Skip to content

Commit fa2ede1

Browse files
committed
fix: Mark the EXCEPTION result of an overridden flag in the all flags state
When the evaluation of an overridden flag throws during allFlagsState, the error result now carries the marking of the flag's own definition, so the state presents its marked reason with event tracking off, as for any override-affected flag.
1 parent db19718 commit fa2ede1

1 file changed

Lines changed: 19 additions & 0 deletions

File tree

‎lib/sdk/server/src/test/java/com/launchdarkly/sdk/server/InputValidatingEvaluatorOverrideTest.java‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.launchdarkly.sdk.EvaluationReason.ErrorKind;
55
import com.launchdarkly.sdk.LDValue;
66
import com.launchdarkly.sdk.LDValueType;
7+
import com.launchdarkly.sdk.json.JsonSerialization;
78
import com.launchdarkly.sdk.server.DataModel.FeatureFlag;
89
import com.launchdarkly.sdk.server.subsystems.DataStoreTypes.DataKind;
910
import com.launchdarkly.sdk.server.subsystems.DataStoreTypes.ItemDescriptor;
@@ -154,6 +155,24 @@ public void errorResultOfOverrideFlagKeepsMarkingWithCallerDefault() {
154155
assertEquals(EvaluationReason.error(ErrorKind.MALFORMED_FLAG).withOverrideAffected(true), result.getResult().getReason());
155156
}
156157

158+
@Test
159+
public void allFlagsStateMarksTheExceptionResultOfAnOverrideFlagAndTurnsOffItsTracking() {
160+
FeatureFlag marked = flagWithPrerequisite("marked").markedAsOverride();
161+
FeatureFlag plain = flagWithPrerequisite("plain");
162+
FeatureFlagsState state = evaluatorOver(storeFailingOn("prereq", marked, plain))
163+
.allFlagsState(BASE_USER, FlagsStateOption.WITH_REASONS);
164+
LDValue flagsState = LDValue.parse(JsonSerialization.serialize(state)).get("$flagsState");
165+
166+
assertEquals(EvaluationReason.ErrorKind.EXCEPTION, state.getFlagReason("marked").getErrorKind());
167+
assertTrue(state.getFlagReason("marked").isOverrideAffected());
168+
assertTrue(flagsState.get("marked").get("trackEvents").isNull());
169+
170+
// A flag that did not come from the override store keeps its unmarked reason and tracking.
171+
assertEquals(EvaluationReason.ErrorKind.EXCEPTION, state.getFlagReason("plain").getErrorKind());
172+
assertFalse(state.getFlagReason("plain").isOverrideAffected());
173+
assertEquals(LDValue.of(true), flagsState.get("plain").get("trackEvents"));
174+
}
175+
157176
@Test
158177
public void allFlagsStateKeepsMarkedReason() {
159178
FeatureFlag marked = flagBuilder("marked").on(false).offVariation(0).variations(LDValue.of("x")).build()

0 commit comments

Comments
 (0)