6
6
import com .launchdarkly .sdk .LDContext ;
7
7
import com .launchdarkly .sdk .server .DataModel .FeatureFlag ;
8
8
import com .launchdarkly .sdk .server .DataModel .Prerequisite ;
9
- import com .launchdarkly .sdk .server .EvaluatorTestUtil .PrereqEval ;
10
- import com .launchdarkly .sdk .server .EvaluatorTestUtil .PrereqRecorder ;
11
-
12
9
import org .junit .Test ;
13
10
14
11
import static com .launchdarkly .sdk .server .EvaluatorTestUtil .BASE_USER ;
@@ -44,6 +41,7 @@ public void flagReturnsOffVariationIfPrerequisiteIsNotFound() throws Exception {
44
41
45
42
EvaluationReason expectedReason = EvaluationReason .prerequisiteFailed ("feature1" );
46
43
assertEquals (EvalResult .of (OFF_VALUE , OFF_VARIATION , expectedReason ), result );
44
+ assertEquals (0 , result .getPrerequisiteEvalRecords ().size ());
47
45
}
48
46
49
47
@ Test
@@ -58,18 +56,18 @@ public void flagReturnsOffVariationAndEventIfPrerequisiteIsOff() throws Exceptio
58
56
// note that even though it returns the desired variation, it is still off and therefore not a match
59
57
.build ();
60
58
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 (){});
63
60
64
61
EvaluationReason expectedReason = EvaluationReason .prerequisiteFailed ("feature1" );
65
62
assertEquals (EvalResult .of (OFF_VALUE , OFF_VARIATION , expectedReason ), result );
66
63
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 );
69
66
assertEquals (f1 , eval .flag );
70
67
assertEquals (f0 , eval .prereqOfFlag );
71
68
assertEquals (GREEN_VARIATION , eval .result .getVariationIndex ());
72
69
assertEquals (GREEN_VALUE , eval .result .getValue ());
70
+ assertEquals (1 , result .getPrerequisiteEvalRecords ().size ());
73
71
}
74
72
75
73
@ Test
@@ -83,18 +81,18 @@ public void flagReturnsOffVariationAndEventIfPrerequisiteIsNotMet() throws Excep
83
81
.fallthroughVariation (RED_VARIATION )
84
82
.build ();
85
83
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 (){});
88
85
89
86
EvaluationReason expectedReason = EvaluationReason .prerequisiteFailed ("feature1" );
90
87
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 );
94
91
assertEquals (f1 , eval .flag );
95
92
assertEquals (f0 , eval .prereqOfFlag );
96
93
assertEquals (RED_VARIATION , eval .result .getVariationIndex ());
97
94
assertEquals (RED_VALUE , eval .result .getValue ());
95
+ assertEquals (1 , result .getPrerequisiteEvalRecords ().size ());
98
96
}
99
97
100
98
@ Test
@@ -145,13 +143,12 @@ public void flagReturnsFallthroughVariationAndEventIfPrerequisiteIsMetAndThereAr
145
143
.version (2 )
146
144
.build ();
147
145
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 (){});
150
147
151
148
assertEquals (EvalResult .of (FALLTHROUGH_VALUE , FALLTHROUGH_VARIATION , EvaluationReason .fallthrough ()), result );
152
149
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 );
155
152
assertEquals (f1 , eval .flag );
156
153
assertEquals (f0 , eval .prereqOfFlag );
157
154
assertEquals (GREEN_VARIATION , eval .result .getVariationIndex ());
@@ -174,26 +171,63 @@ public void multipleLevelsOfPrerequisitesProduceMultipleEvents() throws Exceptio
174
171
.fallthroughVariation (GREEN_VARIATION )
175
172
.build ();
176
173
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 (){});
179
175
180
176
assertEquals (EvalResult .of (FALLTHROUGH_VALUE , FALLTHROUGH_VARIATION , EvaluationReason .fallthrough ()), result );
181
177
182
- assertEquals (2 , Iterables .size (recordPrereqs . evals ));
178
+ assertEquals (2 , Iterables .size (result . getPrerequisiteEvalRecords () ));
183
179
184
- PrereqEval eval0 = recordPrereqs . evals .get (0 );
180
+ PrerequisiteEvalRecord eval0 = result . getPrerequisiteEvalRecords () .get (0 );
185
181
assertEquals (f2 , eval0 .flag );
186
182
assertEquals (f1 , eval0 .prereqOfFlag );
187
183
assertEquals (GREEN_VARIATION , eval0 .result .getVariationIndex ());
188
184
assertEquals (GREEN_VALUE , eval0 .result .getValue ());
189
185
190
- PrereqEval eval1 = recordPrereqs . evals .get (1 );
186
+ PrerequisiteEvalRecord eval1 = result . getPrerequisiteEvalRecords () .get (1 );
191
187
assertEquals (f1 , eval1 .flag );
192
188
assertEquals (f0 , eval1 .prereqOfFlag );
193
189
assertEquals (GREEN_VARIATION , eval1 .result .getVariationIndex ());
194
190
assertEquals (GREEN_VALUE , eval1 .result .getValue ());
195
191
}
196
192
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
+
197
231
@ Test
198
232
public void prerequisiteCycleDetection () {
199
233
for (int depth = 1 ; depth <= 4 ; depth ++) {
0 commit comments