From b85d4bac1d2a564528ff5bf8bd1ff29cabfb48ba Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 31 Dec 2024 09:52:43 +0100 Subject: [PATCH] UnifiedPush: extract logic to resolve the gateway url and unit test it. --- .../UnifiedPushGatewayUrlResolver.kt | 43 ++++++++++ .../VectorUnifiedPushMessagingReceiver.kt | 15 +--- ...efaultUnifiedPushGatewayUrlResolverTest.kt | 83 +++++++++++++++++++ .../FakeUnifiedPushGatewayUrlResolver.kt | 18 ++++ .../VectorUnifiedPushMessagingReceiverTest.kt | 12 ++- 5 files changed, 156 insertions(+), 15 deletions(-) create mode 100644 libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/UnifiedPushGatewayUrlResolver.kt create mode 100644 libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/DefaultUnifiedPushGatewayUrlResolverTest.kt create mode 100644 libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/FakeUnifiedPushGatewayUrlResolver.kt diff --git a/libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/UnifiedPushGatewayUrlResolver.kt b/libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/UnifiedPushGatewayUrlResolver.kt new file mode 100644 index 0000000000..d338d55096 --- /dev/null +++ b/libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/UnifiedPushGatewayUrlResolver.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2024 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only + * Please see LICENSE in the repository root for full details. + */ + +package io.element.android.libraries.pushproviders.unifiedpush + +import com.squareup.anvil.annotations.ContributesBinding +import io.element.android.libraries.di.AppScope +import javax.inject.Inject + +interface UnifiedPushGatewayUrlResolver { + fun resolve( + gatewayResult: UnifiedPushGatewayResolverResult, + instance: String, + ): String +} + +@ContributesBinding(AppScope::class) +class DefaultUnifiedPushGatewayUrlResolver @Inject constructor( + private val unifiedPushStore: UnifiedPushStore, +) : UnifiedPushGatewayUrlResolver { + override fun resolve( + gatewayResult: UnifiedPushGatewayResolverResult, + instance: String, + ): String { + return when (gatewayResult) { + is UnifiedPushGatewayResolverResult.Error -> { + // Use previous gateway if any, or the provided one + unifiedPushStore.getPushGateway(instance) ?: gatewayResult.gateway + } + UnifiedPushGatewayResolverResult.ErrorInvalidUrl, + UnifiedPushGatewayResolverResult.NoMatrixGateway -> { + UnifiedPushConfig.DEFAULT_PUSH_GATEWAY_HTTP_URL + } + is UnifiedPushGatewayResolverResult.Success -> { + gatewayResult.gateway + } + } + } +} diff --git a/libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/VectorUnifiedPushMessagingReceiver.kt b/libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/VectorUnifiedPushMessagingReceiver.kt index eb40a7f1e0..096fb69c57 100644 --- a/libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/VectorUnifiedPushMessagingReceiver.kt +++ b/libraries/pushproviders/unifiedpush/src/main/kotlin/io/element/android/libraries/pushproviders/unifiedpush/VectorUnifiedPushMessagingReceiver.kt @@ -28,6 +28,7 @@ class VectorUnifiedPushMessagingReceiver : MessagingReceiver() { @Inject lateinit var guardServiceStarter: GuardServiceStarter @Inject lateinit var unifiedPushStore: UnifiedPushStore @Inject lateinit var unifiedPushGatewayResolver: UnifiedPushGatewayResolver + @Inject lateinit var unifiedPushGatewayUrlResolver: UnifiedPushGatewayUrlResolver @Inject lateinit var newGatewayHandler: UnifiedPushNewGatewayHandler @Inject lateinit var endpointRegistrationHandler: EndpointRegistrationHandler @Inject lateinit var coroutineScope: CoroutineScope @@ -65,19 +66,7 @@ class VectorUnifiedPushMessagingReceiver : MessagingReceiver() { coroutineScope.launch { val gateway = unifiedPushGatewayResolver.getGateway(endpoint) .let { gatewayResult -> - when (gatewayResult) { - is UnifiedPushGatewayResolverResult.Error -> { - // Use previous gateway if any, or the provided one - unifiedPushStore.getPushGateway(instance) ?: gatewayResult.gateway - } - UnifiedPushGatewayResolverResult.ErrorInvalidUrl, - UnifiedPushGatewayResolverResult.NoMatrixGateway -> { - UnifiedPushConfig.DEFAULT_PUSH_GATEWAY_HTTP_URL - } - is UnifiedPushGatewayResolverResult.Success -> { - gatewayResult.gateway - } - } + unifiedPushGatewayUrlResolver.resolve(gatewayResult, instance) } unifiedPushStore.storePushGateway(instance, gateway) val result = newGatewayHandler.handle(endpoint, gateway, instance) diff --git a/libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/DefaultUnifiedPushGatewayUrlResolverTest.kt b/libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/DefaultUnifiedPushGatewayUrlResolverTest.kt new file mode 100644 index 0000000000..46495b39e2 --- /dev/null +++ b/libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/DefaultUnifiedPushGatewayUrlResolverTest.kt @@ -0,0 +1,83 @@ +/* + * Copyright 2024 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only + * Please see LICENSE in the repository root for full details. + */ + +package io.element.android.libraries.pushproviders.unifiedpush + +import com.google.common.truth.Truth.assertThat +import org.junit.Test + +class DefaultUnifiedPushGatewayUrlResolverTest { + @Test + fun `resolve ErrorInvalidUrl returns the default gateway`() { + val sut = createDefaultUnifiedPushGatewayUrlResolver() + val result = sut.resolve( + gatewayResult = UnifiedPushGatewayResolverResult.ErrorInvalidUrl, + instance = "", + ) + assertThat(result).isEqualTo(UnifiedPushConfig.DEFAULT_PUSH_GATEWAY_HTTP_URL) + } + + @Test + fun `resolve NoMatrixGateway returns the default gateway`() { + val sut = createDefaultUnifiedPushGatewayUrlResolver() + val result = sut.resolve( + gatewayResult = UnifiedPushGatewayResolverResult.NoMatrixGateway, + instance = "", + ) + assertThat(result).isEqualTo(UnifiedPushConfig.DEFAULT_PUSH_GATEWAY_HTTP_URL) + } + + @Test + fun `resolve Success returns the url`() { + val sut = createDefaultUnifiedPushGatewayUrlResolver() + val result = sut.resolve( + gatewayResult = UnifiedPushGatewayResolverResult.Success("aUrl"), + instance = "", + ) + assertThat(result).isEqualTo("aUrl") + } + + @Test + fun `resolve Error returns the current url when available`() { + val sut = createDefaultUnifiedPushGatewayUrlResolver( + unifiedPushStore = FakeUnifiedPushStore( + getPushGatewayResult = { instance -> + assertThat(instance).isEqualTo("instance") + "aCurrentUrl" + }, + ) + ) + val result = sut.resolve( + gatewayResult = UnifiedPushGatewayResolverResult.Error("aUrl"), + instance = "instance", + ) + assertThat(result).isEqualTo("aCurrentUrl") + } + + @Test + fun `resolve Error returns the url if no current url is available`() { + val sut = createDefaultUnifiedPushGatewayUrlResolver( + unifiedPushStore = FakeUnifiedPushStore( + getPushGatewayResult = { instance -> + assertThat(instance).isEqualTo("instance") + null + }, + ) + ) + val result = sut.resolve( + gatewayResult = UnifiedPushGatewayResolverResult.Error("aUrl"), + instance = "instance", + ) + assertThat(result).isEqualTo("aUrl") + } + + private fun createDefaultUnifiedPushGatewayUrlResolver( + unifiedPushStore: UnifiedPushStore = FakeUnifiedPushStore(), + ) = DefaultUnifiedPushGatewayUrlResolver( + unifiedPushStore = unifiedPushStore, + ) +} diff --git a/libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/FakeUnifiedPushGatewayUrlResolver.kt b/libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/FakeUnifiedPushGatewayUrlResolver.kt new file mode 100644 index 0000000000..b4ac6da4aa --- /dev/null +++ b/libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/FakeUnifiedPushGatewayUrlResolver.kt @@ -0,0 +1,18 @@ +/* + * Copyright 2024 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only + * Please see LICENSE in the repository root for full details. + */ + +package io.element.android.libraries.pushproviders.unifiedpush + +import io.element.android.tests.testutils.lambda.lambdaError + +class FakeUnifiedPushGatewayUrlResolver( + private val resolveResult: (UnifiedPushGatewayResolverResult, String) -> String = { _, _ -> lambdaError() }, +) : UnifiedPushGatewayUrlResolver { + override fun resolve(gatewayResult: UnifiedPushGatewayResolverResult, instance: String): String { + return resolveResult(gatewayResult, instance) + } +} diff --git a/libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/VectorUnifiedPushMessagingReceiverTest.kt b/libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/VectorUnifiedPushMessagingReceiverTest.kt index ab726a9c82..2a402004ed 100644 --- a/libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/VectorUnifiedPushMessagingReceiverTest.kt +++ b/libraries/pushproviders/unifiedpush/src/test/kotlin/io/element/android/libraries/pushproviders/unifiedpush/VectorUnifiedPushMessagingReceiverTest.kt @@ -118,6 +118,9 @@ class VectorUnifiedPushMessagingReceiverTest { unifiedPushGatewayResolver = FakeUnifiedPushGatewayResolver( getGatewayResult = { UnifiedPushGatewayResolverResult.Success("aGateway") } ), + unifiedPushGatewayUrlResolver = FakeUnifiedPushGatewayUrlResolver( + resolveResult = { _, _ -> "aGatewayUrl" } + ), endpointRegistrationHandler = endpointRegistrationHandler, unifiedPushNewGatewayHandler = unifiedPushNewGatewayHandler, ) @@ -133,7 +136,7 @@ class VectorUnifiedPushMessagingReceiverTest { } storePushGatewayResult.assertions() .isCalledOnce() - .with(value(A_SECRET), value("aGateway")) + .with(value(A_SECRET), value("aGatewayUrl")) storeUpEndpointResult.assertions() .isCalledOnce() .with(value(A_SECRET), value("anEndpoint")) @@ -158,6 +161,9 @@ class VectorUnifiedPushMessagingReceiverTest { unifiedPushGatewayResolver = FakeUnifiedPushGatewayResolver( getGatewayResult = { UnifiedPushGatewayResolverResult.Success("aGateway") } ), + unifiedPushGatewayUrlResolver = FakeUnifiedPushGatewayUrlResolver( + resolveResult = { _, _ -> "aGatewayUrl" } + ), endpointRegistrationHandler = endpointRegistrationHandler, unifiedPushNewGatewayHandler = unifiedPushNewGatewayHandler, ) @@ -173,7 +179,7 @@ class VectorUnifiedPushMessagingReceiverTest { } storePushGatewayResult.assertions() .isCalledOnce() - .with(value(A_SECRET), value("aGateway")) + .with(value(A_SECRET), value("aGatewayUrl")) storeUpEndpointResult.assertions() .isNeverCalled() } @@ -182,6 +188,7 @@ class VectorUnifiedPushMessagingReceiverTest { pushHandler: PushHandler = FakePushHandler(), unifiedPushStore: UnifiedPushStore = FakeUnifiedPushStore(), unifiedPushGatewayResolver: UnifiedPushGatewayResolver = FakeUnifiedPushGatewayResolver(), + unifiedPushGatewayUrlResolver: UnifiedPushGatewayUrlResolver = FakeUnifiedPushGatewayUrlResolver(), unifiedPushNewGatewayHandler: UnifiedPushNewGatewayHandler = FakeUnifiedPushNewGatewayHandler(), endpointRegistrationHandler: EndpointRegistrationHandler = EndpointRegistrationHandler(), ): VectorUnifiedPushMessagingReceiver { @@ -191,6 +198,7 @@ class VectorUnifiedPushMessagingReceiverTest { this.guardServiceStarter = NoopGuardServiceStarter() this.unifiedPushStore = unifiedPushStore this.unifiedPushGatewayResolver = unifiedPushGatewayResolver + this.unifiedPushGatewayUrlResolver = unifiedPushGatewayUrlResolver this.newGatewayHandler = unifiedPushNewGatewayHandler this.endpointRegistrationHandler = endpointRegistrationHandler this.coroutineScope = this@createVectorUnifiedPushMessagingReceiver