diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/FeatureFlagsManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/FeatureFlagsManager.java index 554ef583a..6251988e6 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/FeatureFlagsManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/FeatureFlagsManager.java @@ -26,10 +26,10 @@ import static com.codahale.metrics.MetricRegistry.name; */ public class FeatureFlagsManager implements Managed { - private final FeatureFlags featureFlagDatabase; - private final ScheduledExecutorService refreshExecutorService; - private ScheduledFuture refreshFuture; - private final AtomicReference> featureFlags = new AtomicReference<>(Collections.emptyMap()); + private final FeatureFlags featureFlagDatabase; + private final ScheduledExecutorService refreshExecutorService; + private ScheduledFuture refreshFuture; + private final AtomicReference> featureFlags = new AtomicReference<>(Collections.emptyMap()); private static final String GAUGE_NAME = "status"; private static final String FLAG_TAG_NAME = "flag"; @@ -70,6 +70,7 @@ public class FeatureFlagsManager implements Managed { @VisibleForTesting void refreshFeatureFlags() { final Map refreshedFeatureFlags = featureFlagDatabase.getFeatureFlags(); + featureFlags.set(refreshedFeatureFlags); for (final Map.Entry entry : refreshedFeatureFlags.entrySet()) { diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/controllers/FeatureFlagsControllerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/controllers/FeatureFlagsControllerTest.java index a80670d1d..7bf0f365a 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/controllers/FeatureFlagsControllerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/controllers/FeatureFlagsControllerTest.java @@ -60,6 +60,17 @@ public class FeatureFlagsControllerTest { verify(FEATURE_FLAG_MANAGER).setFeatureFlag("testFlag", true); } + { + final Response response = resources.getJerseyTest() + .target("/v1/featureflag/secondFlag") + .request() + .header("Token", "first") + .put(Entity.form(new Form().param("active", "false"))); + + assertEquals(204, response.getStatus()); + verify(FEATURE_FLAG_MANAGER).setFeatureFlag("secondFlag", false); + } + { final Response response = resources.getJerseyTest() .target("/v1/featureflag/testFlag") diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/storage/FeatureFlagsManagerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/storage/FeatureFlagsManagerTest.java index fd2ff031d..7c09d9e93 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/FeatureFlagsManagerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/FeatureFlagsManagerTest.java @@ -1,44 +1,46 @@ package org.whispersystems.textsecuregcm.storage; +import com.opentable.db.postgres.embedded.LiquibasePreparer; +import com.opentable.db.postgres.junit.EmbeddedPostgresRules; +import com.opentable.db.postgres.junit.PreparedDbRule; +import org.jdbi.v3.core.Jdbi; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.whispersystems.textsecuregcm.configuration.CircuitBreakerConfiguration; -import java.util.HashMap; -import java.util.Map; import java.util.concurrent.ScheduledExecutorService; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; public class FeatureFlagsManagerTest { - private FeatureFlags featureFlagDatabase; private FeatureFlagsManager featureFlagsManager; + @Rule + public PreparedDbRule db = EmbeddedPostgresRules.preparedDatabase(LiquibasePreparer.forClasspathLocation("accountsdb.xml")); + @Before public void setUp() { - featureFlagDatabase = mock(FeatureFlags.class); - featureFlagsManager = new FeatureFlagsManager(featureFlagDatabase, mock(ScheduledExecutorService.class)); + final FaultTolerantDatabase database = new FaultTolerantDatabase("featureFlagsTest", + Jdbi.create(db.getTestDatabase()), + new CircuitBreakerConfiguration()); + + featureFlagsManager = new FeatureFlagsManager(new FeatureFlags(database), mock(ScheduledExecutorService.class)); } @Test public void testIsFeatureFlagActive() { - final Map featureFlags = new HashMap<>(); - featureFlags.put("testFlag", true); + final String flagName = "testFlag"; - when(featureFlagDatabase.getFeatureFlags()).thenReturn(featureFlags); + assertFalse(featureFlagsManager.isFeatureFlagActive(flagName)); - assertFalse(featureFlagsManager.isFeatureFlagActive("testFlag")); + featureFlagsManager.setFeatureFlag(flagName, true); + assertTrue(featureFlagsManager.isFeatureFlagActive(flagName)); - featureFlagsManager.refreshFeatureFlags(); - - assertTrue(featureFlagsManager.isFeatureFlagActive("testFlag")); - - featureFlags.put("testFlag", false); - featureFlagsManager.refreshFeatureFlags(); - - assertFalse(featureFlagsManager.isFeatureFlagActive("testFlag")); + featureFlagsManager.setFeatureFlag(flagName, false); + assertFalse(featureFlagsManager.isFeatureFlagActive(flagName)); } }