diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/server/VerificationServer.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/server/VerificationServer.kt index 3ae32ead140aebe45a3ebc590eec9eaee0950f0f..78d80f3f1620b50164a26ca76d3f09e81609ec0a 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/server/VerificationServer.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/server/VerificationServer.kt @@ -6,6 +6,7 @@ import de.rki.coronawarnapp.util.PaddingTool.requestPadding import de.rki.coronawarnapp.util.security.HashHelper import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import org.joda.time.Duration import timber.log.Timber import javax.inject.Inject import javax.inject.Singleton @@ -114,6 +115,12 @@ class VerificationServer @Inject constructor( const val PADDING_LENGTH_BODY_TAN_FAKE = 31 + VERIFICATION_BODY_FILL const val DUMMY_REGISTRATION_TOKEN = "11111111-2222-4444-8888-161616161616" + /** + * Test is available for this long on the server. + * After this period the server will delete it and return PENDING if the regtoken is polled again. + */ + val TEST_AVAILABLBILITY = Duration.standardDays(60) + private const val TAG = "VerificationServer" } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/type/pcr/PCRProcessor.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/type/pcr/PCRProcessor.kt index a5d44f6886fe26008471e63b6d3e1f8c97607f73..d866dca57e230c320f0322319a5b0c7f4a2e9676 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/type/pcr/PCRProcessor.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/type/pcr/PCRProcessor.kt @@ -14,6 +14,7 @@ import de.rki.coronawarnapp.coronatest.server.CoronaTestResult.RAT_NEGATIVE import de.rki.coronawarnapp.coronatest.server.CoronaTestResult.RAT_PENDING import de.rki.coronawarnapp.coronatest.server.CoronaTestResult.RAT_POSITIVE import de.rki.coronawarnapp.coronatest.server.CoronaTestResult.RAT_REDEEMED +import de.rki.coronawarnapp.coronatest.server.VerificationServer import de.rki.coronawarnapp.coronatest.tan.CoronaTestTAN import de.rki.coronawarnapp.coronatest.type.CoronaTest import de.rki.coronawarnapp.coronatest.type.CoronaTestProcessor @@ -26,7 +27,6 @@ import de.rki.coronawarnapp.exception.http.BadRequestException import de.rki.coronawarnapp.exception.http.CwaWebException import de.rki.coronawarnapp.exception.reporting.report import de.rki.coronawarnapp.util.TimeStamper -import de.rki.coronawarnapp.worker.BackgroundConstants import org.joda.time.Duration import org.joda.time.Instant import timber.log.Timber @@ -139,7 +139,7 @@ class PCRProcessor @Inject constructor( } test.copy( - testResult = check21PlusDays(test, newTestResult), + testResult = check60Days(test, newTestResult), testResultReceivedAt = determineReceivedDate(test, newTestResult), lastUpdatedAt = nowUTC, lastError = null @@ -153,13 +153,13 @@ class PCRProcessor @Inject constructor( } } - // After 21 days, the previously EXPIRED test is deleted from the server, and it may return pending again. - private fun check21PlusDays(test: CoronaTest, newResult: CoronaTestResult): CoronaTestResult { - val calculateDays = Duration(test.registeredAt, timeStamper.nowUTC).standardDays - Timber.tag(TAG).d("Calculated test age: %d days, newResult=%s", calculateDays, newResult) + // After 60 days, the previously EXPIRED test is deleted from the server, and it may return pending again. + private fun check60Days(test: CoronaTest, newResult: CoronaTestResult): CoronaTestResult { + val calculateDays = Duration(test.registeredAt, timeStamper.nowUTC) + Timber.tag(TAG).d("Calculated test age: %d days, newResult=%s", calculateDays.standardDays, newResult) - return if (newResult == PCR_OR_RAT_PENDING && calculateDays >= BackgroundConstants.POLLING_VALIDITY_MAX_DAYS) { - Timber.tag(TAG).d("$calculateDays is exceeding the maximum polling duration") + return if (newResult == PCR_OR_RAT_PENDING && calculateDays > VerificationServer.TEST_AVAILABLBILITY) { + Timber.tag(TAG).d("$calculateDays is exceeding the test availability.") PCR_REDEEMED } else { newResult diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/type/rapidantigen/RapidAntigenProcessor.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/type/rapidantigen/RapidAntigenProcessor.kt index 964bb01bdb75d3bf7e58eec53a30746e601a0fa2..13654af995730337cf71d2b4e257b9dfda554354 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/type/rapidantigen/RapidAntigenProcessor.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/type/rapidantigen/RapidAntigenProcessor.kt @@ -13,6 +13,7 @@ import de.rki.coronawarnapp.coronatest.server.CoronaTestResult.RAT_NEGATIVE import de.rki.coronawarnapp.coronatest.server.CoronaTestResult.RAT_PENDING import de.rki.coronawarnapp.coronatest.server.CoronaTestResult.RAT_POSITIVE import de.rki.coronawarnapp.coronatest.server.CoronaTestResult.RAT_REDEEMED +import de.rki.coronawarnapp.coronatest.server.VerificationServer import de.rki.coronawarnapp.coronatest.tan.CoronaTestTAN import de.rki.coronawarnapp.coronatest.type.CoronaTest import de.rki.coronawarnapp.coronatest.type.CoronaTestProcessor @@ -23,7 +24,6 @@ import de.rki.coronawarnapp.exception.http.BadRequestException import de.rki.coronawarnapp.exception.http.CwaWebException import de.rki.coronawarnapp.exception.reporting.report import de.rki.coronawarnapp.util.TimeStamper -import de.rki.coronawarnapp.worker.BackgroundConstants import org.joda.time.Duration import org.joda.time.Instant import timber.log.Timber @@ -112,7 +112,7 @@ class RapidAntigenProcessor @Inject constructor( } test.copy( - testResult = check21PlusDays(test, newTestResult), + testResult = check60Days(test, newTestResult), testResultReceivedAt = determineReceivedDate(test, newTestResult), lastUpdatedAt = nowUTC, lastError = null @@ -126,16 +126,15 @@ class RapidAntigenProcessor @Inject constructor( } } - // After 21 days, the previously EXPIRED test is deleted from the server, and it may return pending again. - private fun check21PlusDays(test: CoronaTest, newResult: CoronaTestResult): CoronaTestResult { - val calculateDays = Duration(test.registeredAt, timeStamper.nowUTC).standardDays - Timber.tag(TAG).d("Calculated test age: %d days, newResult=%s", calculateDays, newResult) + // After 60 days, the previously EXPIRED test is deleted from the server, and it may return pending again. + private fun check60Days(test: CoronaTest, newResult: CoronaTestResult): CoronaTestResult { + val calculateDays = Duration(test.registeredAt, timeStamper.nowUTC) + Timber.tag(TAG).d("Calculated test age: %d days, newResult=%s", calculateDays.standardDays, newResult) - return if ( - (newResult == PCR_OR_RAT_PENDING || newResult == RAT_PENDING) && - calculateDays >= BackgroundConstants.POLLING_VALIDITY_MAX_DAYS + return if ((newResult == PCR_OR_RAT_PENDING || newResult == RAT_PENDING) && + calculateDays > VerificationServer.TEST_AVAILABLBILITY ) { - Timber.tag(TAG).d("$calculateDays is exceeding the maximum polling duration") + Timber.tag(TAG).d("$calculateDays is exceeding the test availability.") RAT_REDEEMED } else { newResult diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundConstants.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundConstants.kt index 32bec142a340b955e949c5b6b58fd1b7e79fe838..600b8a8f2a785fe5213d091972798960eeb9869b 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundConstants.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/worker/BackgroundConstants.kt @@ -19,13 +19,6 @@ object BackgroundConstants { */ const val WORKER_RETRY_COUNT_THRESHOLD = 2 - /** - * The maximum validity in days for keeping Background polling active - * - * @see TimeUnit.DAYS - */ - const val POLLING_VALIDITY_MAX_DAYS = 21 - /** * Backoff initial delay * diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/coronatest/server/VerificationServerTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/coronatest/server/VerificationServerTest.kt index a7f311ba6a18f1b0107130993b5912513bc0ad1c..86cf613364c9c51cb26871ef000dc051c3c9c9d1 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/coronatest/server/VerificationServerTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/coronatest/server/VerificationServerTest.kt @@ -13,6 +13,7 @@ import kotlinx.coroutines.runBlocking import okhttp3.ConnectionSpec import okhttp3.mockwebserver.MockResponse import okhttp3.mockwebserver.MockWebServer +import org.joda.time.Duration import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -211,4 +212,9 @@ class VerificationServerTest : BaseIOTest() { a.headerSizeIgnoringContentLength() shouldBe b.headerSizeIgnoringContentLength() } } + + @Test + fun `test availability constant`() { + VerificationServer.TEST_AVAILABLBILITY shouldBe Duration.standardDays(60) + } } diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/coronatest/type/pcr/PCRProcessorTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/coronatest/type/pcr/PCRProcessorTest.kt index ab6c4b178ec1e4335d6ca35e78203378d5b4f582..4401dc012eeb67e776a812430b0211c16283f60d 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/coronatest/type/pcr/PCRProcessorTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/coronatest/type/pcr/PCRProcessorTest.kt @@ -94,7 +94,7 @@ class PCRProcessorTest : BaseTest() { instance.pollServer(pcrTest).testResult shouldBe PCR_OR_RAT_PENDING val past60DaysTest = pcrTest.copy( - registeredAt = nowUTC.minus(Duration.standardDays(21)) + registeredAt = nowUTC.minus(Duration.standardDays(61)) ) instance.pollServer(past60DaysTest).testResult shouldBe PCR_REDEEMED diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/coronatest/type/rapidantigen/RapidAntigenProcessorTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/coronatest/type/rapidantigen/RapidAntigenProcessorTest.kt index 3cd6913d97017a8aec38da5c5cb2192c533f98d7..b3287063eb1098b7de65538b526782e4c7402725 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/coronatest/type/rapidantigen/RapidAntigenProcessorTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/coronatest/type/rapidantigen/RapidAntigenProcessorTest.kt @@ -75,7 +75,7 @@ class RapidAntigenProcessorTest : BaseTest() { instance.pollServer(raTest).testResult shouldBe PCR_OR_RAT_PENDING val past60DaysTest = raTest.copy( - registeredAt = nowUTC.minus(Duration.standardDays(21)) + registeredAt = nowUTC.minus(Duration.standardDays(61)) ) instance.pollServer(past60DaysTest).testResult shouldBe RAT_REDEEMED diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/worker/BackgroundConstantsTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/worker/BackgroundConstantsTest.kt index c932ef5a240341b9ec60177bdaa0b1c46bcc7499..c354d0634b62b0778ba9575daec973705b3db689 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/worker/BackgroundConstantsTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/worker/BackgroundConstantsTest.kt @@ -9,7 +9,6 @@ class BackgroundConstantsTest { fun allBackgroundConstants() { Assert.assertEquals(BackgroundConstants.KIND_DELAY, 1L) Assert.assertEquals(BackgroundConstants.WORKER_RETRY_COUNT_THRESHOLD, 2) - Assert.assertEquals(BackgroundConstants.POLLING_VALIDITY_MAX_DAYS, 21) Assert.assertEquals(BackgroundConstants.BACKOFF_INITIAL_DELAY, 8L) } }