From b976d9deac656d7e8bed68fbd1a67906baf77a62 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 19 Nov 2025 17:30:34 +0100 Subject: [PATCH] Fix and add test --- .../impl/workmanager/WorkerDataConverter.kt | 3 ++- .../SyncNotificationWorkManagerRequestTest.kt | 13 +++++++------ .../workmanager/WorkerDataConverterTest.kt | 19 ++++++++++++++++++- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/workmanager/WorkerDataConverter.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/workmanager/WorkerDataConverter.kt index 71d24cd62d..98aea3f528 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/workmanager/WorkerDataConverter.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/workmanager/WorkerDataConverter.kt @@ -25,6 +25,7 @@ class WorkerDataConverter( private val json: JsonProvider, ) { fun serialize(notificationEventRequests: List): List> { + // First try to serialize all requests at once. In the vast majority of cases this will work. return serializeRequests(notificationEventRequests) .fold( onSuccess = { @@ -69,7 +70,7 @@ class WorkerDataConverter( companion object { private const val REQUESTS_KEY = "requests" - private const val CHUNK_SIZE = 20 + internal const val CHUNK_SIZE = 20 } } diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/workmanager/SyncNotificationWorkManagerRequestTest.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/workmanager/SyncNotificationWorkManagerRequestTest.kt index 62acaa16b1..cc4890d93f 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/workmanager/SyncNotificationWorkManagerRequestTest.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/workmanager/SyncNotificationWorkManagerRequestTest.kt @@ -21,6 +21,7 @@ import io.element.android.libraries.workmanager.api.workManagerTag import io.element.android.services.toolbox.test.sdk.FakeBuildVersionSdkIntProvider import kotlinx.coroutines.test.runTest import org.junit.Test +import kotlin.collections.first class SyncNotificationWorkManagerRequestTest { @Test @@ -32,8 +33,8 @@ class SyncNotificationWorkManagerRequestTest { ) val result = request.build() - assertThat(result.isSuccess).isTrue() - result.getOrNull()!!.run { + assertThat(result.first().isSuccess).isTrue() + result.first().getOrNull()!!.run { assertThat(this).isInstanceOf(OneTimeWorkRequest::class.java) assertThat(workSpec.input.hasKeyWithValueOfType("requests")).isTrue() // True in API 33+ @@ -51,8 +52,8 @@ class SyncNotificationWorkManagerRequestTest { ) val result = request.build() - assertThat(result.isSuccess).isTrue() - result.getOrNull()!!.run { + assertThat(result.first().isSuccess).isTrue() + result.first().getOrNull()!!.run { assertThat(this).isInstanceOf(OneTimeWorkRequest::class.java) assertThat(workSpec.input.hasKeyWithValueOfType("requests")).isTrue() // False before API 33 @@ -69,7 +70,7 @@ class SyncNotificationWorkManagerRequestTest { ) val result = request.build() - assertThat(result.isFailure).isTrue() + assertThat(result.first().isFailure).isTrue() } @Test @@ -80,7 +81,7 @@ class SyncNotificationWorkManagerRequestTest { workerDataConverter = WorkerDataConverter({ error("error during serialization") }) ) val result = request.build() - assertThat(result.isFailure).isTrue() + assertThat(result.first().isFailure).isTrue() } } diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/workmanager/WorkerDataConverterTest.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/workmanager/WorkerDataConverterTest.kt index ad6999b4ea..9c3f346a28 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/workmanager/WorkerDataConverterTest.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/workmanager/WorkerDataConverterTest.kt @@ -10,6 +10,7 @@ package io.element.android.libraries.push.impl.workmanager import com.google.common.truth.Truth.assertThat import io.element.android.libraries.androidutils.json.DefaultJsonProvider +import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.test.AN_EVENT_ID import io.element.android.libraries.matrix.test.AN_EVENT_ID_2 import io.element.android.libraries.matrix.test.A_ROOM_ID @@ -45,9 +46,25 @@ class WorkerDataConverterTest { ) } + @Test + fun `serializing lots of data leads to several work data generated`() { + val data = List(100) { + NotificationEventRequest( + sessionId = A_SESSION_ID, + roomId = A_ROOM_ID, + eventId = EventId(AN_EVENT_ID.value + it), + providerInfo = "info$it", + ) + } + val sut = WorkerDataConverter(DefaultJsonProvider()) + val serialized = sut.serialize(data) + assertThat(serialized.size).isGreaterThan(1) + assertThat(serialized.size).isEqualTo(100 / WorkerDataConverter.CHUNK_SIZE) + } + private fun testIdentity(data: List) { val sut = WorkerDataConverter(DefaultJsonProvider()) - val serialized = sut.serialize(data).getOrThrow() + val serialized = sut.serialize(data).first().getOrThrow() val result = sut.deserialize(serialized) assertThat(result).isEqualTo(data) }