diff --git a/build.gradle b/build.gradle index 422641c57..083b29fdf 100644 --- a/build.gradle +++ b/build.gradle @@ -81,9 +81,16 @@ dependencies { compile 'org.whispersystems:textsecure-android:1.6.2' compile 'com.h6ah4i.android.compat:mulsellistprefcompat:1.0.0' + testCompile 'junit:junit:4.12' + testCompile 'org.assertj:assertj-core:1.7.1' + testCompile 'org.mockito:mockito-core:1.9.5' + testCompile 'org.powermock:powermock-api-mockito:1.6.1' + testCompile 'org.powermock:powermock-module-junit4:1.6.1' + testCompile 'org.powermock:powermock-module-junit4-rule:1.6.1' + testCompile 'org.powermock:powermock-classloading-xstream:1.6.1' + androidTestCompile 'com.google.dexmaker:dexmaker:1.2' androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.2' - androidTestCompile ('org.assertj:assertj-core:1.7.1') { exclude group: 'org.hamcrest', module: 'hamcrest-core' } @@ -91,13 +98,6 @@ dependencies { exclude group: 'org.hamcrest', module: 'hamcrest-core' exclude group: 'com.android.support', module: 'support-annotations' } - androidTestCompile ('com.android.support.test:runner:0.2') { - exclude group: 'com.android.support', module: 'support-annotations' - } - androidTestCompile ('com.android.support.test.espresso:espresso-core:2.1') { - exclude group: 'com.android.support', module: 'support-annotations' - exclude group: 'javax.inject' - } } dependencyVerification { @@ -162,7 +162,6 @@ android { minSdkVersion 9 targetSdkVersion 22 - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" buildConfigField "long", "BUILD_TIMESTAMP", System.currentTimeMillis() + "L" buildConfigField "String", "PUSH_URL", "\"https://textsecure-service.whispersystems.org\"" buildConfigField "boolean", "DEV_BUILD", "false" @@ -227,6 +226,9 @@ android { androidTest { java.srcDirs = ['test/androidTest/java'] } + test { + java.srcDirs = ['test/unitTest/java'] + } } lintOptions { @@ -265,27 +267,3 @@ if (propFile.canRead()){ android.buildTypes.release.signingConfig = null } -if (project.hasProperty('espresso') && System.console() != null) { - println "______________________WARNING_______________________" - println "ALL YOUR CONTACTS WILL BE DELETED IN THE PROCESS" - println "OF RUNNING THESE TESTS, TYPE 'delete all my contacts'" - println "TO CONTINUE" - println "----------------------------------------------------" - - def input = System.console().readLine(':') - if (input == 'delete all my contacts') { - android.productFlavors { - base {} - espresso { - testInstrumentationRunner "org.thoughtcrime.securesms.TextSecureWakingTestRunner" - } - } - android.sourceSets.espresso { - manifest.srcFile 'test/espresso/AndroidManifest.xml' - } - android.sourceSets.androidTestEspresso { - java.srcDirs = ['test/androidTestEspresso/java'] - res.srcDirs = ['test/androidTestEspresso/res'] - } - } -} diff --git a/test/unitTest/java/org/thoughtcrime/securesms/BaseUnitTest.java b/test/unitTest/java/org/thoughtcrime/securesms/BaseUnitTest.java new file mode 100644 index 000000000..7c356cefb --- /dev/null +++ b/test/unitTest/java/org/thoughtcrime/securesms/BaseUnitTest.java @@ -0,0 +1,44 @@ +package org.thoughtcrime.securesms; + +import android.os.Handler; +import android.os.Looper; +import android.util.Log; + +import org.junit.Before; +import org.junit.runner.RunWith; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import static org.mockito.Matchers.anyString; +import static org.powermock.api.mockito.PowerMockito.mockStatic; + +@RunWith(PowerMockRunner.class) +@PrepareForTest( { Log.class, Handler.class, Looper.class }) +public abstract class BaseUnitTest { + @Before + public void setUp() throws Exception { + mockStatic(Looper.class); + mockStatic(Log.class); + mockStatic(Handler.class); + + PowerMockito.when(Looper.getMainLooper()).thenReturn(null); + PowerMockito.whenNew(Handler.class).withAnyArguments().thenReturn(null); + + Answer logAnswer = new Answer() { + @Override public Void answer(InvocationOnMock invocation) throws Throwable { + final String tag = (String)invocation.getArguments()[0]; + final String msg = (String)invocation.getArguments()[1]; + System.out.println(invocation.getMethod().getName().toUpperCase() + "/[" + tag + "] " + msg); + return null; + } + }; + PowerMockito.doAnswer(logAnswer).when(Log.class, "d", anyString(), anyString()); + PowerMockito.doAnswer(logAnswer).when(Log.class, "i", anyString(), anyString()); + PowerMockito.doAnswer(logAnswer).when(Log.class, "w", anyString(), anyString()); + PowerMockito.doAnswer(logAnswer).when(Log.class, "e", anyString(), anyString()); + PowerMockito.doAnswer(logAnswer).when(Log.class, "wtf", anyString(), anyString()); + } +} diff --git a/test/androidTest/java/org/thoughtcrime/securesms/util/ListPartitionTest.java b/test/unitTest/java/org/thoughtcrime/securesms/util/ListPartitionTest.java similarity index 85% rename from test/androidTest/java/org/thoughtcrime/securesms/util/ListPartitionTest.java rename to test/unitTest/java/org/thoughtcrime/securesms/util/ListPartitionTest.java index 9cad7f616..1ef955a83 100644 --- a/test/androidTest/java/org/thoughtcrime/securesms/util/ListPartitionTest.java +++ b/test/unitTest/java/org/thoughtcrime/securesms/util/ListPartitionTest.java @@ -1,15 +1,16 @@ package org.thoughtcrime.securesms.util; -import org.thoughtcrime.securesms.TextSecureTestCase; +import org.junit.Test; +import org.thoughtcrime.securesms.BaseUnitTest; import java.util.LinkedList; import java.util.List; -import static junit.framework.Assert.assertEquals; +import static org.junit.Assert.assertEquals; -public class ListPartitionTest extends TextSecureTestCase { +public class ListPartitionTest extends BaseUnitTest { - public void testPartitionEven() { + @Test public void testPartitionEven() { List list = new LinkedList<>(); for (int i=0;i<100;i++) { @@ -32,7 +33,7 @@ public class ListPartitionTest extends TextSecureTestCase { } } - public void testPartitionOdd() { + @Test public void testPartitionOdd() { List list = new LinkedList<>(); for (int i=0;i<100;i++) { @@ -60,7 +61,7 @@ public class ListPartitionTest extends TextSecureTestCase { assertEquals((int)partitions.get(10).get(0), 100); } - public void testPathological() { + @Test public void testPathological() { List list = new LinkedList<>(); for (int i=0;i<100;i++) { diff --git a/test/androidTest/java/org/thoughtcrime/securesms/util/PhoneNumberFormatterTest.java b/test/unitTest/java/org/thoughtcrime/securesms/util/PhoneNumberFormatterTest.java similarity index 70% rename from test/androidTest/java/org/thoughtcrime/securesms/util/PhoneNumberFormatterTest.java rename to test/unitTest/java/org/thoughtcrime/securesms/util/PhoneNumberFormatterTest.java index c522da01a..e8c6b8c2b 100644 --- a/test/androidTest/java/org/thoughtcrime/securesms/util/PhoneNumberFormatterTest.java +++ b/test/unitTest/java/org/thoughtcrime/securesms/util/PhoneNumberFormatterTest.java @@ -1,25 +1,23 @@ package org.thoughtcrime.securesms.util; -import android.test.AndroidTestCase; - import junit.framework.AssertionFailedError; -import org.thoughtcrime.securesms.TextSecureTestCase; +import org.junit.Test; import org.whispersystems.textsecure.api.util.InvalidNumberException; import org.whispersystems.textsecure.api.util.PhoneNumberFormatter; import static org.assertj.core.api.Assertions.assertThat; -public class PhoneNumberFormatterTest extends TextSecureTestCase { +public class PhoneNumberFormatterTest { private static final String LOCAL_NUMBER = "+15555555555"; - public void testFormatNumberE164() throws Exception, InvalidNumberException { + @Test public void testFormatNumberE164() throws Exception, InvalidNumberException { assertThat(PhoneNumberFormatter.formatNumber("(555) 555-5555", LOCAL_NUMBER)).isEqualTo(LOCAL_NUMBER); assertThat(PhoneNumberFormatter.formatNumber("555-5555", LOCAL_NUMBER)).isEqualTo(LOCAL_NUMBER); assertThat(PhoneNumberFormatter.formatNumber("(123) 555-5555", LOCAL_NUMBER)).isNotEqualTo(LOCAL_NUMBER); } - public void testFormatNumberEmail() throws Exception { + @Test public void testFormatNumberEmail() throws Exception { try { PhoneNumberFormatter.formatNumber("person@domain.com", LOCAL_NUMBER); throw new AssertionFailedError("should have thrown on email"); @@ -27,9 +25,4 @@ public class PhoneNumberFormatterTest extends TextSecureTestCase { // success } } - - @Override - public void setUp() throws Exception { - super.setUp(); - } } diff --git a/test/androidTest/java/org/thoughtcrime/securesms/util/Rfc5724UriTest.java b/test/unitTest/java/org/thoughtcrime/securesms/util/Rfc5724UriTest.java similarity index 79% rename from test/androidTest/java/org/thoughtcrime/securesms/util/Rfc5724UriTest.java rename to test/unitTest/java/org/thoughtcrime/securesms/util/Rfc5724UriTest.java index 095dcf3e1..3af2c0e9f 100644 --- a/test/androidTest/java/org/thoughtcrime/securesms/util/Rfc5724UriTest.java +++ b/test/unitTest/java/org/thoughtcrime/securesms/util/Rfc5724UriTest.java @@ -17,17 +17,18 @@ package org.thoughtcrime.securesms.util; -import android.util.Log; +import junit.framework.AssertionFailedError; -import org.thoughtcrime.securesms.TextSecureTestCase; +import org.junit.Test; +import org.thoughtcrime.securesms.BaseUnitTest; import java.net.URISyntaxException; -public class Rfc5724UriTest extends TextSecureTestCase { +import static org.junit.Assert.assertTrue; - private static final String TAG = Rfc5724UriTest.class.getSimpleName(); +public class Rfc5724UriTest extends BaseUnitTest { - public void testInvalidPath() throws Exception { + @Test public void testInvalidPath() throws Exception { final String[] invalidSchemaUris = { "", ":", @@ -40,13 +41,14 @@ public class Rfc5724UriTest extends TextSecureTestCase { for (String uri : invalidSchemaUris) { try { new Rfc5724Uri(uri); - Log.e(TAG, "uri " + uri + " should have failed path check"); - assertTrue(false); - } catch (URISyntaxException e) { } + throw new AssertionFailedError("URISyntaxException should be thrown"); + } catch (URISyntaxException e) { + // success + } } } - public void testGetSchema() throws Exception { + @Test public void testGetSchema() throws Exception { final String[][] uriTestPairs = { {"sms:+15555555555", "sms"}, {"sMs:+15555555555", "sMs"}, @@ -57,15 +59,14 @@ public class Rfc5724UriTest extends TextSecureTestCase { for (String[] uriTestPair : uriTestPairs) { final Rfc5724Uri testUri = new Rfc5724Uri(uriTestPair[0]); - Log.d(TAG, testUri.getSchema() + " ?= " + uriTestPair[1]); assertTrue(testUri.getSchema().equals(uriTestPair[1])); } } - public void testGetPath() throws Exception { + @Test public void testGetPath() throws Exception { final String[][] uriTestPairs = { {"sms:+15555555555", "+15555555555"}, - {"sms:%2B49555555555", "%2B555555555"}, + {"sms:%2B555555555", "%2B555555555"}, {"smsto:+15555555555?", "+15555555555"}, {"mms:+15555555555?a=b", "+15555555555"}, {"mmsto:+15555555555?a=b&c=d", "+15555555555"}, @@ -77,12 +78,11 @@ public class Rfc5724UriTest extends TextSecureTestCase { for (String[] uriTestPair : uriTestPairs) { final Rfc5724Uri testUri = new Rfc5724Uri(uriTestPair[0]); - Log.d(TAG, testUri.getPath() + " ?= " + uriTestPair[1]); assertTrue(testUri.getPath().equals(uriTestPair[1])); } } - public void testGetQueryParams() throws Exception { + @Test public void testGetQueryParams() throws Exception { final String[][] uriTestPairs = { {"sms:+15555555555", "a", null}, {"mms:+15555555555?b=", "a", null}, @@ -98,10 +98,8 @@ public class Rfc5724UriTest extends TextSecureTestCase { final Rfc5724Uri testUri = new Rfc5724Uri(uriTestPair[0]); final String paramResult = testUri.getQueryParams().get(uriTestPair[1]); - Log.d(TAG, paramResult + " ?= " + uriTestPair[2]); if (paramResult == null) assertTrue(uriTestPair[2] == null); else assertTrue(paramResult.equals(uriTestPair[2])); } } - }