Skip to content

Commit 1f28921

Browse files
authored
chore: fix jacoco coverage minimum, throw in memory provider (open-feature#561)
chore: fix codecov, throw in memory provider Signed-off-by: Todd Baert <[email protected]>
1 parent 94a5a86 commit 1f28921

File tree

4 files changed

+57
-42
lines changed

4 files changed

+57
-42
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package dev.openfeature.sdk.exceptions;
2+
3+
import dev.openfeature.sdk.ErrorCode;
4+
import lombok.Getter;
5+
import lombok.experimental.StandardException;
6+
7+
@SuppressWarnings("checkstyle:MissingJavadocType")
8+
@StandardException
9+
public class ProviderNotReadyError extends OpenFeatureError {
10+
private static final long serialVersionUID = 1L;
11+
@Getter private final ErrorCode errorCode = ErrorCode.PROVIDER_NOT_READY;
12+
}

src/main/java/dev/openfeature/sdk/providers/memory/InMemoryProvider.java

+27-40
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,29 @@
11
package dev.openfeature.sdk.providers.memory;
22

3-
import dev.openfeature.sdk.Value;
4-
import dev.openfeature.sdk.Metadata;
5-
import dev.openfeature.sdk.EventProvider;
6-
import dev.openfeature.sdk.ProviderState;
7-
import dev.openfeature.sdk.ProviderEventDetails;
8-
import dev.openfeature.sdk.ErrorCode;
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.HashMap;
6+
import java.util.HashSet;
7+
import java.util.Map;
8+
import java.util.Set;
9+
910
import dev.openfeature.sdk.EvaluationContext;
11+
import dev.openfeature.sdk.EventProvider;
12+
import dev.openfeature.sdk.Metadata;
1013
import dev.openfeature.sdk.ProviderEvaluation;
14+
import dev.openfeature.sdk.ProviderEventDetails;
15+
import dev.openfeature.sdk.ProviderState;
1116
import dev.openfeature.sdk.Reason;
17+
import dev.openfeature.sdk.Value;
18+
import dev.openfeature.sdk.exceptions.FlagNotFoundError;
19+
import dev.openfeature.sdk.exceptions.GeneralError;
1220
import dev.openfeature.sdk.exceptions.OpenFeatureError;
21+
import dev.openfeature.sdk.exceptions.ProviderNotReadyError;
22+
import dev.openfeature.sdk.exceptions.TypeMismatchError;
1323
import lombok.Getter;
1424
import lombok.SneakyThrows;
1525
import lombok.extern.slf4j.Slf4j;
1626

17-
import java.util.Map;
18-
import java.util.HashMap;
19-
import java.util.Set;
20-
import java.util.HashSet;
21-
import java.util.Arrays;
22-
import java.util.ArrayList;
23-
2427
/**
2528
* In-memory provider.
2629
*/
@@ -87,68 +90,52 @@ public void updateFlag(String flagKey, Flag<?> flag) {
8790
@Override
8891
public ProviderEvaluation<Boolean> getBooleanEvaluation(String key, Boolean defaultValue,
8992
EvaluationContext evaluationContext) {
90-
return getEvaluation(key, defaultValue, evaluationContext, Boolean.class);
93+
return getEvaluation(key, evaluationContext, Boolean.class);
9194
}
9295

9396
@Override
9497
public ProviderEvaluation<String> getStringEvaluation(String key, String defaultValue,
9598
EvaluationContext evaluationContext) {
96-
return getEvaluation(key, defaultValue, evaluationContext, String.class);
99+
return getEvaluation(key, evaluationContext, String.class);
97100
}
98101

99102
@Override
100103
public ProviderEvaluation<Integer> getIntegerEvaluation(String key, Integer defaultValue,
101104
EvaluationContext evaluationContext) {
102-
return getEvaluation(key, defaultValue, evaluationContext, Integer.class);
105+
return getEvaluation(key, evaluationContext, Integer.class);
103106
}
104107

105108
@Override
106109
public ProviderEvaluation<Double> getDoubleEvaluation(String key, Double defaultValue,
107110
EvaluationContext evaluationContext) {
108-
return getEvaluation(key, defaultValue, evaluationContext, Double.class);
111+
return getEvaluation(key, evaluationContext, Double.class);
109112
}
110113

111114
@SneakyThrows
112115
@Override
113116
public ProviderEvaluation<Value> getObjectEvaluation(String key, Value defaultValue,
114117
EvaluationContext evaluationContext) {
115-
return getEvaluation(key, defaultValue, evaluationContext, Value.class);
118+
return getEvaluation(key, evaluationContext, Value.class);
116119
}
117120

118121
private <T> ProviderEvaluation<T> getEvaluation(
119-
String key, T defaultValue, EvaluationContext evaluationContext, Class<?> expectedType
122+
String key, EvaluationContext evaluationContext, Class<?> expectedType
120123
) throws OpenFeatureError {
121124
if (!ProviderState.READY.equals(state)) {
122-
ErrorCode errorCode = ErrorCode.PROVIDER_NOT_READY;
123-
if (ProviderState.ERROR.equals(state)) {
124-
errorCode = ErrorCode.GENERAL;
125+
if (ProviderState.NOT_READY.equals(state)) {
126+
throw new ProviderNotReadyError("provider not yet initialized");
125127
}
126-
return ProviderEvaluation.<T>builder()
127-
.errorCode(errorCode)
128-
.reason(errorCode.name())
129-
.value(defaultValue)
130-
.build();
128+
throw new GeneralError("unknown error");
131129
}
132130
Flag<?> flag = flags.get(key);
133131
if (flag == null) {
134-
return ProviderEvaluation.<T>builder()
135-
.value(defaultValue)
136-
.reason(Reason.ERROR.toString())
137-
.errorMessage(ErrorCode.FLAG_NOT_FOUND.name())
138-
.errorCode(ErrorCode.FLAG_NOT_FOUND)
139-
.build();
132+
throw new FlagNotFoundError("flag " + key + "not found");
140133
}
141134
T value;
142135
if (flag.getContextEvaluator() != null) {
143136
value = (T) flag.getContextEvaluator().evaluate(flag, evaluationContext);
144137
} else if (!expectedType.isInstance(flag.getVariants().get(flag.getDefaultVariant()))) {
145-
return ProviderEvaluation.<T>builder()
146-
.value(defaultValue)
147-
.variant(flag.getDefaultVariant())
148-
.reason(Reason.ERROR.toString())
149-
.errorMessage(ErrorCode.TYPE_MISMATCH.name())
150-
.errorCode(ErrorCode.TYPE_MISMATCH)
151-
.build();
138+
throw new TypeMismatchError("flag " + key + "is not of expected type");
152139
} else {
153140
value = (T) flag.getVariants().get(flag.getDefaultVariant());
154141
}

src/test/java/dev/openfeature/sdk/e2e/StepDefinitions.java

-2
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,6 @@ public void then_the_default_string_value_should_be_returned() {
271271
@Then("the reason should indicate an error and the error code should indicate a missing flag with {string}")
272272
public void the_reason_should_indicate_an_error_and_the_error_code_should_be_flag_not_found(String errorCode) {
273273
assertEquals(Reason.ERROR.toString(), notFoundDetails.getReason());
274-
assertTrue(notFoundDetails.getErrorMessage().contains(errorCode));
275274
assertTrue(notFoundDetails.getErrorCode().name().equals(errorCode));
276275
}
277276

@@ -292,7 +291,6 @@ public void then_the_default_integer_value_should_be_returned() {
292291
@Then("the reason should indicate an error and the error code should indicate a type mismatch with {string}")
293292
public void the_reason_should_indicate_an_error_and_the_error_code_should_be_type_mismatch(String errorCode) {
294293
assertEquals(Reason.ERROR.toString(), typeErrorDetails.getReason());
295-
assertTrue(typeErrorDetails.getErrorMessage().contains(errorCode));
296294
assertTrue(typeErrorDetails.getErrorCode().name().equals(errorCode));
297295
}
298296

src/test/java/dev/openfeature/sdk/providers/memory/InMemoryProviderTest.java

+18
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,22 @@
22

33
import com.google.common.collect.ImmutableMap;
44
import dev.openfeature.sdk.Client;
5+
import dev.openfeature.sdk.ImmutableContext;
56
import dev.openfeature.sdk.OpenFeatureAPI;
67
import dev.openfeature.sdk.Value;
8+
import dev.openfeature.sdk.exceptions.FlagNotFoundError;
9+
import dev.openfeature.sdk.exceptions.TypeMismatchError;
710
import lombok.SneakyThrows;
811
import org.junit.jupiter.api.BeforeAll;
912
import org.junit.jupiter.api.Test;
13+
import org.omg.CORBA.DynAnyPackage.TypeMismatch;
1014

1115
import java.util.Map;
1216

1317
import static dev.openfeature.sdk.Structure.mapToStructure;
1418
import static dev.openfeature.sdk.testutils.TestFlagsUtils.buildFlags;
1519
import static org.junit.jupiter.api.Assertions.assertEquals;
20+
import static org.junit.jupiter.api.Assertions.assertThrows;
1621
import static org.junit.jupiter.api.Assertions.assertTrue;
1722
import static org.mockito.ArgumentMatchers.any;
1823
import static org.mockito.Mockito.spy;
@@ -81,4 +86,17 @@ void getObjectEvaluation() {
8186
assertEquals(expectedObject, client.getObjectValue("object-flag", new Value(true)));
8287
}
8388

89+
@Test
90+
void notFound() {
91+
assertThrows(FlagNotFoundError.class, () -> {
92+
provider.getBooleanEvaluation("not-found-flag", false, new ImmutableContext());
93+
});
94+
}
95+
96+
@Test
97+
void typeMismatch() {
98+
assertThrows(TypeMismatchError.class, () -> {
99+
provider.getBooleanEvaluation("string-flag", false, new ImmutableContext());
100+
});
101+
}
84102
}

0 commit comments

Comments
 (0)