From 1ffe622280dac7b29e60c30f0f6764f4494fe885 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Wed, 30 Apr 2025 11:26:50 -0700 Subject: [PATCH 1/2] fix empty arrays in excluded --- .../client/utils/RuleBasedSegmentProcessor.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/client/src/main/java/io/split/client/utils/RuleBasedSegmentProcessor.java b/client/src/main/java/io/split/client/utils/RuleBasedSegmentProcessor.java index eebea3b1..2fc12fe6 100644 --- a/client/src/main/java/io/split/client/utils/RuleBasedSegmentProcessor.java +++ b/client/src/main/java/io/split/client/utils/RuleBasedSegmentProcessor.java @@ -22,10 +22,7 @@ public static RuleBasedSegmentsToUpdate processRuleBasedSegmentChanges(RuleBased List toRemove = new ArrayList<>(); Set segments = new HashSet<>(); for (RuleBasedSegment ruleBasedSegment : ruleBasedSegments) { - if (ruleBasedSegment.excluded == null) - { - ruleBasedSegment.excluded = createEmptyExcluded(); - } + ruleBasedSegment.excluded = checkExcluded(ruleBasedSegment.excluded); if (ruleBasedSegment.status != Status.ACTIVE) { // archive. toRemove.add(ruleBasedSegment.name); @@ -49,4 +46,16 @@ private static Excluded createEmptyExcluded() { return excluded; } + private static Excluded checkExcluded(Excluded excluded) { + if (excluded == null) { + excluded = createEmptyExcluded(); + } + if (excluded.segments == null) { + excluded.segments = new ArrayList<>(); + } + if (excluded.keys == null) { + excluded.keys = new ArrayList<>(); + } + return excluded; + } } \ No newline at end of file From 0b2813d3947fef6a30f40876e958e0e3ba85bb45 Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany Date: Wed, 30 Apr 2025 11:33:51 -0700 Subject: [PATCH 2/2] added tests --- .../ParsedRuleBasedSegmentTest.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/client/src/test/java/io/split/engine/experiments/ParsedRuleBasedSegmentTest.java b/client/src/test/java/io/split/engine/experiments/ParsedRuleBasedSegmentTest.java index 81f3b768..d1411c81 100644 --- a/client/src/test/java/io/split/engine/experiments/ParsedRuleBasedSegmentTest.java +++ b/client/src/test/java/io/split/engine/experiments/ParsedRuleBasedSegmentTest.java @@ -46,5 +46,37 @@ public void worksWithoutExcluded() { RuleBasedSegmentsToUpdate toUpdate = processRuleBasedSegmentChanges(parser, change.ruleBasedSegments.d); Assert.assertTrue(toUpdate.getToAdd().get(0).excludedKeys().isEmpty()); Assert.assertTrue(toUpdate.getToAdd().get(0).excludedSegments().isEmpty()); + + load = "{\"ff\":{\"s\":-1,\"t\":-1,\"d\":[]},\"rbs\":{\"s\":-1,\"t\":1457726098069,\"d\":[{ \"changeNumber\": 123, \"trafficTypeName\": \"user\", \"name\": \"some_name\"," + + "\"status\": \"ACTIVE\",\"excluded\":{\"segments\":[\"segment1\"]},\"conditions\": [{\"contitionType\": \"ROLLOUT\"," + + "\"label\": \"some_label\", \"matcherGroup\": { \"matchers\": [{ \"matcherType\": \"ALL_KEYS\", \"negate\": false}]," + + "\"combiner\": \"AND\"}}]}]}}"; + change = Json.fromJson(load, SplitChange.class); + toUpdate = processRuleBasedSegmentChanges(parser, change.ruleBasedSegments.d); + Assert.assertTrue(toUpdate.getToAdd().get(0).excludedKeys().isEmpty()); + + load = "{\"ff\":{\"s\":-1,\"t\":-1,\"d\":[]},\"rbs\":{\"s\":-1,\"t\":1457726098069,\"d\":[{ \"changeNumber\": 123, \"trafficTypeName\": \"user\", \"name\": \"some_name\"," + + "\"status\": \"ACTIVE\",\"excluded\":{\"segments\":[\"segment1\"], \"keys\":null},\"conditions\": [{\"contitionType\": \"ROLLOUT\"," + + "\"label\": \"some_label\", \"matcherGroup\": { \"matchers\": [{ \"matcherType\": \"ALL_KEYS\", \"negate\": false}]," + + "\"combiner\": \"AND\"}}]}]}}"; + change = Json.fromJson(load, SplitChange.class); + toUpdate = processRuleBasedSegmentChanges(parser, change.ruleBasedSegments.d); + Assert.assertTrue(toUpdate.getToAdd().get(0).excludedKeys().isEmpty()); + + load = "{\"ff\":{\"s\":-1,\"t\":-1,\"d\":[]},\"rbs\":{\"s\":-1,\"t\":1457726098069,\"d\":[{ \"changeNumber\": 123, \"trafficTypeName\": \"user\", \"name\": \"some_name\"," + + "\"status\": \"ACTIVE\",\"excluded\":{\"keys\":[\"key1\"]},\"conditions\": [{\"contitionType\": \"ROLLOUT\"," + + "\"label\": \"some_label\", \"matcherGroup\": { \"matchers\": [{ \"matcherType\": \"ALL_KEYS\", \"negate\": false}]," + + "\"combiner\": \"AND\"}}]}]}}"; + change = Json.fromJson(load, SplitChange.class); + toUpdate = processRuleBasedSegmentChanges(parser, change.ruleBasedSegments.d); + Assert.assertTrue(toUpdate.getToAdd().get(0).excludedSegments().isEmpty()); + + load = "{\"ff\":{\"s\":-1,\"t\":-1,\"d\":[]},\"rbs\":{\"s\":-1,\"t\":1457726098069,\"d\":[{ \"changeNumber\": 123, \"trafficTypeName\": \"user\", \"name\": \"some_name\"," + + "\"status\": \"ACTIVE\",\"excluded\":{\"segments\":null, \"keys\":[\"key1\"]},\"conditions\": [{\"contitionType\": \"ROLLOUT\"," + + "\"label\": \"some_label\", \"matcherGroup\": { \"matchers\": [{ \"matcherType\": \"ALL_KEYS\", \"negate\": false}]," + + "\"combiner\": \"AND\"}}]}]}}"; + change = Json.fromJson(load, SplitChange.class); + toUpdate = processRuleBasedSegmentChanges(parser, change.ruleBasedSegments.d); + Assert.assertTrue(toUpdate.getToAdd().get(0).excludedSegments().isEmpty()); } } \ No newline at end of file