Skip to content
Open
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
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package io.split.client.testing;

import io.split.client.SplitAndKey;
import io.split.client.SplitClient;
import io.split.client.api.Key;
import io.split.client.api.SplitResult;
Expand All @@ -9,131 +10,131 @@
import java.util.*;
import java.util.concurrent.TimeoutException;

import static java.util.stream.Collectors.toMap;

public class SplitClientForTest implements SplitClient {
private Map<String, String> _tests;
private static final SplitResult CONTROL_RESULT = new SplitResult(Treatments.CONTROL, null);

private final Map<SplitAndKey, SplitResult> _tests;

public SplitClientForTest() {
_tests = new HashMap<>();
}

public Map<String, String> tests() {
return _tests;
return _tests
.entrySet()
.stream()
.collect(toMap(
entry -> entry.getKey().split(),
entry -> entry.getValue().treatment(),
(existing, replacement) -> existing
));
}

public Map<SplitAndKey, SplitResult> testMappings() {
return Collections.unmodifiableMap(_tests);
}

public void clearTreatments() {
_tests = new HashMap<>();
_tests.clear();
}

public void registerTreatments(Map<String, String> treatments) {
_tests.putAll(treatments);
for (Map.Entry<String, String> entry : treatments.entrySet()) {
registerTreatment(entry.getKey(), entry.getValue());
}
}

public void registerTreatment(String feature, String treatment) {
_tests.put(feature, treatment);
registerTreatment(feature, null, treatment);
}

public void registerTreatment(String feature, String key, String treatment) {
registerTreatment(feature, key, treatment, null);
}

public void registerTreatment(String feature, String key, String treatment, String config) {
registerTreatment(SplitAndKey.of(feature, key), new SplitResult(treatment, config));
}

public void registerTreatment(SplitAndKey splitAndKey, SplitResult splitResult) {
_tests.put(splitAndKey, splitResult);
}

public String getTreatment(String key, String featureFlagName) {
return _tests.containsKey(featureFlagName)
? _tests.get(featureFlagName)
: Treatments.CONTROL;
return getTreatment(key, featureFlagName, Collections.emptyMap());
}

public String getTreatment(String key, String featureFlagName, Map<String, Object> attributes) {
return _tests.containsKey(featureFlagName)
? _tests.get(featureFlagName)
: Treatments.CONTROL;
return getTreatmentWithConfig(key, featureFlagName, attributes).treatment();
}

public String getTreatment(Key key, String featureFlagName, Map<String, Object> attributes) {
return _tests.containsKey(featureFlagName)
? _tests.get(featureFlagName)
: Treatments.CONTROL;
return getTreatment(key.matchingKey(), featureFlagName, attributes);
}

@Override
public SplitResult getTreatmentWithConfig(String key, String featureFlagName) {
return new SplitResult(_tests.containsKey(featureFlagName)
? _tests.get(featureFlagName)
: Treatments.CONTROL, null);
return getTreatmentWithConfig(key, featureFlagName, Collections.emptyMap());
}

@Override
public SplitResult getTreatmentWithConfig(String key, String featureFlagName, Map<String, Object> attributes) {
return new SplitResult(_tests.containsKey(featureFlagName)
? _tests.get(featureFlagName)
: Treatments.CONTROL, null);
if (_tests.containsKey(SplitAndKey.of(featureFlagName, key))) {
return _tests.get(SplitAndKey.of(featureFlagName, key));
}
else {
return _tests.getOrDefault(SplitAndKey.of(featureFlagName), CONTROL_RESULT);
}
}

@Override
public SplitResult getTreatmentWithConfig(Key key, String featureFlagName, Map<String, Object> attributes) {
return new SplitResult(_tests.containsKey(featureFlagName)
? _tests.get(featureFlagName)
: Treatments.CONTROL, null);
return getTreatmentWithConfig(key.matchingKey(), featureFlagName, attributes);
}

@Override
public Map<String, String> getTreatments(String key, List<String> featureFlagNames) {
Map<String, String> treatments = new HashMap<>();
for (String split : featureFlagNames) {
treatments.put(split, _tests.containsKey(split) ? _tests.get(split) : Treatments.CONTROL);
}
return treatments;
return getTreatments(key, featureFlagNames, Collections.emptyMap());
}

@Override
public Map<String, String> getTreatments(String key, List<String> featureFlagNames, Map<String, Object> attributes){
Map<String, String> treatments = new HashMap<>();
for (String split : featureFlagNames) {
treatments.put(split, _tests.containsKey(split) ? _tests.get(split) : Treatments.CONTROL);
treatments.put(split, getTreatment(key, split, attributes));
}
return treatments;
}

@Override
public Map<String, String> getTreatments(Key key, List<String> featureFlagNames, Map<String, Object> attributes) {
Map<String, String> treatments = new HashMap<>();
for (String split : featureFlagNames) {
treatments.put(split, _tests.containsKey(split) ? _tests.get(split) : Treatments.CONTROL);
}
return treatments;
return getTreatments(key.matchingKey(), featureFlagNames, attributes);
}

@Override
public Map<String, SplitResult> getTreatmentsWithConfig(String key, List<String> featureFlagNames) {
Map<String, SplitResult> treatments = new HashMap<>();
for (String split : featureFlagNames) {
treatments.put(split, new SplitResult(_tests.containsKey(split)
? _tests.get(split)
: Treatments.CONTROL, null));
}
return treatments;
return getTreatmentsWithConfig(key, featureFlagNames, Collections.emptyMap());
}

@Override
public Map<String, SplitResult> getTreatmentsWithConfig(String key, List<String> featureFlagNames, Map<String, Object> attributes) {
Map<String, SplitResult> treatments = new HashMap<>();
for (String split : featureFlagNames) {
treatments.put(split, new SplitResult(_tests.containsKey(split)
? _tests.get(split)
: Treatments.CONTROL, null));
treatments.put(split, getTreatmentWithConfig(key, split, attributes));
}
return treatments;
}

@Override
public Map<String, SplitResult> getTreatmentsWithConfig(Key key, List<String> featureFlagNames, Map<String, Object> attributes) {
Map<String, SplitResult> treatments = new HashMap<>();
for (String split : featureFlagNames) {
treatments.put(split, new SplitResult(_tests.containsKey(split)
? _tests.get(split)
: Treatments.CONTROL, null));
}
return treatments;
return getTreatmentsWithConfig(key.matchingKey(), featureFlagNames, attributes);
}

@Override
public Map<String, String> getTreatmentsByFlagSet(String key, String flagSet) {
return null;
return new HashMap<>();
}

@Override
Expand All @@ -148,7 +149,7 @@ public Map<String, String> getTreatmentsByFlagSet(Key key, String flagSet, Map<S

@Override
public Map<String, String> getTreatmentsByFlagSets(String key, List<String> flagSets) {
return null;
return new HashMap<>();
}

@Override
Expand All @@ -163,7 +164,7 @@ public Map<String, String> getTreatmentsByFlagSets(Key key, List<String> flagSet

@Override
public Map<String, SplitResult> getTreatmentsWithConfigByFlagSet(String key, String flagSet) {
return null;
return new HashMap<>();
}

@Override
Expand All @@ -178,7 +179,7 @@ public Map<String, SplitResult> getTreatmentsWithConfigByFlagSet(Key key, String

@Override
public Map<String, SplitResult> getTreatmentsWithConfigByFlagSets(String key, List<String> flagSets) {
return null;
return new HashMap<>();
}

@Override
Expand All @@ -193,62 +194,62 @@ public Map<String, SplitResult> getTreatmentsWithConfigByFlagSets(Key key, List<

@Override
public String getTreatment(String key, String featureFlagName, EvaluationOptions evaluationOptions) {
return null;
return getTreatment(key, featureFlagName);
}

@Override
public String getTreatment(String key, String featureFlagName, Map<String, Object> attributes, EvaluationOptions evaluationOptions) {
return null;
return getTreatment(key, featureFlagName, attributes);
}

@Override
public String getTreatment(Key key, String featureFlagName, Map<String, Object> attributes, EvaluationOptions evaluationOptions) {
return null;
return getTreatment(key, featureFlagName, attributes);
}

@Override
public Map<String, String> getTreatments(String key, List<String> featureFlagNames, EvaluationOptions evaluationOptions) {
return new HashMap<>();
return getTreatments(key, featureFlagNames);
}

@Override
public Map<String, String> getTreatments(String key, List<String> featureFlagNames, Map<String, Object> attributes,
EvaluationOptions evaluationOptions) {
return new HashMap<>();
return getTreatments(key, featureFlagNames, attributes);
}

@Override
public Map<String, String> getTreatments(Key key, List<String> featureFlagNames, Map<String, Object> attributes,
EvaluationOptions evaluationOptions) {
return new HashMap<>();
return getTreatments(key, featureFlagNames, attributes);
}

@Override
public SplitResult getTreatmentWithConfig(String key, String featureFlagName, EvaluationOptions evaluationOptions) {
return null;
return getTreatmentWithConfig(key, featureFlagName);
}

@Override
public SplitResult getTreatmentWithConfig(Key key, String featureFlagName, Map<String, Object> attributes,
EvaluationOptions evaluationOptions) {
return null;
return getTreatmentWithConfig(key, featureFlagName, attributes);
}

@Override
public SplitResult getTreatmentWithConfig(String key, String featureFlagName, Map<String, Object> attributes,
EvaluationOptions evaluationOptions) {
return null;
return getTreatmentWithConfig(key, featureFlagName, attributes);
}

@Override
public Map<String, SplitResult> getTreatmentsWithConfig(String key, List<String> featureFlagNames, Map<String, Object> attributes,
EvaluationOptions evaluationOptions) {
return new HashMap<>();
return getTreatmentsWithConfig(key, featureFlagNames, attributes);
}

@Override
public Map<String, SplitResult> getTreatmentsWithConfig(String key, List<String> featureFlagNames, EvaluationOptions evaluationOptions) {
return new HashMap<>();
return getTreatmentsWithConfig(key, featureFlagNames);
}

@Override
Expand Down Expand Up @@ -298,7 +299,7 @@ public Map<String, String> getTreatmentsByFlagSet(String key, String flagSet, Ev
@Override
public Map<String, SplitResult> getTreatmentsWithConfig(Key key, List<String> featureFlagNames, Map<String, Object> attributes,
EvaluationOptions evaluationOptions) {
return new HashMap<>();
return getTreatmentsWithConfig(key.matchingKey(), featureFlagNames);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package io.split.client.testing.runner;

import io.split.client.SplitAndKey;
import io.split.client.api.SplitResult;
import io.split.client.testing.SplitClientForTest;
import io.split.client.testing.annotations.SplitTestClient;
import org.junit.runners.model.Statement;
Expand All @@ -24,7 +26,7 @@ public void evaluate() throws Throwable {
SplitClientForTest splitClient = findFirstSplitClient(target, target.getClass());

// Preserve the Split state between Test runs
Map<String, String> priorTests = new HashMap<>(splitClient.tests());
Map<SplitAndKey, SplitResult> priorTests = new HashMap<>(splitClient.testMappings());

// Apply the Active Scenario for this
if (scenario != null) {
Expand All @@ -36,7 +38,9 @@ public void evaluate() throws Throwable {
} finally {
// Clear any Scenario specific changes and re-apply existing splits
splitClient.clearTreatments();
splitClient.registerTreatments(priorTests);
for (Map.Entry<SplitAndKey, SplitResult> entry : priorTests.entrySet()) {
splitClient.registerTreatment(entry.getKey(), entry.getValue());
}
}
}

Expand All @@ -57,4 +61,4 @@ private static SplitClientForTest findFirstSplitClient(Object target, Class<?> t
throw new IllegalArgumentException("No SplitTestClient found in hierarchy");
}
}
}
}
Loading