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 fea3ce914..374bb394a 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/dependencies/InstrumentationApplicationDependencyProvider.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/dependencies/InstrumentationApplicationDependencyProvider.kt @@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.dependencies import android.app.Application import okhttp3.ConnectionSpec +import okhttp3.WebSocketListener import okhttp3.mockwebserver.Dispatcher import okhttp3.mockwebserver.MockResponse import okhttp3.mockwebserver.MockWebServer @@ -14,8 +15,10 @@ import org.thoughtcrime.securesms.KbsEnclave import org.thoughtcrime.securesms.push.SignalServiceNetworkAccess import org.thoughtcrime.securesms.push.SignalServiceTrustStore import org.thoughtcrime.securesms.recipients.LiveRecipientCache +import org.thoughtcrime.securesms.testing.Get import org.thoughtcrime.securesms.testing.Verb import org.thoughtcrime.securesms.testing.runSync +import org.thoughtcrime.securesms.testing.success import org.thoughtcrime.securesms.util.Base64 import org.whispersystems.signalservice.api.KeyBackupService import org.whispersystems.signalservice.api.SignalServiceAccountManager @@ -47,6 +50,12 @@ class InstrumentationApplicationDependencyProvider(application: Application, def runSync { webServer = MockWebServer() baseUrl = webServer.url("").toString() + + addMockWebRequestHandlers( + Get("/v1/websocket/") { + MockResponse().success().withWebSocketUpgrade(object : WebSocketListener() {}) + } + ) } webServer.setDispatcher(object : Dispatcher() { 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 bbc885c74..c18e368d4 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/messages/MessageProcessingPerformanceTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/messages/MessageProcessingPerformanceTest.kt @@ -25,6 +25,7 @@ import org.thoughtcrime.securesms.testing.awaitFor import org.whispersystems.signalservice.internal.push.SignalServiceProtos.Envelope import kotlin.time.Duration.Companion.minutes import kotlin.time.Duration.Companion.seconds +import android.util.Log as AndroidLog /** * Sends N messages from Bob to Alice to track performance of Alice's processing of messages. @@ -36,8 +37,6 @@ class MessageProcessingPerformanceTest { companion object { private val TAG = Log.tag(MessageProcessingPerformanceTest::class.java) private val TIMING_TAG = "TIMING_$TAG".substring(0..23) - - private val jobFinishRegex = "\\[JOB::[a-f\\d]{8}-[a-f\\d]{4}-[a-f\\d]{4}-[a-f\\d]{4}-[a-f\\d]{12}]\\[([^]]*)]\\[\\d+] Job finished with result SUCCESS in (\\d+) ms. \\(Time Since Submission: (\\d+) ms.*".toRegex() } @get:Rule @@ -126,6 +125,16 @@ class MessageProcessingPerformanceTest { // Process logs for timing data val entries = harness.inMemoryLogger.entries() + // Calculate decryption average + + val decrypts = entries + .filter { it.tag == AliceClient.TAG } + .drop(1) + + val totalDecryptDuration = decrypts.sumOf { it.message!!.toLong() } + + AndroidLog.w(TAG, "Decryption: Average runtime: ${totalDecryptDuration.toFloat() / decrypts.size.toFloat()}ms") + // Calculate MessageContentProcessor val takeLast: List = entries.filter { it.tag == TimingMessageContentProcessor.TAG }.drop(2) @@ -139,7 +148,7 @@ class MessageProcessingPerformanceTest { processDuration += end.timestamp - start.timestamp } - android.util.Log.w(TAG, "MessageContentProcessor.process: Average runtime: ${processDuration.toFloat() / processCount.toFloat()}ms") + AndroidLog.w(TAG, "MessageContentProcessor.process: Average runtime: ${processDuration.toFloat() / processCount.toFloat()}ms") // Calculate messages per second from "retrieving" first message post session initialization to processing last message @@ -149,6 +158,6 @@ class MessageProcessingPerformanceTest { val duration = (end.timestamp - start.timestamp).toFloat() / 1000f val messagePerSecond = messageCount.toFloat() / duration - android.util.Log.w(TAG, "Processing $messageCount messages took ${duration}s or ${messagePerSecond}m/s") + AndroidLog.w(TAG, "Processing $messageCount messages took ${duration}s or ${messagePerSecond}m/s") } } diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/AliceClient.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/AliceClient.kt index dfe4bb6df..5847e4299 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/AliceClient.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/AliceClient.kt @@ -1,5 +1,6 @@ package org.thoughtcrime.securesms.testing +import org.signal.core.util.logging.Log import org.signal.libsignal.protocol.ecc.ECKeyPair import org.signal.libsignal.zkgroup.profiles.ProfileKey import org.thoughtcrime.securesms.crypto.ProfileKeyUtil @@ -19,6 +20,10 @@ import org.whispersystems.signalservice.internal.push.SignalServiceProtos.Envelo */ class AliceClient(val serviceId: ServiceId, val e164: String, val trustRoot: ECKeyPair) { + companion object { + val TAG = Log.tag(AliceClient::class.java) + } + private val aliceSenderCertificate = FakeClientHelpers.createCertificateFor( trustRoot = trustRoot, uuid = serviceId.uuid(), @@ -29,7 +34,10 @@ class AliceClient(val serviceId: ServiceId, val e164: String, val trustRoot: ECK ) fun process(envelope: Envelope, serverDeliveredTimestamp: Long) { + val start = System.currentTimeMillis() ApplicationDependencies.getIncomingMessageObserver().processEnvelope(envelope, serverDeliveredTimestamp) + val end = System.currentTimeMillis() + Log.d(TAG, "${end - start}") } fun encrypt(now: Long, destination: Recipient): Envelope { 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 6e32dfaf1..d9a82b907 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/SignalActivityRule.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/SignalActivityRule.kt @@ -22,7 +22,6 @@ import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.dependencies.InstrumentationApplicationDependencyProvider import org.thoughtcrime.securesms.keyvalue.SignalStore -import org.thoughtcrime.securesms.net.DeviceTransferBlockingInterceptor import org.thoughtcrime.securesms.profiles.ProfileName import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId @@ -73,8 +72,6 @@ class SignalActivityRule(private val othersCount: Int = 4) : ExternalResource() } private fun setupSelf(): Recipient { - DeviceTransferBlockingInterceptor.getInstance().blockNetwork() - PreferenceManager.getDefaultSharedPreferences(application).edit().putBoolean("pref_prompted_push_registration", true).commit() val masterSecret = MasterSecretUtil.generateMasterSecret(application, MasterSecretUtil.UNENCRYPTED_PASSPHRASE) MasterSecretUtil.generateAsymmetricMasterSecret(application, masterSecret) diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/websocket/WebSocketConnection.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/websocket/WebSocketConnection.java index ae0fc90b0..4c19b5635 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/websocket/WebSocketConnection.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/websocket/WebSocketConnection.java @@ -142,7 +142,7 @@ public class WebSocketConnection extends WebSocketListener { OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder().sslSocketFactory(new Tls12SocketFactory(socketFactory.first()), socketFactory.second()) - .connectionSpecs(Util.immutableList(ConnectionSpec.RESTRICTED_TLS)) + .connectionSpecs(serviceUrl.getConnectionSpecs().orElse(Util.immutableList(ConnectionSpec.RESTRICTED_TLS))) .readTimeout(KEEPALIVE_TIMEOUT_SECONDS + 10, TimeUnit.SECONDS) .dns(dns.orElse(Dns.SYSTEM)) .connectTimeout(KEEPALIVE_TIMEOUT_SECONDS + 10, TimeUnit.SECONDS);