From 48d3b829d8659718c9e11a5875199a2984e1bc02 Mon Sep 17 00:00:00 2001 From: zhangyihui1 Date: Tue, 14 May 2019 15:11:49 +0800 Subject: [PATCH] Add IATF test example. --- test/p2p/iatfTest/.gitignore | 1 + test/p2p/iatfTest/build.gradle | 41 ++++ test/p2p/iatfTest/proguard-rules.pro | 21 ++ .../owt/test/p2p/apitest/TestDevice1.java | 67 ++++++ .../owt/test/p2p/apitest/TestDevice2.java | 67 ++++++ .../p2p/iatfTest/src/main/AndroidManifest.xml | 33 +++ .../owt/test/p2p/apitest/MainActivity.java | 16 ++ .../main/res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 14383 bytes .../src/main/res/layout/activity_test.xml | 30 +++ .../iatfTest/src/main/res/values/strings.xml | 5 + test/util/build.gradle | 4 + .../src/main/java/owt/test/util/Config.java | 12 + .../main/java/owt/test/util/LockServer.java | 215 ++++++++++++++++++ test/util/src/main/resources/config.xml | 2 + 14 files changed, 514 insertions(+) create mode 100644 test/p2p/iatfTest/.gitignore create mode 100644 test/p2p/iatfTest/build.gradle create mode 100644 test/p2p/iatfTest/proguard-rules.pro create mode 100644 test/p2p/iatfTest/src/androidTest/java/owt/test/p2p/apitest/TestDevice1.java create mode 100644 test/p2p/iatfTest/src/androidTest/java/owt/test/p2p/apitest/TestDevice2.java create mode 100644 test/p2p/iatfTest/src/main/AndroidManifest.xml create mode 100644 test/p2p/iatfTest/src/main/java/owt/test/p2p/apitest/MainActivity.java create mode 100644 test/p2p/iatfTest/src/main/res/drawable-xhdpi/ic_launcher.png create mode 100644 test/p2p/iatfTest/src/main/res/layout/activity_test.xml create mode 100644 test/p2p/iatfTest/src/main/res/values/strings.xml create mode 100644 test/util/src/main/java/owt/test/util/LockServer.java diff --git a/test/p2p/iatfTest/.gitignore b/test/p2p/iatfTest/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/test/p2p/iatfTest/.gitignore @@ -0,0 +1 @@ +/build diff --git a/test/p2p/iatfTest/build.gradle b/test/p2p/iatfTest/build.gradle new file mode 100644 index 00000000..3ae79497 --- /dev/null +++ b/test/p2p/iatfTest/build.gradle @@ -0,0 +1,41 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 21 + buildToolsVersion rootProject.ext.buildToolsVersion + + defaultConfig { + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion 21 + + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + + +repositories { + flatDir { + dirs '../../libs' + } +} + +dependencies { + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test:rules:1.0.2' + implementation project(':test:p2p:util') +} diff --git a/test/p2p/iatfTest/proguard-rules.pro b/test/p2p/iatfTest/proguard-rules.pro new file mode 100644 index 00000000..f1b42451 --- /dev/null +++ b/test/p2p/iatfTest/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/test/p2p/iatfTest/src/androidTest/java/owt/test/p2p/apitest/TestDevice1.java b/test/p2p/iatfTest/src/androidTest/java/owt/test/p2p/apitest/TestDevice1.java new file mode 100644 index 00000000..4a904175 --- /dev/null +++ b/test/p2p/iatfTest/src/androidTest/java/owt/test/p2p/apitest/TestDevice1.java @@ -0,0 +1,67 @@ +package owt.test.p2p.apitest; + +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.json.JSONException; +import org.json.JSONObject; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; + +import owt.p2p.P2PClient; +import owt.test.util.LockServer; + + +@RunWith(AndroidJUnit4.class) +public class TestDevice1 { + private static LockServer mLockServer = new LockServer(); + private static String taskId = null; + private int caseSequenceNumber = 0; + + @Test + public void testConnect() { + mLockServer.notifyWorkflowLock("user1", "connect"); + mLockServer.waitWorkflowLock("user2", "connect"); + } + + @BeforeClass + public static void beforeClass() { + taskId = InstrumentationRegistry.getArguments().getString("taskId"); + mLockServer.connect(taskId,"role1"); + mLockServer.waitControlLock("task-start"); + } + + @AfterClass + public static void afterClass() { + mLockServer.disconnect(); + } + + @After + public void tearDown() { + JSONObject lockData = new JSONObject(); + try { + lockData.put("sequenceNumber", this.caseSequenceNumber); + } catch (JSONException e) { + e.printStackTrace(); + } + mLockServer.notifyControlLock("case-end", lockData); + mLockServer.initStatus(); + } + + @Before + public void setUp() { + this.caseSequenceNumber++; + JSONObject lockData = new JSONObject(); + try { + lockData.put("sequenceNumber", this.caseSequenceNumber); + } catch (JSONException e) { + e.printStackTrace(); + } + mLockServer.notifyControlLock("case-ready", lockData); + mLockServer.waitControlLock("case-start"); + } +} diff --git a/test/p2p/iatfTest/src/androidTest/java/owt/test/p2p/apitest/TestDevice2.java b/test/p2p/iatfTest/src/androidTest/java/owt/test/p2p/apitest/TestDevice2.java new file mode 100644 index 00000000..3bd32c91 --- /dev/null +++ b/test/p2p/iatfTest/src/androidTest/java/owt/test/p2p/apitest/TestDevice2.java @@ -0,0 +1,67 @@ +package owt.test.p2p.apitest; + +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.json.JSONException; +import org.json.JSONObject; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; + +import owt.test.util.LockServer; + +@RunWith(AndroidJUnit4.class) +public class TestDevice2 { + private static LockServer mLockServer = new LockServer(); + private static String taskId = null; + private int caseSequenceNumber = 0; + + @Test + public void testConnect() { + mLockServer.waitWorkflowLock("user1", "connect"); + mLockServer.notifyWorkflowLock("user2", "connect"); + } + + @BeforeClass + public static void beforeClass() { + taskId = InstrumentationRegistry.getArguments().getString("taskId"); + mLockServer.connect(taskId,"role2"); + mLockServer.waitControlLock("task-start"); + } + + @AfterClass + public static void afterClass() { + mLockServer.disconnect(); + + } + + @After + public void tearDown() { + JSONObject lockData = new JSONObject(); + try { + lockData.put("sequenceNumber", this.caseSequenceNumber); + } catch (JSONException e) { + e.printStackTrace(); + } + mLockServer.notifyControlLock("case-end", lockData); + mLockServer.initStatus(); + } + + @Before + public void setUp() { + this.caseSequenceNumber++; + JSONObject lockData = new JSONObject(); + try { + lockData.put("sequenceNumber", caseSequenceNumber); + } catch (JSONException e) { + e.printStackTrace(); + } + mLockServer.notifyControlLock("case-ready", lockData); + mLockServer.waitControlLock("case-start"); + } + +} diff --git a/test/p2p/iatfTest/src/main/AndroidManifest.xml b/test/p2p/iatfTest/src/main/AndroidManifest.xml new file mode 100644 index 00000000..6ca5e765 --- /dev/null +++ b/test/p2p/iatfTest/src/main/AndroidManifest.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/p2p/iatfTest/src/main/java/owt/test/p2p/apitest/MainActivity.java b/test/p2p/iatfTest/src/main/java/owt/test/p2p/apitest/MainActivity.java new file mode 100644 index 00000000..9438f38d --- /dev/null +++ b/test/p2p/iatfTest/src/main/java/owt/test/p2p/apitest/MainActivity.java @@ -0,0 +1,16 @@ +package owt.test.p2p.apitest; + +import android.app.Activity; +import android.os.Bundle; + + +public class MainActivity extends Activity { + private final static String TAG = "owt_p2p_iatf_test"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_test); + } + +} diff --git a/test/p2p/iatfTest/src/main/res/drawable-xhdpi/ic_launcher.png b/test/p2p/iatfTest/src/main/res/drawable-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..71c6d760f05183ef8a47c614d8d13380c8528499 GIT binary patch literal 14383 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 literal 0 HcmV?d00001 diff --git a/test/p2p/iatfTest/src/main/res/layout/activity_test.xml b/test/p2p/iatfTest/src/main/res/layout/activity_test.xml new file mode 100644 index 00000000..b9550356 --- /dev/null +++ b/test/p2p/iatfTest/src/main/res/layout/activity_test.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/p2p/iatfTest/src/main/res/values/strings.xml b/test/p2p/iatfTest/src/main/res/values/strings.xml new file mode 100644 index 00000000..8ffa8afc --- /dev/null +++ b/test/p2p/iatfTest/src/main/res/values/strings.xml @@ -0,0 +1,5 @@ + + + owt_p2p_iatf_test + owt_p2p_iatf_test + diff --git a/test/util/build.gradle b/test/util/build.gradle index 8dfc1c91..d4e2f960 100644 --- a/test/util/build.gradle +++ b/test/util/build.gradle @@ -26,6 +26,10 @@ repositories { } } dependencies { + implementation('io.socket:socket.io-client:1.0.0') { + // excluding org.json which is provided by Android + exclude group: 'org.json', module: 'json' + } implementation 'org.dom4j:dom4j:2.0.2' api project(':src:sdk:base') api project(':src:sdk:conference') diff --git a/test/util/src/main/java/owt/test/util/Config.java b/test/util/src/main/java/owt/test/util/Config.java index aa5be987..8f41b39a 100644 --- a/test/util/src/main/java/owt/test/util/Config.java +++ b/test/util/src/main/java/owt/test/util/Config.java @@ -53,6 +53,10 @@ public class Config { public static final String RAW_STREAM_FILE; + public static final String IATF_SERVER; + + public static final String IATF_WAIT_TIME; + static { InputStream config = Thread.currentThread().getContextClassLoader().getResourceAsStream( "config.xml"); @@ -82,6 +86,14 @@ public class Config { Element rawStreamFileElement = rootElement.element("rawStreamFile"); RAW_STREAM_FILE = rawStreamFileElement == null ? "" : rawStreamFileElement.getText(); + + Element iatfServerElement = rootElement.element("iatfServer"); + IATF_SERVER = iatfServerElement == null ? "" : iatfServerElement.getText(); + + + Element iatfWaitLockTimeElement = rootElement.element("iatfWaitLockTime"); + IATF_WAIT_TIME = iatfWaitLockTimeElement == null ? "" : iatfWaitLockTimeElement.getText(); + } catch (DocumentException e) { throw new RuntimeException(e.getMessage()); } diff --git a/test/util/src/main/java/owt/test/util/LockServer.java b/test/util/src/main/java/owt/test/util/LockServer.java new file mode 100644 index 00000000..ea4d400d --- /dev/null +++ b/test/util/src/main/java/owt/test/util/LockServer.java @@ -0,0 +1,215 @@ +package owt.test.util; + +import static junit.framework.Assert.assertTrue; + +import static owt.test.util.Config.IATF_SERVER; +import static owt.test.util.Config.IATF_WAIT_TIME; + +import android.util.Log; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.net.URISyntaxException; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +import io.socket.client.IO; +import io.socket.client.Socket; +import io.socket.emitter.Emitter; +import okhttp3.OkHttpClient; + + +public class LockServer { + private final static String TAG = "iatf_test_util"; + public String controlMsg = ""; + public String targetcontrolMsg = ""; + public String targetworkFlowMsgType = ""; + public String targetworkFlowMsgData = ""; + public String workFlowMsgType = ""; + public String workFlowMsgData = ""; + private Socket mSocket = null; + private final ExecutorService callbackExecutor = Executors.newSingleThreadExecutor(); + static SSLContext sslContext; + static HostnameVerifier hostnameVerifier; + private CountDownLatch latch = new CountDownLatch(1); + public Object lockControl = new Object(); + public Object lockWorkFlow = new Object(); + + public void initStatus(){ + this.controlMsg = ""; + this.targetcontrolMsg = ""; + this.targetworkFlowMsgType = ""; + this.targetworkFlowMsgData = ""; + this.workFlowMsgData = ""; + this.workFlowMsgType = ""; + } + + public static void setUpINSECURESSLContext() { + hostnameVerifier = (hostname, session) -> true; + + TrustManager[] trustManagers = new TrustManager[]{new X509TrustManager() { + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) throws + CertificateException { + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) throws + CertificateException { + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[0]; + } + }}; + + try { + sslContext = SSLContext.getInstance("TLS"); + sslContext.init(null, trustManagers, null); + } catch (NoSuchAlgorithmException | KeyManagementException e) { + e.printStackTrace(); + } + } + + private final Emitter.Listener connectedCallback = args -> callbackExecutor.execute(() -> { + Log.d(TAG, "Socket connected."); + }); + + private final Emitter.Listener iatfControlCallback = args -> callbackExecutor.execute(() -> { + synchronized (lockControl) { + JSONObject msg = (JSONObject) args[0]; + Log.d(TAG, "iatf-control msg: " + msg.toString()); + try { + controlMsg = msg.getString("type"); + if (latch.getCount() != 0 && targetcontrolMsg.equals(controlMsg)) { + latch.countDown(); + } + } catch (JSONException e) { + e.printStackTrace(); + } + } + }); + + private final Emitter.Listener iatfWorkFlowCallback = args -> callbackExecutor.execute(() -> { + synchronized (lockWorkFlow) { + JSONObject workFlowMsg = (JSONObject) args[0]; + Log.d(TAG, "iatf-workflow msg: " + workFlowMsg.toString()); + try { + workFlowMsgData = workFlowMsg.getString("data"); + workFlowMsgType = workFlowMsg.getString("type"); + if (latch.getCount() != 0 && targetworkFlowMsgData.equals(workFlowMsgData) + && targetworkFlowMsgType.equals(workFlowMsgType)) { + latch.countDown(); + } + } catch (JSONException e) { + e.printStackTrace(); + } + } + }); + + public void connect(String taskId, String role) { + try { + setUpINSECURESSLContext(); + IO.Options opt = new IO.Options(); + opt.forceNew = true; + opt.reconnection = true; + opt.secure = true; + opt.query = "taskId=" + taskId + "&role=" + role + "&type=Android"; + OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder(); + if (sslContext != null) { + clientBuilder.sslSocketFactory(sslContext.getSocketFactory()); + } + if (hostnameVerifier != null) { + clientBuilder.hostnameVerifier(hostnameVerifier); + } + OkHttpClient httpClient = clientBuilder.build(); + opt.callFactory = httpClient; + opt.webSocketFactory = httpClient; + mSocket = IO.socket(IATF_SERVER, opt); + mSocket.on(Socket.EVENT_CONNECT, connectedCallback) + .on("iatf-control", iatfControlCallback) + .on("iatf-workflow", iatfWorkFlowCallback); + mSocket.connect(); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + } + + public void disconnect(){ + mSocket.disconnect(); + } + + public void notifyControlLock(String lockTpye, JSONObject lockDate) { + JSONObject msg = new JSONObject(); + try { + msg.put("type", lockTpye); + msg.put("message",lockDate); + } catch (JSONException e) { + e.printStackTrace(); + } + mSocket.emit("iatf-control", msg); + } + + public void notifyWorkflowLock(String lockTpye, String lockDate) { + JSONObject msg = new JSONObject(); + try { + msg.put("type", lockTpye); + msg.put("data",lockDate); + } catch (JSONException e) { + e.printStackTrace(); + } + mSocket.emit("iatf-workflow", msg); + } + + public void waitControlLock(String lock) { + synchronized (lockControl) { + targetcontrolMsg = lock; + latch = new CountDownLatch(1); + if (controlMsg.equals(lock)) { + latch.countDown(); + } + } + assertTrue("can not get " + lock, waitLock()); + } + + public void waitWorkflowLock(String lockType, String lockData) { + synchronized (lockWorkFlow) { + targetworkFlowMsgType = lockType; + targetworkFlowMsgData = lockData; + latch = new CountDownLatch(1); + if (workFlowMsgType.equals(lockType) && workFlowMsgData.equals(lockData)) { + latch.countDown(); + } + } + assertTrue( + "can not get workFlowType:" + lockType + " workFlowData:" + lockData, + waitLock()); + } + + + private boolean waitLock() { + try { + if (latch.await(Integer.valueOf(IATF_WAIT_TIME), TimeUnit.MILLISECONDS)) { + return true; + } else { + Log.w(TAG, "Timeout on Resultable.getResult."); + } + } catch (InterruptedException e) { + Log.w(TAG, "InterruptedException during latch.await"); + } + return false; + } +} diff --git a/test/util/src/main/resources/config.xml b/test/util/src/main/resources/config.xml index f0eca6be..0dc5d368 100644 --- a/test/util/src/main/resources/config.xml +++ b/test/util/src/main/resources/config.xml @@ -6,4 +6,6 @@ place_holder place_holder place_holder + place_holder> + place_holder>