Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: provider state check #603

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/main/java/dev/openfeature/sdk/OpenFeatureClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

import dev.openfeature.sdk.exceptions.GeneralError;
import dev.openfeature.sdk.exceptions.OpenFeatureError;
import dev.openfeature.sdk.exceptions.ProviderNotReadyError;
import dev.openfeature.sdk.internal.AutoCloseableLock;
import dev.openfeature.sdk.internal.AutoCloseableReentrantReadWriteLock;
import dev.openfeature.sdk.internal.ObjectUtils;
Expand Down Expand Up @@ -163,6 +164,14 @@ private <T> ProviderEvaluation<?> createProviderEvaluation(
T defaultValue,
FeatureProvider provider,
EvaluationContext invocationContext) {

if (!ProviderState.READY.equals(provider.getState())) {
if (ProviderState.NOT_READY.equals(provider.getState())) {
throw new ProviderNotReadyError("provider not yet initialized");
}
throw new GeneralError("unknown error");
}

switch (type) {
case BOOLEAN:
return provider.getBooleanEvaluation(key, (Boolean) defaultValue, invocationContext);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,7 @@
import dev.openfeature.sdk.Reason;
import dev.openfeature.sdk.Value;
import dev.openfeature.sdk.exceptions.FlagNotFoundError;
import dev.openfeature.sdk.exceptions.GeneralError;
import dev.openfeature.sdk.exceptions.OpenFeatureError;
import dev.openfeature.sdk.exceptions.ProviderNotReadyError;
import dev.openfeature.sdk.exceptions.TypeMismatchError;
import lombok.Getter;
import lombok.SneakyThrows;
Expand Down Expand Up @@ -121,12 +119,6 @@ public ProviderEvaluation<Value> getObjectEvaluation(String key, Value defaultVa
private <T> ProviderEvaluation<T> getEvaluation(
String key, EvaluationContext evaluationContext, Class<?> expectedType
) throws OpenFeatureError {
if (!ProviderState.READY.equals(state)) {
if (ProviderState.NOT_READY.equals(state)) {
throw new ProviderNotReadyError("provider not yet initialized");
}
throw new GeneralError("unknown error");
}
Flag<?> flag = flags.get(key);
if (flag == null) {
throw new FlagNotFoundError("flag " + key + "not found");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -254,9 +254,9 @@ public void initialize(EvaluationContext evaluationContext) throws Exception {

assertEquals(Reason.ERROR.toString(), result.getReason());
Mockito.verify(logger).error(
ArgumentMatchers.contains("Unable to correctly evaluate flag with key"),
any(),
ArgumentMatchers.isA(FlagNotFoundError.class));
ArgumentMatchers.contains("Unable to correctly evaluate flag with key"),
any(),
ArgumentMatchers.isA(FlagNotFoundError.class));
}

@Specification(number="1.2.2", text="The client interface MUST define a metadata member or accessor, containing an immutable name field or accessor of type string, which corresponds to the name value supplied during client creation.")
Expand Down
13 changes: 12 additions & 1 deletion src/test/java/dev/openfeature/sdk/HookSpecTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,10 @@ void emptyApiHooks() {
List<String> evalOrder = new ArrayList<>();
OpenFeatureAPI api = OpenFeatureAPI.getInstance();
api.setProvider(new NoOpProvider() {
@Override
public ProviderState getState() {
return ProviderState.READY;
}
public List<Hook> getProviderHooks() {
return Collections.singletonList(new BooleanHook() {

Expand Down Expand Up @@ -387,6 +391,7 @@ public void finallyAfter(HookContext<Boolean> ctx, Map<String, Object> hints) {
.thenReturn(ProviderEvaluation.<Boolean>builder()
.value(true)
.build());
when(provider.getState()).thenReturn(ProviderState.READY);
InOrder order = inOrder(hook, provider);

OpenFeatureAPI api = OpenFeatureAPI.getInstance();
Expand Down Expand Up @@ -491,6 +496,7 @@ public void finallyAfter(HookContext<Boolean> ctx, Map<String, Object> hints) {
when(provider.getBooleanEvaluation(any(), any(), any())).thenReturn(ProviderEvaluation.<Boolean>builder()
.value(true)
.build());
when(provider.getState()).thenReturn(ProviderState.READY);

OpenFeatureAPI api = OpenFeatureAPI.getInstance();
FeatureProviderTestUtils.setFeatureProvider(provider);
Expand Down Expand Up @@ -551,7 +557,12 @@ public void finallyAfter(HookContext<Boolean> ctx, Map<String, Object> hints) {
private Client getClient(FeatureProvider provider) {
OpenFeatureAPI api = OpenFeatureAPI.getInstance();
if (provider == null) {
FeatureProviderTestUtils.setFeatureProvider(new NoOpProvider());
FeatureProviderTestUtils.setFeatureProvider(new NoOpProvider() {
@Override
public ProviderState getState() {
return ProviderState.READY;
}
});
} else {
FeatureProviderTestUtils.setFeatureProvider(provider);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ void mergeContextTest() {
.value(true).build());
when(api.getProvider()).thenReturn(mockProvider);
when(api.getProvider(any())).thenReturn(mockProvider);

when(mockProvider.getState()).thenReturn(ProviderState.READY);

OpenFeatureClient client = new OpenFeatureClient(api, "name", "version");
client.setEvaluationContext(ctx);
Expand Down
2 changes: 1 addition & 1 deletion src/test/java/dev/openfeature/sdk/TestConstants.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package dev.openfeature.sdk;

public class TestConstants {
public static final String BROKEN_MESSAGE = "This is borked.";
public static final String BROKEN_MESSAGE = "This is broken.";
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import dev.openfeature.sdk.OpenFeatureAPI;
import dev.openfeature.sdk.Value;
import dev.openfeature.sdk.exceptions.FlagNotFoundError;
import dev.openfeature.sdk.exceptions.ProviderNotReadyError;
import dev.openfeature.sdk.exceptions.OpenFeatureError;
import dev.openfeature.sdk.exceptions.TypeMismatchError;
import lombok.SneakyThrows;
import org.junit.jupiter.api.BeforeAll;
Expand Down Expand Up @@ -103,6 +103,6 @@ void shouldThrowIfNotInitialized() {
InMemoryProvider inMemoryProvider = new InMemoryProvider(new HashMap<>());

// ErrorCode.PROVIDER_NOT_READY should be returned when evaluated via the client
assertThrows(ProviderNotReadyError.class, ()-> inMemoryProvider.getBooleanEvaluation("fail_not_initialized", false, new ImmutableContext()));
assertThrows(OpenFeatureError.class, ()-> inMemoryProvider.getBooleanEvaluation("fail_not_initialized", false, new ImmutableContext()));
}
}
Loading