Allow SendDeliveryReceiptJob to run during benchmarking tests.

This commit is contained in:
Cody Henthorne
2026-02-13 17:01:32 -05:00
committed by Alex Hart
parent 47947b85c7
commit 58b5ebf39d
3 changed files with 165 additions and 30 deletions
@@ -11,12 +11,12 @@ import android.content.Intent
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import org.signal.benchmark.network.BenchmarkWebSocketConnection
import org.signal.benchmark.setup.Generator
import org.signal.benchmark.setup.Harness
import org.signal.core.util.ThreadUtil
import org.signal.core.util.logging.Log
import org.whispersystems.signalservice.internal.push.Envelope
import org.whispersystems.signalservice.internal.websocket.BenchmarkWebSocketConnection
import org.whispersystems.signalservice.internal.websocket.WebSocketRequestMessage
import kotlin.random.Random
@@ -46,8 +46,8 @@ class BenchmarkCommandReceiver : BroadcastReceiver() {
"individual-send" -> handlePrepareIndividualSend()
"group-send" -> handlePrepareGroupSend()
"release-messages" -> {
BenchmarkWebSocketConnection.instance.startWholeBatchTrace = true
BenchmarkWebSocketConnection.instance.releaseMessages()
BenchmarkWebSocketConnection.authInstance.startWholeBatchTrace = true
BenchmarkWebSocketConnection.authInstance.releaseMessages()
}
else -> Log.w(TAG, "Unknown command: $command")
}
@@ -61,7 +61,7 @@ class BenchmarkCommandReceiver : BroadcastReceiver() {
runBlocking {
launch(Dispatchers.IO) {
BenchmarkWebSocketConnection.instance.run {
BenchmarkWebSocketConnection.authInstance.run {
Log.i(TAG, "Sending initial message form Bob to establish session.")
addPendingMessages(listOf(encryptedEnvelope.toWebSocketPayload()))
releaseMessages()
@@ -78,8 +78,8 @@ class BenchmarkCommandReceiver : BroadcastReceiver() {
val messages = envelopes.map { e -> e.toWebSocketPayload() }
BenchmarkWebSocketConnection.instance.addPendingMessages(messages)
BenchmarkWebSocketConnection.instance.addQueueEmptyMessage()
BenchmarkWebSocketConnection.authInstance.addPendingMessages(messages)
BenchmarkWebSocketConnection.authInstance.addQueueEmptyMessage()
}
private fun handlePrepareGroupSend() {
@@ -90,7 +90,7 @@ class BenchmarkCommandReceiver : BroadcastReceiver() {
runBlocking {
launch(Dispatchers.IO) {
BenchmarkWebSocketConnection.instance.run {
BenchmarkWebSocketConnection.authInstance.run {
Log.i(TAG, "Sending initial group messages from client to establish sessions.")
addPendingMessages(encryptedEnvelopes.map { it.toWebSocketPayload() })
releaseMessages()
@@ -108,9 +108,9 @@ class BenchmarkCommandReceiver : BroadcastReceiver() {
val messages = envelopes.map { e -> e.toWebSocketPayload() }
BenchmarkWebSocketConnection.instance.addPendingMessages(messages)
BenchmarkWebSocketConnection.authInstance.addPendingMessages(messages)
}
BenchmarkWebSocketConnection.instance.addQueueEmptyMessage()
BenchmarkWebSocketConnection.authInstance.addQueueEmptyMessage()
}
private fun Envelope.toWebSocketPayload(): WebSocketRequestMessage {
@@ -3,18 +3,15 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.signal.benchmark.network
package org.whispersystems.signalservice.internal.websocket
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Single
import io.reactivex.rxjava3.subjects.BehaviorSubject
import okio.IOException
import org.thoughtcrime.securesms.util.JsonUtils
import org.thoughtcrime.securesms.util.SignalTrace
import org.whispersystems.signalservice.api.websocket.WebSocketConnectionState
import org.whispersystems.signalservice.internal.websocket.WebSocketConnection
import org.whispersystems.signalservice.internal.websocket.WebSocketRequestMessage
import org.whispersystems.signalservice.internal.websocket.WebSocketResponseMessage
import org.whispersystems.signalservice.internal.websocket.WebsocketResponse
import org.whispersystems.signalservice.internal.push.SendMessageResponse
import java.net.SocketException
import java.util.LinkedList
import java.util.Optional
@@ -32,13 +29,22 @@ import java.util.concurrent.TimeoutException
class BenchmarkWebSocketConnection : WebSocketConnection {
companion object {
lateinit var instance: BenchmarkWebSocketConnection
lateinit var authInstance: BenchmarkWebSocketConnection
private set
@Synchronized
fun create(): WebSocketConnection {
instance = BenchmarkWebSocketConnection()
return instance
fun createAuthInstance(): WebSocketConnection {
authInstance = BenchmarkWebSocketConnection()
return authInstance
}
lateinit var unauthInstance: BenchmarkWebSocketConnection
private set
@Synchronized
fun createUnauthInstance(): WebSocketConnection {
unauthInstance = BenchmarkWebSocketConnection()
return unauthInstance
}
}
@@ -118,12 +124,16 @@ class BenchmarkWebSocketConnection : WebSocketConnection {
request: WebSocketRequestMessage,
timeoutSeconds: Long
): Single<WebsocketResponse> {
return Single.error(IOException("fake timeout"))
if (request.verb != null && request.path != null) {
if (request.verb == "PUT" && request.path!!.startsWith("/v1/messages/")) {
return Single.just(WebsocketResponse(200, SendMessageResponse().toJson(), emptyList<String>(), true))
}
}
return Single.error(okio.IOException("fake timeout"))
}
override fun sendKeepAlive() {
error("Not yet implemented")
}
override fun sendKeepAlive() = Unit
fun addQueueEmptyMessage() {
addPendingMessages(
@@ -136,3 +146,7 @@ class BenchmarkWebSocketConnection : WebSocketConnection {
)
}
}
private fun Any.toJson(): String {
return JsonUtils.toJson(this)
}