diff --git a/app/src/main/java/org/mozilla/fenix/experiments/NimbusSetup.kt b/app/src/main/java/org/mozilla/fenix/experiments/NimbusSetup.kt index 5fd84dd8e..db7d1c159 100644 --- a/app/src/main/java/org/mozilla/fenix/experiments/NimbusSetup.kt +++ b/app/src/main/java/org/mozilla/fenix/experiments/NimbusSetup.kt @@ -109,17 +109,17 @@ fun NimbusInterface.maybeFetchExperiments( feature: NimbusSystem = FxNimbusMessaging.features.nimbusSystem.value(), currentTimeMillis: Long = System.currentTimeMillis(), ) { - val minimumPeriodMinutes = if (!context.settings().nimbusUsePreview) { - feature.refreshIntervalForeground + if (context.settings().nimbusUsePreview) { + context.settings().nimbusLastFetchTime = 0L + fetchExperiments() } else { - 0 - } - - val lastFetchTimeMillis = context.settings().nimbusLastFetchTime - val minimumPeriodMillis = minimumPeriodMinutes * Settings.ONE_MINUTE_MS + val minimumPeriodMinutes = feature.refreshIntervalForeground + val lastFetchTimeMillis = context.settings().nimbusLastFetchTime + val minimumPeriodMillis = minimumPeriodMinutes * Settings.ONE_MINUTE_MS - if (currentTimeMillis - lastFetchTimeMillis >= minimumPeriodMillis) { - context.settings().nimbusLastFetchTime = currentTimeMillis - fetchExperiments() + if (currentTimeMillis - lastFetchTimeMillis >= minimumPeriodMillis) { + context.settings().nimbusLastFetchTime = currentTimeMillis + fetchExperiments() + } } } diff --git a/app/src/test/java/org/mozilla/fenix/nimbus/NimbusSystemTest.kt b/app/src/test/java/org/mozilla/fenix/nimbus/NimbusSystemTest.kt index 3a0dbf220..b3e2362b4 100644 --- a/app/src/test/java/org/mozilla/fenix/nimbus/NimbusSystemTest.kt +++ b/app/src/test/java/org/mozilla/fenix/nimbus/NimbusSystemTest.kt @@ -100,4 +100,65 @@ class NimbusSystemTest { ) assertTrue(nimbus.isFetching) } + + @Test + fun `GIVEN a nimbus object calling maybeFetchExperiments WHEN using a preview collection THEN always call fetchExperiments`() { + var currentTime = 0L + fun assertFetchEveryTime() { + nimbus.maybeFetchExperiments( + context, + config, + currentTime, + ) + assertTrue(nimbus.isFetching) + assertEquals(lastTimeSlot.captured, 0L) + nimbus.isFetching = false + } + + // Using usePreview, we call fetch every time we call maybeFetch. + every { settings.nimbusUsePreview } returns true + currentTime = Settings.ONE_HOUR_MS + assertFetchEveryTime() + + currentTime += Settings.ONE_MINUTE_MS + assertFetchEveryTime() + + currentTime += Settings.ONE_MINUTE_MS + assertFetchEveryTime() + + // Now turn preview collection off. + // We should fetch exactly once… + every { settings.nimbusUsePreview } returns false + + currentTime += Settings.ONE_MINUTE_MS + nimbus.maybeFetchExperiments( + context, + config, + currentTime, + ) + assertTrue(nimbus.isFetching) + assertEquals(lastTimeSlot.captured, currentTime) + nimbus.isFetching = false + every { settings.nimbusLastFetchTime } returns currentTime + + // … and then back off. We show here that the next call to maybeFetch + // doesn't call fetch. + currentTime += Settings.ONE_MINUTE_MS + nimbus.maybeFetchExperiments( + context, + config, + currentTime, + ) + assertFalse(nimbus.isFetching) + + // Now wait, another hour, and we've reset the behaviour back to normal operation. + currentTime += Settings.ONE_HOUR_MS + Settings.ONE_MINUTE_MS + nimbus.maybeFetchExperiments( + context, + config, + currentTime, + ) + assertTrue(nimbus.isFetching) + assertEquals(lastTimeSlot.captured, currentTime) + } }