diff --git a/pom.xml b/pom.xml index 69608af..1e3d2cd 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ 4.0.0 io.split.openfeature split-openfeature-provider - 1.2.1 + 1.2.2 split-openfeature-provider-java Split OpenFeature Java Provider www.split.io @@ -166,6 +166,12 @@ org.apache.maven.plugins maven-gpg-plugin 3.2.8 + + + --pinentry-mode + loopback + + sign-artifacts diff --git a/src/main/java/io/split/openfeature/SplitProvider.java b/src/main/java/io/split/openfeature/SplitProvider.java index 67c43cf..d7927af 100644 --- a/src/main/java/io/split/openfeature/SplitProvider.java +++ b/src/main/java/io/split/openfeature/SplitProvider.java @@ -17,15 +17,20 @@ import io.split.client.SplitClient; import io.split.client.api.SplitResult; import io.split.openfeature.utils.Serialization; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.time.Instant; import java.time.format.DateTimeParseException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.concurrent.TimeoutException; import java.util.stream.Collectors; public class SplitProvider implements FeatureProvider { + private static final Logger _log = LoggerFactory.getLogger(SplitProvider.class); private static final String NAME = "Split"; @@ -33,6 +38,14 @@ public class SplitProvider implements FeatureProvider { public SplitProvider(SplitClient splitClient) { client = splitClient; + try { + this.client.blockUntilReady(); + } catch (InterruptedException e) { + _log.error("Interrupted Exception: ", e); + Thread.currentThread().interrupt(); + } catch (TimeoutException e) { + throw new GeneralError("Error occurred initializing the client.", e); + } } public SplitProvider(String apiKey) { diff --git a/src/test/java/io/split/openfeature/ClientTest.java b/src/test/java/io/split/openfeature/ClientTest.java index 9dd966a..667d33b 100644 --- a/src/test/java/io/split/openfeature/ClientTest.java +++ b/src/test/java/io/split/openfeature/ClientTest.java @@ -36,7 +36,11 @@ public class ClientTest { public void init() { openFeatureAPI = OpenFeatureAPI.getInstance(); try { - SplitClientConfig config = SplitClientConfig.builder().splitFile("src/test/resources/split.yaml").build(); + SplitClientConfig config = SplitClientConfig + .builder() + .splitFile("src/test/resources/split.yaml") + .setBlockUntilReadyTimeout(10000) + .build(); splitClient = SplitFactoryBuilder.build("localhost", config).client(); openFeatureAPI.setProviderAndWait(new SplitProvider(splitClient)); } catch (URISyntaxException | IOException e) { diff --git a/src/test/java/io/split/openfeature/SplitProviderTest.java b/src/test/java/io/split/openfeature/SplitProviderTest.java index 14f4575..5282bc8 100644 --- a/src/test/java/io/split/openfeature/SplitProviderTest.java +++ b/src/test/java/io/split/openfeature/SplitProviderTest.java @@ -20,6 +20,7 @@ import java.time.Instant; import java.util.List; import java.util.Map; +import java.util.concurrent.TimeoutException; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -470,10 +471,10 @@ public void evalStructureErrorTest() { } @Test - public void trackWithDetailsTest() { + public void trackWithDetailsTest() throws InterruptedException, TimeoutException { SplitProvider provider = new SplitProvider(mockSplitClient); - + verify(mockSplitClient).blockUntilReady(); EvaluationContext ctx = new MutableContext(key).add("trafficType", "user"); TrackingEventDetails details = new MutableTrackingEventDetails(42.5) .add("plan", new Value("pro")) @@ -491,18 +492,19 @@ public void trackWithDetailsTest() { } @Test - public void trackTargetingKeyErrorTest() { + public void trackTargetingKeyErrorTest() throws InterruptedException, TimeoutException { // Tracking without targetingKey should throw error SplitProvider provider = new SplitProvider(mockSplitClient); EvaluationContext ctx = new MutableContext().add("trafficType", "user"); assertThrows(dev.openfeature.sdk.exceptions.TargetingKeyMissingError.class, () -> provider.track("purchase", ctx, null)); - verifyNoInteractions(mockSplitClient); + verify(mockSplitClient).blockUntilReady(); + verifyNoMoreInteractions(mockSplitClient); } @Test - public void trackEventNameErrorTest() { + public void trackEventNameErrorTest() throws InterruptedException, TimeoutException { // Tracking without eventName should throw error SplitProvider provider = new SplitProvider(mockSplitClient); EvaluationContext ctx = new MutableContext(key).add("trafficType", "user"); @@ -510,11 +512,12 @@ public void trackEventNameErrorTest() { GeneralError ex = assertThrows(GeneralError.class, () -> provider.track(" ", ctx, null)); // blank name assertTrue(ex.getMessage().toLowerCase().contains("eventname")); - verifyNoInteractions(mockSplitClient); + verify(mockSplitClient).blockUntilReady(); + verifyNoMoreInteractions(mockSplitClient); } @Test - public void trackTrafficTypeErrorTest() { + public void trackTrafficTypeErrorTest() throws InterruptedException, TimeoutException { // Tracking without trafficType should throw error SplitProvider provider = new SplitProvider(mockSplitClient); EvaluationContext ctx = new MutableContext(key); @@ -522,7 +525,8 @@ public void trackTrafficTypeErrorTest() { GeneralError ex = assertThrows(GeneralError.class, () -> provider.track("purchase", ctx, null)); assertTrue(ex.getMessage().toLowerCase().contains("traffictype")); - verifyNoInteractions(mockSplitClient); + verify(mockSplitClient).blockUntilReady(); + verifyNoMoreInteractions(mockSplitClient); } @Test