kopia lustrzana https://github.com/ryukoposting/Signal-Android
Stabilize message processing tests and add inline decryption timings.
rodzic
68a0cb40a6
commit
f1c2ee9b32
|
@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.dependencies
|
||||||
|
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
import okhttp3.ConnectionSpec
|
import okhttp3.ConnectionSpec
|
||||||
|
import okhttp3.WebSocketListener
|
||||||
import okhttp3.mockwebserver.Dispatcher
|
import okhttp3.mockwebserver.Dispatcher
|
||||||
import okhttp3.mockwebserver.MockResponse
|
import okhttp3.mockwebserver.MockResponse
|
||||||
import okhttp3.mockwebserver.MockWebServer
|
import okhttp3.mockwebserver.MockWebServer
|
||||||
|
@ -14,8 +15,10 @@ import org.thoughtcrime.securesms.KbsEnclave
|
||||||
import org.thoughtcrime.securesms.push.SignalServiceNetworkAccess
|
import org.thoughtcrime.securesms.push.SignalServiceNetworkAccess
|
||||||
import org.thoughtcrime.securesms.push.SignalServiceTrustStore
|
import org.thoughtcrime.securesms.push.SignalServiceTrustStore
|
||||||
import org.thoughtcrime.securesms.recipients.LiveRecipientCache
|
import org.thoughtcrime.securesms.recipients.LiveRecipientCache
|
||||||
|
import org.thoughtcrime.securesms.testing.Get
|
||||||
import org.thoughtcrime.securesms.testing.Verb
|
import org.thoughtcrime.securesms.testing.Verb
|
||||||
import org.thoughtcrime.securesms.testing.runSync
|
import org.thoughtcrime.securesms.testing.runSync
|
||||||
|
import org.thoughtcrime.securesms.testing.success
|
||||||
import org.thoughtcrime.securesms.util.Base64
|
import org.thoughtcrime.securesms.util.Base64
|
||||||
import org.whispersystems.signalservice.api.KeyBackupService
|
import org.whispersystems.signalservice.api.KeyBackupService
|
||||||
import org.whispersystems.signalservice.api.SignalServiceAccountManager
|
import org.whispersystems.signalservice.api.SignalServiceAccountManager
|
||||||
|
@ -47,6 +50,12 @@ class InstrumentationApplicationDependencyProvider(application: Application, def
|
||||||
runSync {
|
runSync {
|
||||||
webServer = MockWebServer()
|
webServer = MockWebServer()
|
||||||
baseUrl = webServer.url("").toString()
|
baseUrl = webServer.url("").toString()
|
||||||
|
|
||||||
|
addMockWebRequestHandlers(
|
||||||
|
Get("/v1/websocket/") {
|
||||||
|
MockResponse().success().withWebSocketUpgrade(object : WebSocketListener() {})
|
||||||
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
webServer.setDispatcher(object : Dispatcher() {
|
webServer.setDispatcher(object : Dispatcher() {
|
||||||
|
|
|
@ -25,6 +25,7 @@ import org.thoughtcrime.securesms.testing.awaitFor
|
||||||
import org.whispersystems.signalservice.internal.push.SignalServiceProtos.Envelope
|
import org.whispersystems.signalservice.internal.push.SignalServiceProtos.Envelope
|
||||||
import kotlin.time.Duration.Companion.minutes
|
import kotlin.time.Duration.Companion.minutes
|
||||||
import kotlin.time.Duration.Companion.seconds
|
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.
|
* Sends N messages from Bob to Alice to track performance of Alice's processing of messages.
|
||||||
|
@ -36,8 +37,6 @@ class MessageProcessingPerformanceTest {
|
||||||
companion object {
|
companion object {
|
||||||
private val TAG = Log.tag(MessageProcessingPerformanceTest::class.java)
|
private val TAG = Log.tag(MessageProcessingPerformanceTest::class.java)
|
||||||
private val TIMING_TAG = "TIMING_$TAG".substring(0..23)
|
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
|
@get:Rule
|
||||||
|
@ -126,6 +125,16 @@ class MessageProcessingPerformanceTest {
|
||||||
// Process logs for timing data
|
// Process logs for timing data
|
||||||
val entries = harness.inMemoryLogger.entries()
|
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
|
// Calculate MessageContentProcessor
|
||||||
|
|
||||||
val takeLast: List<Entry> = entries.filter { it.tag == TimingMessageContentProcessor.TAG }.drop(2)
|
val takeLast: List<Entry> = entries.filter { it.tag == TimingMessageContentProcessor.TAG }.drop(2)
|
||||||
|
@ -139,7 +148,7 @@ class MessageProcessingPerformanceTest {
|
||||||
processDuration += end.timestamp - start.timestamp
|
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
|
// 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 duration = (end.timestamp - start.timestamp).toFloat() / 1000f
|
||||||
val messagePerSecond = messageCount.toFloat() / duration
|
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")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package org.thoughtcrime.securesms.testing
|
package org.thoughtcrime.securesms.testing
|
||||||
|
|
||||||
|
import org.signal.core.util.logging.Log
|
||||||
import org.signal.libsignal.protocol.ecc.ECKeyPair
|
import org.signal.libsignal.protocol.ecc.ECKeyPair
|
||||||
import org.signal.libsignal.zkgroup.profiles.ProfileKey
|
import org.signal.libsignal.zkgroup.profiles.ProfileKey
|
||||||
import org.thoughtcrime.securesms.crypto.ProfileKeyUtil
|
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) {
|
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(
|
private val aliceSenderCertificate = FakeClientHelpers.createCertificateFor(
|
||||||
trustRoot = trustRoot,
|
trustRoot = trustRoot,
|
||||||
uuid = serviceId.uuid(),
|
uuid = serviceId.uuid(),
|
||||||
|
@ -29,7 +34,10 @@ class AliceClient(val serviceId: ServiceId, val e164: String, val trustRoot: ECK
|
||||||
)
|
)
|
||||||
|
|
||||||
fun process(envelope: Envelope, serverDeliveredTimestamp: Long) {
|
fun process(envelope: Envelope, serverDeliveredTimestamp: Long) {
|
||||||
|
val start = System.currentTimeMillis()
|
||||||
ApplicationDependencies.getIncomingMessageObserver().processEnvelope(envelope, serverDeliveredTimestamp)
|
ApplicationDependencies.getIncomingMessageObserver().processEnvelope(envelope, serverDeliveredTimestamp)
|
||||||
|
val end = System.currentTimeMillis()
|
||||||
|
Log.d(TAG, "${end - start}")
|
||||||
}
|
}
|
||||||
|
|
||||||
fun encrypt(now: Long, destination: Recipient): Envelope {
|
fun encrypt(now: Long, destination: Recipient): Envelope {
|
||||||
|
|
|
@ -22,7 +22,6 @@ import org.thoughtcrime.securesms.database.SignalDatabase
|
||||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
|
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
|
||||||
import org.thoughtcrime.securesms.dependencies.InstrumentationApplicationDependencyProvider
|
import org.thoughtcrime.securesms.dependencies.InstrumentationApplicationDependencyProvider
|
||||||
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
||||||
import org.thoughtcrime.securesms.net.DeviceTransferBlockingInterceptor
|
|
||||||
import org.thoughtcrime.securesms.profiles.ProfileName
|
import org.thoughtcrime.securesms.profiles.ProfileName
|
||||||
import org.thoughtcrime.securesms.recipients.Recipient
|
import org.thoughtcrime.securesms.recipients.Recipient
|
||||||
import org.thoughtcrime.securesms.recipients.RecipientId
|
import org.thoughtcrime.securesms.recipients.RecipientId
|
||||||
|
@ -73,8 +72,6 @@ class SignalActivityRule(private val othersCount: Int = 4) : ExternalResource()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setupSelf(): Recipient {
|
private fun setupSelf(): Recipient {
|
||||||
DeviceTransferBlockingInterceptor.getInstance().blockNetwork()
|
|
||||||
|
|
||||||
PreferenceManager.getDefaultSharedPreferences(application).edit().putBoolean("pref_prompted_push_registration", true).commit()
|
PreferenceManager.getDefaultSharedPreferences(application).edit().putBoolean("pref_prompted_push_registration", true).commit()
|
||||||
val masterSecret = MasterSecretUtil.generateMasterSecret(application, MasterSecretUtil.UNENCRYPTED_PASSPHRASE)
|
val masterSecret = MasterSecretUtil.generateMasterSecret(application, MasterSecretUtil.UNENCRYPTED_PASSPHRASE)
|
||||||
MasterSecretUtil.generateAsymmetricMasterSecret(application, masterSecret)
|
MasterSecretUtil.generateAsymmetricMasterSecret(application, masterSecret)
|
||||||
|
|
|
@ -142,7 +142,7 @@ public class WebSocketConnection extends WebSocketListener {
|
||||||
|
|
||||||
OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder().sslSocketFactory(new Tls12SocketFactory(socketFactory.first()),
|
OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder().sslSocketFactory(new Tls12SocketFactory(socketFactory.first()),
|
||||||
socketFactory.second())
|
socketFactory.second())
|
||||||
.connectionSpecs(Util.immutableList(ConnectionSpec.RESTRICTED_TLS))
|
.connectionSpecs(serviceUrl.getConnectionSpecs().orElse(Util.immutableList(ConnectionSpec.RESTRICTED_TLS)))
|
||||||
.readTimeout(KEEPALIVE_TIMEOUT_SECONDS + 10, TimeUnit.SECONDS)
|
.readTimeout(KEEPALIVE_TIMEOUT_SECONDS + 10, TimeUnit.SECONDS)
|
||||||
.dns(dns.orElse(Dns.SYSTEM))
|
.dns(dns.orElse(Dns.SYSTEM))
|
||||||
.connectTimeout(KEEPALIVE_TIMEOUT_SECONDS + 10, TimeUnit.SECONDS);
|
.connectTimeout(KEEPALIVE_TIMEOUT_SECONDS + 10, TimeUnit.SECONDS);
|
||||||
|
|
Ładowanie…
Reference in New Issue