From 68bdfbc91a696be5578faefa3d819e61680f63e8 Mon Sep 17 00:00:00 2001 From: Matthias Urhahn <matthias.urhahn@sap.com> Date: Wed, 17 Mar 2021 19:17:28 +0100 Subject: [PATCH] If there is an `initialTestResultReceivedTimestamp` it may be (EXPOSUREAPP-4484) #2638 * If there is an `initialTestResultReceivedTimestamp` it may be the bug. If there is also a registration value, but no `devicePairingSuccessfulAt` timestamp, then we are being called from `asyncRegisterDeviceViaGUID` or `asyncRegisterDeviceViaTAN`, and it's a new test and `initialTestResultReceivedTimestamp` should be null. * Fix check order and add tests. --- .../submission/SubmissionRepository.kt | 10 ++++ .../storage/SubmissionRepositoryTest.kt | 55 ++++++++++++++++++- 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/submission/SubmissionRepository.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/submission/SubmissionRepository.kt index eb822b0b8..38edfe9df 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/submission/SubmissionRepository.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/submission/SubmissionRepository.kt @@ -165,6 +165,16 @@ class SubmissionRepository @Inject constructor( deadmanNotificationScheduler.cancelScheduledWork() } + // https://jira-ibs.wbs.net.sap/browse/EXPOSUREAPP-4484 + // User removed a test before 1.11 where due to a bug the timestamp was not removed. + if (submissionSettings.initialTestResultReceivedAt != null && + submissionSettings.registrationToken.value != null && + submissionSettings.devicePairingSuccessfulAt == null + ) { + Timber.tag(TAG).w("User has stale initialTestResultReceivedAt, fixing EXPOSUREAPP-4484.") + submissionSettings.initialTestResultReceivedAt = null + } + val initialTestResultReceivedTimestamp = submissionSettings.initialTestResultReceivedAt if (initialTestResultReceivedTimestamp == null) { diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/SubmissionRepositoryTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/SubmissionRepositoryTest.kt index 8744d3d5a..119b38c92 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/SubmissionRepositoryTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/SubmissionRepositoryTest.kt @@ -80,12 +80,15 @@ class SubmissionRepositoryTest : BaseTest() { every { submissionSettings.devicePairingSuccessfulAt = any() } just Runs every { submissionSettings.initialTestResultReceivedAt } returns resultReceivedTimeStamp + every { submissionSettings.initialTestResultReceivedAt = any() } just Runs every { submissionSettings.hasGivenConsent } returns mockFlowPreference(false) every { submissionSettings.hasViewedTestResult } returns mockFlowPreference(false) every { submissionSettings.symptoms } returns mockFlowPreference(Symptoms.NO_INFO_GIVEN) every { submissionSettings.clear() } just Runs + every { submissionSettings.devicePairingSuccessfulAt } returns null + every { taskController.tasks } returns emptyFlow() coEvery { tekHistoryStorage.clear() } just Runs @@ -118,7 +121,6 @@ class SubmissionRepositoryTest : BaseTest() { tracingSettings.isTestResultAvailableNotificationSent = capture(isTestResultAvailableNotificationSent) } answers {} - every { submissionSettings.initialTestResultReceivedAt = any() } just Runs every { submissionSettings.isAllowedToSubmitKeys = any() } just Runs every { submissionSettings.isSubmissionSuccessful = any() } just Runs @@ -277,4 +279,55 @@ class SubmissionRepositoryTest : BaseTest() { coVerify(exactly = 0) { submissionService.asyncRequestTestResult(any()) } } + + @Test + fun `EXPOSUREAPP-4484 is fixed`() = runBlockingTest { + every { timeStamper.nowUTC } returns Instant.EPOCH + + var initialTimeStamp = Instant.EPOCH.plus(9999) + every { submissionSettings.initialTestResultReceivedAt } answers { initialTimeStamp } + every { submissionSettings.initialTestResultReceivedAt = any() } answers { initialTimeStamp = arg(0) } + + every { submissionSettings.registrationToken } returns mockFlowPreference("token") + every { submissionSettings.devicePairingSuccessfulAt } returns null + + val submissionRepository = createInstance(scope = this) + + submissionRepository.updateTestResult(TestResult.NEGATIVE) + + verify { + submissionSettings.initialTestResultReceivedAt = null + submissionSettings.initialTestResultReceivedAt = Instant.EPOCH + } + + initialTimeStamp shouldBe Instant.EPOCH + } + + @Test + fun `EXPOSUREAPP-4484 has specific conditions`() = runBlockingTest { + val submissionRepository = createInstance(scope = this) + + every { submissionSettings.initialTestResultReceivedAt } returns Instant.ofEpochMilli(1234) + every { submissionSettings.registrationToken } returns mockFlowPreference("token") + // This needs to be null to trigger the fix + every { submissionSettings.devicePairingSuccessfulAt } returns Instant.ofEpochMilli(5678) + + submissionRepository.updateTestResult(TestResult.NEGATIVE) + + every { submissionSettings.initialTestResultReceivedAt } returns Instant.ofEpochMilli(1234) + // This needs to be non null to trigger the fix + every { submissionSettings.registrationToken } returns mockFlowPreference(null) + every { submissionSettings.devicePairingSuccessfulAt } returns null + + submissionRepository.updateTestResult(TestResult.NEGATIVE) + + // This needs to be non null to trigger the fix + every { submissionSettings.initialTestResultReceivedAt } returns null + every { submissionSettings.registrationToken } returns mockFlowPreference("token") + every { submissionSettings.devicePairingSuccessfulAt } returns null + + submissionRepository.updateTestResult(TestResult.NEGATIVE) + + verify(exactly = 0) { submissionSettings.initialTestResultReceivedAt = null } + } } -- GitLab