diff --git a/src/org/thoughtcrime/securesms/service/SmsListener.java b/src/org/thoughtcrime/securesms/service/SmsListener.java index 2a7c59bf8d..8a58d90a04 100644 --- a/src/org/thoughtcrime/securesms/service/SmsListener.java +++ b/src/org/thoughtcrime/securesms/service/SmsListener.java @@ -22,6 +22,8 @@ import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.provider.Telephony; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.telephony.SmsMessage; import android.util.Log; @@ -29,6 +31,7 @@ import org.thoughtcrime.securesms.ApplicationContext; import org.thoughtcrime.securesms.jobs.SmsReceiveJob; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.Util; +import org.thoughtcrime.securesms.util.VisibleForTesting; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -104,7 +107,7 @@ public class SmsListener extends BroadcastReceiver { if (!ApplicationMigrationService.isDatabaseImported(context)) return false; - if (isChallenge(context, intent)) + if (isChallenge(context, messageBody)) return false; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && @@ -123,9 +126,7 @@ public class SmsListener extends BroadcastReceiver { return false; } - private boolean isChallenge(Context context, Intent intent) { - String messageBody = getSmsMessageBodyFromIntent(intent); - + @VisibleForTesting boolean isChallenge(@NonNull Context context, @Nullable String messageBody) { if (messageBody == null) return false; @@ -138,8 +139,7 @@ public class SmsListener extends BroadcastReceiver { return false; } - private String parseChallenge(Context context, Intent intent) { - String messageBody = getSmsMessageBodyFromIntent(intent); + @VisibleForTesting String parseChallenge(String messageBody) { Matcher challengeMatcher = CHALLENGE_PATTERN.matcher(messageBody); if (!challengeMatcher.matches()) { @@ -153,10 +153,11 @@ public class SmsListener extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { Log.w("SMSListener", "Got SMS broadcast..."); - if (SMS_RECEIVED_ACTION.equals(intent.getAction()) && isChallenge(context, intent)) { + String messageBody = getSmsMessageBodyFromIntent(intent); + if (SMS_RECEIVED_ACTION.equals(intent.getAction()) && isChallenge(context, messageBody)) { Log.w("SmsListener", "Got challenge!"); Intent challengeIntent = new Intent(RegistrationService.CHALLENGE_EVENT); - challengeIntent.putExtra(RegistrationService.CHALLENGE_EXTRA, parseChallenge(context, intent)); + challengeIntent.putExtra(RegistrationService.CHALLENGE_EXTRA, parseChallenge(messageBody)); context.sendBroadcast(challengeIntent); abortBroadcast(); diff --git a/test/androidTest/java/org/thoughtcrime/securesms/service/SmsListenerTest.java b/test/androidTest/java/org/thoughtcrime/securesms/service/SmsListenerTest.java deleted file mode 100644 index 0e2ad03b6a..0000000000 --- a/test/androidTest/java/org/thoughtcrime/securesms/service/SmsListenerTest.java +++ /dev/null @@ -1,89 +0,0 @@ -/** - * Copyright (C) 2015 Open Whisper Systems - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.thoughtcrime.securesms.service; - -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.util.Log; - -import org.mockito.ArgumentCaptor; -import org.thoughtcrime.securesms.TextSecureTestCase; -import org.thoughtcrime.securesms.util.SmsUtil; - -import static org.mockito.Matchers.anyBoolean; -import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.anyString; -import static org.mockito.Matchers.contains; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -public class SmsListenerTest extends TextSecureTestCase { - - private static final String CHALLENGE_SMS_3_3 = "Your TextSecure verification code: 337-337"; - private static final String CHALLENGE_SMS_3_3_PREPEND = "XXX\nYour TextSecure verification code: 1337-1337"; - private static final String CHALLENGE_SMS_3_4 = "Your TextSecure verification code: 337-1337"; - private static final String CHALLENGE_SMS_4_3 = "Your TextSecure verification code: 1337-337"; - private static final String CHALLENGE_SMS_4_4 = "Your TextSecure verification code: 1337-1337"; - private static final String CHALLENGE_SMS_4_4_PREPEND = "XXXYour TextSecure verification code: 1337-1337"; - private static final String CHALLENGE_SMS_4_4_APPEND = "Your TextSecure verification code: 1337-1337XXX"; - private static final String[] CHALLENGE_SMS = { - CHALLENGE_SMS_3_3, CHALLENGE_SMS_3_3_PREPEND, CHALLENGE_SMS_3_4, CHALLENGE_SMS_4_3, - CHALLENGE_SMS_4_4, CHALLENGE_SMS_4_4_PREPEND, CHALLENGE_SMS_4_4_APPEND - }; - - private static final String CHALLENGE_3_3 = "337337"; - private static final String CHALLENGE_3_4 = "3371337"; - private static final String CHALLENGE_4_3 = "1337337"; - private static final String CHALLENGE_4_4 = "13371337"; - private static final String[] CHALLENGES = { - CHALLENGE_3_3, CHALLENGE_3_3, CHALLENGE_3_4, CHALLENGE_4_3, - CHALLENGE_4_4, CHALLENGE_4_4, CHALLENGE_4_4, - }; - - public void testReceiveChallenges() throws Exception { - final SmsListener smsListener = new SmsListener(); - - for (int i = 0; i < CHALLENGES.length; i++) { - final String CHALLENGE = CHALLENGES[i]; - final String CHALLENGE_SMS = SmsListenerTest.CHALLENGE_SMS[i]; - - final Context mockContext = mock(Context.class); - final SharedPreferences mockPreferences = mock(SharedPreferences.class); - final ArgumentCaptor intentCaptor = ArgumentCaptor.forClass(Intent.class); - - when(mockContext.getPackageName()).thenReturn(getContext().getPackageName()); - when(mockContext.getSharedPreferences(anyString(), anyInt())).thenReturn(mockPreferences); - when(mockPreferences.getBoolean(contains("pref_verifying"), anyBoolean())).thenReturn(true); - - try { - smsListener.onReceive(mockContext, SmsUtil.buildSmsReceivedIntent("15555555555", (CHALLENGE_SMS))); - } catch (IllegalStateException e) { - Log.d(getClass().getName(), "some api levels are picky with abortBroadcast()"); - } - - verify(mockContext, times(1)).sendBroadcast(intentCaptor.capture()); - - final Intent sendIntent = intentCaptor.getValue(); - assertTrue(sendIntent.getAction().equals(RegistrationService.CHALLENGE_EVENT)); - assertTrue(sendIntent.getStringExtra(RegistrationService.CHALLENGE_EXTRA).equals(CHALLENGE)); - } - } -} diff --git a/test/androidTest/java/org/thoughtcrime/securesms/util/SmsUtil.java b/test/androidTest/java/org/thoughtcrime/securesms/util/SmsUtil.java deleted file mode 100644 index 6ac5ca5c6f..0000000000 --- a/test/androidTest/java/org/thoughtcrime/securesms/util/SmsUtil.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) 2015 Open Whisper Systems - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.thoughtcrime.securesms.util; - -import android.annotation.SuppressLint; -import android.content.Intent; -import android.os.Bundle; -import android.provider.Telephony; -import android.telephony.PhoneNumberUtils; - -import java.io.ByteArrayOutputStream; -import java.lang.reflect.Method; -import java.util.Calendar; -import java.util.GregorianCalendar; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -public class SmsUtil { - - private static byte reverseByte(byte b) { - return (byte) ((b & 0xF0) >> 4 | (b & 0x0F) << 4); - } - - /* - credit :D - http://stackoverflow.com/a/12338541 - */ - @SuppressWarnings("unchecked") - public static byte[] buildSmsPdu(String senderPstnNumber, String body) throws Exception{ - byte[] scBytes = PhoneNumberUtils.networkPortionToCalledPartyBCD("0000000000"); - byte[] senderBytes = PhoneNumberUtils.networkPortionToCalledPartyBCD(senderPstnNumber); - int lsmcs = scBytes.length; - byte[] dateBytes = new byte[7]; - Calendar calendar = new GregorianCalendar(); - - dateBytes[0] = reverseByte((byte) (calendar.get(Calendar.YEAR))); - dateBytes[1] = reverseByte((byte) (calendar.get(Calendar.MONTH) + 1)); - dateBytes[2] = reverseByte((byte) (calendar.get(Calendar.DAY_OF_MONTH))); - dateBytes[3] = reverseByte((byte) (calendar.get(Calendar.HOUR_OF_DAY))); - dateBytes[4] = reverseByte((byte) (calendar.get(Calendar.MINUTE))); - dateBytes[5] = reverseByte((byte) (calendar.get(Calendar.SECOND))); - dateBytes[6] = reverseByte((byte) ((calendar.get(Calendar.ZONE_OFFSET) + calendar.get(Calendar.DST_OFFSET)) / (60 * 1000 * 15))); - - ByteArrayOutputStream bo = new ByteArrayOutputStream(); - bo.write(lsmcs); - bo.write(scBytes); - bo.write(0x04); - bo.write((byte) senderPstnNumber.length()); - bo.write(senderBytes); - bo.write(0x00); - bo.write(0x00); - bo.write(dateBytes); - - String sReflectedClassName = "com.android.internal.telephony.GsmAlphabet"; - Class cReflectedNFCExtras = Class.forName(sReflectedClassName); - Method stringToGsm7BitPacked = cReflectedNFCExtras.getMethod("stringToGsm7BitPacked", new Class[] { String.class }); - - stringToGsm7BitPacked.setAccessible(true); - byte[] bodybytes = (byte[]) stringToGsm7BitPacked.invoke(null, body); - bo.write(bodybytes); - - return bo.toByteArray(); - } - - @SuppressLint("NewApi") - public static Intent buildSmsReceivedIntent(String senderPstnNumber, String smsBody) throws Exception { - final Intent smsIntent = mock(Intent.class); - final Bundle smsExtras = new Bundle(); - final byte[] smsPdu = SmsUtil.buildSmsPdu(senderPstnNumber, smsBody); - - smsExtras.putSerializable("pdus", new Object[]{smsPdu}); - - when(smsIntent.getAction()).thenReturn(Telephony.Sms.Intents.SMS_RECEIVED_ACTION); - when(smsIntent.getExtras()).thenReturn(smsExtras); - - return smsIntent; - } - -} diff --git a/test/unitTest/java/org/thoughtcrime/securesms/BaseUnitTest.java b/test/unitTest/java/org/thoughtcrime/securesms/BaseUnitTest.java index 18ad13b1aa..69dd6f0302 100644 --- a/test/unitTest/java/org/thoughtcrime/securesms/BaseUnitTest.java +++ b/test/unitTest/java/org/thoughtcrime/securesms/BaseUnitTest.java @@ -4,6 +4,7 @@ import android.content.Context; import android.content.SharedPreferences; import android.os.Handler; import android.os.Looper; +import android.preference.PreferenceManager; import android.text.TextUtils; import android.util.Log; @@ -16,8 +17,6 @@ import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import org.thoughtcrime.securesms.crypto.MasterSecret; -import java.util.Set; - import javax.crypto.spec.SecretKeySpec; import static org.mockito.Matchers.any; @@ -26,27 +25,29 @@ import static org.mockito.Matchers.anyFloat; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyLong; import static org.mockito.Matchers.anyString; -import static org.powermock.api.mockito.PowerMockito.doReturn; import static org.powermock.api.mockito.PowerMockito.mock; import static org.powermock.api.mockito.PowerMockito.mockStatic; import static org.powermock.api.mockito.PowerMockito.when; @RunWith(PowerMockRunner.class) -@PrepareForTest({ Log.class, Handler.class, Looper.class, TextUtils.class }) +@PrepareForTest({ Log.class, Handler.class, Looper.class, TextUtils.class, PreferenceManager.class }) public abstract class BaseUnitTest { - protected Context context; protected MasterSecret masterSecret; + protected Context context = mock(Context.class); + protected SharedPreferences sharedPreferences = mock(SharedPreferences.class); + @Before public void setUp() throws Exception { - context = mock(Context.class); masterSecret = new MasterSecret(new SecretKeySpec(new byte[16], "AES"), new SecretKeySpec(new byte[16], "HmacSHA1")); mockStatic(Looper.class); mockStatic(Log.class); mockStatic(Handler.class); mockStatic(TextUtils.class); + mockStatic(PreferenceManager.class); + when(PreferenceManager.getDefaultSharedPreferences(any(Context.class))).thenReturn(sharedPreferences); when(Looper.getMainLooper()).thenReturn(null); PowerMockito.whenNew(Handler.class).withAnyArguments().thenReturn(null); @@ -72,12 +73,12 @@ public abstract class BaseUnitTest { } }).when(TextUtils.class, "isEmpty", anyString()); - SharedPreferences mockSharedPreferences = mock(SharedPreferences.class); - when(mockSharedPreferences.getString(anyString(), anyString())).thenReturn(""); - when(mockSharedPreferences.getLong(anyString(), anyLong())).thenReturn(0L); - when(mockSharedPreferences.getInt(anyString(), anyInt())).thenReturn(0); - when(mockSharedPreferences.getBoolean(anyString(), anyBoolean())).thenReturn(false); - when(mockSharedPreferences.getFloat(anyString(), anyFloat())).thenReturn(0f); - when(context.getSharedPreferences(anyString(), anyInt())).thenReturn(mockSharedPreferences); + when(sharedPreferences.getString(anyString(), anyString())).thenReturn(""); + when(sharedPreferences.getLong(anyString(), anyLong())).thenReturn(0L); + when(sharedPreferences.getInt(anyString(), anyInt())).thenReturn(0); + when(sharedPreferences.getBoolean(anyString(), anyBoolean())).thenReturn(false); + when(sharedPreferences.getFloat(anyString(), anyFloat())).thenReturn(0f); + when(context.getSharedPreferences(anyString(), anyInt())).thenReturn(sharedPreferences); + when(context.getPackageName()).thenReturn("org.thoughtcrime.securesms"); } } diff --git a/test/androidTest/java/org/thoughtcrime/securesms/jobs/CleanPreKeysJobTest.java b/test/unitTest/java/org/thoughtcrime/securesms/jobs/CleanPreKeysJobTest.java similarity index 92% rename from test/androidTest/java/org/thoughtcrime/securesms/jobs/CleanPreKeysJobTest.java rename to test/unitTest/java/org/thoughtcrime/securesms/jobs/CleanPreKeysJobTest.java index 72ef293f12..8215dfa69b 100644 --- a/test/androidTest/java/org/thoughtcrime/securesms/jobs/CleanPreKeysJobTest.java +++ b/test/unitTest/java/org/thoughtcrime/securesms/jobs/CleanPreKeysJobTest.java @@ -1,6 +1,7 @@ package org.thoughtcrime.securesms.jobs; -import org.thoughtcrime.securesms.TextSecureTestCase; +import org.junit.Test; +import org.thoughtcrime.securesms.BaseUnitTest; import org.thoughtcrime.securesms.crypto.MasterSecret; import org.thoughtcrime.securesms.dependencies.AxolotlStorageModule; import org.whispersystems.libaxolotl.ecc.Curve; @@ -18,6 +19,7 @@ import dagger.Module; import dagger.ObjectGraph; import dagger.Provides; +import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; @@ -27,15 +29,15 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; -public class CleanPreKeysJobTest extends TextSecureTestCase { - +public class CleanPreKeysJobTest extends BaseUnitTest { + @Test public void testSignedPreKeyRotationNotRegistered() throws IOException, MasterSecretJob.RequirementNotMetException { TextSecureAccountManager accountManager = mock(TextSecureAccountManager.class); SignedPreKeyStore signedPreKeyStore = mock(SignedPreKeyStore.class); MasterSecret masterSecret = mock(MasterSecret.class); when(accountManager.getSignedPreKey()).thenReturn(null); - CleanPreKeysJob cleanPreKeysJob = new CleanPreKeysJob(getContext()); + CleanPreKeysJob cleanPreKeysJob = new CleanPreKeysJob(context); ObjectGraph objectGraph = ObjectGraph.create(new TestModule(accountManager, signedPreKeyStore)); objectGraph.inject(cleanPreKeysJob); @@ -46,6 +48,7 @@ public class CleanPreKeysJobTest extends TextSecureTestCase { verifyNoMoreInteractions(signedPreKeyStore); } + @Test public void testSignedPreKeyEviction() throws Exception { SignedPreKeyStore signedPreKeyStore = mock(SignedPreKeyStore.class); TextSecureAccountManager accountManager = mock(TextSecureAccountManager.class); @@ -68,7 +71,7 @@ public class CleanPreKeysJobTest extends TextSecureTestCase { when(signedPreKeyStore.loadSignedPreKeys()).thenReturn(records); when(signedPreKeyStore.loadSignedPreKey(eq(3133))).thenReturn(currentRecord); - CleanPreKeysJob cleanPreKeysJob = new CleanPreKeysJob(getContext()); + CleanPreKeysJob cleanPreKeysJob = new CleanPreKeysJob(context); ObjectGraph objectGraph = ObjectGraph.create(new TestModule(accountManager, signedPreKeyStore)); objectGraph.inject(cleanPreKeysJob); @@ -79,6 +82,7 @@ public class CleanPreKeysJobTest extends TextSecureTestCase { verify(signedPreKeyStore, times(1)).removeSignedPreKey(anyInt()); } + @Test public void testSignedPreKeyNoEviction() throws Exception { SignedPreKeyStore signedPreKeyStore = mock(SignedPreKeyStore.class); TextSecureAccountManager accountManager = mock(TextSecureAccountManager.class); @@ -96,7 +100,7 @@ public class CleanPreKeysJobTest extends TextSecureTestCase { when(signedPreKeyStore.loadSignedPreKeys()).thenReturn(records); when(signedPreKeyStore.loadSignedPreKey(eq(3133))).thenReturn(currentRecord); - CleanPreKeysJob cleanPreKeysJob = new CleanPreKeysJob(getContext()); + CleanPreKeysJob cleanPreKeysJob = new CleanPreKeysJob(context); ObjectGraph objectGraph = ObjectGraph.create(new TestModule(accountManager, signedPreKeyStore)); objectGraph.inject(cleanPreKeysJob); @@ -104,6 +108,7 @@ public class CleanPreKeysJobTest extends TextSecureTestCase { verify(signedPreKeyStore, never()).removeSignedPreKey(anyInt()); } + @Test public void testConnectionError() throws Exception { SignedPreKeyStore signedPreKeyStore = mock(SignedPreKeyStore.class); TextSecureAccountManager accountManager = mock(TextSecureAccountManager.class); @@ -111,7 +116,7 @@ public class CleanPreKeysJobTest extends TextSecureTestCase { when(accountManager.getSignedPreKey()).thenThrow(new PushNetworkException("Connectivity error!")); - CleanPreKeysJob cleanPreKeysJob = new CleanPreKeysJob(getContext()); + CleanPreKeysJob cleanPreKeysJob = new CleanPreKeysJob(context); ObjectGraph objectGraph = ObjectGraph.create(new TestModule(accountManager, signedPreKeyStore)); objectGraph.inject(cleanPreKeysJob); @@ -148,5 +153,4 @@ public class CleanPreKeysJobTest extends TextSecureTestCase { }; } } - } diff --git a/test/androidTest/java/org/thoughtcrime/securesms/jobs/DeliveryReceiptJobTest.java b/test/unitTest/java/org/thoughtcrime/securesms/jobs/DeliveryReceiptJobTest.java similarity index 88% rename from test/androidTest/java/org/thoughtcrime/securesms/jobs/DeliveryReceiptJobTest.java rename to test/unitTest/java/org/thoughtcrime/securesms/jobs/DeliveryReceiptJobTest.java index 7bcdc5136a..da74965949 100644 --- a/test/androidTest/java/org/thoughtcrime/securesms/jobs/DeliveryReceiptJobTest.java +++ b/test/unitTest/java/org/thoughtcrime/securesms/jobs/DeliveryReceiptJobTest.java @@ -1,8 +1,10 @@ package org.thoughtcrime.securesms.jobs; +import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; -import org.thoughtcrime.securesms.TextSecureTestCase; +import org.thoughtcrime.securesms.BaseUnitTest; +import org.thoughtcrime.securesms.dependencies.TextSecureCommunicationModule.TextSecureMessageSenderFactory; import org.whispersystems.textsecure.api.TextSecureMessageSender; import org.whispersystems.textsecure.api.push.TextSecureAddress; import org.whispersystems.textsecure.api.push.exceptions.NotFoundException; @@ -14,19 +16,20 @@ import dagger.Module; import dagger.ObjectGraph; import dagger.Provides; +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; -import static org.thoughtcrime.securesms.dependencies.TextSecureCommunicationModule.TextSecureMessageSenderFactory; - -public class DeliveryReceiptJobTest extends TextSecureTestCase { +public class DeliveryReceiptJobTest extends BaseUnitTest { + @Test public void testDelivery() throws IOException { TextSecureMessageSender textSecureMessageSender = mock(TextSecureMessageSender.class); long timestamp = System.currentTimeMillis(); - DeliveryReceiptJob deliveryReceiptJob = new DeliveryReceiptJob(getContext(), + DeliveryReceiptJob deliveryReceiptJob = new DeliveryReceiptJob(context, "+14152222222", timestamp, "foo"); @@ -51,7 +54,7 @@ public class DeliveryReceiptJobTest extends TextSecureTestCase { .sendDeliveryReceipt(any(TextSecureAddress.class), eq(timestamp)); - DeliveryReceiptJob deliveryReceiptJob = new DeliveryReceiptJob(getContext(), + DeliveryReceiptJob deliveryReceiptJob = new DeliveryReceiptJob(context, "+14152222222", timestamp, "foo"); @@ -86,7 +89,8 @@ public class DeliveryReceiptJobTest extends TextSecureTestCase { this.textSecureMessageSender = textSecureMessageSender; } - @Provides TextSecureMessageSenderFactory provideTextSecureMessageSenderFactory() { + @Provides + TextSecureMessageSenderFactory provideTextSecureMessageSenderFactory() { return new TextSecureMessageSenderFactory() { @Override public TextSecureMessageSender create() { diff --git a/test/unitTest/java/org/thoughtcrime/securesms/service/SmsListenerTest.java b/test/unitTest/java/org/thoughtcrime/securesms/service/SmsListenerTest.java new file mode 100644 index 0000000000..a511b61f61 --- /dev/null +++ b/test/unitTest/java/org/thoughtcrime/securesms/service/SmsListenerTest.java @@ -0,0 +1,48 @@ +package org.thoughtcrime.securesms.service; + +import junit.framework.AssertionFailedError; + +import org.junit.Before; +import org.junit.Test; +import org.thoughtcrime.securesms.BaseUnitTest; + +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Matchers.anyBoolean; +import static org.mockito.Matchers.contains; +import static org.mockito.Mockito.when; + +public class SmsListenerTest extends BaseUnitTest { + private static Map CHALLENGES = new HashMap() {{ + put("Your TextSecure verification code: 337-337", "337337"); + put("XXX\nYour TextSecure verification code: 1337-1337", "13371337"); + put("Your TextSecure verification code: 337-1337", "3371337"); + put("Your TextSecure verification code: 1337-337", "1337337"); + put("Your TextSecure verification code: 1337-1337", "13371337"); + put("XXXYour TextSecure verification code: 1337-1337", "13371337"); + put("Your TextSecure verification code: 1337-1337XXX", "13371337"); + }}; + + private SmsListener listener; + + @Before + @Override + public void setUp() throws Exception { + super.setUp(); + listener = new SmsListener(); + when(sharedPreferences.getBoolean(contains("pref_verifying"), anyBoolean())).thenReturn(true); + } + + @Test + public void testChallenges() throws Exception { + for (Entry challenge : CHALLENGES.entrySet()) { + if (!listener.isChallenge(context, challenge.getKey())) { + throw new AssertionFailedError("SmsListener didn't recognize body as a challenge."); + } + assertEquals(listener.parseChallenge(challenge.getKey()), challenge.getValue()); + } + } +}