Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions src/main/java/io/split/android/client/dtos/Prerequisite.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package io.split.android.client.dtos;

import com.google.gson.annotations.SerializedName;

import java.util.HashSet;
import java.util.Set;

public class Prerequisite {

@SerializedName("n")
private String name;

@SerializedName("ts")
private Set<String> treatments;

public Prerequisite() {
}

Prerequisite(String name, Set<String> treatments) {
this.name = name;
this.treatments = treatments;
}

public String getName() {
return name;
}

public Set<String> getTreatments() {
return treatments == null ? new HashSet<>() : treatments;
}
}
9 changes: 9 additions & 0 deletions src/main/java/io/split/android/client/dtos/Split.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import com.google.gson.annotations.SerializedName;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
Expand Down Expand Up @@ -53,6 +54,10 @@ public class Split {
@SerializedName("impressionsDisabled")
public boolean impressionsDisabled = false;

@Nullable
@SerializedName("prerequisites")
private List<Prerequisite> prerequisites;

public String json = null;

public Split() {
Expand All @@ -63,4 +68,8 @@ public Split(String name, String json) {
this.name = name;
this.json = json;
}

public List<Prerequisite> getPrerequisites() {
return prerequisites == null ? new ArrayList<>() : prerequisites;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,13 @@
import org.junit.Before;
import org.junit.Test;

import java.util.List;
import java.util.Set;

import io.split.android.client.dtos.Excluded;
import io.split.android.client.dtos.ExcludedSegment;
import io.split.android.client.dtos.Prerequisite;
import io.split.android.client.dtos.Split;
import io.split.android.client.dtos.TargetingRulesChange;
import io.split.android.client.service.http.HttpResponseParserException;
import io.split.android.helpers.FileHelper;
Expand Down Expand Up @@ -63,6 +66,37 @@ public void parsesLegacySplitChangeJson() throws Exception {
assertTrue(result.getRuleBasedSegmentsChange().getSegments().isEmpty());
}

@Test
public void parsesPrerequisites() throws HttpResponseParserException {
String json = fileHelper.loadFileContent("split_changes_prerequisites.json");
TargetingRulesChange result = parser.parse(json);

assertNotNull(result);
assertNotNull(result.getFeatureFlagsChange());
Split firstSplit = result.getFeatureFlagsChange().splits.get(0);
assertEquals("FACUNDO_TEST", firstSplit.name);
List<Prerequisite> preReqs = firstSplit.getPrerequisites();
assertEquals(2, preReqs.size());
assertEquals("flag1", preReqs.get(0).getName());
assertEquals("flag2", preReqs.get(1).getName());
assertEquals(2, preReqs.get(0).getTreatments().size());
assertEquals(1, preReqs.get(1).getTreatments().size());
assertTrue(preReqs.get(0).getTreatments().contains("on"));
assertTrue(preReqs.get(0).getTreatments().contains("v1"));
assertTrue(preReqs.get(1).getTreatments().contains("off"));
}

@Test
public void nonExistingPrerequisitesDefaultsToEmpty() throws HttpResponseParserException {
String json = fileHelper.loadFileContent("split_changes_prerequisites.json");
TargetingRulesChange result = parser.parse(json);
assertNotNull(result);
Split split = result.getFeatureFlagsChange().splits.get(1);
assertEquals("FACUNDO_TEST_2", split.name);
List<Prerequisite> preReqs = split.getPrerequisites();
assertEquals(0, preReqs.size());
}

@Test
public void parseNullReturnsNull() throws HttpResponseParserException {
TargetingRulesChange result = parser.parse(null);
Expand Down
253 changes: 253 additions & 0 deletions src/test/resources/split_changes_prerequisites.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,253 @@
{
"ff": {
"d": [
{
"trafficTypeName": "account",
"name": "FACUNDO_TEST",
"trafficAllocation": 59,
"trafficAllocationSeed": -2108186082,
"seed": -1947050785,
"status": "ACTIVE",
"killed": false,
"defaultTreatment": "off",
"changeNumber": 1506703262916,
"prerequisites": [
{
"n": "flag1",
"ts": ["on","v1"]
},
{
"n": "flag2",
"ts": ["off"]
}
],
"algo": 2,
"conditions": [
{
"conditionType": "WHITELIST",
"matcherGroup": {
"combiner": "AND",
"matchers": [
{
"keySelector": null,
"matcherType": "WHITELIST",
"negate": false,
"userDefinedSegmentMatcherData": null,
"whitelistMatcherData": {
"whitelist": [
"nico_test",
"othertest"
]
},
"unaryNumericMatcherData": null,
"betweenMatcherData": null,
"booleanMatcherData": null,
"dependencyMatcherData": null,
"stringMatcherData": null
}
]
},
"partitions": [
{
"treatment": "on",
"size": 100
}
],
"label": "whitelisted"
},
{
"conditionType": "WHITELIST",
"matcherGroup": {
"combiner": "AND",
"matchers": [
{
"keySelector": null,
"matcherType": "WHITELIST",
"negate": false,
"userDefinedSegmentMatcherData": null,
"whitelistMatcherData": {
"whitelist": [
"bla"
]
},
"unaryNumericMatcherData": null,
"betweenMatcherData": null,
"booleanMatcherData": null,
"dependencyMatcherData": null,
"stringMatcherData": null
}
]
},
"partitions": [
{
"treatment": "off",
"size": 100
}
],
"label": "whitelisted"
},
{
"conditionType": "ROLLOUT",
"matcherGroup": {
"combiner": "AND",
"matchers": [
{
"keySelector": {
"trafficType": "account",
"attribute": null
},
"matcherType": "ALL_KEYS",
"negate": false,
"userDefinedSegmentMatcherData": null,
"whitelistMatcherData": null,
"unaryNumericMatcherData": null,
"betweenMatcherData": null,
"booleanMatcherData": null,
"dependencyMatcherData": null,
"stringMatcherData": null
}
]
},
"partitions": [
{
"treatment": "on",
"size": 0
},
{
"treatment": "off",
"size": 100
},
{
"treatment": "visa",
"size": 0
}
],
"label": "in segment all"
}
]
},
{
"trafficTypeName": "account",
"name": "FACUNDO_TEST_2",
"trafficAllocation": 59,
"trafficAllocationSeed": -2108186082,
"seed": -1947050785,
"status": "ACTIVE",
"killed": false,
"defaultTreatment": "off",
"changeNumber": 1506703262916,
"algo": 2,
"conditions": [
{
"conditionType": "WHITELIST",
"matcherGroup": {
"combiner": "AND",
"matchers": [
{
"keySelector": null,
"matcherType": "WHITELIST",
"negate": false,
"userDefinedSegmentMatcherData": null,
"whitelistMatcherData": {
"whitelist": [
"nico_test",
"othertest"
]
},
"unaryNumericMatcherData": null,
"betweenMatcherData": null,
"booleanMatcherData": null,
"dependencyMatcherData": null,
"stringMatcherData": null
}
]
},
"partitions": [
{
"treatment": "on",
"size": 100
}
],
"label": "whitelisted"
},
{
"conditionType": "WHITELIST",
"matcherGroup": {
"combiner": "AND",
"matchers": [
{
"keySelector": null,
"matcherType": "WHITELIST",
"negate": false,
"userDefinedSegmentMatcherData": null,
"whitelistMatcherData": {
"whitelist": [
"bla"
]
},
"unaryNumericMatcherData": null,
"betweenMatcherData": null,
"booleanMatcherData": null,
"dependencyMatcherData": null,
"stringMatcherData": null
}
]
},
"partitions": [
{
"treatment": "off",
"size": 100
}
],
"label": "whitelisted"
},
{
"conditionType": "ROLLOUT",
"matcherGroup": {
"combiner": "AND",
"matchers": [
{
"keySelector": {
"trafficType": "account",
"attribute": null
},
"matcherType": "ALL_KEYS",
"negate": false,
"userDefinedSegmentMatcherData": null,
"whitelistMatcherData": null,
"unaryNumericMatcherData": null,
"betweenMatcherData": null,
"booleanMatcherData": null,
"dependencyMatcherData": null,
"stringMatcherData": null
}
]
},
"partitions": [
{
"treatment": "on",
"size": 0
},
{
"treatment": "off",
"size": 100
},
{
"treatment": "visa",
"size": 0
}
],
"label": "in segment all"
}
]
}
],
"s": -1,
"t": 1506703262916
},
"rbs": {
"d": [],
"s": 1506703262920,
"t": 1506703263000
}
}
Loading