Merge pull request #2901 from element-hq/feature/bma/fixUnregisteringPusherLocalError
Fix unregistering pusher local error
This commit is contained in:
commit
85c8a26f8a
5 changed files with 41 additions and 17 deletions
|
|
@ -51,13 +51,16 @@ class DefaultPushService @Inject constructor(
|
||||||
pushProvider: PushProvider,
|
pushProvider: PushProvider,
|
||||||
distributor: Distributor,
|
distributor: Distributor,
|
||||||
): Result<Unit> {
|
): Result<Unit> {
|
||||||
|
Timber.d("Registering with ${pushProvider.name}/${distributor.name}}")
|
||||||
val userPushStore = userPushStoreFactory.getOrCreate(matrixClient.sessionId)
|
val userPushStore = userPushStoreFactory.getOrCreate(matrixClient.sessionId)
|
||||||
val currentPushProviderName = userPushStore.getPushProviderName()
|
val currentPushProviderName = userPushStore.getPushProviderName()
|
||||||
val currentPushProvider = pushProviders.find { it.name == currentPushProviderName }
|
val currentPushProvider = pushProviders.find { it.name == currentPushProviderName }
|
||||||
val currentDistributorValue = currentPushProvider?.getCurrentDistributor(matrixClient)?.value
|
val currentDistributorValue = currentPushProvider?.getCurrentDistributor(matrixClient)?.value
|
||||||
if (currentPushProviderName != pushProvider.name || currentDistributorValue != distributor.value) {
|
if (currentPushProviderName != pushProvider.name || currentDistributorValue != distributor.value) {
|
||||||
// Unregister previous one if any
|
// Unregister previous one if any
|
||||||
currentPushProvider?.unregister(matrixClient)
|
currentPushProvider
|
||||||
|
?.also { Timber.d("Unregistering previous push provider $currentPushProviderName/$currentDistributorValue") }
|
||||||
|
?.unregister(matrixClient)
|
||||||
?.onFailure {
|
?.onFailure {
|
||||||
Timber.w(it, "Failed to unregister previous push provider")
|
Timber.w(it, "Failed to unregister previous push provider")
|
||||||
return Result.failure(it)
|
return Result.failure(it)
|
||||||
|
|
|
||||||
|
|
@ -64,14 +64,13 @@ class FirebasePushProvider @Inject constructor(
|
||||||
override suspend fun getCurrentDistributor(matrixClient: MatrixClient) = firebaseDistributor
|
override suspend fun getCurrentDistributor(matrixClient: MatrixClient) = firebaseDistributor
|
||||||
|
|
||||||
override suspend fun unregister(matrixClient: MatrixClient): Result<Unit> {
|
override suspend fun unregister(matrixClient: MatrixClient): Result<Unit> {
|
||||||
val pushKey = firebaseStore.getFcmToken() ?: return Result.failure<Unit>(
|
val pushKey = firebaseStore.getFcmToken()
|
||||||
IllegalStateException(
|
return if (pushKey == null) {
|
||||||
"Unable to unregister pusher, Firebase token is not known."
|
|
||||||
)
|
|
||||||
).also {
|
|
||||||
Timber.tag(loggerTag.value).w("Unable to unregister pusher, Firebase token is not known.")
|
Timber.tag(loggerTag.value).w("Unable to unregister pusher, Firebase token is not known.")
|
||||||
|
Result.success(Unit)
|
||||||
|
} else {
|
||||||
|
pusherSubscriber.unregisterPusher(matrixClient, pushKey, FirebaseConfig.PUSHER_HTTP_URL)
|
||||||
}
|
}
|
||||||
return pusherSubscriber.unregisterPusher(matrixClient, pushKey, FirebaseConfig.PUSHER_HTTP_URL)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun getCurrentUserPushConfig(): CurrentUserPushConfig? {
|
override suspend fun getCurrentUserPushConfig(): CurrentUserPushConfig? {
|
||||||
|
|
|
||||||
|
|
@ -134,17 +134,14 @@ class FirebasePushProviderTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `unregister ko no token`() = runTest {
|
fun `unregister no token - in this case, the error is ignored`() = runTest {
|
||||||
val firebasePushProvider = createFirebasePushProvider(
|
val firebasePushProvider = createFirebasePushProvider(
|
||||||
firebaseStore = InMemoryFirebaseStore(
|
firebaseStore = InMemoryFirebaseStore(
|
||||||
token = null
|
token = null
|
||||||
),
|
),
|
||||||
pusherSubscriber = FakePusherSubscriber(
|
|
||||||
unregisterPusherResult = { _, _, _ -> Result.success(Unit) }
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
val result = firebasePushProvider.unregister(FakeMatrixClient())
|
val result = firebasePushProvider.unregister(FakeMatrixClient())
|
||||||
assertThat(result.isFailure).isTrue()
|
assertThat(result.isSuccess).isTrue()
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@ import io.element.android.libraries.di.ApplicationContext
|
||||||
import io.element.android.libraries.matrix.api.MatrixClient
|
import io.element.android.libraries.matrix.api.MatrixClient
|
||||||
import io.element.android.libraries.pushproviders.api.PusherSubscriber
|
import io.element.android.libraries.pushproviders.api.PusherSubscriber
|
||||||
import org.unifiedpush.android.connector.UnifiedPush
|
import org.unifiedpush.android.connector.UnifiedPush
|
||||||
|
import timber.log.Timber
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
interface UnregisterUnifiedPushUseCase {
|
interface UnregisterUnifiedPushUseCase {
|
||||||
|
|
@ -39,7 +40,11 @@ class DefaultUnregisterUnifiedPushUseCase @Inject constructor(
|
||||||
val endpoint = unifiedPushStore.getEndpoint(clientSecret)
|
val endpoint = unifiedPushStore.getEndpoint(clientSecret)
|
||||||
val gateway = unifiedPushStore.getPushGateway(clientSecret)
|
val gateway = unifiedPushStore.getPushGateway(clientSecret)
|
||||||
if (endpoint == null || gateway == null) {
|
if (endpoint == null || gateway == null) {
|
||||||
return Result.failure(IllegalStateException("No endpoint or gateway found for client secret"))
|
Timber.w("No endpoint or gateway found for client secret")
|
||||||
|
// Ensure we don't have any remaining data, but ignore this error
|
||||||
|
unifiedPushStore.storeUpEndpoint(clientSecret, null)
|
||||||
|
unifiedPushStore.storePushGateway(clientSecret, null)
|
||||||
|
return Result.success(Unit)
|
||||||
}
|
}
|
||||||
return pusherSubscriber.unregisterPusher(matrixClient, endpoint, gateway)
|
return pusherSubscriber.unregisterPusher(matrixClient, endpoint, gateway)
|
||||||
.onSuccess {
|
.onSuccess {
|
||||||
|
|
|
||||||
|
|
@ -64,29 +64,49 @@ class DefaultUnregisterUnifiedPushUseCaseTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `test un registration error - no endpoint`() = runTest {
|
fun `test un registration error - no endpoint - will not unregister but return success`() = runTest {
|
||||||
val matrixClient = FakeMatrixClient()
|
val matrixClient = FakeMatrixClient()
|
||||||
|
val storeUpEndpointResult = lambdaRecorder { _: String, _: String? -> }
|
||||||
|
val storePushGatewayResult = lambdaRecorder { _: String, _: String? -> }
|
||||||
val useCase = createDefaultUnregisterUnifiedPushUseCase(
|
val useCase = createDefaultUnregisterUnifiedPushUseCase(
|
||||||
unifiedPushStore = FakeUnifiedPushStore(
|
unifiedPushStore = FakeUnifiedPushStore(
|
||||||
getEndpointResult = { null },
|
getEndpointResult = { null },
|
||||||
getPushGatewayResult = { "aGateway" },
|
getPushGatewayResult = { "aGateway" },
|
||||||
|
storeUpEndpointResult = storeUpEndpointResult,
|
||||||
|
storePushGatewayResult = storePushGatewayResult,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
val result = useCase.execute(matrixClient, A_SECRET)
|
val result = useCase.execute(matrixClient, A_SECRET)
|
||||||
assertThat(result.isFailure).isTrue()
|
assertThat(result.isSuccess).isTrue()
|
||||||
|
storeUpEndpointResult.assertions()
|
||||||
|
.isCalledOnce()
|
||||||
|
.with(value(A_SECRET), value(null))
|
||||||
|
storePushGatewayResult.assertions()
|
||||||
|
.isCalledOnce()
|
||||||
|
.with(value(A_SECRET), value(null))
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `test un registration error - no gateway`() = runTest {
|
fun `test un registration error - no gateway - will not unregister but return success`() = runTest {
|
||||||
val matrixClient = FakeMatrixClient()
|
val matrixClient = FakeMatrixClient()
|
||||||
|
val storeUpEndpointResult = lambdaRecorder { _: String, _: String? -> }
|
||||||
|
val storePushGatewayResult = lambdaRecorder { _: String, _: String? -> }
|
||||||
val useCase = createDefaultUnregisterUnifiedPushUseCase(
|
val useCase = createDefaultUnregisterUnifiedPushUseCase(
|
||||||
unifiedPushStore = FakeUnifiedPushStore(
|
unifiedPushStore = FakeUnifiedPushStore(
|
||||||
getEndpointResult = { "aEndpoint" },
|
getEndpointResult = { "aEndpoint" },
|
||||||
getPushGatewayResult = { null },
|
getPushGatewayResult = { null },
|
||||||
|
storeUpEndpointResult = storeUpEndpointResult,
|
||||||
|
storePushGatewayResult = storePushGatewayResult,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
val result = useCase.execute(matrixClient, A_SECRET)
|
val result = useCase.execute(matrixClient, A_SECRET)
|
||||||
assertThat(result.isFailure).isTrue()
|
assertThat(result.isSuccess).isTrue()
|
||||||
|
storeUpEndpointResult.assertions()
|
||||||
|
.isCalledOnce()
|
||||||
|
.with(value(A_SECRET), value(null))
|
||||||
|
storePushGatewayResult.assertions()
|
||||||
|
.isCalledOnce()
|
||||||
|
.with(value(A_SECRET), value(null))
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue