@@ -186,4 +186,111 @@ public void evaluateWithSetsNotHaveFlags() {
186186 Map <String , EvaluatorImp .TreatmentLabelAndChangeNumber > result = _evaluator .evaluateFeaturesByFlagSets (MATCHING_KEY , BUCKETING_KEY , sets , null );
187187 Assert .assertTrue (result .isEmpty ());
188188 }
189+
190+ @ Test
191+ public void evaluateWithPrerequisites () {
192+ Partition partition = new Partition ();
193+ partition .treatment = TREATMENT_VALUE ;
194+ partition .size = 100 ;
195+ _partitions .add (partition );
196+ ParsedCondition condition = new ParsedCondition (ConditionType .WHITELIST , _matcher , _partitions , "test whitelist label" );
197+ _conditions .add (condition );
198+ List <Prerequisite > prerequisites = Arrays .asList (new Prerequisite ("split1" , Arrays .asList (TREATMENT_VALUE )));
199+
200+ ParsedSplit split = new ParsedSplit (SPLIT_NAME , 0 , false , DEFAULT_TREATMENT_VALUE , _conditions , TRAFFIC_TYPE_VALUE , CHANGE_NUMBER , 60 , 18 , 2 , _configurations , new HashSet <>(), true , new PrerequisitesMatcher (prerequisites ));
201+ ParsedSplit split1 = new ParsedSplit ("split1" , 0 , false , DEFAULT_TREATMENT_VALUE , _conditions , TRAFFIC_TYPE_VALUE , CHANGE_NUMBER , 60 , 18 , 2 , _configurations , new HashSet <>(), true , new PrerequisitesMatcher (null ));
202+
203+ Mockito .when (_splitCacheConsumer .get (SPLIT_NAME )).thenReturn (split );
204+ Mockito .when (_splitCacheConsumer .get ("split1" )).thenReturn (split1 );
205+
206+ EvaluatorImp .TreatmentLabelAndChangeNumber result = _evaluator .evaluateFeature (MATCHING_KEY , BUCKETING_KEY , SPLIT_NAME , null );
207+ assertEquals (TREATMENT_VALUE , result .treatment );
208+ assertEquals ("test whitelist label" , result .label );
209+ assertEquals (CHANGE_NUMBER , result .changeNumber );
210+
211+ result = _evaluator .evaluateFeature (MATCHING_KEY , BUCKETING_KEY , SPLIT_NAME , null );
212+ assertEquals (DEFAULT_TREATMENT_VALUE , result .treatment );
213+ assertEquals (Labels .PREREQUISITES_NOT_MET , result .label );
214+ assertEquals (CHANGE_NUMBER , result .changeNumber );
215+
216+ // if split is killed, label should be killed.
217+ split = new ParsedSplit (SPLIT_NAME , 0 , true , DEFAULT_TREATMENT_VALUE , _conditions , TRAFFIC_TYPE_VALUE , CHANGE_NUMBER , 60 , 18 , 2 , _configurations , new HashSet <>(), true , new PrerequisitesMatcher (prerequisites ));
218+ Mockito .when (_splitCacheConsumer .get (SPLIT_NAME )).thenReturn (split );
219+ result = _evaluator .evaluateFeature (MATCHING_KEY , BUCKETING_KEY , SPLIT_NAME , null );
220+ assertEquals (DEFAULT_TREATMENT_VALUE , result .treatment );
221+ assertEquals (Labels .KILLED , result .label );
222+ assertEquals (CHANGE_NUMBER , result .changeNumber );
223+ }
224+
225+ @ Test
226+ public void evaluateFallbackTreatmentWorks () {
227+ Mockito .when (_splitCacheConsumer .get (SPLIT_NAME )).thenReturn (null );
228+ FallbackTreatmentsConfiguration fallbackTreatmentsConfiguration = new FallbackTreatmentsConfiguration (new FallbackTreatment ("on" ));
229+ FallbackTreatmentCalculator fallbackTreatmentCalculator = new FallbackTreatmentCalculatorImp (fallbackTreatmentsConfiguration );
230+ _evaluator = new EvaluatorImp (_splitCacheConsumer , _segmentCacheConsumer , _ruleBasedSegmentCacheConsumer , fallbackTreatmentCalculator );
231+
232+ EvaluatorImp .TreatmentLabelAndChangeNumber result = _evaluator .evaluateFeature (MATCHING_KEY , BUCKETING_KEY , SPLIT_NAME , null );
233+ assertEquals ("on" , result .treatment );
234+ assertEquals ("fallback - definition not found" , result .label );
235+
236+ ParsedSplit split = new ParsedSplit (SPLIT_NAME , 0 , false , DEFAULT_TREATMENT_VALUE , _conditions , null , CHANGE_NUMBER , 60 , 18 , 2 , _configurations , new HashSet <>(), false , null );
237+ Mockito .when (_splitCacheConsumer .get (SPLIT_NAME )).thenReturn (split );
238+ result = _evaluator .evaluateFeature (MATCHING_KEY , BUCKETING_KEY , SPLIT_NAME , null );
239+ assertEquals ("on" , result .treatment );
240+ assertEquals ("fallback - exception" , result .label );
241+
242+ // using byflag only
243+ Mockito .when (_splitCacheConsumer .get (SPLIT_NAME )).thenReturn (null );
244+ Mockito .when (_splitCacheConsumer .get ("another_name" )).thenReturn (null );
245+ fallbackTreatmentsConfiguration = new FallbackTreatmentsConfiguration (new HashMap <String , FallbackTreatment >() {{ put (SPLIT_NAME , new FallbackTreatment ("off" )); }} );
246+ fallbackTreatmentCalculator = new FallbackTreatmentCalculatorImp (fallbackTreatmentsConfiguration );
247+ _evaluator = new EvaluatorImp (_splitCacheConsumer , _segmentCacheConsumer , _ruleBasedSegmentCacheConsumer , fallbackTreatmentCalculator );
248+
249+ result = _evaluator .evaluateFeature (MATCHING_KEY , BUCKETING_KEY , SPLIT_NAME , null );
250+ assertEquals ("off" , result .treatment );
251+ assertEquals ("fallback - definition not found" , result .label );
252+
253+ result = _evaluator .evaluateFeature (MATCHING_KEY , BUCKETING_KEY , "another_name" , null );
254+ assertEquals ("control" , result .treatment );
255+ assertEquals ("definition not found" , result .label );
256+
257+ split = new ParsedSplit (SPLIT_NAME , 0 , false , DEFAULT_TREATMENT_VALUE , _conditions , null , CHANGE_NUMBER , 60 , 18 , 2 , _configurations , new HashSet <>(), false , null );
258+ Mockito .when (_splitCacheConsumer .get (SPLIT_NAME )).thenReturn (split );
259+ result = _evaluator .evaluateFeature (MATCHING_KEY , BUCKETING_KEY , SPLIT_NAME , null );
260+ assertEquals ("off" , result .treatment );
261+ assertEquals ("fallback - exception" , result .label );
262+
263+ split = new ParsedSplit ("another_name" , 0 , false , DEFAULT_TREATMENT_VALUE , _conditions , null , CHANGE_NUMBER , 60 , 18 , 2 , _configurations , new HashSet <>(), false , null );
264+ Mockito .when (_splitCacheConsumer .get ("another_name" )).thenReturn (split );
265+ result = _evaluator .evaluateFeature (MATCHING_KEY , BUCKETING_KEY , "another_name" , null );
266+ assertEquals ("control" , result .treatment );
267+ assertEquals ("exception" , result .label );
268+
269+ // with byflag
270+ Mockito .when (_splitCacheConsumer .get (SPLIT_NAME )).thenReturn (null );
271+ Mockito .when (_splitCacheConsumer .get ("another_name" )).thenReturn (null );
272+ fallbackTreatmentsConfiguration = new FallbackTreatmentsConfiguration (new FallbackTreatment ("on" ), new HashMap <String , FallbackTreatment >() {{ put (SPLIT_NAME , new FallbackTreatment ("off" )); }} );
273+ fallbackTreatmentCalculator = new FallbackTreatmentCalculatorImp (fallbackTreatmentsConfiguration );
274+ _evaluator = new EvaluatorImp (_splitCacheConsumer , _segmentCacheConsumer , _ruleBasedSegmentCacheConsumer , fallbackTreatmentCalculator );
275+
276+ result = _evaluator .evaluateFeature (MATCHING_KEY , BUCKETING_KEY , SPLIT_NAME , null );
277+ assertEquals ("off" , result .treatment );
278+ assertEquals ("fallback - definition not found" , result .label );
279+
280+ result = _evaluator .evaluateFeature (MATCHING_KEY , BUCKETING_KEY , "another_name" , null );
281+ assertEquals ("on" , result .treatment );
282+ assertEquals ("fallback - definition not found" , result .label );
283+
284+ split = new ParsedSplit (SPLIT_NAME , 0 , false , DEFAULT_TREATMENT_VALUE , _conditions , null , CHANGE_NUMBER , 60 , 18 , 2 , _configurations , new HashSet <>(), false , null );
285+ Mockito .when (_splitCacheConsumer .get (SPLIT_NAME )).thenReturn (split );
286+ result = _evaluator .evaluateFeature (MATCHING_KEY , BUCKETING_KEY , SPLIT_NAME , null );
287+ assertEquals ("off" , result .treatment );
288+ assertEquals ("fallback - exception" , result .label );
289+
290+ split = new ParsedSplit ("another_name" , 0 , false , DEFAULT_TREATMENT_VALUE , _conditions , null , CHANGE_NUMBER , 60 , 18 , 2 , _configurations , new HashSet <>(), false , null );
291+ Mockito .when (_splitCacheConsumer .get ("another_name" )).thenReturn (split );
292+ result = _evaluator .evaluateFeature (MATCHING_KEY , BUCKETING_KEY , "another_name" , null );
293+ assertEquals ("on" , result .treatment );
294+ assertEquals ("fallback - exception" , result .label );
295+ }
189296}
0 commit comments