Browse Source

Simplify `RegisterUnifiedPushUseCase`, fix test

pull/2899/head
Jorge Martín 4 months ago
parent
commit
0639bc6a5b
  1. 25
      libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/RegisterUnifiedPushUseCase.kt
  2. 9
      libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/DefaultRegisterUnifiedPushUseCaseTest.kt

25
libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/RegisterUnifiedPushUseCase.kt

@ -22,11 +22,8 @@ import io.element.android.libraries.di.AppScope
import io.element.android.libraries.di.ApplicationContext import io.element.android.libraries.di.ApplicationContext
import io.element.android.libraries.pushproviders.api.Distributor import io.element.android.libraries.pushproviders.api.Distributor
import io.element.android.libraries.pushproviders.unifiedpush.registration.EndpointRegistrationHandler import io.element.android.libraries.pushproviders.unifiedpush.registration.EndpointRegistrationHandler
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
import kotlinx.coroutines.withTimeout import kotlinx.coroutines.withTimeout
import org.unifiedpush.android.connector.UnifiedPush import org.unifiedpush.android.connector.UnifiedPush
import javax.inject.Inject import javax.inject.Inject
@ -40,27 +37,21 @@ interface RegisterUnifiedPushUseCase {
class DefaultRegisterUnifiedPushUseCase @Inject constructor( class DefaultRegisterUnifiedPushUseCase @Inject constructor(
@ApplicationContext private val context: Context, @ApplicationContext private val context: Context,
private val endpointRegistrationHandler: EndpointRegistrationHandler, private val endpointRegistrationHandler: EndpointRegistrationHandler,
private val coroutineScope: CoroutineScope,
) : RegisterUnifiedPushUseCase { ) : RegisterUnifiedPushUseCase {
override suspend fun execute(distributor: Distributor, clientSecret: String): Result<Unit> { override suspend fun execute(distributor: Distributor, clientSecret: String): Result<Unit> {
UnifiedPush.saveDistributor(context, distributor.value) UnifiedPush.saveDistributor(context, distributor.value)
val completable = CompletableDeferred<Result<Unit>>()
val job = coroutineScope.launch {
val result = endpointRegistrationHandler.state
.filter { it.clientSecret == clientSecret }
.first()
.result
completable.complete(result)
}
// This will trigger the callback // This will trigger the callback
// VectorUnifiedPushMessagingReceiver.onNewEndpoint // VectorUnifiedPushMessagingReceiver.onNewEndpoint
UnifiedPush.registerApp(context = context, instance = clientSecret) UnifiedPush.registerApp(context = context, instance = clientSecret)
// Wait for VectorUnifiedPushMessagingReceiver.onNewEndpoint to proceed // Wait for VectorUnifiedPushMessagingReceiver.onNewEndpoint to proceed
return withTimeout(30.seconds) { return runCatching {
completable.await() withTimeout(30.seconds) {
} val result = endpointRegistrationHandler.state
.onFailure { .filter { it.clientSecret == clientSecret }
job.cancel() .first()
.result
result.getOrThrow()
} }
}
} }
} }

9
libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/DefaultRegisterUnifiedPushUseCaseTest.kt

@ -25,12 +25,14 @@ import io.element.android.libraries.pushproviders.unifiedpush.registration.Endpo
import io.element.android.libraries.pushproviders.unifiedpush.registration.RegistrationResult import io.element.android.libraries.pushproviders.unifiedpush.registration.RegistrationResult
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.test.StandardTestDispatcher
import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.advanceTimeBy
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest
import org.junit.Ignore
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner import org.robolectric.RobolectricTestRunner
import kotlin.time.Duration.Companion.seconds
@RunWith(RobolectricTestRunner::class) @RunWith(RobolectricTestRunner::class)
class DefaultRegisterUnifiedPushUseCaseTest { class DefaultRegisterUnifiedPushUseCaseTest {
@ -64,15 +66,15 @@ class DefaultRegisterUnifiedPushUseCaseTest {
assertThat(result.isSuccess).isFalse() assertThat(result.isSuccess).isFalse()
} }
@Ignore("Find a solution to test timeout")
@Test @Test
fun `test registration timeout`() = runTest { fun `test registration timeout`() = runTest(StandardTestDispatcher()) {
val endpointRegistrationHandler = EndpointRegistrationHandler() val endpointRegistrationHandler = EndpointRegistrationHandler()
val useCase = createDefaultRegisterUnifiedPushUseCase( val useCase = createDefaultRegisterUnifiedPushUseCase(
endpointRegistrationHandler = endpointRegistrationHandler endpointRegistrationHandler = endpointRegistrationHandler
) )
val aDistributor = Distributor("aValue", "aName") val aDistributor = Distributor("aValue", "aName")
val result = useCase.execute(aDistributor, A_SECRET) val result = useCase.execute(aDistributor, A_SECRET)
advanceTimeBy(30.seconds)
assertThat(result.isSuccess).isFalse() assertThat(result.isSuccess).isFalse()
} }
@ -83,7 +85,6 @@ class DefaultRegisterUnifiedPushUseCaseTest {
return DefaultRegisterUnifiedPushUseCase( return DefaultRegisterUnifiedPushUseCase(
context = context, context = context,
endpointRegistrationHandler = endpointRegistrationHandler, endpointRegistrationHandler = endpointRegistrationHandler,
coroutineScope = this@createDefaultRegisterUnifiedPushUseCase
) )
} }
} }

Loading…
Cancel
Save