Skip to content

Commit 95b0894

Browse files
authored
[FSSDK-13023] Fix excludeTargetedDeliveries parsing in Holdout config parsers (#638)
1 parent c506793 commit 95b0894

7 files changed

Lines changed: 53 additions & 8 deletions

File tree

core-api/src/main/java/com/optimizely/ab/config/Holdout.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ public Holdout(@JsonProperty("id") @Nonnull String id,
108108
@JsonProperty("variations") @Nonnull List<Variation> variations,
109109
@JsonProperty("trafficAllocation") @Nonnull List<TrafficAllocation> trafficAllocation,
110110
@JsonProperty("includedRules") @Nullable List<String> includedRules,
111-
@JsonProperty("exclude_targeted_deliveries") @Nullable Boolean excludeTargetedDeliveries) {
111+
@JsonProperty("excludeTargetedDeliveries") @Nullable Boolean excludeTargetedDeliveries) {
112112
this.id = id;
113113
this.key = key;
114114
this.status = status;

core-api/src/main/java/com/optimizely/ab/config/parser/GsonHelpers.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,8 +213,8 @@ static Holdout parseHoldout(JsonObject holdoutJson, JsonDeserializationContext c
213213
}
214214

215215
boolean excludeTargetedDeliveries = false;
216-
if (holdoutJson.has("exclude_targeted_deliveries") && !holdoutJson.get("exclude_targeted_deliveries").isJsonNull()) {
217-
excludeTargetedDeliveries = holdoutJson.get("exclude_targeted_deliveries").getAsBoolean();
216+
if (holdoutJson.has("excludeTargetedDeliveries") && !holdoutJson.get("excludeTargetedDeliveries").isJsonNull()) {
217+
excludeTargetedDeliveries = holdoutJson.get("excludeTargetedDeliveries").getAsBoolean();
218218
}
219219

220220
return new Holdout(id, key, status, audienceIds, conditions, variations, trafficAllocations, includedRules, excludeTargetedDeliveries);

core-api/src/main/java/com/optimizely/ab/config/parser/JsonConfigParser.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,8 +239,8 @@ private List<Holdout> parseHoldouts(JSONArray holdoutJson) {
239239
}
240240

241241
boolean excludeTargetedDeliveries = false;
242-
if (holdoutObject.has("exclude_targeted_deliveries") && !holdoutObject.isNull("exclude_targeted_deliveries")) {
243-
excludeTargetedDeliveries = holdoutObject.getBoolean("exclude_targeted_deliveries");
242+
if (holdoutObject.has("excludeTargetedDeliveries") && !holdoutObject.isNull("excludeTargetedDeliveries")) {
243+
excludeTargetedDeliveries = holdoutObject.getBoolean("excludeTargetedDeliveries");
244244
}
245245

246246
holdouts.add(new Holdout(id, key, status, audienceIds, conditions, variations,

core-api/src/main/java/com/optimizely/ab/config/parser/JsonSimpleConfigParser.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -258,8 +258,8 @@ private List<Holdout> parseHoldouts(JSONArray holdoutJson) {
258258
}
259259

260260
boolean excludeTargetedDeliveries = false;
261-
if (hoObject.containsKey("exclude_targeted_deliveries") && hoObject.get("exclude_targeted_deliveries") != null) {
262-
excludeTargetedDeliveries = (Boolean) hoObject.get("exclude_targeted_deliveries");
261+
if (hoObject.containsKey("excludeTargetedDeliveries") && hoObject.get("excludeTargetedDeliveries") != null) {
262+
excludeTargetedDeliveries = (Boolean) hoObject.get("excludeTargetedDeliveries");
263263
}
264264

265265
holdouts.add(new Holdout(id, key, status, audienceIds, conditions, variations,

core-api/src/test/java/com/optimizely/ab/config/DatafileProjectConfigTestUtils.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,7 @@ private static void verifyHoldouts(List<Holdout> actual, List<Holdout> expected)
546546
assertThat(actualHoldout.getAudienceConditions(), is(expectedHoldout.getAudienceConditions()));
547547
assertThat(actualHoldout.getIncludedRules(), is(expectedHoldout.getIncludedRules()));
548548
assertThat(actualHoldout.isGlobal(), is(expectedHoldout.isGlobal()));
549+
assertThat(actualHoldout.isExcludeTargetedDeliveries(), is(expectedHoldout.isExcludeTargetedDeliveries()));
549550
verifyVariations(actualHoldout.getVariations(), expectedHoldout.getVariations());
550551
verifyTrafficAllocations(actualHoldout.getTrafficAllocation(),
551552
expectedHoldout.getTrafficAllocation());

core-api/src/test/java/com/optimizely/ab/config/ValidProjectConfigV4.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -570,6 +570,28 @@ public class ValidProjectConfigV4 {
570570
)
571571
);
572572

573+
// Dedicated 0% traffic holdout used solely to verify excludeTargetedDeliveries parsing
574+
// across all 4 ConfigParser implementations, without affecting decision-path tests
575+
// (no user is ever bucketed into a 0%-traffic holdout).
576+
public static final Holdout HOLDOUT_ETD_PARSER_COVERAGE = new Holdout(
577+
"1007532345431",
578+
"holdout_etd_parser_coverage",
579+
Holdout.HoldoutStatus.RUNNING.toString(),
580+
Collections.<String>emptyList(),
581+
null,
582+
DatafileProjectConfigTestUtils.createListOfObjects(
583+
VARIATION_HOLDOUT_VARIATION_OFF
584+
),
585+
DatafileProjectConfigTestUtils.createListOfObjects(
586+
new TrafficAllocation(
587+
"$opt_dummy_variation_id",
588+
0
589+
)
590+
),
591+
null,
592+
true
593+
);
594+
573595

574596
public static final Holdout HOLDOUT_TYPEDAUDIENCE_HOLDOUT = new Holdout(
575597
"10075323429",
@@ -1685,6 +1707,7 @@ public static ProjectConfig generateValidProjectConfigV4_holdout() {
16851707
holdouts.add(HOLDOUT_ZERO_TRAFFIC_HOLDOUT);
16861708
holdouts.add(HOLDOUT_BASIC_HOLDOUT);
16871709
holdouts.add(HOLDOUT_TYPEDAUDIENCE_HOLDOUT);
1710+
holdouts.add(HOLDOUT_ETD_PARSER_COVERAGE);
16881711
holdouts.add(HOLDOUT_LOCAL_FOR_BASIC_EXPERIMENT_PARSER);
16891712

16901713
// list featureFlags

core-api/src/test/resources/config/holdouts-project-config.json

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,8 @@
511511
"id": "$opt_dummy_variation_id",
512512
"key": "ho_off_key"
513513
}
514-
]
514+
],
515+
"excludeTargetedDeliveries": false
515516
},
516517
{
517518
"id": "10075323429",
@@ -532,6 +533,26 @@
532533
],
533534
"audienceIds": ["3468206643", "3468206644", "3468206646", "3468206645"],
534535
"audienceConditions" : ["or", "3468206643", "3468206644", "3468206646", "3468206645"]
536+
},
537+
{
538+
"audienceIds": [],
539+
"id": "1007532345431",
540+
"key": "holdout_etd_parser_coverage",
541+
"status": "Running",
542+
"trafficAllocation": [
543+
{
544+
"endOfRange": 0,
545+
"entityId": "$opt_dummy_variation_id"
546+
}
547+
],
548+
"variations": [
549+
{
550+
"featureEnabled": false,
551+
"id": "$opt_dummy_variation_id",
552+
"key": "ho_off_key"
553+
}
554+
],
555+
"excludeTargetedDeliveries": true
535556
}
536557
],
537558
"localHoldouts": [

0 commit comments

Comments
 (0)