Skip to content

Commit 5a6a152

Browse files
committed
adding more tests
1 parent 2bf741f commit 5a6a152

File tree

8 files changed

+99
-74
lines changed

8 files changed

+99
-74
lines changed

lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/EvalResult.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.launchdarkly.sdk.LDValue;
77
import com.launchdarkly.sdk.LDValueType;
88

9+
import java.util.ArrayList;
910
import java.util.Collections;
1011
import java.util.List;
1112

@@ -34,7 +35,7 @@ final class EvalResult {
3435
private final boolean forceReasonTracking;
3536

3637
// A list of prerequisites evaluation records evaluated as part of obtaining this result.
37-
private List<PrerequisiteEvalRecord> prerequisiteEvalRecords;
38+
private List<PrerequisiteEvalRecord> prerequisiteEvalRecords = new ArrayList<>(0); // 0 initial capacity uses a static instance for performance
3839

3940
/**
4041
* Constructs an instance that wraps the specified EvaluationDetail and also precomputes

lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/Evaluator.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ private static class EvaluatorState {
122122
private EvaluationReason.BigSegmentsStatus bigSegmentsStatus = null;
123123
private FeatureFlag originalFlag = null;
124124
private List<String> prerequisiteStack = null;
125-
private List<PrerequisiteEvalRecord> prerequisiteEvalRecords = null;
125+
private List<PrerequisiteEvalRecord> prerequisiteEvalRecords = new ArrayList<>(0); // 0 initial capacity uses a static instance for performance
126126
private List<String> segmentStack = null;
127127
}
128128

@@ -146,8 +146,6 @@ EvalResult evaluate(FeatureFlag flag, LDContext context, @Nonnull EvaluationReco
146146

147147
EvaluatorState state = new EvaluatorState();
148148
state.originalFlag = flag;
149-
// allocate list capacity to avoid size increase during evaluation
150-
state.prerequisiteEvalRecords = new ArrayList<>(); // TODO: optimize when this is used, shouldn't allocate for flag with no prereqs
151149

152150
try {
153151
EvalResult result = evaluateInternal(flag, context, recorder, state);
@@ -158,8 +156,6 @@ EvalResult evaluate(FeatureFlag flag, LDContext context, @Nonnull EvaluationReco
158156
);
159157
}
160158

161-
// TODO: these changes have reduced throughput, can we optimize this a bit. Perhaps by calling constructor
162-
// with all parameters instead of using multiple calls in this immutable style
163159
if (state.prerequisiteEvalRecords != null && !state.prerequisiteEvalRecords.isEmpty()) {
164160
result = result.withPrerequisiteEvalRecords(state.prerequisiteEvalRecords);
165161
}

lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/FeatureFlagsState.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.launchdarkly.sdk.server.interfaces.LDClientInterface;
1313

1414
import java.io.IOException;
15+
import java.util.ArrayList;
1516
import java.util.HashMap;
1617
import java.util.List;
1718
import java.util.Map;
@@ -284,7 +285,7 @@ Builder addFlag(DataModel.FeatureFlag flag, EvalResult eval) {
284285
flag.isTrackEvents() || eval.isForceReasonTracking(),
285286
eval.isForceReasonTracking(),
286287
flag.getDebugEventsUntilDate(),
287-
eval.getPrerequisiteEvalRecords() == null ? null : eval.getPrerequisiteEvalRecords().stream()
288+
eval.getPrerequisiteEvalRecords().stream()
288289
.filter(record -> record.prereqOfFlag.getKey() == flag.getKey()) // only include top level prereqs
289290
.map(record -> record.flag.getKey()) // map from prereq record to prereq key
290291
.collect(Collectors.toList())
@@ -399,7 +400,7 @@ public FeatureFlagsState read(JsonReader in) throws IOException {
399400
m0.trackEvents,
400401
m0.trackReason,
401402
m0.debugEventsUntilDate,
402-
m0.prerequisites);
403+
m0.prerequisites != null ? m0.prerequisites : new ArrayList<>(0));
403404
allFlagMetadata.put(e.getKey(), m1);
404405
}
405406
}

lib/sdk/server/src/test/java/com/launchdarkly/sdk/server/EvaluatorPrerequisiteTest.java

Lines changed: 55 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,6 @@
66
import com.launchdarkly.sdk.LDContext;
77
import com.launchdarkly.sdk.server.DataModel.FeatureFlag;
88
import com.launchdarkly.sdk.server.DataModel.Prerequisite;
9-
import com.launchdarkly.sdk.server.EvaluatorTestUtil.PrereqEval;
10-
import com.launchdarkly.sdk.server.EvaluatorTestUtil.PrereqRecorder;
11-
129
import org.junit.Test;
1310

1411
import static com.launchdarkly.sdk.server.EvaluatorTestUtil.BASE_USER;
@@ -44,6 +41,7 @@ public void flagReturnsOffVariationIfPrerequisiteIsNotFound() throws Exception {
4441

4542
EvaluationReason expectedReason = EvaluationReason.prerequisiteFailed("feature1");
4643
assertEquals(EvalResult.of(OFF_VALUE, OFF_VARIATION, expectedReason), result);
44+
assertEquals(0, result.getPrerequisiteEvalRecords().size());
4745
}
4846

4947
@Test
@@ -58,18 +56,18 @@ public void flagReturnsOffVariationAndEventIfPrerequisiteIsOff() throws Exceptio
5856
// note that even though it returns the desired variation, it is still off and therefore not a match
5957
.build();
6058
Evaluator e = evaluatorBuilder().withStoredFlags(f1).build();
61-
PrereqRecorder recordPrereqs = new PrereqRecorder();
62-
EvalResult result = e.evaluate(f0, BASE_USER, recordPrereqs);
59+
EvalResult result = e.evaluate(f0, BASE_USER, new EvaluationRecorder(){});
6360

6461
EvaluationReason expectedReason = EvaluationReason.prerequisiteFailed("feature1");
6562
assertEquals(EvalResult.of(OFF_VALUE, OFF_VARIATION, expectedReason), result);
6663

67-
assertEquals(1, Iterables.size(recordPrereqs.evals));
68-
PrereqEval eval = recordPrereqs.evals.get(0);
64+
assertEquals(1, Iterables.size(result.getPrerequisiteEvalRecords()));
65+
PrerequisiteEvalRecord eval = result.getPrerequisiteEvalRecords().get(0);
6966
assertEquals(f1, eval.flag);
7067
assertEquals(f0, eval.prereqOfFlag);
7168
assertEquals(GREEN_VARIATION, eval.result.getVariationIndex());
7269
assertEquals(GREEN_VALUE, eval.result.getValue());
70+
assertEquals(1, result.getPrerequisiteEvalRecords().size());
7371
}
7472

7573
@Test
@@ -83,18 +81,18 @@ public void flagReturnsOffVariationAndEventIfPrerequisiteIsNotMet() throws Excep
8381
.fallthroughVariation(RED_VARIATION)
8482
.build();
8583
Evaluator e = evaluatorBuilder().withStoredFlags(f1).build();
86-
PrereqRecorder recordPrereqs = new PrereqRecorder();
87-
EvalResult result = e.evaluate(f0, BASE_USER, recordPrereqs);
84+
EvalResult result = e.evaluate(f0, BASE_USER, new EvaluationRecorder(){});
8885

8986
EvaluationReason expectedReason = EvaluationReason.prerequisiteFailed("feature1");
9087
assertEquals(EvalResult.of(OFF_VALUE, OFF_VARIATION, expectedReason), result);
91-
92-
assertEquals(1, Iterables.size(recordPrereqs.evals));
93-
PrereqEval eval = recordPrereqs.evals.get(0);
88+
89+
assertEquals(1, Iterables.size(result.getPrerequisiteEvalRecords()));
90+
PrerequisiteEvalRecord eval = result.getPrerequisiteEvalRecords().get(0);
9491
assertEquals(f1, eval.flag);
9592
assertEquals(f0, eval.prereqOfFlag);
9693
assertEquals(RED_VARIATION, eval.result.getVariationIndex());
9794
assertEquals(RED_VALUE, eval.result.getValue());
95+
assertEquals(1, result.getPrerequisiteEvalRecords().size());
9896
}
9997

10098
@Test
@@ -145,13 +143,12 @@ public void flagReturnsFallthroughVariationAndEventIfPrerequisiteIsMetAndThereAr
145143
.version(2)
146144
.build();
147145
Evaluator e = evaluatorBuilder().withStoredFlags(f1).build();
148-
PrereqRecorder recordPrereqs = new PrereqRecorder();
149-
EvalResult result = e.evaluate(f0, BASE_USER, recordPrereqs);
146+
EvalResult result = e.evaluate(f0, BASE_USER, new EvaluationRecorder(){});
150147

151148
assertEquals(EvalResult.of(FALLTHROUGH_VALUE, FALLTHROUGH_VARIATION, EvaluationReason.fallthrough()), result);
152149

153-
assertEquals(1, Iterables.size(recordPrereqs.evals));
154-
PrereqEval eval = recordPrereqs.evals.get(0);
150+
assertEquals(1, Iterables.size(result.getPrerequisiteEvalRecords()));
151+
PrerequisiteEvalRecord eval = result.getPrerequisiteEvalRecords().get(0);
155152
assertEquals(f1, eval.flag);
156153
assertEquals(f0, eval.prereqOfFlag);
157154
assertEquals(GREEN_VARIATION, eval.result.getVariationIndex());
@@ -174,26 +171,63 @@ public void multipleLevelsOfPrerequisitesProduceMultipleEvents() throws Exceptio
174171
.fallthroughVariation(GREEN_VARIATION)
175172
.build();
176173
Evaluator e = evaluatorBuilder().withStoredFlags(f1, f2).build();
177-
PrereqRecorder recordPrereqs = new PrereqRecorder();
178-
EvalResult result = e.evaluate(f0, BASE_USER, recordPrereqs);
174+
EvalResult result = e.evaluate(f0, BASE_USER, new EvaluationRecorder(){});
179175

180176
assertEquals(EvalResult.of(FALLTHROUGH_VALUE, FALLTHROUGH_VARIATION, EvaluationReason.fallthrough()), result);
181177

182-
assertEquals(2, Iterables.size(recordPrereqs.evals));
178+
assertEquals(2, Iterables.size(result.getPrerequisiteEvalRecords()));
183179

184-
PrereqEval eval0 = recordPrereqs.evals.get(0);
180+
PrerequisiteEvalRecord eval0 = result.getPrerequisiteEvalRecords().get(0);
185181
assertEquals(f2, eval0.flag);
186182
assertEquals(f1, eval0.prereqOfFlag);
187183
assertEquals(GREEN_VARIATION, eval0.result.getVariationIndex());
188184
assertEquals(GREEN_VALUE, eval0.result.getValue());
189185

190-
PrereqEval eval1 = recordPrereqs.evals.get(1);
186+
PrerequisiteEvalRecord eval1 = result.getPrerequisiteEvalRecords().get(1);
191187
assertEquals(f1, eval1.flag);
192188
assertEquals(f0, eval1.prereqOfFlag);
193189
assertEquals(GREEN_VARIATION, eval1.result.getVariationIndex());
194190
assertEquals(GREEN_VALUE, eval1.result.getValue());
195191
}
196192

193+
@Test
194+
public void prerequisitesListIsAccurateWhenShortCircuiting() throws Exception {
195+
FeatureFlag f0 = buildThreeWayFlag("feature")
196+
.on(true)
197+
.prerequisites(prerequisite("prereq1", GREEN_VARIATION), prerequisite("prereq2", GREEN_VARIATION), prerequisite("prereq3", GREEN_VARIATION))
198+
.build();
199+
FeatureFlag f1 = buildRedGreenFlag("prereq1")
200+
.on(true)
201+
.fallthroughVariation(GREEN_VARIATION)
202+
.build();
203+
FeatureFlag f2 = buildRedGreenFlag("prereq2")
204+
.on(true)
205+
.fallthroughVariation(RED_VARIATION)
206+
.build();
207+
FeatureFlag f3 = buildRedGreenFlag("prereq3")
208+
.on(true)
209+
.fallthroughVariation(GREEN_VARIATION)
210+
.build();
211+
212+
Evaluator e = evaluatorBuilder().withStoredFlags(f0, f1, f2, f3).build();
213+
EvalResult result = e.evaluate(f0, BASE_USER, new EvaluationRecorder(){});
214+
215+
assertEquals(EvalResult.of(OFF_VALUE, OFF_VARIATION, EvaluationReason.prerequisiteFailed("prereq2")), result);
216+
assertEquals(2, Iterables.size(result.getPrerequisiteEvalRecords())); // prereq 1 and 2 are reached, but 2 fails, so 3 is not checked.
217+
218+
PrerequisiteEvalRecord prereq1Eval = result.getPrerequisiteEvalRecords().get(0);
219+
assertEquals(f1, prereq1Eval.flag);
220+
assertEquals(f0, prereq1Eval.prereqOfFlag);
221+
assertEquals(GREEN_VARIATION, prereq1Eval.result.getVariationIndex());
222+
assertEquals(GREEN_VALUE, prereq1Eval.result.getValue());
223+
224+
PrerequisiteEvalRecord prereq2Eval = result.getPrerequisiteEvalRecords().get(1);
225+
assertEquals(f2, prereq2Eval.flag);
226+
assertEquals(f0, prereq2Eval.prereqOfFlag);
227+
assertEquals(RED_VARIATION, prereq2Eval.result.getVariationIndex());
228+
assertEquals(RED_VALUE, prereq2Eval.result.getValue());
229+
}
230+
197231
@Test
198232
public void prerequisiteCycleDetection() {
199233
for (int depth = 1; depth <= 4; depth++) {

lib/sdk/server/src/test/java/com/launchdarkly/sdk/server/EvaluatorTest.java

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99
import com.launchdarkly.sdk.server.DataModel.RolloutKind;
1010
import com.launchdarkly.sdk.server.DataModel.VariationOrRollout;
1111
import com.launchdarkly.sdk.server.DataModel.WeightedVariation;
12-
import com.launchdarkly.sdk.server.EvaluatorTestUtil.PrereqEval;
13-
import com.launchdarkly.sdk.server.EvaluatorTestUtil.PrereqRecorder;
1412

1513
import org.junit.Test;
1614

@@ -298,14 +296,13 @@ public void flagReturnsOffVariationAndEventIfPrerequisiteIsOff() throws Exceptio
298296
// note that even though it returns the desired variation, it is still off and therefore not a match
299297
.build();
300298
Evaluator e = evaluatorBuilder().withStoredFlags(f1).build();
301-
PrereqRecorder recordPrereqs = new PrereqRecorder();
302-
EvalResult result = e.evaluate(f0, BASE_USER, recordPrereqs);
299+
EvalResult result = e.evaluate(f0, BASE_USER, new EvaluationRecorder(){});
303300

304301
EvaluationReason expectedReason = EvaluationReason.prerequisiteFailed("feature1");
305302
assertEquals(EvalResult.of(OFF_VALUE, OFF_VARIATION, expectedReason), result);
306303

307-
assertEquals(1, Iterables.size(recordPrereqs.evals));
308-
PrereqEval eval = recordPrereqs.evals.get(0);
304+
assertEquals(1, Iterables.size(result.getPrerequisiteEvalRecords()));
305+
PrerequisiteEvalRecord eval = result.getPrerequisiteEvalRecords().get(0);
309306
assertEquals(f1, eval.flag);
310307
assertEquals(f0, eval.prereqOfFlag);
311308
assertEquals(GREEN_VARIATION, eval.result.getVariationIndex());
@@ -323,14 +320,13 @@ public void flagReturnsOffVariationAndEventIfPrerequisiteIsNotMet() throws Excep
323320
.fallthroughVariation(RED_VARIATION)
324321
.build();
325322
Evaluator e = evaluatorBuilder().withStoredFlags(f1).build();
326-
PrereqRecorder recordPrereqs = new PrereqRecorder();
327-
EvalResult result = e.evaluate(f0, BASE_USER, recordPrereqs);
323+
EvalResult result = e.evaluate(f0, BASE_USER, new EvaluationRecorder(){});
328324

329325
EvaluationReason expectedReason = EvaluationReason.prerequisiteFailed("feature1");
330326
assertEquals(EvalResult.of(OFF_VALUE, OFF_VARIATION, expectedReason), result);
331327

332-
assertEquals(1, Iterables.size(recordPrereqs.evals));
333-
PrereqEval eval = recordPrereqs.evals.get(0);
328+
assertEquals(1, Iterables.size(result.getPrerequisiteEvalRecords()));
329+
PrerequisiteEvalRecord eval = result.getPrerequisiteEvalRecords().get(0);
334330
assertEquals(f1, eval.flag);
335331
assertEquals(f0, eval.prereqOfFlag);
336332
assertEquals(RED_VARIATION, eval.result.getVariationIndex());
@@ -385,13 +381,12 @@ public void flagReturnsFallthroughVariationAndEventIfPrerequisiteIsMetAndThereAr
385381
.version(2)
386382
.build();
387383
Evaluator e = evaluatorBuilder().withStoredFlags(f1).build();
388-
PrereqRecorder recordPrereqs = new PrereqRecorder();
389-
EvalResult result = e.evaluate(f0, BASE_USER, recordPrereqs);
384+
EvalResult result = e.evaluate(f0, BASE_USER, new EvaluationRecorder(){});
390385

391386
assertEquals(EvalResult.of(FALLTHROUGH_VALUE, FALLTHROUGH_VARIATION, EvaluationReason.fallthrough()), result);
392387

393-
assertEquals(1, Iterables.size(recordPrereqs.evals));
394-
PrereqEval eval = recordPrereqs.evals.get(0);
388+
assertEquals(1, Iterables.size(result.getPrerequisiteEvalRecords()));
389+
PrerequisiteEvalRecord eval = result.getPrerequisiteEvalRecords().get(0);
395390
assertEquals(f1, eval.flag);
396391
assertEquals(f0, eval.prereqOfFlag);
397392
assertEquals(GREEN_VARIATION, eval.result.getVariationIndex());
@@ -414,20 +409,19 @@ public void multipleLevelsOfPrerequisitesProduceMultipleEvents() throws Exceptio
414409
.fallthroughVariation(GREEN_VARIATION)
415410
.build();
416411
Evaluator e = evaluatorBuilder().withStoredFlags(f1, f2).build();
417-
PrereqRecorder recordPrereqs = new PrereqRecorder();
418-
EvalResult result = e.evaluate(f0, BASE_USER, recordPrereqs);
412+
EvalResult result = e.evaluate(f0, BASE_USER, new EvaluationRecorder(){});
419413

420414
assertEquals(EvalResult.of(FALLTHROUGH_VALUE, FALLTHROUGH_VARIATION, EvaluationReason.fallthrough()), result);
421415

422-
assertEquals(2, Iterables.size(recordPrereqs.evals));
416+
assertEquals(2, Iterables.size(result.getPrerequisiteEvalRecords()));
423417

424-
PrereqEval eval0 = recordPrereqs.evals.get(0);
418+
PrerequisiteEvalRecord eval0 = result.getPrerequisiteEvalRecords().get(0);
425419
assertEquals(f2, eval0.flag);
426420
assertEquals(f1, eval0.prereqOfFlag);
427421
assertEquals(GREEN_VARIATION, eval0.result.getVariationIndex());
428422
assertEquals(GREEN_VALUE, eval0.result.getValue());
429423

430-
PrereqEval eval1 = recordPrereqs.evals.get(1);
424+
PrerequisiteEvalRecord eval1 = result.getPrerequisiteEvalRecords().get(1);
431425
assertEquals(f1, eval1.flag);
432426
assertEquals(f0, eval1.prereqOfFlag);
433427
assertEquals(GREEN_VARIATION, eval1.result.getVariationIndex());

lib/sdk/server/src/test/java/com/launchdarkly/sdk/server/EvaluatorTestUtil.java

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -137,28 +137,4 @@ public void recordPrerequisiteEvaluation(FeatureFlag flag, FeatureFlag prereqOfF
137137
}
138138
};
139139
}
140-
141-
public static final class PrereqEval {
142-
public final FeatureFlag flag;
143-
public final FeatureFlag prereqOfFlag;
144-
public final LDContext context;
145-
public final EvalResult result;
146-
147-
public PrereqEval(FeatureFlag flag, FeatureFlag prereqOfFlag, LDContext context, EvalResult result) {
148-
this.flag = flag;
149-
this.prereqOfFlag = prereqOfFlag;
150-
this.context = context;
151-
this.result = result;
152-
}
153-
}
154-
155-
public static final class PrereqRecorder implements EvaluationRecorder {
156-
public final List<PrereqEval> evals = new ArrayList<>();
157-
158-
@Override
159-
public void recordPrerequisiteEvaluation(FeatureFlag flag, FeatureFlag prereqOfFlag, LDContext context,
160-
EvalResult result) {
161-
evals.add(new PrereqEval(flag, prereqOfFlag, context, result));
162-
}
163-
}
164140
}

lib/sdk/server/src/test/java/com/launchdarkly/sdk/server/FeatureFlagsStateTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,8 +177,9 @@ public void canConvertToJson() {
177177

178178
@Test
179179
public void canConvertFromJson() throws SerializationException {
180+
FeatureFlagsState expectedState = makeInstanceForSerialization();
180181
FeatureFlagsState state = JsonSerialization.deserialize(makeExpectedJsonSerialization(), FeatureFlagsState.class);
181-
assertEquals(makeInstanceForSerialization(), state);
182+
assertEquals(expectedState, state);
182183
}
183184

184185
private static FeatureFlagsState makeInstanceForSerialization() {

lib/sdk/server/src/test/java/com/launchdarkly/sdk/server/LDClientEvaluationTest.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -676,14 +676,32 @@ public void allFlagStateIncludesPrerequisites() throws Exception {
676676
DataModel.FeatureFlag flag3 = flagBuilder("flagABC")
677677
.version(3)
678678
.on(true)
679-
.variations(LDValue.of("x"), LDValue.of("value3"))
679+
.variations(LDValue.of("off"), LDValue.of("value3"))
680680
.fallthrough(fallthroughVariation(0))
681681
.prerequisites(prerequisite("flagAB", 0))
682682
.trackEvents(false)
683683
.build();
684+
DataModel.FeatureFlag flag4 = flagBuilder("flagAD")
685+
.version(4)
686+
.on(true)
687+
.variations(LDValue.of("off"), LDValue.of("value4"))
688+
.fallthrough(fallthroughVariation(0))
689+
.prerequisites(prerequisite("flagA", 0))
690+
.trackEvents(false)
691+
.build();
692+
DataModel.FeatureFlag flagTwoPrereqs = flagBuilder("flagTwoPrereqs")
693+
.version(4)
694+
.on(true)
695+
.variations(LDValue.of("off"), LDValue.of("value5"))
696+
.fallthrough(fallthroughVariation(0))
697+
.prerequisites(prerequisite("flagA", 0), prerequisite("flagAB", 0))
698+
.trackEvents(false)
699+
.build();
684700
upsertFlag(dataStore, flag1);
685701
upsertFlag(dataStore, flag2);
686702
upsertFlag(dataStore, flag3);
703+
upsertFlag(dataStore, flag4);
704+
upsertFlag(dataStore, flagTwoPrereqs);
687705

688706
FeatureFlagsState state = client.allFlagsState(context);
689707
assertTrue(state.isValid());
@@ -692,8 +710,12 @@ public void allFlagStateIncludesPrerequisites() throws Exception {
692710
String expectedPart1 = "{\"$flagsState\":{\"flagA\":{}}}";
693711
String expectedPart2 = "{\"$flagsState\":{\"flagAB\":{\"prerequisites\":[\"flagA\"]}}}";
694712
String expectedPart3 = "{\"$flagsState\":{\"flagABC\":{\"prerequisites\":[\"flagAB\"]}}}";
713+
String expectedPart4 = "{\"$flagsState\":{\"flagAD\":{\"prerequisites\":[\"flagA\"]}}}";
714+
String expectedPart5 = "{\"$flagsState\":{\"flagTwoPrereqs\":{\"prerequisites\":[\"flagA\",\"flagAB\"]}}}";
695715
assertJsonIncludes(expectedPart1, outputJson);
696716
assertJsonIncludes(expectedPart2, outputJson);
697717
assertJsonIncludes(expectedPart3, outputJson);
718+
assertJsonIncludes(expectedPart4, outputJson);
719+
assertJsonIncludes(expectedPart5, outputJson);
698720
}
699721
}

0 commit comments

Comments
 (0)