diff --git a/talk/app/webrtc/androidtests/AndroidManifest.xml b/talk/app/webrtc/androidtests/AndroidManifest.xml new file mode 100644 index 000000000..3bcd99b42 --- /dev/null +++ b/talk/app/webrtc/androidtests/AndroidManifest.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/talk/app/webrtc/androidtests/ant.properties b/talk/app/webrtc/androidtests/ant.properties new file mode 100644 index 000000000..bc0535386 --- /dev/null +++ b/talk/app/webrtc/androidtests/ant.properties @@ -0,0 +1,18 @@ +# This file is used to override default values used by the Ant build system. +# +# This file must be checked into Version Control Systems, as it is +# integral to the build system of your project. + +# This file is only used by the Ant script. + +# You can use this to override default values such as +# 'source.dir' for the location of your java source folder and +# 'out.dir' for the location of your output folder. + +# You can also use it define how the release builds are signed by declaring +# the following properties: +# 'key.store' for the location of your keystore and +# 'key.alias' for the name of the key to use. +# The password will be asked during the build when you use the 'release' target. + +source.dir=../java/testcommon/src;src \ No newline at end of file diff --git a/talk/app/webrtc/androidtests/build.xml b/talk/app/webrtc/androidtests/build.xml new file mode 100644 index 000000000..cb4cb7ac9 --- /dev/null +++ b/talk/app/webrtc/androidtests/build.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/talk/app/webrtc/androidtests/jni/Android.mk b/talk/app/webrtc/androidtests/jni/Android.mk new file mode 100644 index 000000000..8e8016003 --- /dev/null +++ b/talk/app/webrtc/androidtests/jni/Android.mk @@ -0,0 +1,2 @@ +# This space intentionally left blank (required for Android build system). + diff --git a/talk/app/webrtc/androidtests/project.properties b/talk/app/webrtc/androidtests/project.properties new file mode 100644 index 000000000..47b70783f --- /dev/null +++ b/talk/app/webrtc/androidtests/project.properties @@ -0,0 +1,16 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system edit +# "ant.properties", and override values to adapt the script to your +# project structure. +# +# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): +#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt + +# Project target. +target=android-21 + +java.compilerargs=-Xlint:all -Werror diff --git a/talk/app/webrtc/androidtests/res/drawable-hdpi/ic_launcher.png b/talk/app/webrtc/androidtests/res/drawable-hdpi/ic_launcher.png new file mode 100644 index 000000000..96a442e5b Binary files /dev/null and b/talk/app/webrtc/androidtests/res/drawable-hdpi/ic_launcher.png differ diff --git a/talk/app/webrtc/androidtests/res/drawable-ldpi/ic_launcher.png b/talk/app/webrtc/androidtests/res/drawable-ldpi/ic_launcher.png new file mode 100644 index 000000000..99238729d Binary files /dev/null and b/talk/app/webrtc/androidtests/res/drawable-ldpi/ic_launcher.png differ diff --git a/talk/app/webrtc/androidtests/res/drawable-mdpi/ic_launcher.png b/talk/app/webrtc/androidtests/res/drawable-mdpi/ic_launcher.png new file mode 100644 index 000000000..359047dfa Binary files /dev/null and b/talk/app/webrtc/androidtests/res/drawable-mdpi/ic_launcher.png differ diff --git a/talk/app/webrtc/androidtests/res/drawable-xhdpi/ic_launcher.png b/talk/app/webrtc/androidtests/res/drawable-xhdpi/ic_launcher.png new file mode 100644 index 000000000..71c6d760f Binary files /dev/null and b/talk/app/webrtc/androidtests/res/drawable-xhdpi/ic_launcher.png differ diff --git a/talk/app/webrtc/androidtests/res/values/strings.xml b/talk/app/webrtc/androidtests/res/values/strings.xml new file mode 100644 index 000000000..dfe63f89c --- /dev/null +++ b/talk/app/webrtc/androidtests/res/values/strings.xml @@ -0,0 +1,6 @@ + + + + AndroidPeerConnectionTests + + diff --git a/talk/app/webrtc/androidtests/src/org/webrtc/PeerConnectionAndroidTest.java b/talk/app/webrtc/androidtests/src/org/webrtc/PeerConnectionAndroidTest.java new file mode 100644 index 000000000..228d35c12 --- /dev/null +++ b/talk/app/webrtc/androidtests/src/org/webrtc/PeerConnectionAndroidTest.java @@ -0,0 +1,49 @@ +/* + * libjingle + * Copyright 2014, Google Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.webrtc; + +import android.test.ActivityTestCase; + +public class PeerConnectionAndroidTest extends ActivityTestCase { + private PeerConnectionTest test = new PeerConnectionTest(); + + @Override + protected void setUp() { + assertTrue(PeerConnectionFactory.initializeAndroidGlobals( + getInstrumentation().getContext(), true, + true, null)); + } + + public void testCompleteSession() throws Exception { + // TODO(perkj): Investigate if |test.initializeThreadCheck()| can be used + // on android as well. Currently this check fail. + test.doTest(); + } + + +} diff --git a/talk/app/webrtc/javatests/src/org/webrtc/PeerConnectionTest.java b/talk/app/webrtc/java/testcommon/src/org/webrtc/PeerConnectionTest.java similarity index 94% rename from talk/app/webrtc/javatests/src/org/webrtc/PeerConnectionTest.java rename to talk/app/webrtc/java/testcommon/src/org/webrtc/PeerConnectionTest.java index 048d92b26..8d962cce9 100644 --- a/talk/app/webrtc/javatests/src/org/webrtc/PeerConnectionTest.java +++ b/talk/app/webrtc/java/testcommon/src/org/webrtc/PeerConnectionTest.java @@ -27,9 +27,6 @@ package org.webrtc; -import junit.framework.TestCase; - -import org.junit.Test; import org.webrtc.PeerConnection.IceConnectionState; import org.webrtc.PeerConnection.IceGatheringState; import org.webrtc.PeerConnection.SignalingState; @@ -39,7 +36,6 @@ import java.lang.ref.WeakReference; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.util.Arrays; -import java.util.EnumSet; import java.util.IdentityHashMap; import java.util.LinkedList; import java.util.Map; @@ -47,15 +43,18 @@ import java.util.TreeSet; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import static junit.framework.Assert.*; + /** End-to-end tests for PeerConnection.java. */ -public class PeerConnectionTest extends TestCase { +public class PeerConnectionTest { // Set to true to render video. private static final boolean RENDER_TO_GUI = false; + private TreeSet threadsBeforeTest = null; private static class ObserverExpectations implements PeerConnection.Observer, - VideoRenderer.Callbacks, - DataChannel.Observer, - StatsObserver { + VideoRenderer.Callbacks, + DataChannel.Observer, + StatsObserver { private final String name; private int expectedIceCandidates = 0; private int expectedErrors = 0; @@ -113,10 +112,6 @@ public class PeerConnectionTest extends TestCase { gotIceCandidates.add(candidate); } - public synchronized void expectError() { - ++expectedErrors; - } - public synchronized void expectSetSize() { if (RENDER_TO_GUI) { // When new frames are delivered to the GUI renderer we don't get @@ -440,6 +435,7 @@ public class PeerConnectionTest extends TestCase { public int height = -1; public int numFramesDelivered = 0; + @Override public void setSize(int width, int height) { assertEquals(this.width, -1); assertEquals(this.height, -1); @@ -447,6 +443,7 @@ public class PeerConnectionTest extends TestCase { this.height = height; } + @Override public void renderFrame(VideoRenderer.I420Frame frame) { ++numFramesDelivered; } @@ -488,40 +485,21 @@ public class PeerConnectionTest extends TestCase { return new WeakReference(lMS); } - private static void assertEquals( - SessionDescription lhs, SessionDescription rhs) { - assertEquals(lhs.type, rhs.type); - assertEquals(lhs.description, rhs.description); - } - - @Test - public void testCompleteSession() throws Exception { - doTest(); - } - - @Test - public void testCompleteSessionOnNonMainThread() throws Exception { - final Exception[] exceptionHolder = new Exception[1]; - Thread nonMainThread = new Thread("PeerConnectionTest-nonMainThread") { - @Override public void run() { - try { - doTest(); - } catch (Exception e) { - exceptionHolder[0] = e; - } - } - }; - nonMainThread.start(); - nonMainThread.join(); - if (exceptionHolder[0] != null) - throw exceptionHolder[0]; - } - - private void doTest() throws Exception { - CountDownLatch testDone = new CountDownLatch(1); + // Used for making sure thread handles are not leaked. + // Call initializeThreadCheck before a test and finalizeThreadCheck after + // a test. + void initializeThreadCheck() { System.gc(); // Encourage any GC-related threads to start up. - TreeSet threadsBeforeTest = allThreads(); + threadsBeforeTest = allThreads(); + } + void finalizeThreadCheck() throws Exception { + TreeSet threadsAfterTest = allThreads(); + assertEquals(threadsBeforeTest, threadsAfterTest); + Thread.sleep(100); + } + + void doTest() throws Exception { PeerConnectionFactory factory = new PeerConnectionFactory(); // Uncomment to get ALL WebRTC tracing and SENSITIVE libjingle logging. // NOTE: this _must_ happen while |factory| is alive! @@ -736,10 +714,6 @@ public class PeerConnectionTest extends TestCase { videoSource.dispose(); factory.dispose(); System.gc(); - - TreeSet threadsAfterTest = allThreads(); - assertEquals(threadsBeforeTest, threadsAfterTest); - Thread.sleep(100); } private static void shutdownPC( @@ -782,16 +756,4 @@ public class PeerConnectionTest extends TestCase { } return threads; } - - // Return a String form of |strings| joined by |separator|. - private static String joinStrings(String separator, TreeSet strings) { - StringBuilder builder = new StringBuilder(); - for (String s : strings) { - if (builder.length() > 0) { - builder.append(separator); - } - builder.append(s); - } - return builder.toString(); - } } diff --git a/talk/app/webrtc/javatests/libjingle_peerconnection_java_unittest.sh b/talk/app/webrtc/javatests/libjingle_peerconnection_java_unittest.sh index 0ecb7309d..4f8c74ad0 100644 --- a/talk/app/webrtc/javatests/libjingle_peerconnection_java_unittest.sh +++ b/talk/app/webrtc/javatests/libjingle_peerconnection_java_unittest.sh @@ -44,4 +44,4 @@ export LD_LIBRARY_PATH=`pwd` export JAVA_HOME=GYP_JAVA_HOME ${JAVA_HOME}/bin/java -Xcheck:jni -classpath $CLASSPATH \ - junit.textui.TestRunner org.webrtc.PeerConnectionTest + junit.textui.TestRunner org.webrtc.PeerConnectionTestJava diff --git a/talk/app/webrtc/javatests/src/org/webrtc/PeerConnectionTestJava.java b/talk/app/webrtc/javatests/src/org/webrtc/PeerConnectionTestJava.java new file mode 100644 index 000000000..2f0419c42 --- /dev/null +++ b/talk/app/webrtc/javatests/src/org/webrtc/PeerConnectionTestJava.java @@ -0,0 +1,62 @@ +/* + * libjingle + * Copyright 2014, Google Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.webrtc; + + +import junit.framework.TestCase; + +/** End-to-end tests for PeerConnection.java. */ +public class PeerConnectionTestJava extends TestCase { + private PeerConnectionTest test = new PeerConnectionTest(); + @Test + public void testCompleteSession() throws Exception { + test.initializeThreadCheck(); + test.doTest(); + test.finalizeThreadCheck(); + } + + @Test + public void testCompleteSessionOnNonMainThread() throws Exception { + final Exception[] exceptionHolder = new Exception[1]; + Thread nonMainThread = new Thread("PeerConnectionTest-nonMainThread") { + @Override public void run() { + try { + test.initializeThreadCheck(); + test.doTest(); + test.finalizeThreadCheck(); + } catch (Exception e) { + exceptionHolder[0] = e; + } + } + }; + nonMainThread.start(); + nonMainThread.join(); + if (exceptionHolder[0] != null) + throw exceptionHolder[0]; + } +} \ No newline at end of file diff --git a/talk/libjingle_tests.gyp b/talk/libjingle_tests.gyp index 128203b4b..d853236da 100755 --- a/talk/libjingle_tests.gyp +++ b/talk/libjingle_tests.gyp @@ -263,7 +263,8 @@ 'variables': { 'java_src_dir': 'app/webrtc/javatests/src', 'java_files': [ - 'app/webrtc/javatests/src/org/webrtc/PeerConnectionTest.java', + 'app/webrtc/java/testcommon/src/org/webrtc/PeerConnectionTest.java', + 'app/webrtc/javatests/src/org/webrtc/PeerConnectionTestJava.java', ], }, 'action_name': 'create_jar', @@ -313,6 +314,61 @@ }, ], }], + ['OS=="android"', { + 'targets': [ + { + 'target_name': 'libjingle_peerconnection_android_unittest', + 'type': 'none', + 'dependencies': [ + 'libjingle.gyp:libjingle_peerconnection_jar', + ], + 'actions': [ + { + # TODO(perkj): convert from a custom script to a standard gyp + # apk build once chromium's apk-building gyp machinery can be used + # (http://crbug.com/225101) + 'action_name': 'build_peerconnection_unittests_apk', + 'inputs' : [ + '<(PRODUCT_DIR)/libjingle_peerconnection.jar', + '<(PRODUCT_DIR)/libjingle_peerconnection_so.so', + 'app/webrtc/androidtests/AndroidManifest.xml', + 'app/webrtc/androidtests/ant.properties', + 'app/webrtc/androidtests/build.xml', + 'app/webrtc/androidtests/jni/Android.mk', + 'app/webrtc/androidtests/project.properties', + 'app/webrtc/androidtests/res/drawable-hdpi/ic_launcher.png', + 'app/webrtc/androidtests/res/drawable-ldpi/ic_launcher.png', + 'app/webrtc/androidtests/res/drawable-mdpi/ic_launcher.png', + 'app/webrtc/androidtests/res/drawable-xhdpi/ic_launcher.png', + 'app/webrtc/androidtests/res/values/strings.xml', + 'app/webrtc/androidtests/src/org/webrtc/PeerConnectionAndroidTest.java', + 'app/webrtc/java/testcommon/src/org/webrtc/PeerConnectionTest.java', + ], + 'outputs': [ + '<(PRODUCT_DIR)/libjingle_peerconnection_android_unittest.apk', + ], + 'variables': { + 'ant_log': '../../../<(INTERMEDIATE_DIR)/ant.log', # ../.. to compensate for the cd app/webrtc/androidtests below. + }, + 'action': [ + 'bash', '-ec', + 'rm -fr <(_outputs) app/webrtc/androidtests/{bin,libs} && ' + 'mkdir -p <(INTERMEDIATE_DIR) && ' # Must happen _before_ the cd below + 'mkdir -p app/webrtc/androidtests/libs/<(android_app_abi) && ' + 'cp <(PRODUCT_DIR)/libjingle_peerconnection.jar app/webrtc/androidtests/libs/ &&' + '<(android_strip) -o app/webrtc/androidtests/libs/<(android_app_abi)/libjingle_peerconnection_so.so <(PRODUCT_DIR)/libjingle_peerconnection_so.so &&' + 'cd app/webrtc/androidtests && ' + '{ ANDROID_SDK_ROOT=<(android_sdk_root) ' + 'ant debug > <(ant_log) 2>&1 || ' + ' { cat <(ant_log) ; exit 1; } } && ' + 'cd - > /dev/null && ' + 'cp app/webrtc/androidtests/bin/libjingle_peerconnection_android_unittest-debug.apk <(_outputs)' + ], + }, + ], + }, # target AppRTCDemo + ], # targets + }], # OS=="android" ['OS=="ios" or (OS=="mac" and target_arch!="ia32" and mac_sdk>="10.7")', { # The >=10.7 above is required to make ARC link cleanly (e.g. as # opposed to _compile_ cleanly, which the library under test