diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberViewModelTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberViewModelTest.kt index 8c2579f1c8..ed95f6c680 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberViewModelTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberViewModelTest.kt @@ -10,13 +10,11 @@ import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith -import org.mockito.kotlin.mock import org.signal.core.util.ThreadUtil import org.signal.libsignal.protocol.state.SignedPreKeyRecord import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.dependencies.InstrumentationApplicationDependencyProvider import org.thoughtcrime.securesms.keyvalue.SignalStore -import org.thoughtcrime.securesms.pin.KbsRepository import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.registration.VerifyAccountRepository import org.thoughtcrime.securesms.registration.VerifyResponseProcessor @@ -48,20 +46,17 @@ class ChangeNumberViewModelTest { val harness = SignalActivityRule() private lateinit var viewModel: ChangeNumberViewModel - private lateinit var kbsRepository: KbsRepository @Before fun setUp() { ApplicationDependencies.getSignalServiceAccountManager().setSoTimeoutMillis(1000) - kbsRepository = mock() ThreadUtil.runOnMainSync { viewModel = ChangeNumberViewModel( localNumber = harness.self.requireE164(), changeNumberRepository = ChangeNumberRepository(), savedState = SavedStateHandle(), password = SignalStore.account().servicePassword!!, - verifyAccountRepository = VerifyAccountRepository(harness.application), - kbsRepository = kbsRepository + verifyAccountRepository = VerifyAccountRepository(harness.application) ) viewModel.setNewCountry(1) @@ -235,7 +230,7 @@ class ChangeNumberViewModelTest { lateinit var changeNumberRequest: ChangePhoneNumberRequest lateinit var setPreKeysRequest: PreKeyState - MockProvider.mockGetRegistrationLockStringFlow(kbsRepository) + MockProvider.mockGetRegistrationLockStringFlow() InstrumentationApplicationDependencyProvider.addMockWebRequestHandlers( Post("/v1/verification/session") { MockResponse().success(MockProvider.sessionMetadataJson.copy(verified = false)) }, @@ -323,7 +318,7 @@ class ChangeNumberViewModelTest { lateinit var changeNumberRequest: ChangePhoneNumberRequest lateinit var setPreKeysRequest: PreKeyState - MockProvider.mockGetRegistrationLockStringFlow(kbsRepository) + MockProvider.mockGetRegistrationLockStringFlow() InstrumentationApplicationDependencyProvider.addMockWebRequestHandlers( Post("/v1/verification/session") { MockResponse().success(MockProvider.sessionMetadataJson.copy(verified = false)) }, diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShapeTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShapeTest.kt index b4fc41234a..d0a625017a 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShapeTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShapeTest.kt @@ -211,6 +211,9 @@ class V2ConversationItemShapeTest { override val displayMode: ConversationItemDisplayMode = ConversationItemDisplayMode.STANDARD override val clickListener: ConversationAdapter.ItemClickListener = FakeConversationItemClickListener + override val selectedItems: Set = emptySet() + override val isMessageRequestAccepted: Boolean = true + override val searchQuery: String? = null override fun onStartExpirationTimeout(messageRecord: MessageRecord) = Unit diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/AttachmentTableTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/AttachmentTableTest.kt index 9ec88c352c..6895d57ab7 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/AttachmentTableTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/AttachmentTableTest.kt @@ -6,6 +6,7 @@ import androidx.test.filters.FlakyTest import org.junit.Assert.assertEquals import org.junit.Assert.assertNotEquals import org.junit.Before +import org.junit.Ignore import org.junit.Test import org.junit.runner.RunWith import org.thoughtcrime.securesms.attachments.UriAttachment @@ -64,6 +65,7 @@ class AttachmentTableTest { } @FlakyTest + @Ignore("test is flaky") @Test fun givenIdenticalAttachmentsInsertedForPreUpload_whenIUpdateAttachmentDataAndSpecifyOnlyModifyThisAttachment_thenIExpectDifferentFileInfos() { val blob = BlobProvider.getInstance().forData(byteArrayOf(1, 2, 3, 4, 5)).createForSingleSessionInMemory() diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/CallTableTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/CallTableTest.kt index 36d9ebeaad..9836db3e9e 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/CallTableTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/CallTableTest.kt @@ -10,13 +10,17 @@ import org.junit.Test import org.junit.runner.RunWith import org.signal.ringrtc.CallId import org.signal.ringrtc.CallManager +import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.testing.SignalActivityRule @RunWith(AndroidJUnit4::class) class CallTableTest { @get:Rule - val harness = SignalActivityRule() + val harness = SignalActivityRule(createGroup = true) + + private val groupRecipientId: RecipientId + get() = harness.group!!.recipientId @Test fun givenACall_whenISetTimestamp_thenIExpectUpdatedTimestamp() { @@ -24,13 +28,13 @@ class CallTableTest { val now = System.currentTimeMillis() SignalDatabase.calls.insertAcceptedGroupCall( callId, - harness.others[0], + groupRecipientId, CallTable.Direction.INCOMING, now ) - SignalDatabase.calls.setTimestamp(callId, harness.others[0], -1L) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + SignalDatabase.calls.setTimestamp(callId, groupRecipientId, -1L) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) assertEquals(-1L, call?.timestamp) @@ -45,15 +49,15 @@ class CallTableTest { val now = System.currentTimeMillis() SignalDatabase.calls.insertAcceptedGroupCall( callId, - harness.others[0], + groupRecipientId, CallTable.Direction.INCOMING, now ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) SignalDatabase.calls.deleteGroupCall(call!!) - val deletedCall = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val deletedCall = SignalDatabase.calls.getCallById(callId, groupRecipientId) val oldestDeletionTimestamp = SignalDatabase.calls.getOldestDeletionTimestamp() assertEquals(CallTable.Event.DELETE, deletedCall?.event) @@ -66,12 +70,12 @@ class CallTableTest { val callId = 1L SignalDatabase.calls.insertDeletedGroupCallFromSyncEvent( callId, - harness.others[0], + groupRecipientId, CallTable.Direction.OUTGOING, System.currentTimeMillis() ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) val oldestDeletionTimestamp = SignalDatabase.calls.getOldestDeletionTimestamp() @@ -86,12 +90,12 @@ class CallTableTest { val callId = 1L SignalDatabase.calls.insertAcceptedGroupCall( callId, - harness.others[0], + groupRecipientId, CallTable.Direction.OUTGOING, System.currentTimeMillis() ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) assertEquals(CallTable.Event.OUTGOING_RING, call?.event) assertEquals(harness.self.id, call?.ringerRecipient) @@ -103,12 +107,12 @@ class CallTableTest { val callId = 1L SignalDatabase.calls.insertAcceptedGroupCall( callId, - harness.others[0], + groupRecipientId, CallTable.Direction.INCOMING, System.currentTimeMillis() ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) assertEquals(CallTable.Event.JOINED, call?.event) assertNull(call?.ringerRecipient) @@ -120,13 +124,13 @@ class CallTableTest { val callId = 1L SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( ringId = callId, - groupRecipientId = harness.others[0], + groupRecipientId = groupRecipientId, ringerRecipient = harness.others[1], dateReceived = System.currentTimeMillis(), ringState = CallManager.RingUpdate.REQUESTED ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) assertEquals(CallTable.Event.RINGING, call?.event) @@ -134,7 +138,7 @@ class CallTableTest { call!! ) - val acceptedCall = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val acceptedCall = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertEquals(CallTable.Event.ACCEPTED, acceptedCall?.event) } @@ -143,13 +147,13 @@ class CallTableTest { val callId = 1L SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( ringId = callId, - groupRecipientId = harness.others[0], + groupRecipientId = groupRecipientId, ringerRecipient = harness.others[1], dateReceived = System.currentTimeMillis(), ringState = CallManager.RingUpdate.EXPIRED_REQUEST ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) assertEquals(CallTable.Event.MISSED, call?.event) @@ -157,7 +161,7 @@ class CallTableTest { call!! ) - val acceptedCall = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val acceptedCall = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertEquals(CallTable.Event.ACCEPTED, acceptedCall?.event) } @@ -166,13 +170,13 @@ class CallTableTest { val callId = 1L SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( ringId = callId, - groupRecipientId = harness.others[0], + groupRecipientId = groupRecipientId, ringerRecipient = harness.others[1], dateReceived = System.currentTimeMillis(), ringState = CallManager.RingUpdate.DECLINED_ON_ANOTHER_DEVICE ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) assertEquals(CallTable.Event.DECLINED, call?.event) @@ -180,7 +184,7 @@ class CallTableTest { call!! ) - val acceptedCall = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val acceptedCall = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertEquals(CallTable.Event.ACCEPTED, acceptedCall?.event) } @@ -189,7 +193,7 @@ class CallTableTest { val era = "aaa" val callId = CallId.fromEra(era).longValue() SignalDatabase.calls.insertOrUpdateGroupCallFromLocalEvent( - groupRecipientId = harness.others[0], + groupRecipientId = groupRecipientId, sender = harness.others[1], timestamp = System.currentTimeMillis(), peekGroupCallEraId = "aaa", @@ -197,7 +201,7 @@ class CallTableTest { isCallFull = false ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) assertEquals(CallTable.Event.GENERIC_GROUP_CALL, call?.event) @@ -205,7 +209,7 @@ class CallTableTest { call!! ) - val acceptedCall = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val acceptedCall = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertEquals(CallTable.Event.JOINED, acceptedCall?.event) } @@ -214,7 +218,7 @@ class CallTableTest { val era = "aaa" val callId = CallId.fromEra(era).longValue() SignalDatabase.calls.insertOrUpdateGroupCallFromLocalEvent( - groupRecipientId = harness.others[0], + groupRecipientId = groupRecipientId, sender = harness.others[1], timestamp = System.currentTimeMillis(), peekGroupCallEraId = "aaa", @@ -222,7 +226,7 @@ class CallTableTest { isCallFull = false ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) assertEquals(CallTable.Event.GENERIC_GROUP_CALL, call?.event) } @@ -233,7 +237,7 @@ class CallTableTest { val callId = CallId.fromEra(era).longValue() val now = System.currentTimeMillis() SignalDatabase.calls.insertOrUpdateGroupCallFromLocalEvent( - groupRecipientId = harness.others[0], + groupRecipientId = groupRecipientId, sender = harness.others[1], timestamp = now, peekGroupCallEraId = "aaa", @@ -241,13 +245,13 @@ class CallTableTest { isCallFull = false ) - SignalDatabase.calls.getCallById(callId, harness.others[0]).let { + SignalDatabase.calls.getCallById(callId, groupRecipientId).let { assertNotNull(it) assertEquals(now, it?.timestamp) } SignalDatabase.calls.insertOrUpdateGroupCallFromLocalEvent( - groupRecipientId = harness.others[0], + groupRecipientId = groupRecipientId, sender = harness.others[1], timestamp = 1L, peekGroupCallEraId = "aaa", @@ -255,7 +259,7 @@ class CallTableTest { isCallFull = false ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) assertEquals(CallTable.Event.GENERIC_GROUP_CALL, call?.event) assertEquals(1L, call?.timestamp) @@ -266,20 +270,20 @@ class CallTableTest { val callId = 1L SignalDatabase.calls.insertDeletedGroupCallFromSyncEvent( callId = callId, - recipientId = harness.others[0], + recipientId = groupRecipientId, direction = CallTable.Direction.INCOMING, timestamp = System.currentTimeMillis() ) SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( ringId = callId, - groupRecipientId = harness.others[0], + groupRecipientId = groupRecipientId, ringerRecipient = harness.others[1], dateReceived = System.currentTimeMillis(), ringState = CallManager.RingUpdate.REQUESTED ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) assertEquals(CallTable.Event.DELETE, call?.event) } @@ -290,7 +294,7 @@ class CallTableTest { val callId = CallId.fromEra(era).longValue() val now = System.currentTimeMillis() SignalDatabase.calls.insertOrUpdateGroupCallFromLocalEvent( - groupRecipientId = harness.others[0], + groupRecipientId = groupRecipientId, sender = harness.others[1], timestamp = now, peekGroupCallEraId = "aaa", @@ -300,13 +304,13 @@ class CallTableTest { SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, - harness.others[0], + groupRecipientId, harness.others[1], System.currentTimeMillis(), CallManager.RingUpdate.REQUESTED ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) assertEquals(CallTable.Event.RINGING, call?.event) assertEquals(harness.others[1], call?.ringerRecipient) @@ -319,20 +323,20 @@ class CallTableTest { val now = System.currentTimeMillis() SignalDatabase.calls.insertAcceptedGroupCall( callId, - harness.others[0], + groupRecipientId, CallTable.Direction.INCOMING, now ) SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, - harness.others[0], + groupRecipientId, harness.others[1], System.currentTimeMillis(), CallManager.RingUpdate.REQUESTED ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) assertEquals(CallTable.Event.ACCEPTED, call?.event) assertEquals(harness.others[1], call?.ringerRecipient) @@ -344,7 +348,7 @@ class CallTableTest { val callId = CallId.fromEra(era).longValue() val now = System.currentTimeMillis() SignalDatabase.calls.insertOrUpdateGroupCallFromLocalEvent( - groupRecipientId = harness.others[0], + groupRecipientId = groupRecipientId, sender = harness.others[1], timestamp = now, peekGroupCallEraId = "aaa", @@ -354,13 +358,13 @@ class CallTableTest { SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, - harness.others[0], + groupRecipientId, harness.others[1], System.currentTimeMillis(), CallManager.RingUpdate.EXPIRED_REQUEST ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) assertEquals(CallTable.Event.MISSED, call?.event) assertEquals(harness.others[1], call?.ringerRecipient) @@ -372,7 +376,7 @@ class CallTableTest { val callId = CallId.fromEra(era).longValue() val now = System.currentTimeMillis() SignalDatabase.calls.insertOrUpdateGroupCallFromLocalEvent( - groupRecipientId = harness.others[0], + groupRecipientId = groupRecipientId, sender = harness.others[1], timestamp = now, peekGroupCallEraId = "aaa", @@ -382,7 +386,7 @@ class CallTableTest { SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, - harness.others[0], + groupRecipientId, harness.others[1], System.currentTimeMillis(), CallManager.RingUpdate.REQUESTED @@ -390,13 +394,13 @@ class CallTableTest { SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, - harness.others[0], + groupRecipientId, harness.others[1], System.currentTimeMillis(), CallManager.RingUpdate.EXPIRED_REQUEST ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) assertEquals(CallTable.Event.MISSED, call?.event) assertEquals(harness.others[1], call?.ringerRecipient) @@ -409,20 +413,20 @@ class CallTableTest { val now = System.currentTimeMillis() SignalDatabase.calls.insertAcceptedGroupCall( callId, - harness.others[0], + groupRecipientId, CallTable.Direction.INCOMING, now ) SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, - harness.others[0], + groupRecipientId, harness.others[1], System.currentTimeMillis(), CallManager.RingUpdate.BUSY_LOCALLY ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) assertEquals(CallTable.Event.ACCEPTED, call?.event) } @@ -434,20 +438,20 @@ class CallTableTest { val now = System.currentTimeMillis() SignalDatabase.calls.insertAcceptedGroupCall( callId, - harness.others[0], + groupRecipientId, CallTable.Direction.INCOMING, now ) SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, - harness.others[0], + groupRecipientId, harness.others[1], System.currentTimeMillis(), CallManager.RingUpdate.BUSY_ON_ANOTHER_DEVICE ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) assertEquals(CallTable.Event.ACCEPTED, call?.event) } @@ -458,7 +462,7 @@ class CallTableTest { val callId = CallId.fromEra(era).longValue() val now = System.currentTimeMillis() SignalDatabase.calls.insertOrUpdateGroupCallFromLocalEvent( - groupRecipientId = harness.others[0], + groupRecipientId = groupRecipientId, sender = harness.others[1], timestamp = now, peekGroupCallEraId = "aaa", @@ -468,7 +472,7 @@ class CallTableTest { SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, - harness.others[0], + groupRecipientId, harness.others[1], System.currentTimeMillis(), CallManager.RingUpdate.REQUESTED @@ -476,13 +480,13 @@ class CallTableTest { SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, - harness.others[0], + groupRecipientId, harness.others[1], System.currentTimeMillis(), CallManager.RingUpdate.BUSY_LOCALLY ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) assertEquals(CallTable.Event.MISSED, call?.event) } @@ -493,7 +497,7 @@ class CallTableTest { val callId = CallId.fromEra(era).longValue() val now = System.currentTimeMillis() SignalDatabase.calls.insertOrUpdateGroupCallFromLocalEvent( - groupRecipientId = harness.others[0], + groupRecipientId = groupRecipientId, sender = harness.others[1], timestamp = now, peekGroupCallEraId = "aaa", @@ -503,7 +507,7 @@ class CallTableTest { SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, - harness.others[0], + groupRecipientId, harness.others[1], System.currentTimeMillis(), CallManager.RingUpdate.REQUESTED @@ -511,13 +515,13 @@ class CallTableTest { SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, - harness.others[0], + groupRecipientId, harness.others[1], System.currentTimeMillis(), CallManager.RingUpdate.BUSY_ON_ANOTHER_DEVICE ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) assertEquals(CallTable.Event.MISSED, call?.event) } @@ -528,7 +532,7 @@ class CallTableTest { val callId = CallId.fromEra(era).longValue() val now = System.currentTimeMillis() SignalDatabase.calls.insertOrUpdateGroupCallFromLocalEvent( - groupRecipientId = harness.others[0], + groupRecipientId = groupRecipientId, sender = harness.others[1], timestamp = now, peekGroupCallEraId = "aaa", @@ -538,13 +542,13 @@ class CallTableTest { SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, - harness.others[0], + groupRecipientId, harness.others[1], System.currentTimeMillis(), CallManager.RingUpdate.ACCEPTED_ON_ANOTHER_DEVICE ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) assertEquals(CallTable.Event.ACCEPTED, call?.event) } @@ -556,7 +560,7 @@ class CallTableTest { SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, - harness.others[0], + groupRecipientId, harness.others[1], System.currentTimeMillis(), CallManager.RingUpdate.REQUESTED @@ -564,13 +568,13 @@ class CallTableTest { SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, - harness.others[0], + groupRecipientId, harness.others[1], System.currentTimeMillis(), CallManager.RingUpdate.DECLINED_ON_ANOTHER_DEVICE ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) assertEquals(CallTable.Event.DECLINED, call?.event) } @@ -582,7 +586,7 @@ class CallTableTest { SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, - harness.others[0], + groupRecipientId, harness.others[1], System.currentTimeMillis(), CallManager.RingUpdate.EXPIRED_REQUEST @@ -590,13 +594,13 @@ class CallTableTest { SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, - harness.others[0], + groupRecipientId, harness.others[1], System.currentTimeMillis(), CallManager.RingUpdate.DECLINED_ON_ANOTHER_DEVICE ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) assertEquals(CallTable.Event.DECLINED, call?.event) } @@ -608,20 +612,20 @@ class CallTableTest { SignalDatabase.calls.insertAcceptedGroupCall( callId, - harness.others[0], + groupRecipientId, CallTable.Direction.OUTGOING, System.currentTimeMillis() ) SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, - harness.others[0], + groupRecipientId, harness.others[1], System.currentTimeMillis(), CallManager.RingUpdate.DECLINED_ON_ANOTHER_DEVICE ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) assertEquals(CallTable.Event.OUTGOING_RING, call?.event) } @@ -631,13 +635,13 @@ class CallTableTest { val callId = 1L SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, - harness.others[0], + groupRecipientId, harness.others[1], System.currentTimeMillis(), CallManager.RingUpdate.REQUESTED ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) assertEquals(CallTable.Event.RINGING, call?.event) assertEquals(harness.others[1], call?.ringerRecipient) @@ -649,13 +653,13 @@ class CallTableTest { val callId = 1L SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, - harness.others[0], + groupRecipientId, harness.others[1], System.currentTimeMillis(), CallManager.RingUpdate.EXPIRED_REQUEST ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) assertEquals(CallTable.Event.MISSED, call?.event) assertEquals(harness.others[1], call?.ringerRecipient) @@ -667,13 +671,13 @@ class CallTableTest { val callId = 1L SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, - harness.others[0], + groupRecipientId, harness.others[1], System.currentTimeMillis(), CallManager.RingUpdate.CANCELLED_BY_RINGER ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) assertEquals(CallTable.Event.MISSED, call?.event) assertEquals(harness.others[1], call?.ringerRecipient) @@ -685,13 +689,13 @@ class CallTableTest { val callId = 1L SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, - harness.others[0], + groupRecipientId, harness.others[1], System.currentTimeMillis(), CallManager.RingUpdate.BUSY_LOCALLY ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) assertEquals(CallTable.Event.MISSED, call?.event) assertNotNull(call?.messageId) @@ -702,13 +706,13 @@ class CallTableTest { val callId = 1L SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, - harness.others[0], + groupRecipientId, harness.others[1], System.currentTimeMillis(), CallManager.RingUpdate.BUSY_ON_ANOTHER_DEVICE ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) assertEquals(CallTable.Event.MISSED, call?.event) assertNotNull(call?.messageId) @@ -719,13 +723,13 @@ class CallTableTest { val callId = 1L SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, - harness.others[0], + groupRecipientId, harness.others[1], System.currentTimeMillis(), CallManager.RingUpdate.ACCEPTED_ON_ANOTHER_DEVICE ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) assertEquals(CallTable.Event.ACCEPTED, call?.event) assertNotNull(call?.messageId) @@ -736,13 +740,13 @@ class CallTableTest { val callId = 1L SignalDatabase.calls.insertOrUpdateGroupCallFromRingState( callId, - harness.others[0], + groupRecipientId, harness.others[1], System.currentTimeMillis(), CallManager.RingUpdate.DECLINED_ON_ANOTHER_DEVICE ) - val call = SignalDatabase.calls.getCallById(callId, harness.others[0]) + val call = SignalDatabase.calls.getCallById(callId, groupRecipientId) assertNotNull(call) assertEquals(CallTable.Event.DECLINED, call?.event) assertNotNull(call?.messageId) diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/MessageTableTest_gifts.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/MessageTableTest_gifts.kt index 2484b751e1..cb60fa48fd 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/MessageTableTest_gifts.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/MessageTableTest_gifts.kt @@ -82,7 +82,7 @@ class MessageTableTest_gifts { MmsHelper.insert( recipient = Recipient.resolved(recipients[0]), - sentTimeMillis = 1, + sentTimeMillis = 2, giftBadge = GiftBadge.getDefaultInstance() ) @@ -102,7 +102,7 @@ class MessageTableTest_gifts { val messageId2 = MmsHelper.insert( recipient = Recipient.resolved(recipients[0]), - sentTimeMillis = 1, + sentTimeMillis = 2, giftBadge = GiftBadge.getDefaultInstance() ) @@ -121,13 +121,13 @@ class MessageTableTest_gifts { val messageId2 = MmsHelper.insert( recipient = Recipient.resolved(recipients[0]), - sentTimeMillis = 1, + sentTimeMillis = 2, giftBadge = GiftBadge.getDefaultInstance() ) MmsHelper.insert( recipient = Recipient.resolved(recipients[0]), - sentTimeMillis = 1, + sentTimeMillis = 3, giftBadge = null ) @@ -146,13 +146,13 @@ class MessageTableTest_gifts { val messageId2 = MmsHelper.insert( recipient = Recipient.resolved(recipients[0]), - sentTimeMillis = 1, + sentTimeMillis = 2, giftBadge = GiftBadge.getDefaultInstance() ) val messageId3 = MmsHelper.insert( recipient = Recipient.resolved(recipients[0]), - sentTimeMillis = 1, + sentTimeMillis = 3, giftBadge = null ) @@ -171,13 +171,13 @@ class MessageTableTest_gifts { MmsHelper.insert( recipient = Recipient.resolved(recipients[0]), - sentTimeMillis = 1, + sentTimeMillis = 2, giftBadge = GiftBadge.getDefaultInstance() ) val messageId3 = MmsHelper.insert( recipient = Recipient.resolved(recipients[0]), - sentTimeMillis = 1, + sentTimeMillis = 3, giftBadge = null ) diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/MmsTableTest_stories.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/MmsTableTest_stories.kt index c20399199d..7f626bdedf 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/MmsTableTest_stories.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/MmsTableTest_stories.kt @@ -253,8 +253,7 @@ class MmsTableTest_stories { val groupStoryId = MmsHelper.insert( recipient = myStory, sentTimeMillis = 200, - storyType = StoryType.STORY_WITH_REPLIES, - threadId = -1L + storyType = StoryType.STORY_WITH_REPLIES ) // WHEN @@ -319,8 +318,7 @@ class MmsTableTest_stories { val groupStoryId = MmsHelper.insert( recipient = myStory, sentTimeMillis = 200, - storyType = StoryType.STORY_WITH_REPLIES, - threadId = -1L + storyType = StoryType.STORY_WITH_REPLIES ) MmsHelper.insert( @@ -331,7 +329,7 @@ class MmsTableTest_stories { receivedTimeMillis = 202, parentStoryId = ParentStoryId.GroupReply(groupStoryId) ), - -1 + SignalDatabase.threads.getOrCreateThreadIdFor(myStory, ThreadTable.DistributionTypes.DEFAULT) ) // WHEN diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_getAndPossiblyMerge.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_getAndPossiblyMerge.kt index a28483185f..afc28b1e7f 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_getAndPossiblyMerge.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_getAndPossiblyMerge.kt @@ -858,6 +858,7 @@ class RecipientTableTest_getAndPossiblyMerge { } ApplicationDependencies.getRecipientCache().clear() + ApplicationDependencies.getRecipientCache().clearSelf() RecipientId.clearCache() } @@ -873,7 +874,7 @@ class RecipientTableTest_getAndPossiblyMerge { if (createThread) { // Create a thread and throw a dummy message in it so it doesn't get automatically deleted SignalDatabase.threads.getOrCreateThreadIdFor(Recipient.resolved(id)) - SignalDatabase.messages.insertMessageInbox(IncomingEncryptedMessage(IncomingTextMessage(id, 1, 0, 0, 0, "", Optional.empty(), 0, false, ""), "")) + SignalDatabase.messages.insertMessageInbox(IncomingEncryptedMessage(IncomingTextMessage(id, 1, (Math.random() * Long.MAX_VALUE).toLong(), 0, 0, "", Optional.empty(), 0, false, ""), "")) } if (pniSession) { diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/StorySendTableTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/StorySendTableTest.kt index b482a30cfa..e8ee5b2ec8 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/StorySendTableTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/StorySendTableTest.kt @@ -12,12 +12,14 @@ import org.junit.Assert.assertNotNull import org.junit.Assert.assertTrue import org.junit.Assert.fail import org.junit.Before +import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.thoughtcrime.securesms.database.model.DistributionListId import org.thoughtcrime.securesms.database.model.StoryType import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId +import org.thoughtcrime.securesms.testing.SignalActivityRule import org.whispersystems.signalservice.api.push.DistributionId import org.whispersystems.signalservice.api.push.ServiceId import java.util.UUID @@ -25,6 +27,9 @@ import java.util.UUID @RunWith(AndroidJUnit4::class) class StorySendTableTest { + @get:Rule + val harness = SignalActivityRule(othersCount = 0, createGroup = false) + private val distributionId1 = DistributionId.from(UUID.randomUUID()) private val distributionId2 = DistributionId.from(UUID.randomUUID()) private val distributionId3 = DistributionId.from(UUID.randomUUID()) diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/dependencies/InstrumentationApplicationDependencyProvider.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/dependencies/InstrumentationApplicationDependencyProvider.kt index 5697867e9a..3889c8688d 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/dependencies/InstrumentationApplicationDependencyProvider.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/dependencies/InstrumentationApplicationDependencyProvider.kt @@ -33,6 +33,7 @@ import org.whispersystems.signalservice.internal.configuration.SignalKeyBackupSe import org.whispersystems.signalservice.internal.configuration.SignalServiceConfiguration import org.whispersystems.signalservice.internal.configuration.SignalServiceUrl import org.whispersystems.signalservice.internal.configuration.SignalStorageUrl +import org.whispersystems.signalservice.internal.configuration.SignalSvr2Url import java.security.KeyStore import java.util.Optional @@ -74,20 +75,20 @@ class InstrumentationApplicationDependencyProvider(application: Application, def serviceTrustStore = SignalServiceTrustStore(application) uncensoredConfiguration = SignalServiceConfiguration( - arrayOf(SignalServiceUrl(baseUrl, "localhost", serviceTrustStore, ConnectionSpec.CLEARTEXT)), - mapOf( + signalServiceUrls = arrayOf(SignalServiceUrl(baseUrl, "localhost", serviceTrustStore, ConnectionSpec.CLEARTEXT)), + signalCdnUrlMap = mapOf( 0 to arrayOf(SignalCdnUrl(baseUrl, "localhost", serviceTrustStore, ConnectionSpec.CLEARTEXT)), 2 to arrayOf(SignalCdnUrl(baseUrl, "localhost", serviceTrustStore, ConnectionSpec.CLEARTEXT)) ), - arrayOf(SignalKeyBackupServiceUrl(baseUrl, "localhost", serviceTrustStore, ConnectionSpec.CLEARTEXT)), - arrayOf(SignalStorageUrl(baseUrl, "localhost", serviceTrustStore, ConnectionSpec.CLEARTEXT)), - arrayOf(SignalCdsiUrl(baseUrl, "localhost", serviceTrustStore, ConnectionSpec.CLEARTEXT)), - emptyArray(), - emptyList(), - Optional.of(SignalServiceNetworkAccess.DNS), - Optional.empty(), - Base64.decode(BuildConfig.ZKGROUP_SERVER_PUBLIC_PARAMS), - Base64.decode(BuildConfig.GENERIC_SERVER_PUBLIC_PARAMS) + signalKeyBackupServiceUrls = arrayOf(SignalKeyBackupServiceUrl(baseUrl, "localhost", serviceTrustStore, ConnectionSpec.CLEARTEXT)), + signalStorageUrls = arrayOf(SignalStorageUrl(baseUrl, "localhost", serviceTrustStore, ConnectionSpec.CLEARTEXT)), + signalCdsiUrls = arrayOf(SignalCdsiUrl(baseUrl, "localhost", serviceTrustStore, ConnectionSpec.CLEARTEXT)), + signalSvr2Urls = arrayOf(SignalSvr2Url(baseUrl, serviceTrustStore, "localhost", ConnectionSpec.CLEARTEXT)), + networkInterceptors = emptyList(), + dns = Optional.of(SignalServiceNetworkAccess.DNS), + signalProxy = Optional.empty(), + zkGroupServerPublicParams = Base64.decode(BuildConfig.ZKGROUP_SERVER_PUBLIC_PARAMS), + genericServerPublicParams = Base64.decode(BuildConfig.GENERIC_SERVER_PUBLIC_PARAMS) ) serviceNetworkAccessMock = mock { diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/jobs/PreKeysSyncJobTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/jobs/PreKeysSyncJobTest.kt deleted file mode 100644 index 52a2459645..0000000000 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/jobs/PreKeysSyncJobTest.kt +++ /dev/null @@ -1,212 +0,0 @@ -package org.thoughtcrime.securesms.jobs - -import androidx.test.ext.junit.runners.AndroidJUnit4 -import okhttp3.mockwebserver.MockResponse -import org.junit.After -import org.junit.Before -import org.junit.Rule -import org.junit.Test -import org.junit.runner.RunWith -import org.signal.libsignal.protocol.ecc.Curve -import org.thoughtcrime.securesms.crypto.storage.PreKeyMetadataStore -import org.thoughtcrime.securesms.dependencies.ApplicationDependencies -import org.thoughtcrime.securesms.dependencies.InstrumentationApplicationDependencyProvider -import org.thoughtcrime.securesms.jobmanager.Job -import org.thoughtcrime.securesms.keyvalue.SignalStore -import org.thoughtcrime.securesms.testing.Get -import org.thoughtcrime.securesms.testing.Put -import org.thoughtcrime.securesms.testing.SignalActivityRule -import org.thoughtcrime.securesms.testing.assertIs -import org.thoughtcrime.securesms.testing.assertIsNot -import org.thoughtcrime.securesms.testing.parsedRequestBody -import org.thoughtcrime.securesms.testing.success -import org.whispersystems.signalservice.api.push.SignedPreKeyEntity -import org.whispersystems.signalservice.internal.push.OneTimePreKeyCounts -import org.whispersystems.signalservice.internal.push.PreKeyState - -@RunWith(AndroidJUnit4::class) -class PreKeysSyncJobTest { - - @get:Rule - val harness = SignalActivityRule() - - private val aciPreKeyMeta: PreKeyMetadataStore - get() = SignalStore.account().aciPreKeys - - private val pniPreKeyMeta: PreKeyMetadataStore - get() = SignalStore.account().pniPreKeys - - private lateinit var job: PreKeysSyncJob - - @Before - fun setUp() { - job = PreKeysSyncJob() - } - - @After - fun tearDown() { - InstrumentationApplicationDependencyProvider.clearHandlers() - } - - /** - * Create signed prekeys for both identities when both do not have registered prekeys according - * to our local state. - */ - @Test - fun runWithoutRegisteredKeysForBothIdentities() { - // GIVEN - aciPreKeyMeta.isSignedPreKeyRegistered = false - pniPreKeyMeta.isSignedPreKeyRegistered = false - - lateinit var aciSignedPreKey: SignedPreKeyEntity - lateinit var pniSignedPreKey: SignedPreKeyEntity - - InstrumentationApplicationDependencyProvider.addMockWebRequestHandlers( - Put("/v2/keys/signed?identity=aci") { r -> - aciSignedPreKey = r.parsedRequestBody() - MockResponse().success() - }, - Put("/v2/keys/signed?identity=pni") { r -> - pniSignedPreKey = r.parsedRequestBody() - MockResponse().success() - } - ) - - // WHEN - val result: Job.Result = job.run() - - // THEN - result.isSuccess assertIs true - - aciPreKeyMeta.isSignedPreKeyRegistered assertIs true - pniPreKeyMeta.isSignedPreKeyRegistered assertIs true - - val aciVerifySignatureResult = Curve.verifySignature( - ApplicationDependencies.getProtocolStore().aci().identityKeyPair.publicKey.publicKey, - aciSignedPreKey.publicKey.serialize(), - aciSignedPreKey.signature - ) - aciVerifySignatureResult assertIs true - - val pniVerifySignatureResult = Curve.verifySignature( - ApplicationDependencies.getProtocolStore().pni().identityKeyPair.publicKey.publicKey, - pniSignedPreKey.publicKey.serialize(), - pniSignedPreKey.signature - ) - pniVerifySignatureResult assertIs true - } - - /** - * With 100 prekeys registered for each identity, do nothing. - */ - @Test - fun runWithRegisteredKeysForBothIdentities() { - // GIVEN - val currentAciKeyId = aciPreKeyMeta.activeSignedPreKeyId - val currentPniKeyId = pniPreKeyMeta.activeSignedPreKeyId - - InstrumentationApplicationDependencyProvider.addMockWebRequestHandlers( - Get("/v2/keys?identity=aci") { MockResponse().success(OneTimePreKeyCounts(100, 100)) }, - Get("/v2/keys?identity=pni") { MockResponse().success(OneTimePreKeyCounts(100, 100)) } - ) - - // WHEN - val result: Job.Result = job.run() - - // THEN - result.isSuccess assertIs true - - aciPreKeyMeta.activeSignedPreKeyId assertIs currentAciKeyId - pniPreKeyMeta.activeSignedPreKeyId assertIs currentPniKeyId - } - - /** - * With 100 prekeys registered for ACI, but no PNI prekeys registered according to local state, - * do nothing for ACI but create PNI prekeys and update local state. - */ - @Test - fun runWithRegisteredKeysForAciIdentityOnly() { - // GIVEN - pniPreKeyMeta.isSignedPreKeyRegistered = false - - val currentAciKeyId = aciPreKeyMeta.activeSignedPreKeyId - val currentPniKeyId = pniPreKeyMeta.activeSignedPreKeyId - - InstrumentationApplicationDependencyProvider.addMockWebRequestHandlers( - Get("/v2/keys?identity=aci") { MockResponse().success(OneTimePreKeyCounts(100, 100)) }, - Put("/v2/keys/signed?identity=pni") { MockResponse().success() } - ) - - // WHEN - val result: Job.Result = job.run() - - // THEN - result.isSuccess assertIs true - - pniPreKeyMeta.isSignedPreKeyRegistered assertIs true - aciPreKeyMeta.activeSignedPreKeyId assertIs currentAciKeyId - pniPreKeyMeta.activeSignedPreKeyId assertIsNot currentPniKeyId - } - - /** - * With <10 prekeys registered for each identity, upload new. - */ - @Test - fun runWithLowNumberOfRegisteredKeysForBothIdentities() { - // GIVEN - val currentAciKeyId = aciPreKeyMeta.activeSignedPreKeyId - val currentPniKeyId = pniPreKeyMeta.activeSignedPreKeyId - - val currentNextAciPreKeyId = aciPreKeyMeta.nextEcOneTimePreKeyId - val currentNextPniPreKeyId = pniPreKeyMeta.nextEcOneTimePreKeyId - - lateinit var aciPreKeyStateRequest: PreKeyState - lateinit var pniPreKeyStateRequest: PreKeyState - - InstrumentationApplicationDependencyProvider.addMockWebRequestHandlers( - Get("/v2/keys?identity=aci") { MockResponse().success(OneTimePreKeyCounts(5, 5)) }, - Get("/v2/keys?identity=pni") { MockResponse().success(OneTimePreKeyCounts(5, 5)) }, - Put("/v2/keys/?identity=aci") { r -> - aciPreKeyStateRequest = r.parsedRequestBody() - MockResponse().success() - }, - Put("/v2/keys/?identity=pni") { r -> - pniPreKeyStateRequest = r.parsedRequestBody() - MockResponse().success() - } - ) - - // WHEN - val result: Job.Result = job.run() - - // THEN - result.isSuccess assertIs true - aciPreKeyMeta.activeSignedPreKeyId assertIsNot currentAciKeyId - pniPreKeyMeta.activeSignedPreKeyId assertIsNot currentPniKeyId - - aciPreKeyMeta.nextEcOneTimePreKeyId assertIsNot currentNextAciPreKeyId - pniPreKeyMeta.nextEcOneTimePreKeyId assertIsNot currentNextPniPreKeyId - - ApplicationDependencies.getProtocolStore().aci().identityKeyPair.publicKey.let { aciIdentityKey -> - aciPreKeyStateRequest.identityKey assertIs aciIdentityKey - - val verifySignatureResult = Curve.verifySignature( - aciIdentityKey.publicKey, - aciPreKeyStateRequest.signedPreKey.publicKey.serialize(), - aciPreKeyStateRequest.signedPreKey.signature - ) - verifySignatureResult assertIs true - } - - ApplicationDependencies.getProtocolStore().pni().identityKeyPair.publicKey.let { pniIdentityKey -> - pniPreKeyStateRequest.identityKey assertIs pniIdentityKey - - val verifySignatureResult = Curve.verifySignature( - pniIdentityKey.publicKey, - pniPreKeyStateRequest.signedPreKey.publicKey.serialize(), - pniPreKeyStateRequest.signedPreKey.signature - ) - verifySignatureResult assertIs true - } - } -} diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/jobs/RefreshOwnProfileJob__checkUsernameIsInSyncTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/jobs/RefreshOwnProfileJob__checkUsernameIsInSyncTest.kt index e79f804715..5cc41aa90b 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/jobs/RefreshOwnProfileJob__checkUsernameIsInSyncTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/jobs/RefreshOwnProfileJob__checkUsernameIsInSyncTest.kt @@ -12,6 +12,7 @@ import org.signal.libsignal.usernames.Username import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.dependencies.InstrumentationApplicationDependencyProvider import org.thoughtcrime.securesms.keyvalue.SignalStore +import org.thoughtcrime.securesms.testing.Delete import org.thoughtcrime.securesms.testing.Get import org.thoughtcrime.securesms.testing.Put import org.thoughtcrime.securesms.testing.SignalActivityRule @@ -36,6 +37,11 @@ class RefreshOwnProfileJob__checkUsernameIsInSyncTest { @Test fun givenNoLocalUsername_whenICheckUsernameIsInSync_thenIExpectNoFailures() { + // GIVEN + InstrumentationApplicationDependencyProvider.addMockWebRequestHandlers( + Delete("/v1/accounts/username_hash") { MockResponse().success() } + ) + // WHEN RefreshOwnProfileJob.checkUsernameIsInSync() } diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/lock/PinHashing_hashPin_Test.java b/app/src/androidTest/java/org/thoughtcrime/securesms/lock/PinHashing_hashPin_Test.java index b3d6d7bd10..b63167add4 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/lock/PinHashing_hashPin_Test.java +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/lock/PinHashing_hashPin_Test.java @@ -22,10 +22,10 @@ public final class PinHashing_hashPin_Test { @Test public void argon2_hashed_pin_password() throws IOException { String pin = "password"; - byte[] backupId = Hex.fromStringCondensed("000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"); + byte[] salt = Hex.fromStringCondensed("000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"); MasterKey masterKey = new MasterKey(Hex.fromStringCondensed("202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f")); - PinHash hashedPin = PinHashUtil.hashPin(pin, new byte[]{}); + PinHash hashedPin = PinHashUtil.hashPin(pin, salt); KbsData kbsData = PinHashUtil.createNewKbsData(hashedPin, masterKey); assertArrayEquals(hashedPin.accessKey(), kbsData.getKbsAccessKey()); @@ -40,10 +40,10 @@ public final class PinHashing_hashPin_Test { @Test public void argon2_hashed_pin_another_password() throws IOException { String pin = "anotherpassword"; - byte[] backupId = Hex.fromStringCondensed("202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f"); + byte[] salt = Hex.fromStringCondensed("202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f"); MasterKey masterKey = new MasterKey(Hex.fromStringCondensed("88a787415a2ecd79da0d1016a82a27c5c695c9a19b88b0aa1d35683280aa9a67")); - PinHash hashedPin = PinHashUtil.hashPin(pin, new byte[]{}); + PinHash hashedPin = PinHashUtil.hashPin(pin, salt); KbsData kbsData = PinHashUtil.createNewKbsData(hashedPin, masterKey); assertArrayEquals(hashedPin.accessKey(), kbsData.getKbsAccessKey()); @@ -58,10 +58,10 @@ public final class PinHashing_hashPin_Test { @Test public void argon2_hashed_pin_password_with_spaces_diacritics_and_non_arabic_numerals() throws IOException { String pin = " Pass६örd "; - byte[] backupId = Hex.fromStringCondensed("cba811749042b303a6a7efa5ccd160aea5e3ea243c8d2692bd13d515732f51a8"); + byte[] salt = Hex.fromStringCondensed("cba811749042b303a6a7efa5ccd160aea5e3ea243c8d2692bd13d515732f51a8"); MasterKey masterKey = new MasterKey(Hex.fromStringCondensed("9571f3fde1e58588ba49bcf82be1b301ca3859a6f59076f79a8f47181ef952bf")); - PinHash hashedPin = PinHashUtil.hashPin(pin, new byte[]{}); + PinHash hashedPin = PinHashUtil.hashPin(pin, salt); KbsData kbsData = PinHashUtil.createNewKbsData(hashedPin, masterKey); assertArrayEquals(hashedPin.accessKey(), kbsData.getKbsAccessKey()); @@ -78,10 +78,10 @@ public final class PinHashing_hashPin_Test { @Test public void argon2_hashed_pin_password_with_just_non_arabic_numerals() throws IOException { String pin = " ६१८ "; - byte[] backupId = Hex.fromStringCondensed("717dc111a98423a57196512606822fca646c653facd037c10728f14ba0be2ab3"); + byte[] salt = Hex.fromStringCondensed("717dc111a98423a57196512606822fca646c653facd037c10728f14ba0be2ab3"); MasterKey masterKey = new MasterKey(Hex.fromStringCondensed("0432d735b32f66d0e3a70d4f9cc821a8529521a4937d26b987715d8eff4e4c54")); - PinHash hashedPin = PinHashUtil.hashPin(pin, new byte[]{}); + PinHash hashedPin = PinHashUtil.hashPin(pin, salt); KbsData kbsData = PinHashUtil.createNewKbsData(hashedPin, masterKey); assertArrayEquals(hashedPin.accessKey(), kbsData.getKbsAccessKey()); diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/messages/MessageContentProcessorTestV2.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/messages/MessageContentProcessorTestV2.kt deleted file mode 100644 index ec4dadc7ca..0000000000 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/messages/MessageContentProcessorTestV2.kt +++ /dev/null @@ -1,313 +0,0 @@ -package org.thoughtcrime.securesms.messages - -import android.database.Cursor -import android.util.Base64 -import androidx.test.ext.junit.runners.AndroidJUnit4 -import org.junit.Before -import org.junit.Rule -import org.junit.Test -import org.junit.runner.RunWith -import org.signal.core.util.ThreadUtil -import org.signal.core.util.readToList -import org.signal.core.util.select -import org.signal.core.util.withinTransaction -import org.thoughtcrime.securesms.database.AttachmentTable -import org.thoughtcrime.securesms.database.MessageTable -import org.thoughtcrime.securesms.database.SignalDatabase -import org.thoughtcrime.securesms.database.ThreadTable -import org.thoughtcrime.securesms.keyvalue.SignalStore -import org.thoughtcrime.securesms.testing.Entry -import org.thoughtcrime.securesms.testing.InMemoryLogger -import org.thoughtcrime.securesms.testing.MessageContentFuzzer -import org.thoughtcrime.securesms.testing.SignalActivityRule -import org.thoughtcrime.securesms.testing.assertIs -import org.thoughtcrime.securesms.util.MessageTableTestUtils -import org.whispersystems.signalservice.api.crypto.EnvelopeMetadata -import org.whispersystems.signalservice.api.messages.SignalServiceContent -import org.whispersystems.signalservice.api.messages.SignalServiceMetadata -import org.whispersystems.signalservice.api.push.SignalServiceAddress -import org.whispersystems.signalservice.internal.push.SignalServiceProtos -import org.whispersystems.signalservice.internal.serialize.SignalServiceAddressProtobufSerializer -import org.whispersystems.signalservice.internal.serialize.SignalServiceMetadataProtobufSerializer -import org.whispersystems.signalservice.internal.serialize.protos.SignalServiceContentProto -import java.util.Optional - -@RunWith(AndroidJUnit4::class) -class MessageContentProcessorTestV2 { - - companion object { - private val TAGS = listOf(MessageContentProcessor.TAG, MessageContentProcessorV2.TAG, AttachmentTable.TAG) - - private val GENERALIZE_TAG = mapOf( - MessageContentProcessor.TAG to "MCP", - MessageContentProcessorV2.TAG to "MCP", - AttachmentTable.TAG to AttachmentTable.TAG - ) - - private val IGNORE_MESSAGE_COLUMNS = listOf( - MessageTable.DATE_RECEIVED, - MessageTable.NOTIFIED_TIMESTAMP, - MessageTable.REACTIONS_LAST_SEEN, - MessageTable.NOTIFIED - ) - - private val IGNORE_ATTACHMENT_COLUMNS = listOf( - AttachmentTable.UNIQUE_ID, - AttachmentTable.TRANSFER_FILE - ) - } - - @get:Rule - val harness = SignalActivityRule() - - private lateinit var processorV1: MessageContentProcessor - private lateinit var processorV2: MessageContentProcessorV2 - private lateinit var testResult: TestResults - private var envelopeTimestamp: Long = 0 - - @Before - fun setup() { - processorV1 = MessageContentProcessor(harness.context) - processorV2 = MessageContentProcessorV2(harness.context) - envelopeTimestamp = System.currentTimeMillis() - testResult = TestResults() - } - - @Test - fun textMessage() { - var start = envelopeTimestamp - - val messages: List = (0 until 100).map { - start += 200 - TestMessage( - envelope = MessageContentFuzzer.envelope(start), - content = MessageContentFuzzer.fuzzTextMessage(), - metadata = MessageContentFuzzer.envelopeMetadata(harness.others[0], harness.self.id), - serverDeliveredTimestamp = MessageContentFuzzer.fuzzServerDeliveredTimestamp(start) - ) - } - - testResult.runV2(messages) - testResult.runV1(messages) - - testResult.assert() - } - - @Test - fun mediaMessage() { - var start = envelopeTimestamp - - val textMessages: List = (0 until 10).map { - start += 200 - TestMessage( - envelope = MessageContentFuzzer.envelope(start), - content = MessageContentFuzzer.fuzzTextMessage(), - metadata = MessageContentFuzzer.envelopeMetadata(harness.others[0], harness.self.id), - serverDeliveredTimestamp = MessageContentFuzzer.fuzzServerDeliveredTimestamp(start) - ) - } - - val firstBatchMediaMessages: List = (0 until 10).map { - start += 200 - TestMessage( - envelope = MessageContentFuzzer.envelope(start), - content = MessageContentFuzzer.fuzzMediaMessageWithBody(textMessages), - metadata = MessageContentFuzzer.envelopeMetadata(harness.others[0], harness.self.id), - serverDeliveredTimestamp = MessageContentFuzzer.fuzzServerDeliveredTimestamp(start) - ) - } - - val secondBatchNoContentMediaMessages: List = (0 until 10).map { - start += 200 - TestMessage( - envelope = MessageContentFuzzer.envelope(start), - content = MessageContentFuzzer.fuzzMediaMessageNoContent(textMessages + firstBatchMediaMessages), - metadata = MessageContentFuzzer.envelopeMetadata(harness.others[0], harness.self.id), - serverDeliveredTimestamp = MessageContentFuzzer.fuzzServerDeliveredTimestamp(start) - ) - } - - val thirdBatchNoTextMediaMessagesMessages: List = (0 until 10).map { - start += 200 - TestMessage( - envelope = MessageContentFuzzer.envelope(start), - content = MessageContentFuzzer.fuzzMediaMessageNoText(textMessages + firstBatchMediaMessages), - metadata = MessageContentFuzzer.envelopeMetadata(harness.others[0], harness.self.id), - serverDeliveredTimestamp = MessageContentFuzzer.fuzzServerDeliveredTimestamp(start) - ) - } - - testResult.runV2(textMessages + firstBatchMediaMessages + secondBatchNoContentMediaMessages + thirdBatchNoTextMediaMessagesMessages) - testResult.runV1(textMessages + firstBatchMediaMessages + secondBatchNoContentMediaMessages + thirdBatchNoTextMediaMessagesMessages) - - testResult.assert() - } - - private inner class TestResults { - - private lateinit var v1Logs: List - private lateinit var v1Messages: List>> - private lateinit var v1Attachments: List>> - private lateinit var v2Logs: List - private lateinit var v2Messages: List>> - private lateinit var v2Attachments: List>> - - fun runV1(messages: List) { - messages.forEach { (envelope, content, metadata, serverDeliveredTimestamp) -> - if (content.hasDataMessage()) { - processorV1.process( - MessageContentProcessor.MessageState.DECRYPTED_OK, - toSignalServiceContent(envelope, content, metadata, serverDeliveredTimestamp), - null, - envelope.timestamp, - -1 - ) - ThreadUtil.sleep(1) - } - } - - v1Logs = harness.inMemoryLogger.logs() - harness.inMemoryLogger.clear() - - v1Messages = dumpMessages() - v1Attachments = dumpAttachments() - } - - fun runV2(messages: List) { - messages.forEach { (envelope, content, metadata, serverDeliveredTimestamp) -> - if (content.hasDataMessage()) { - processorV2.process( - envelope, - content, - metadata, - serverDeliveredTimestamp, - false - ) - ThreadUtil.sleep(1) - } - } - - v2Logs = harness.inMemoryLogger.logs() - harness.inMemoryLogger.clear() - - v2Messages = dumpMessages() - v2Attachments = dumpAttachments() - - cleanup() - } - - fun cleanup() { - SignalDatabase.rawDatabase.withinTransaction { db -> - SignalDatabase.threads.deleteAllConversations() - db.execSQL("DELETE FROM sqlite_sequence WHERE name = '${MessageTable.TABLE_NAME}'") - db.execSQL("DELETE FROM sqlite_sequence WHERE name = '${ThreadTable.TABLE_NAME}'") - db.execSQL("DELETE FROM sqlite_sequence WHERE name = '${AttachmentTable.TABLE_NAME}'") - } - } - - fun assert() { - v2Logs.zip(v1Logs) - .forEach { (v2, v1) -> - GENERALIZE_TAG[v2.tag]!!.assertIs(GENERALIZE_TAG[v1.tag]!!) - - if (v2.tag != AttachmentTable.TAG) { - if (v2.message?.startsWith("[") == true && v1.message?.startsWith("[") == false) { - v2.message!!.substring(v2.message!!.indexOf(']') + 2).assertIs(v1.message) - } else { - v2.message.assertIs(v1.message) - } - } else { - if (v2.message?.startsWith("Inserted attachment at ID: AttachmentId::") == true) { - v2.message!! - .substring(0, v2.message!!.indexOf(',')) - .assertIs( - v1.message!! - .substring(0, v1.message!!.indexOf(',')) - ) - } else { - v2.message.assertIs(v1.message) - } - } - v2.throwable.assertIs(v1.throwable) - } - - v2Messages.zip(v1Messages) - .forEach { (v2, v1) -> - v2.assertIs(v1) - } - - v2Attachments.zip(v1Attachments) - .forEach { (v2, v1) -> - v2.assertIs(v1) - } - } - - private fun InMemoryLogger.logs(): List { - return entries() - .filter { TAGS.contains(it.tag) } - } - - private fun dumpMessages(): List>> { - return dumpTable(MessageTable.TABLE_NAME) - .map { row -> - val newRow = row.toMutableList() - newRow.removeIf { IGNORE_MESSAGE_COLUMNS.contains(it.first) } - newRow - } - } - - private fun dumpAttachments(): List>> { - return dumpTable(AttachmentTable.TABLE_NAME) - .map { row -> - val newRow = row.toMutableList() - newRow.removeIf { IGNORE_ATTACHMENT_COLUMNS.contains(it.first) } - newRow - } - } - - private fun dumpTable(table: String): List>> { - return SignalDatabase.rawDatabase - .select() - .from(table) - .run() - .readToList { cursor -> - val map: List> = cursor.columnNames.map { column -> - val index = cursor.getColumnIndex(column) - var data: String? = when (cursor.getType(index)) { - Cursor.FIELD_TYPE_BLOB -> Base64.encodeToString(cursor.getBlob(index), 0) - else -> cursor.getString(index) - } - if (table == MessageTable.TABLE_NAME && column == MessageTable.TYPE) { - data = MessageTableTestUtils.typeColumnToString(cursor.getLong(index)) - } - - column to data - } - map - } - } - } - - private fun toSignalServiceContent(envelope: SignalServiceProtos.Envelope, content: SignalServiceProtos.Content, metadata: EnvelopeMetadata, serverDeliveredTimestamp: Long): SignalServiceContent { - val localAddress = SignalServiceAddress(metadata.destinationServiceId, Optional.ofNullable(SignalStore.account().e164)) - val signalServiceMetadata = SignalServiceMetadata( - SignalServiceAddress(metadata.sourceServiceId, Optional.ofNullable(metadata.sourceE164)), - metadata.sourceDeviceId, - envelope.timestamp, - envelope.serverTimestamp, - serverDeliveredTimestamp, - metadata.sealedSender, - envelope.serverGuid, - Optional.ofNullable(metadata.groupId), - metadata.destinationServiceId.toString() - ) - - val contentProto = SignalServiceContentProto.newBuilder() - .setLocalAddress(SignalServiceAddressProtobufSerializer.toProtobuf(localAddress)) - .setMetadata(SignalServiceMetadataProtobufSerializer.toProtobuf(signalServiceMetadata)) - .setContent(content) - .build() - - return SignalServiceContent.createFromProto(contentProto)!! - } -} diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/messages/MessageProcessingPerformanceTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/messages/MessageProcessingPerformanceTest.kt index 048a259eaf..d6309a347e 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/messages/MessageProcessingPerformanceTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/messages/MessageProcessingPerformanceTest.kt @@ -9,6 +9,7 @@ import okio.ByteString import okio.ByteString.Companion.toByteString import org.junit.After import org.junit.Before +import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -37,7 +38,7 @@ import android.util.Log as AndroidLog /** * Sends N messages from Bob to Alice to track performance of Alice's processing of messages. */ -// @Ignore("Ignore test in normal testing as it's a performance test with no assertions") +@Ignore("Ignore test in normal testing as it's a performance test with no assertions") @RunWith(AndroidJUnit4::class) class MessageProcessingPerformanceTest { diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/MockProvider.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/MockProvider.kt index 49cf8ea853..1c75ed204e 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/MockProvider.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/MockProvider.kt @@ -1,9 +1,7 @@ package org.thoughtcrime.securesms.testing -import io.reactivex.rxjava3.core.Single -import org.mockito.kotlin.any +import org.mockito.kotlin.anyOrNull import org.mockito.kotlin.doReturn -import org.mockito.kotlin.mock import org.mockito.kotlin.stub import org.signal.core.util.Hex import org.signal.libsignal.protocol.IdentityKeyPair @@ -15,17 +13,13 @@ import org.signal.libsignal.svr2.PinHash import org.thoughtcrime.securesms.crypto.PreKeyUtil import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.keyvalue.SignalStore -import org.thoughtcrime.securesms.pin.KbsRepository -import org.thoughtcrime.securesms.pin.TokenData import org.thoughtcrime.securesms.test.BuildConfig -import org.whispersystems.signalservice.api.KbsPinData import org.whispersystems.signalservice.api.KeyBackupService +import org.whispersystems.signalservice.api.SvrPinData import org.whispersystems.signalservice.api.kbs.MasterKey import org.whispersystems.signalservice.api.messages.multidevice.DeviceInfo import org.whispersystems.signalservice.api.push.ServiceId import org.whispersystems.signalservice.api.push.SignedPreKeyEntity -import org.whispersystems.signalservice.internal.ServiceResponse -import org.whispersystems.signalservice.internal.contacts.entities.TokenResponse import org.whispersystems.signalservice.internal.push.AuthCredentials import org.whispersystems.signalservice.internal.push.DeviceInfoList import org.whispersystems.signalservice.internal.push.PreKeyEntity @@ -46,7 +40,8 @@ object MockProvider { val senderCertificate = SenderCertificate().apply { certificate = ByteArray(0) } val lockedFailure = PushServiceSocket.RegistrationLockFailure().apply { - backupCredentials = AuthCredentials.create("username", "password") + svr1Credentials = AuthCredentials.create("username", "password") + svr2Credentials = null } val primaryOnlyDeviceList = DeviceInfoList().apply { @@ -83,26 +78,15 @@ object MockProvider { } } - fun mockGetRegistrationLockStringFlow(kbsRepository: KbsRepository) { - val tokenData: TokenData = mock { - on { enclave } doReturn BuildConfig.KBS_ENCLAVE - on { basicAuth } doReturn "basicAuth" - on { triesRemaining } doReturn 10 - on { tokenResponse } doReturn TokenResponse() - } - - kbsRepository.stub { - on { getToken(any() as? String) } doReturn Single.just(ServiceResponse.forResult(tokenData, 200, "")) - } - + fun mockGetRegistrationLockStringFlow() { val session: KeyBackupService.RestoreSession = object : KeyBackupService.RestoreSession { override fun hashSalt(): ByteArray = Hex.fromStringCondensed("cba811749042b303a6a7efa5ccd160aea5e3ea243c8d2692bd13d515732f51a8") - override fun restorePin(hashedPin: PinHash?): KbsPinData = KbsPinData(MasterKey.createNew(SecureRandom()), null) + override fun restorePin(hashedPin: PinHash?): SvrPinData = SvrPinData(MasterKey.createNew(SecureRandom()), null) } val kbsService = ApplicationDependencies.getKeyBackupService(BuildConfig.KBS_ENCLAVE) kbsService.stub { - on { newRegistrationSession(any(), any()) } doReturn session + on { newRegistrationSession(anyOrNull(), anyOrNull()) } doReturn session } } diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/ResponseMocking.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/ResponseMocking.kt index fd93a3ee10..13268521da 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/ResponseMocking.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/ResponseMocking.kt @@ -22,6 +22,8 @@ class Put(path: String, responseFactory: ResponseFactory) : Verb(defaultRequestP class Post(path: String, responseFactory: ResponseFactory) : Verb(defaultRequestPredicate("POST", path), responseFactory) +class Delete(path: String, responseFactory: ResponseFactory) : Verb(defaultRequestPredicate("DELETE", path), responseFactory) + fun MockResponse.success(response: Any? = null): MockResponse { return setResponseCode(200).apply { if (response != null) { diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/SignalActivityRule.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/SignalActivityRule.kt index d5e82aa2f1..1f8b31c8a8 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/SignalActivityRule.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/SignalActivityRule.kt @@ -29,10 +29,10 @@ import org.thoughtcrime.securesms.registration.RegistrationData import org.thoughtcrime.securesms.registration.RegistrationRepository import org.thoughtcrime.securesms.registration.RegistrationUtil import org.thoughtcrime.securesms.registration.VerifyResponse +import org.thoughtcrime.securesms.testing.GroupTestingUtils.asMember import org.thoughtcrime.securesms.util.Util import org.whispersystems.signalservice.api.profiles.SignalServiceProfile import org.whispersystems.signalservice.api.push.ACI -import org.whispersystems.signalservice.api.push.ServiceIdType import org.whispersystems.signalservice.api.push.SignalServiceAddress import org.whispersystems.signalservice.internal.ServiceResponse import org.whispersystems.signalservice.internal.ServiceResponseProcessor @@ -45,7 +45,7 @@ import java.util.UUID * * To use: `@get:Rule val harness = SignalActivityRule()` */ -class SignalActivityRule(private val othersCount: Int = 4) : ExternalResource() { +class SignalActivityRule(private val othersCount: Int = 4, private val createGroup: Boolean = false) : ExternalResource() { val application: Application = ApplicationDependencies.getApplication() @@ -57,6 +57,9 @@ class SignalActivityRule(private val othersCount: Int = 4) : ExternalResource() private set lateinit var othersKeys: List + var group: GroupTestingUtils.TestGroupInfo? = null + private set + val inMemoryLogger: InMemoryLogger get() = (application as SignalInstrumentationApplicationContext).inMemoryLogger @@ -68,6 +71,15 @@ class SignalActivityRule(private val othersCount: Int = 4) : ExternalResource() others = setupOthers.first othersKeys = setupOthers.second + if (createGroup && others.size >= 2) { + group = GroupTestingUtils.insertGroup( + revision = 0, + self.asMember(), + others[0].asMember(), + others[1].asMember() + ) + } + InstrumentationApplicationDependencyProvider.clearHandlers() } @@ -78,6 +90,9 @@ class SignalActivityRule(private val othersCount: Int = 4) : ExternalResource() val preferences: SharedPreferences = application.getSharedPreferences(MasterSecretUtil.PREFERENCES_NAME, 0) preferences.edit().putBoolean("passphrase_initialized", true).commit() + SignalStore.account().generateAciIdentityKeyIfNecessary() + SignalStore.account().generatePniIdentityKeyIfNecessary() + val registrationRepository = RegistrationRepository(application) InstrumentationApplicationDependencyProvider.addMockWebRequestHandlers(Put("/v2/keys") { MockResponse().success() }) @@ -88,19 +103,23 @@ class SignalActivityRule(private val othersCount: Int = 4) : ExternalResource() password = Util.getSecret(18), registrationId = registrationRepository.registrationId, profileKey = registrationRepository.getProfileKey("+15555550101"), - aciPreKeyCollection = RegistrationRepository.generatePreKeysForType(ServiceIdType.ACI), - pniPreKeyCollection = RegistrationRepository.generatePreKeysForType(ServiceIdType.PNI), fcmToken = null, pniRegistrationId = registrationRepository.pniRegistrationId, recoveryPassword = "asdfasdfasdfasdf" ), - VerifyResponse(VerifyAccountResponse(UUID.randomUUID().toString(), UUID.randomUUID().toString(), false), null, null), + VerifyResponse( + verifyAccountResponse = VerifyAccountResponse(UUID.randomUUID().toString(), UUID.randomUUID().toString(), false), + masterKey = null, + pin = null, + aciPreKeyCollection = RegistrationRepository.generateSignedAndLastResortPreKeys(SignalStore.account().aciIdentityKey, SignalStore.account().aciPreKeys), + pniPreKeyCollection = RegistrationRepository.generateSignedAndLastResortPreKeys(SignalStore.account().aciIdentityKey, SignalStore.account().pniPreKeys) + ), false ).blockingGet() ServiceResponseProcessor.DefaultProcessor(response).resultOrThrow - SignalStore.kbsValues().optOut() + SignalStore.svr().optOut() RegistrationUtil.maybeMarkRegistrationComplete() SignalDatabase.recipients.setProfileName(Recipient.self().id, ProfileName.fromParts("Tester", "McTesterson")) diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/svr/Svr2Socket.kt b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/svr/Svr2Socket.kt index 3f12c69f78..df297fb104 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/svr/Svr2Socket.kt +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/svr/Svr2Socket.kt @@ -213,7 +213,12 @@ internal class Svr2Socket( private fun buildOkHttpClient(configuration: SignalServiceConfiguration, svr2Url: SignalSvr2Url): OkHttpClient { val socketFactory = createTlsSocketFactory(svr2Url.trustStore) - val builder = OkHttpClient.Builder().sslSocketFactory(Tls12SocketFactory(socketFactory.first()), socketFactory.second()).connectionSpecs(Util.immutableList(ConnectionSpec.RESTRICTED_TLS)).retryOnConnectionFailure(false).readTimeout(30, TimeUnit.SECONDS).connectTimeout(30, TimeUnit.SECONDS) + val builder = OkHttpClient.Builder() + .sslSocketFactory(Tls12SocketFactory(socketFactory.first()), socketFactory.second()) + .connectionSpecs(svr2Url.connectionSpecs.orElse(Util.immutableList(ConnectionSpec.RESTRICTED_TLS))) + .retryOnConnectionFailure(false) + .readTimeout(30, TimeUnit.SECONDS) + .connectTimeout(30, TimeUnit.SECONDS) for (interceptor in configuration.networkInterceptors) { builder.addInterceptor(interceptor)