diff --git a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/rpc/RpcResolver.java b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/rpc/RpcResolver.java index 05f5be08f..7f5221715 100644 --- a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/rpc/RpcResolver.java +++ b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/rpc/RpcResolver.java @@ -252,7 +252,7 @@ private ProviderEvaluation resultBuilder; - if ("DEFAULT".equals(reason) && variant.isEmpty()) { + if (variant.isEmpty() && ("DEFAULT".equals(reason) || "DISABLED".equals(reason))) { resultBuilder = ProviderEvaluation.builder().value(defaultValue); } else { resultBuilder = ProviderEvaluation.builder().value(value).variant(variant); diff --git a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/resolver/process/InProcessResolverTest.java b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/resolver/process/InProcessResolverTest.java index b0c7c07e7..53a5c5008 100644 --- a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/resolver/process/InProcessResolverTest.java +++ b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/resolver/process/InProcessResolverTest.java @@ -312,7 +312,17 @@ public void disabledFlag() throws Exception { // when/then ProviderEvaluation disabledFlag = inProcessResolver.booleanEvaluation("disabledFlag", false, new ImmutableContext()); - assertEquals(ErrorCode.FLAG_NOT_FOUND, disabledFlag.getErrorCode()); + assertEquals(null, disabledFlag.getErrorCode()); + assertEquals(false, disabledFlag.getValue()); + assertEquals(null, disabledFlag.getVariant()); + assertEquals(Reason.DISABLED.toString(), disabledFlag.getReason()); + + ProviderEvaluation disabledObject = + inProcessResolver.objectEvaluation("disabledFlag", null, new ImmutableContext()); + assertEquals(null, disabledObject.getErrorCode()); + assertEquals(null, disabledObject.getValue()); + assertEquals(null, disabledObject.getVariant()); + assertEquals(Reason.DISABLED.toString(), disabledObject.getReason()); } @Test diff --git a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/resolver/process/MockEvaluator.java b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/resolver/process/MockEvaluator.java index c9c704100..c3017ba40 100644 --- a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/resolver/process/MockEvaluator.java +++ b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/resolver/process/MockEvaluator.java @@ -76,7 +76,7 @@ public ProviderEvaluation resolveDoubleValue(String flagKey, Double defa public ProviderEvaluation resolveObjectValue(String flagKey, Value defaultValue, EvaluationContext ctx) { final ProviderEvaluation evaluation = resolve(Object.class, flagKey, defaultValue, ctx); return ProviderEvaluation.builder() - .value(Value.objectToValue(evaluation.getValue())) + .value(evaluation.getValue() != null ? Value.objectToValue(evaluation.getValue()) : null) .variant(evaluation.getVariant()) .reason(evaluation.getReason()) .errorCode(evaluation.getErrorCode()) @@ -101,8 +101,8 @@ private ProviderEvaluation resolve(Class type, String key, T defaultVa // state check if ("DISABLED".equals(flag.getState())) { return ProviderEvaluation.builder() - .errorMessage("flag: " + key + " is disabled") - .errorCode(ErrorCode.FLAG_NOT_FOUND) + .value(defaultValue) + .reason(Reason.DISABLED.toString()) .flagMetadata(getFlagMetadata(flagSetMetadata, flag)) .build(); } diff --git a/providers/flagd/test-harness b/providers/flagd/test-harness index b507289c4..7575a1dc4 160000 --- a/providers/flagd/test-harness +++ b/providers/flagd/test-harness @@ -1 +1 @@ -Subproject commit b507289c45fca9c2d312c7231929e5b95eae62bb +Subproject commit 7575a1dc45f176e57e809748a712a555e9aa5d11 diff --git a/tools/flagd-api-testkit/test-harness b/tools/flagd-api-testkit/test-harness index b507289c4..7575a1dc4 160000 --- a/tools/flagd-api-testkit/test-harness +++ b/tools/flagd-api-testkit/test-harness @@ -1 +1 @@ -Subproject commit b507289c45fca9c2d312c7231929e5b95eae62bb +Subproject commit 7575a1dc45f176e57e809748a712a555e9aa5d11 diff --git a/tools/flagd-core/src/main/java/dev/openfeature/contrib/tools/flagd/core/FlagdCore.java b/tools/flagd-core/src/main/java/dev/openfeature/contrib/tools/flagd/core/FlagdCore.java index b774c215b..32a6cc58c 100644 --- a/tools/flagd-core/src/main/java/dev/openfeature/contrib/tools/flagd/core/FlagdCore.java +++ b/tools/flagd-core/src/main/java/dev/openfeature/contrib/tools/flagd/core/FlagdCore.java @@ -180,7 +180,7 @@ public ProviderEvaluation resolveObjectValue(String flagKey, Value defaul final ProviderEvaluation evaluation = resolve(Object.class, flagKey, defaultValue, ctx); return ProviderEvaluation.builder() - .value(Value.objectToValue(evaluation.getValue())) + .value(evaluation.getValue() != null ? Value.objectToValue(evaluation.getValue()) : null) .variant(evaluation.getVariant()) .reason(evaluation.getReason()) .errorCode(evaluation.getErrorCode()) @@ -210,12 +210,12 @@ private ProviderEvaluation resolve(Class type, String key, T defaultVa .build(); } - // state check + // state check (DISABLED flags default with reason = DEFAULT) if ("DISABLED".equals(flag.getState())) { return ProviderEvaluation.builder() - .errorMessage("flag: " + key + " is disabled") - .errorCode(ErrorCode.FLAG_NOT_FOUND) - .flagMetadata(getFlagMetadata(currentFlagSetMetadata, null)) + .value(defaultValue) + .reason(Reason.DISABLED.toString()) + .flagMetadata(getFlagMetadata(currentFlagSetMetadata, flag)) .build(); } diff --git a/tools/flagd-core/src/test/java/dev/openfeature/contrib/tools/flagd/core/FlagdCoreTest.java b/tools/flagd-core/src/test/java/dev/openfeature/contrib/tools/flagd/core/FlagdCoreTest.java index 1d7b73294..837bfbf8e 100644 --- a/tools/flagd-core/src/test/java/dev/openfeature/contrib/tools/flagd/core/FlagdCoreTest.java +++ b/tools/flagd-core/src/test/java/dev/openfeature/contrib/tools/flagd/core/FlagdCoreTest.java @@ -7,6 +7,7 @@ import dev.openfeature.sdk.ImmutableContext; import dev.openfeature.sdk.ProviderEvaluation; import dev.openfeature.sdk.Reason; +import dev.openfeature.sdk.Value; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; @@ -79,12 +80,24 @@ void resolveBooleanValue_flagNotFound_returnsError() { } @Test - void resolveBooleanValue_disabledFlag_returnsError() { + void resolveBooleanValue_disabledFlag_returnsDisabledReasonWithDefault() { ProviderEvaluation result = flagdCore.resolveBooleanValue("disabledFlag", false, new ImmutableContext()); - assertThat(result.getErrorCode()).isNotNull(); - assertThat(result.getErrorMessage()).contains("disabled"); + assertThat(result.getErrorCode()).isNull(); + assertThat(result.getValue()).isFalse(); + assertThat(result.getVariant()).isNull(); + assertThat(result.getReason()).isEqualTo(Reason.DISABLED.toString()); + } + + @Test + void resolveObjectValue_disabledFlag_returnsDisabledReasonWithDefault() { + ProviderEvaluation result = flagdCore.resolveObjectValue("disabledFlag", null, new ImmutableContext()); + + assertThat(result.getErrorCode()).isNull(); + assertThat(result.getValue()).isNull(); + assertThat(result.getVariant()).isNull(); + assertThat(result.getReason()).isEqualTo(Reason.DISABLED.toString()); } @Test