From a76bbee3642e212506a14c9d565a027141fe8b2c Mon Sep 17 00:00:00 2001 From: petruki <31597636+petruki@users.noreply.github.com> Date: Tue, 26 May 2026 17:22:56 -0700 Subject: [PATCH 1/2] chore(tests): updated timed tests and other code smells --- README.md | 30 +++++++-------- .../client/SwitcherContextBase.java | 7 ++-- .../SwitcherBasicCriteriaResponseTest.java | 37 +++++++++---------- .../switcherapi/client/SwitcherBasicTest.java | 25 ++++++------- .../client/SwitcherConfigNativeTest.java | 2 +- .../client/SwitcherContextBuilderTest.java | 14 +++---- .../client/SwitcherSilentModeTest.java | 28 ++++++-------- .../SwitcherSnapshotAutoUpdate2Test.java | 6 +-- .../SwitcherSnapshotAutoUpdateTest.java | 27 +++++++------- .../client/SwitcherThrottle1Test.java | 12 +++--- .../client/SwitcherThrottle2Test.java | 6 +-- .../client/utils/SnapshotTest.java | 9 ++++- .../utils/SnapshotWatcherContextTest.java | 6 +-- .../utils/SnapshotWatcherErrorTest.java | 6 +-- .../client/utils/SnapshotWatcherTest.java | 14 +++---- .../utils/SnapshotWatcherWorkerTest.java | 4 +- .../switcherapi/fixture/CountDownHelper.java | 13 +++++++ .../resources/switcherapi-native.properties | 2 +- .../switcherapi-optionals.properties | 2 +- src/test/resources/switcherapi.properties | 2 +- 20 files changed, 127 insertions(+), 125 deletions(-) diff --git a/README.md b/README.md index 7b6192d..f25032b 100644 --- a/README.md +++ b/README.md @@ -123,9 +123,9 @@ Create `src/main/resources/switcherapi.properties`: # Required Configuration switcher.context=com.example.MyAppFeatures switcher.url=https://api.switcherapi.com -switcher.apikey=YOUR_API_KEY -switcher.component=my-application -switcher.domain=MY_DOMAIN +switcher.apikey=[API_KEY] +switcher.component=[COMPONENT_NAME] +switcher.domain=[DOMAIN_NAME} # Optional Configuration switcher.environment=default @@ -188,10 +188,10 @@ public class MyAppFeatures extends SwitcherContextBase { static { configure(ContextBuilder.builder() .context(MyAppFeatures.class.getName()) - .apiKey("YOUR_API_KEY") + .apiKey("[API_KEY]") .url("https://api.switcherapi.com") - .domain("MY_DOMAIN") - .component("my-application") + .domain("[DOMAIN_NAME]") + .component("[COMPONENT_NAME]") .environment("default")); initializeClient(); @@ -337,9 +337,9 @@ Default mode that communicates directly with Switcher API. ```java MyAppFeatures.configure(ContextBuilder.builder() .url("https://api.switcherapi.com") - .apiKey("YOUR_API_KEY") - .domain("MY_DOMAIN") - .component("my-app")); + .apiKey("[API_KEY]") + .domain("[DOMAIN_NAME]") + .component("[COMPONENT_NAME]")); MyAppFeatures.initializeClient(); ``` @@ -382,12 +382,12 @@ switcher.forceRemote().isItOn(); ```java MyAppFeatures.configure(ContextBuilder.builder() .url("https://api.switcherapi.com") - .apiKey("YOUR_API_KEY") - .domain("MY_DOMAIN") + .apiKey("[API_KEY]") + .domain("[DOMAIN_NAME]") .local(true) .snapshotAutoLoad(true) .snapshotAutoUpdateInterval("30s") // Check for updates every 30 seconds - .component("my-app")); + .component("[COMPONENT_NAME]")); MyAppFeatures.initializeClient(); @@ -418,10 +418,10 @@ Here is an example - in-memory snapshot with auto-update every 30 seconds: ```java MyAppFeatures.configure(ContextBuilder.builder() .context(MyAppFeatures.class.getName()) - .apiKey("YOUR_API_KEY") + .apiKey("[API_KEY]") .url("https://api.switcherapi.com") - .domain("MY_DOMAIN") - .component("my-application") + .domain("[DOMAIN_NAME") + .component("[COMPONENT_NAME]") .silentMode("5m") .snapshotAutoUpdateInterval("30s") ); diff --git a/src/main/java/com/switcherapi/client/SwitcherContextBase.java b/src/main/java/com/switcherapi/client/SwitcherContextBase.java index 9293680..4f2fa7f 100644 --- a/src/main/java/com/switcherapi/client/SwitcherContextBase.java +++ b/src/main/java/com/switcherapi/client/SwitcherContextBase.java @@ -66,10 +66,9 @@ * public void configureClient() { * Features.configure(ContextBuilder.builder() * .context(Features.class.getName()) - * .apiKey("API_KEY") - * .domain("Playground") - * .component("switcher-playground") - * .environment("default")); + * .apiKey("[API_KEY]") + * .domain("[DOMAIN_NAME]") + * .component("[COMPONENT_NAME]")); * * Features.initializeClient(); * } diff --git a/src/test/java/com/switcherapi/client/SwitcherBasicCriteriaResponseTest.java b/src/test/java/com/switcherapi/client/SwitcherBasicCriteriaResponseTest.java index 9ea0adf..b3e20b6 100644 --- a/src/test/java/com/switcherapi/client/SwitcherBasicCriteriaResponseTest.java +++ b/src/test/java/com/switcherapi/client/SwitcherBasicCriteriaResponseTest.java @@ -1,6 +1,6 @@ package com.switcherapi.client; -import com.switcherapi.Switchers; +import com.switcherapi.SwitchersBase; import com.switcherapi.client.model.SwitcherBuilder; import com.switcherapi.client.model.SwitcherRequest; import com.switcherapi.client.model.SwitcherResult; @@ -21,33 +21,30 @@ class SwitcherBasicCriteriaResponseTest extends MockWebServerHelper { private boolean authTokenGenerated = false; - + @BeforeAll static void setup() throws IOException { setupMockServer(); - Switchers.loadProperties(); // Load default properties from resources - Switchers.configure(ContextBuilder.builder() // Override default properties + SwitchersBase.configure(ContextBuilder.builder(true) + .context(SwitchersBase.class.getName()) .url(String.format("http://localhost:%s", mockBackEnd.getPort())) - .local(false) - .snapshotLocation(null) - .snapshotSkipValidation(false) - .environment(DEFAULT_ENV) - .silentMode(null) - .snapshotAutoLoad(false) - .snapshotAutoUpdateInterval(null)); + .domain("domain") + .apiKey("apiKey") + .component("component") + .environment(DEFAULT_ENV)); } - + @AfterAll static void tearDown() { tearDownMockServer(); } - + @BeforeEach void resetSwitcherContextState() { ((QueueDispatcher) mockBackEnd.getDispatcher()).clear(); - Switchers.initializeClient(); + SwitchersBase.initializeClient(); } @Test @@ -59,7 +56,7 @@ void shouldReturnCriteriaResponse() { givenResponse(generateCriteriaResponse("true", "Success")); //test - SwitcherRequest switcher = Switchers.getSwitcher(Switchers.REMOTE_KEY); + SwitcherRequest switcher = SwitchersBase.getSwitcher(SwitchersBase.USECASE11); SwitcherResult response = switcher.submit(); assertTrue(response.isItOn()); @@ -75,7 +72,7 @@ void shouldReturnCriteriaResponseWithInputs() { givenResponse(generateCriteriaResponse("false", "Strategy VALUE_VALIDATION does not agree")); //test - SwitcherRequest switcher = Switchers.getSwitcher(Switchers.REMOTE_KEY); + SwitcherRequest switcher = SwitchersBase.getSwitcher(SwitchersBase.USECASE11); SwitcherResult response = switcher .checkValue("value") .checkNumeric("10") @@ -87,8 +84,8 @@ void shouldReturnCriteriaResponseWithInputs() { @Test void shouldFlushStrategyInputs() { - SwitcherBuilder switcherBuilder = Switchers - .getSwitcher(Switchers.REMOTE_KEY) + SwitcherBuilder switcherBuilder = SwitchersBase + .getSwitcher(SwitchersBase.USECASE11) .checkValue("value") .checkNumeric("10"); @@ -111,7 +108,7 @@ void shouldReturnCriteriaResponseWithMetadata() { givenResponse(generateCriteriaResponse(new MetadataSample("123"))); //test - SwitcherRequest switcher = Switchers.getSwitcher(Switchers.REMOTE_KEY); + SwitcherRequest switcher = SwitchersBase.getSwitcher(SwitchersBase.USECASE11); SwitcherResult response = switcher.submit(); assertEquals("123", response.getMetadata(MetadataSample.class).getTransactionId()); @@ -126,7 +123,7 @@ void shouldReturnCriteriaResponseWithWrongMetadata() { givenResponse(generateCriteriaResponse(new MetadataErrorSample("123"))); //test - SwitcherRequest switcher = Switchers.getSwitcher(Switchers.REMOTE_KEY); + SwitcherRequest switcher = SwitchersBase.getSwitcher(SwitchersBase.USECASE11); SwitcherResult response = switcher.submit(); assertNotNull(response.getMetadata(MetadataSample.class)); diff --git a/src/test/java/com/switcherapi/client/SwitcherBasicTest.java b/src/test/java/com/switcherapi/client/SwitcherBasicTest.java index 300166e..bcc4302 100644 --- a/src/test/java/com/switcherapi/client/SwitcherBasicTest.java +++ b/src/test/java/com/switcherapi/client/SwitcherBasicTest.java @@ -1,6 +1,6 @@ package com.switcherapi.client; -import com.switcherapi.Switchers; +import com.switcherapi.SwitchersBase; import com.switcherapi.client.model.SwitcherRequest; import com.switcherapi.fixture.MockWebServerHelper; import mockwebserver3.QueueDispatcher; @@ -22,17 +22,14 @@ class SwitcherBasicTest extends MockWebServerHelper { @BeforeAll static void setup() throws IOException { setupMockServer(); - - Switchers.loadProperties(); // Load default properties from resources - Switchers.configure(ContextBuilder.builder() // Override default properties + + SwitchersBase.configure(ContextBuilder.builder(true) + .context(SwitchersBase.class.getName()) .url(String.format("http://localhost:%s", mockBackEnd.getPort())) - .local(false) - .snapshotLocation(null) - .snapshotSkipValidation(false) - .environment(DEFAULT_ENV) - .silentMode(null) - .snapshotAutoLoad(false) - .snapshotAutoUpdateInterval(null)); + .domain("domain") + .apiKey("apiKey") + .component("component") + .environment(DEFAULT_ENV)); } @AfterAll @@ -44,7 +41,7 @@ static void tearDown() { void resetSwitcherContextState() { ((QueueDispatcher) mockBackEnd.getDispatcher()).clear(); - Switchers.initializeClient(); + SwitchersBase.initializeClient(); } @Test @@ -56,7 +53,7 @@ void shouldReturnTrue() { givenResponse(generateCriteriaResponse("true", false)); //test - SwitcherRequest switcher = Switchers.getSwitcher(Switchers.REMOTE_KEY); + SwitcherRequest switcher = SwitchersBase.getSwitcher(SwitchersBase.USECASE11); assertTrue(switcher.isItOn()); } @@ -69,7 +66,7 @@ void shouldReturnFalse() { givenResponse(generateCriteriaResponse("false", false)); //test - SwitcherRequest switcher = Switchers.getSwitcher(Switchers.REMOTE_KEY); + SwitcherRequest switcher = SwitchersBase.getSwitcher(SwitchersBase.USECASE11); assertFalse(switcher.isItOn()); } diff --git a/src/test/java/com/switcherapi/client/SwitcherConfigNativeTest.java b/src/test/java/com/switcherapi/client/SwitcherConfigNativeTest.java index f86277c..9acdd09 100644 --- a/src/test/java/com/switcherapi/client/SwitcherConfigNativeTest.java +++ b/src/test/java/com/switcherapi/client/SwitcherConfigNativeTest.java @@ -56,7 +56,7 @@ void shouldUseNativeContextFromProperties() { assertTrue(SwitchersBaseNative.getSwitcher(SwitchersBaseNative.USECASE11).isItOn()); assertEquals("switcher-client", context.component); assertEquals("switcher-domain", context.domain); - assertEquals("[API_KEY]", context.apikey); + assertEquals("apiKey", context.apikey); assertEquals("http://localhost:3000", context.url); assertEquals("fixture1", context.environment); } diff --git a/src/test/java/com/switcherapi/client/SwitcherContextBuilderTest.java b/src/test/java/com/switcherapi/client/SwitcherContextBuilderTest.java index dc5f2bb..82b4868 100644 --- a/src/test/java/com/switcherapi/client/SwitcherContextBuilderTest.java +++ b/src/test/java/com/switcherapi/client/SwitcherContextBuilderTest.java @@ -24,9 +24,9 @@ void shouldReturnSuccess() { configure(ContextBuilder.builder(true) .context(SwitchersBase.class.getName()) .url("http://localhost:3000") - .apiKey("API_KEY") - .domain("switcher-domain") - .component("switcher-client") + .apiKey("apiKey") + .domain("domain") + .component("component") .environment(DEFAULT_ENV) .snapshotLocation(SNAPSHOTS_LOCAL) .local(true)); @@ -44,9 +44,9 @@ void shouldReturnError_snapshotNotLoaded() { configure(ContextBuilder.builder(true) .context(SwitchersBase.class.getName()) .url("http://localhost:3000") - .apiKey("API_KEY") - .domain("switcher-domain") - .component("switcher-client") + .apiKey("apiKey") + .domain("domain") + .component("component") .environment(DEFAULT_ENV) .snapshotLocation(null) .local(true)); @@ -61,7 +61,7 @@ void shouldThrowError_wrongContextKeyTypeUsage() { //given configure(ContextBuilder.builder(true) .context(SwitchersBase.class.getName()) - .domain("switcher-domain") + .domain("domain") .snapshotLocation(SNAPSHOTS_LOCAL) .local(true)); diff --git a/src/test/java/com/switcherapi/client/SwitcherSilentModeTest.java b/src/test/java/com/switcherapi/client/SwitcherSilentModeTest.java index 870695a..bc4c706 100644 --- a/src/test/java/com/switcherapi/client/SwitcherSilentModeTest.java +++ b/src/test/java/com/switcherapi/client/SwitcherSilentModeTest.java @@ -1,6 +1,6 @@ package com.switcherapi.client; -import com.switcherapi.Switchers; +import com.switcherapi.SwitchersBase; import com.switcherapi.client.model.SwitcherRequest; import com.switcherapi.fixture.CountDownHelper; import com.switcherapi.fixture.MockWebServerHelper; @@ -24,9 +24,6 @@ class SwitcherSilentModeTest extends MockWebServerHelper { @BeforeAll static void setup() throws IOException { setupMockServer(); - - Switchers.loadProperties(); - Switchers.configure(ContextBuilder.builder().url(String.format("http://localhost:%s", mockBackEnd.getPort()))); } @AfterAll @@ -38,25 +35,24 @@ static void tearDown() { void resetSwitcherContextState() { ((QueueDispatcher) mockBackEnd.getDispatcher()).clear(); - Switchers.configure(ContextBuilder.builder() - .local(false) - .snapshotLocation(null) - .snapshotSkipValidation(false) - .environment(DEFAULT_ENV) - .silentMode(null) - .snapshotAutoLoad(false) - .snapshotAutoUpdateInterval(null)); + SwitchersBase.configure(ContextBuilder.builder(true) + .context(SwitchersBase.class.getName()) + .url(String.format("http://localhost:%s", mockBackEnd.getPort())) + .domain("domain") + .apiKey("apiKey") + .component("component") + .environment(DEFAULT_ENV)); } @Test void shouldReturnTrue_silentMode() { //given - Switchers.configure(ContextBuilder.builder() + SwitchersBase.configure(ContextBuilder.builder() .snapshotLocation(SNAPSHOTS_LOCAL) .environment("fixture1") .silentMode("5s")); - - Switchers.initializeClient(); + + SwitchersBase.initializeClient(); //auth givenResponse(generateMockAuth(10)); @@ -65,7 +61,7 @@ void shouldReturnTrue_silentMode() { givenResponse(generateCriteriaResponse("true", false)); //test - SwitcherRequest switcher = Switchers.getSwitcher(Switchers.USECASE11); + SwitcherRequest switcher = SwitchersBase.getSwitcher(SwitchersBase.USECASE11); assertTrue(switcher.isItOn()); CountDownHelper.wait(2); diff --git a/src/test/java/com/switcherapi/client/SwitcherSnapshotAutoUpdate2Test.java b/src/test/java/com/switcherapi/client/SwitcherSnapshotAutoUpdate2Test.java index 1ead8b4..c64f07a 100644 --- a/src/test/java/com/switcherapi/client/SwitcherSnapshotAutoUpdate2Test.java +++ b/src/test/java/com/switcherapi/client/SwitcherSnapshotAutoUpdate2Test.java @@ -49,7 +49,7 @@ void shouldNotKillThread_whenAPI_wentLocal() { Switchers.configure(ContextBuilder.builder(true) .context(Switchers.class.getName()) .url(String.format("http://localhost:%s", mockBackEnd.getPort())) - .apiKey("[API_KEY]") + .apiKey("apiKey") .environment("generated_mock_default_6") .local(true) .snapshotAutoLoad(true) @@ -65,8 +65,8 @@ void shouldNotKillThread_whenAPI_wentLocal() { givenResponse(generateSnapshotResponse("default.json", SNAPSHOTS_LOCAL)); //graphql //test - CountDownHelper.wait(2); - assertEquals(2, Switchers.getSnapshotVersion()); + assertEquals(2, + CountDownHelper.waitUntil(10, 2L, Switchers::getSnapshotVersion)); } } diff --git a/src/test/java/com/switcherapi/client/SwitcherSnapshotAutoUpdateTest.java b/src/test/java/com/switcherapi/client/SwitcherSnapshotAutoUpdateTest.java index daab30d..b231062 100644 --- a/src/test/java/com/switcherapi/client/SwitcherSnapshotAutoUpdateTest.java +++ b/src/test/java/com/switcherapi/client/SwitcherSnapshotAutoUpdateTest.java @@ -87,7 +87,7 @@ void shouldUpdateSnapshot_local() { Switchers.configure(ContextBuilder.builder(true) .context(Switchers.class.getName()) .url(String.format("http://localhost:%s", mockBackEnd.getPort())) - .apiKey("[API_KEY]") + .apiKey("apiKey") .snapshotLocation(SNAPSHOTS_LOCAL) .environment("generated_mock_default_2") .local(true) @@ -98,8 +98,8 @@ void shouldUpdateSnapshot_local() { assertEquals(1, Switchers.getSnapshotVersion()); //test - CountDownHelper.wait(2); - assertEquals(2, Switchers.getSnapshotVersion()); + assertEquals(2, + CountDownHelper.waitUntil(10, 2L, Switchers::getSnapshotVersion)); } @Test @@ -112,7 +112,7 @@ void shouldUpdateSnapshot_remote() { Switchers.configure(ContextBuilder.builder(true) .context(Switchers.class.getName()) .url(String.format("http://localhost:%s", mockBackEnd.getPort())) - .apiKey("[API_KEY]") + .apiKey("apiKey") .domain("Test") .component("switcher-test") .snapshotLocation(SNAPSHOTS_LOCAL) @@ -125,8 +125,8 @@ void shouldUpdateSnapshot_remote() { assertEquals(1, Switchers.getSnapshotVersion()); //test - CountDownHelper.wait(2); - assertEquals(2, Switchers.getSnapshotVersion()); + assertEquals(2, + CountDownHelper.waitUntil(10, 2L, Switchers::getSnapshotVersion)); } @Test @@ -139,7 +139,7 @@ void shouldNotUpdateSnapshot_whenNoUpdateAvailable() { Switchers.configure(ContextBuilder.builder(true) .context(Switchers.class.getName()) .url(String.format("http://localhost:%s", mockBackEnd.getPort())) - .apiKey("[API_KEY]") + .apiKey("apiKey") .snapshotLocation(SNAPSHOTS_LOCAL) .environment("generated_mock_default_4") .local(true) @@ -150,8 +150,8 @@ void shouldNotUpdateSnapshot_whenNoUpdateAvailable() { assertEquals(1, Switchers.getSnapshotVersion()); //test - still the same version - CountDownHelper.wait(1); - assertEquals(1, Switchers.getSnapshotVersion()); + assertEquals(1, + CountDownHelper.waitUntil(10, 1L, Switchers::getSnapshotVersion)); } @Test @@ -167,7 +167,7 @@ void shouldUpdateSnapshot_remote_inMemory() { Switchers.configure(ContextBuilder.builder(true) .context(Switchers.class.getName()) .url(String.format("http://localhost:%s", mockBackEnd.getPort())) - .apiKey("[API_KEY]") + .apiKey("apiKey") .environment("generated_mock_default_5") .local(true) .snapshotLocation("") @@ -178,9 +178,8 @@ void shouldUpdateSnapshot_remote_inMemory() { assertEquals(1, Switchers.getSnapshotVersion()); //test - CountDownHelper.wait(2); - assertEquals(2, Switchers.getSnapshotVersion()); - assertTrue(Files.notExists(Paths.get("/generated_mock_default_5.json"))); + assertEquals(2, + CountDownHelper.waitUntil(10, 2L, Switchers::getSnapshotVersion)); } @Test @@ -198,7 +197,7 @@ void shouldRestartSnapshotAutoUpdate_whenAlreadySetup() { Switchers.configure(ContextBuilder.builder(true) .context(Switchers.class.getName()) .url(String.format("http://localhost:%s", mockBackEnd.getPort())) - .apiKey("[API_KEY]") + .apiKey("apiKey") .environment("generated_mock_default_6") .local(true) .snapshotAutoLoad(true) diff --git a/src/test/java/com/switcherapi/client/SwitcherThrottle1Test.java b/src/test/java/com/switcherapi/client/SwitcherThrottle1Test.java index 7378d19..16888f0 100644 --- a/src/test/java/com/switcherapi/client/SwitcherThrottle1Test.java +++ b/src/test/java/com/switcherapi/client/SwitcherThrottle1Test.java @@ -11,7 +11,7 @@ import java.io.IOException; import static com.switcherapi.client.remote.Constants.DEFAULT_ENV; -import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; class SwitcherThrottle1Test extends MockWebServerHelper { @@ -23,9 +23,9 @@ static void setup() throws IOException { SwitchersBase.configure(ContextBuilder.builder(true) .context(SwitchersBase.class.getName()) .url(String.format("http://localhost:%s", mockBackEnd.getPort())) - .apiKey("TEST_API_KEY") - .domain("TEST_DOMAIN") - .component("TEST_COMPONENT") + .apiKey("apiKey") + .domain("domain") + .component("component") .environment(DEFAULT_ENV)); SwitchersBase.initializeClient(); @@ -58,8 +58,8 @@ void shouldReturnTrue_withThrottle() { assertTrue(switcher.isItOn()); } - CountDownHelper.wait(1); - assertFalse(switcher.isItOn()); + assertEquals(Boolean.FALSE, + CountDownHelper.waitUntil(10, false, switcher::isItOn)); } } diff --git a/src/test/java/com/switcherapi/client/SwitcherThrottle2Test.java b/src/test/java/com/switcherapi/client/SwitcherThrottle2Test.java index c61804d..8c3e0a9 100644 --- a/src/test/java/com/switcherapi/client/SwitcherThrottle2Test.java +++ b/src/test/java/com/switcherapi/client/SwitcherThrottle2Test.java @@ -22,9 +22,9 @@ static void setup() throws IOException { SwitchersBase.configure(ContextBuilder.builder(true) .context(SwitchersBase.class.getName()) .url(String.format("http://localhost:%s", mockBackEnd.getPort())) - .apiKey("TEST_API_KEY") - .domain("TEST_DOMAIN") - .component("TEST_COMPONENT") + .apiKey("apiKey") + .domain("domain") + .component("component") .environment(DEFAULT_ENV)); SwitchersBase.initializeClient(); diff --git a/src/test/java/com/switcherapi/client/utils/SnapshotTest.java b/src/test/java/com/switcherapi/client/utils/SnapshotTest.java index a032571..7b1cf85 100644 --- a/src/test/java/com/switcherapi/client/utils/SnapshotTest.java +++ b/src/test/java/com/switcherapi/client/utils/SnapshotTest.java @@ -6,6 +6,7 @@ import com.switcherapi.client.service.WorkerName; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.switcherapi.fixture.CountDownHelper; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -66,7 +67,11 @@ protected void writeFixture(String content) { } protected void assertWorker(boolean exists) { - assertEquals(exists, Thread.getAllStackTraces().keySet().stream() - .anyMatch(t -> t.getName().equals(WorkerName.SNAPSHOT_WATCH_WORKER.toString()))); + assertWorker(exists, 5); + } + + protected void assertWorker(boolean exists, int timeout) { + assertEquals(exists, CountDownHelper.waitUntil(timeout, exists, () -> Thread.getAllStackTraces().keySet().stream() + .anyMatch(t -> t.getName().equals(WorkerName.SNAPSHOT_WATCH_WORKER.toString())))); } } diff --git a/src/test/java/com/switcherapi/client/utils/SnapshotWatcherContextTest.java b/src/test/java/com/switcherapi/client/utils/SnapshotWatcherContextTest.java index 463e9b2..7cdcbf8 100644 --- a/src/test/java/com/switcherapi/client/utils/SnapshotWatcherContextTest.java +++ b/src/test/java/com/switcherapi/client/utils/SnapshotWatcherContextTest.java @@ -9,6 +9,7 @@ import java.io.IOException; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertTrue; class SnapshotWatcherContextTest extends SnapshotTest { @@ -60,10 +61,9 @@ void shouldReloadDomainAfterChangingSnapshot() { //when we change the fixture this.changeFixture(); - CountDownHelper.wait(2); - //snapshot file updated - triggered domain reload - assertFalse(switcher.isItOn()); + assertNotEquals(Boolean.TRUE, + CountDownHelper.waitUntil(10, false, switcher::isItOn)); } } diff --git a/src/test/java/com/switcherapi/client/utils/SnapshotWatcherErrorTest.java b/src/test/java/com/switcherapi/client/utils/SnapshotWatcherErrorTest.java index 1b00ab1..fdc9363 100644 --- a/src/test/java/com/switcherapi/client/utils/SnapshotWatcherErrorTest.java +++ b/src/test/java/com/switcherapi/client/utils/SnapshotWatcherErrorTest.java @@ -16,9 +16,9 @@ void shouldNotWatchSnapshotWhenRemote() { SwitchersBase.configure(ContextBuilder.builder(true) .context(SwitchersBase.class.getName()) .url("https://api.switcherapi.com") - .apiKey("[API_KEY]") - .domain("Test") - .component("switcher-test") + .apiKey("apiKey") + .domain("domain") + .component("component") .local(false)); SwitchersBase.initializeClient(); diff --git a/src/test/java/com/switcherapi/client/utils/SnapshotWatcherTest.java b/src/test/java/com/switcherapi/client/utils/SnapshotWatcherTest.java index b145f79..5bbb206 100644 --- a/src/test/java/com/switcherapi/client/utils/SnapshotWatcherTest.java +++ b/src/test/java/com/switcherapi/client/utils/SnapshotWatcherTest.java @@ -11,7 +11,7 @@ import java.io.IOException; -import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; class SnapshotWatcherTest extends SnapshotTest { @@ -53,10 +53,9 @@ void shouldNotReloadDomainAfterChangingSnapshot() { SwitchersBase.stopWatchingSnapshot(); this.changeFixture(); - CountDownHelper.wait(2); - //snapshot file updated - does not change as the watcher has been terminated - assertTrue(switcher.isItOn()); + assertEquals(Boolean.TRUE, + CountDownHelper.waitUntil(10, true, switcher::isItOn)); } @Test @@ -67,13 +66,12 @@ void shouldReloadDomainAfterChangingSnapshot() { assertTrue(switcher.isItOn()); CountDownHelper.wait(1); - - this.changeFixture(); - CountDownHelper.wait(2); + this.changeFixture(); //snapshot file updated - triggered domain reload - assertFalse(switcher.isItOn()); + assertEquals(Boolean.FALSE, + CountDownHelper.waitUntil(10, false, switcher::isItOn)); } } diff --git a/src/test/java/com/switcherapi/client/utils/SnapshotWatcherWorkerTest.java b/src/test/java/com/switcherapi/client/utils/SnapshotWatcherWorkerTest.java index 1d605ea..4e2f053 100644 --- a/src/test/java/com/switcherapi/client/utils/SnapshotWatcherWorkerTest.java +++ b/src/test/java/com/switcherapi/client/utils/SnapshotWatcherWorkerTest.java @@ -2,7 +2,6 @@ import com.switcherapi.SwitchersBase; import com.switcherapi.client.ContextBuilder; -import com.switcherapi.fixture.CountDownHelper; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -27,9 +26,8 @@ void shouldStartAndKillWorker() { assertWorker(true); SwitchersBase.stopWatchingSnapshot(); - CountDownHelper.wait(2); - assertWorker(false); + assertWorker(false, 10); } } diff --git a/src/test/java/com/switcherapi/fixture/CountDownHelper.java b/src/test/java/com/switcherapi/fixture/CountDownHelper.java index 416f886..10ca903 100644 --- a/src/test/java/com/switcherapi/fixture/CountDownHelper.java +++ b/src/test/java/com/switcherapi/fixture/CountDownHelper.java @@ -5,6 +5,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; public class CountDownHelper { @@ -22,4 +23,16 @@ public static void wait(int seconds) { logger.error(e.getMessage(), e); } } + + public static T waitUntil(int timeout, T expected, Supplier condition) { + long startTime = System.currentTimeMillis(); + while (System.currentTimeMillis() - startTime < timeout * 1000L) { + T result = condition.get(); + if (expected.equals(result)) { + return result; + } + wait(1); + } + return null; + } } diff --git a/src/test/resources/switcherapi-native.properties b/src/test/resources/switcherapi-native.properties index b77457a..c6fe500 100644 --- a/src/test/resources/switcherapi-native.properties +++ b/src/test/resources/switcherapi-native.properties @@ -1,5 +1,5 @@ switcher.url=http://localhost:3000 -switcher.apikey=[API_KEY] +switcher.apikey=apiKey switcher.component=switcher-client switcher.environment=fixture1 switcher.domain=switcher-domain diff --git a/src/test/resources/switcherapi-optionals.properties b/src/test/resources/switcherapi-optionals.properties index a17ad00..85f0051 100644 --- a/src/test/resources/switcherapi-optionals.properties +++ b/src/test/resources/switcherapi-optionals.properties @@ -1,6 +1,6 @@ switcher.context=com.switcherapi.SwitchersBase switcher.url=http://localhost:3000 -switcher.apikey=[API_KEY] +switcher.apikey=apiKey switcher.component=switcher-client switcher.environment=test switcher.domain=switcher-domain diff --git a/src/test/resources/switcherapi.properties b/src/test/resources/switcherapi.properties index e2bf2f1..000d560 100644 --- a/src/test/resources/switcherapi.properties +++ b/src/test/resources/switcherapi.properties @@ -1,6 +1,6 @@ switcher.context=com.switcherapi.Switchers switcher.url=http://localhost:3000 -switcher.apikey=[API_KEY] +switcher.apikey=apiKey switcher.component=switcher-client switcher.environment=test switcher.domain=switcher-domain From 98c52fb8a65f66a4ca4a344975261c3e07a533a6 Mon Sep 17 00:00:00 2001 From: petruki <31597636+petruki@users.noreply.github.com> Date: Tue, 26 May 2026 17:26:00 -0700 Subject: [PATCH 2/2] fix(test): removed unused import --- .../com/switcherapi/client/utils/SnapshotWatcherContextTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/com/switcherapi/client/utils/SnapshotWatcherContextTest.java b/src/test/java/com/switcherapi/client/utils/SnapshotWatcherContextTest.java index 7cdcbf8..5de54d2 100644 --- a/src/test/java/com/switcherapi/client/utils/SnapshotWatcherContextTest.java +++ b/src/test/java/com/switcherapi/client/utils/SnapshotWatcherContextTest.java @@ -8,7 +8,6 @@ import java.io.IOException; -import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertTrue;