Skip to content

Commit 578aada

Browse files
committed
[AI-FSSDK] [FSSDK-12735] Fix holdout impression event tracking and decision reason
1 parent f4e5070 commit 578aada

3 files changed

Lines changed: 28 additions & 2 deletions

File tree

‎core-api/src/main/java/com/optimizely/ab/Optimizely.java‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1357,7 +1357,7 @@ private OptimizelyDecision createOptimizelyDecision(
13571357
}
13581358

13591359
if (flagDecision.holdoutDecision != null && !allOptions.contains(OptimizelyDecideOption.DISABLE_DECISION_EVENT)) {
1360-
sendImpression(
1360+
decisionEventDispatched = sendImpression(
13611361
projectConfig,
13621362
flagDecision.holdoutDecision.experiment,
13631363
userId,
@@ -1366,7 +1366,7 @@ private OptimizelyDecision createOptimizelyDecision(
13661366
flagKey,
13671367
flagDecision.holdoutDecision.decisionSource != null ? flagDecision.holdoutDecision.decisionSource.toString() : FeatureDecision.DecisionSource.HOLDOUT.toString(),
13681368
flagDecision.holdoutDecision.variation != null && flagDecision.holdoutDecision.variation.getFeatureEnabled(),
1369-
null);
1369+
null) || decisionEventDispatched;
13701370
}
13711371

13721372
DecisionNotification decisionNotification = DecisionNotification.newFlagDecisionNotificationBuilder()

‎core-api/src/main/java/com/optimizely/ab/bucketing/DecisionService.java‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,10 @@ public List<DecisionResponse<FeatureDecision>> getVariationsForFeatureList(@Non
347347
continue flagLoop;
348348
}
349349

350+
if (globalHoldoutDecision != null && excludeTargetedDeliveries) {
351+
reasons.addInfo("Holdout '%s' has excludeTargetedDeliveries enabled, continuing to rollout evaluation.", globalHoldoutDecision.experiment.getKey());
352+
}
353+
350354
if (globalHoldoutDecision == null) {
351355
DecisionResponse<FeatureDecision> decisionVariationResponse = getVariationFromExperiment(projectConfig, featureFlag, user, options, userProfileTracker, decisionPath);
352356
reasons.merge(decisionVariationResponse.getReasons());

‎core-api/src/test/java/com/optimizely/ab/bucketing/DecisionServiceTest.java‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2168,6 +2168,28 @@ public void globalHoldout_excludeTD_holdoutDecisionAttached() {
21682168
assertEquals(HOLDOUT_GLOBAL_EXCLUDE_TARGETED_DELIVERIES, decision.holdoutDecision.experiment);
21692169
}
21702170

2171+
@Test
2172+
public void globalHoldout_excludeTD_addsDecisionReason() {
2173+
ProjectConfig config = ValidProjectConfigV4.generateValidProjectConfigV4_globalHoldoutExcludeTargetedDeliveries();
2174+
2175+
Bucketer bucketer = new Bucketer();
2176+
DecisionService ds = new DecisionService(bucketer, mockErrorHandler, null, mockCmabService);
2177+
2178+
DecisionResponse<FeatureDecision> response = ds.getVariationForFeature(
2179+
FEATURE_FLAG_SINGLE_VARIABLE_INTEGER,
2180+
optimizely.createUserContext("any_user", Collections.<String, Object>emptyMap()),
2181+
config
2182+
);
2183+
2184+
List<String> reasons = response.getReasons().toReport();
2185+
String expectedReason = String.format(
2186+
"Holdout '%s' has excludeTargetedDeliveries enabled, continuing to rollout evaluation.",
2187+
HOLDOUT_GLOBAL_EXCLUDE_TARGETED_DELIVERIES.getKey()
2188+
);
2189+
assertTrue("Reasons should contain excludeTargetedDeliveries bypass message",
2190+
reasons.contains(expectedReason));
2191+
}
2192+
21712193
private Experiment createMockCmabExperiment() {
21722194
List<Variation> variations = Arrays.asList(
21732195
new Variation("111151", "variation_1"),

0 commit comments

Comments
 (0)