Skip to content

Commit 1204cce

Browse files
authored
Merge pull request #503 from splitio/semver-api-url
added spec to splitchanges and auth urls, and updated tests
2 parents b48a831 + 630363e commit 1204cce

File tree

10 files changed

+582
-20
lines changed

10 files changed

+582
-20
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package io.split;
2+
3+
public final class Spec {
4+
5+
private Spec() {
6+
// restrict instantiation
7+
}
8+
9+
public static final String SPEC_VERSION = "1.1";
10+
}
11+

client/src/main/java/io/split/client/HttpSplitChangeFetcher.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.split.client;
22

33
import com.google.common.annotations.VisibleForTesting;
4+
45
import io.split.client.dtos.SplitChange;
56
import io.split.client.dtos.SplitHttpResponse;
67
import io.split.client.exceptions.UriTooLongException;
@@ -21,6 +22,7 @@
2122
import java.net.URISyntaxException;
2223

2324
import static com.google.common.base.Preconditions.checkNotNull;
25+
import static io.split.Spec.SPEC_VERSION;
2426

2527
/**
2628
* Created by adilaijaz on 5/30/15.
@@ -31,6 +33,7 @@ public final class HttpSplitChangeFetcher implements SplitChangeFetcher {
3133
private static final String SINCE = "since";
3234
private static final String TILL = "till";
3335
private static final String SETS = "sets";
36+
private static final String SPEC = "s";
3437
private final SplitHttpClient _client;
3538
private final URI _target;
3639
private final TelemetryRuntimeProducer _telemetryRuntimeProducer;
@@ -58,13 +61,14 @@ public SplitChange fetch(long since, FetchOptions options) {
5861
long start = System.currentTimeMillis();
5962

6063
try {
61-
URIBuilder uriBuilder = new URIBuilder(_target).addParameter(SINCE, "" + since);
62-
if (options.hasCustomCN()) {
63-
uriBuilder.addParameter(TILL, "" + options.targetCN());
64-
}
64+
URIBuilder uriBuilder = new URIBuilder(_target).addParameter(SPEC, "" + SPEC_VERSION);
65+
uriBuilder.addParameter(SINCE, "" + since);
6566
if (!options.flagSetsFilter().isEmpty()) {
6667
uriBuilder.addParameter(SETS, "" + options.flagSetsFilter());
6768
}
69+
if (options.hasCustomCN()) {
70+
uriBuilder.addParameter(TILL, "" + options.targetCN());
71+
}
6872
URI uri = uriBuilder.build();
6973
SplitHttpResponse response = _client.get(uri, options, null);
7074

client/src/main/java/io/split/engine/matchers/EqualToSemverMatcher.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public boolean match(Object matchValue, String bucketingKey, Map<String, Object>
2828
@Override
2929
public String toString() {
3030
StringBuilder bldr = new StringBuilder();
31-
bldr.append("== ");
31+
bldr.append("== semver ");
3232
bldr.append(_semVer.Version());
3333
return bldr.toString();
3434
}

client/src/main/java/io/split/engine/matchers/GreaterThanOrEqualToSemverMatcher.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public boolean match(Object matchValue, String bucketingKey, Map<String, Object>
2828
@Override
2929
public String toString() {
3030
StringBuilder bldr = new StringBuilder();
31-
bldr.append("== ");
31+
bldr.append(">= semver ");
3232
bldr.append(_semVer.Version());
3333
return bldr.toString();
3434
}

client/src/main/java/io/split/engine/matchers/InListSemverMatcher.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public boolean match(Object matchValue, String bucketingKey, Map<String, Object>
4040
@Override
4141
public String toString() {
4242
StringBuilder bldr = new StringBuilder();
43-
bldr.append("in semver list ");
43+
bldr.append("in semver list [");
4444
boolean first = true;
4545

4646
for (Semver item : _semverlist) {

client/src/main/java/io/split/engine/matchers/LessThanOrEqualToSemverMatcher.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public boolean match(Object matchValue, String bucketingKey, Map<String, Object>
2828
@Override
2929
public String toString() {
3030
StringBuilder bldr = new StringBuilder();
31-
bldr.append("== ");
31+
bldr.append("<= semver ");
3232
bldr.append(_semVer.Version());
3333
return bldr.toString();
3434
}

client/src/main/java/io/split/engine/sse/AuthApiClientImp.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@
1818
import java.net.URI;
1919

2020
import static com.google.common.base.Preconditions.checkNotNull;
21+
import static io.split.Spec.SPEC_VERSION;
2122

2223
public class AuthApiClientImp implements AuthApiClient {
2324
private static final Logger _log = LoggerFactory.getLogger(AuthApiClientImp.class);
2425

26+
private static final String SPEC = "s";
2527
private final SplitHttpClient _httpClient;
2628
private final String _target;
2729
private final TelemetryRuntimeProducer _telemetryRuntimeProducer;
@@ -36,7 +38,7 @@ public AuthApiClientImp(String url, SplitHttpClient httpClient, TelemetryRuntime
3638
public AuthenticationResponse Authenticate() {
3739
try {
3840
long initTime = System.currentTimeMillis();
39-
URI uri = new URIBuilder(_target).build();
41+
URI uri = new URIBuilder(_target).addParameter(SPEC, "" + SPEC_VERSION).build();
4042
SplitHttpResponse response = _httpClient.get(uri, new FetchOptions.Builder().cacheControlHeaders(false).build(), null);
4143
Integer statusCode = response.statusCode();
4244

client/src/test/java/io/split/client/utils/CustomDispatcher.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,16 @@
99
import java.util.*;
1010

1111
public class CustomDispatcher extends Dispatcher {
12-
public static final String INITIAL_SPLIT_CHANGES = "/api/splitChanges?since=-1";
13-
public static final String INITIAL_FLAGS_BY_SETS = "/api/splitChanges?since=-1&sets=set1%2Cset2";
14-
public static final String SINCE_1602796638344 = "/api/splitChanges?since=1602796638344&sets=set1%2Cset2";
15-
public static final String AUTH_ENABLED = "/api/auth/enabled";
16-
public static final String AUTH_DISABLED = "/api/auth/disabled";
17-
public static final String SINCE_1585948850109 = "/api/splitChanges?since=1585948850109";
18-
public static final String SINCE_1585948850109_FLAG_SET = "/api/splitChanges?since=-1&sets=set_1%2Cset_2";
19-
public static final String SINCE_1585948850110 = "/api/splitChanges?since=1585948850110";
20-
public static final String SINCE_1585948850111 = "/api/splitChanges?since=1585948850111";
21-
public static final String SINCE_1585948850112 = "/api/splitChanges?since=1585948850112";
12+
public static final String INITIAL_SPLIT_CHANGES = "/api/splitChanges?s=1.1&since=-1";
13+
public static final String INITIAL_FLAGS_BY_SETS = "/api/splitChanges?s=1.1&since=-1&sets=set1%2Cset2";
14+
public static final String SINCE_1602796638344 = "/api/splitChanges?s=1.1&since=1602796638344&sets=set1%2Cset2";
15+
public static final String AUTH_ENABLED = "/api/auth/enabled?s=1.1";
16+
public static final String AUTH_DISABLED = "/api/auth/disabled?s=1.1";
17+
public static final String SINCE_1585948850109 = "/api/splitChanges?s=1.1&since=1585948850109";
18+
public static final String SINCE_1585948850109_FLAG_SET = "/api/splitChanges?s=1.1&since=-1&sets=set_1%2Cset_2";
19+
public static final String SINCE_1585948850110 = "/api/splitChanges?s=1.1&since=1585948850110";
20+
public static final String SINCE_1585948850111 = "/api/splitChanges?s=1.1&since=1585948850111";
21+
public static final String SINCE_1585948850112 = "/api/splitChanges?s=1.1&since=1585948850112";
2222
public static final String SEGMENT_TEST_INITIAL = "/api/segmentChanges/segment-test?since=-1";
2323
public static final String SEGMENT3_INITIAL = "/api/segmentChanges/segment3?since=-1";
2424
public static final String SEGMENT3_SINCE_1585948850110 = "/api/segmentChanges/segment3?since=1585948850110";

client/src/test/java/io/split/engine/experiments/SplitParserTest.java

Lines changed: 115 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@
3030
import org.junit.Test;
3131
import org.mockito.Mockito;
3232

33+
import java.io.IOException;
34+
import java.nio.charset.StandardCharsets;
35+
import java.nio.file.Files;
36+
import java.nio.file.Paths;
3337
import java.util.ArrayList;
3438
import java.util.HashMap;
3539
import java.util.HashSet;
@@ -533,7 +537,7 @@ public void contains_string() {
533537
}
534538

535539
@Test
536-
public void unsupportedMatcher() {
540+
public void UnsupportedMatcher() {
537541
SplitParser parser = new SplitParser();
538542
String splitWithUndefinedMatcher = "{\"since\":-1,\"till\": 1457726098069,\"splits\": [{ \"changeNumber\": 123, \"trafficTypeName\": \"user\", \"name\": \"some_name\","
539543
+ "\"trafficAllocation\": 100, \"trafficAllocationSeed\": 123456, \"seed\": 321654, \"status\": \"ACTIVE\","
@@ -555,6 +559,116 @@ public void unsupportedMatcher() {
555559
}
556560
}
557561

562+
@Test
563+
public void EqualToSemverMatcher() throws IOException {
564+
SplitParser parser = new SplitParser();
565+
String splits = new String(Files.readAllBytes(Paths.get("src/test/resources/semver/semver-splits.json")), StandardCharsets.UTF_8);
566+
SplitChange change = Json.fromJson(splits, SplitChange.class);
567+
for (Split split : change.splits) {
568+
// should not cause exception
569+
ParsedSplit parsedSplit = parser.parse(split);
570+
if (split.name.equals("semver_equalto")) {
571+
for (ParsedCondition parsedCondition : parsedSplit.parsedConditions()) {
572+
assertTrue(parsedCondition.label().equals("equal to semver"));
573+
for (AttributeMatcher matcher : parsedCondition.matcher().attributeMatchers()) {
574+
// Check the matcher is ALL_KEYS
575+
assertTrue(matcher.matcher().toString().equals(" == semver 1\\.22\\.9"));
576+
return;
577+
}
578+
}
579+
}
580+
}
581+
assertTrue(false);
582+
}
583+
584+
@Test
585+
public void GreaterThanOrEqualSemverMatcher() throws IOException {
586+
SplitParser parser = new SplitParser();
587+
String splits = new String(Files.readAllBytes(Paths.get("src/test/resources/semver/semver-splits.json")), StandardCharsets.UTF_8);
588+
SplitChange change = Json.fromJson(splits, SplitChange.class);
589+
for (Split split : change.splits) {
590+
// should not cause exception
591+
ParsedSplit parsedSplit = parser.parse(split);
592+
if (split.name.equals("semver_greater_or_equalto")) {
593+
for (ParsedCondition parsedCondition : parsedSplit.parsedConditions()) {
594+
assertTrue(parsedCondition.label().equals("greater than or equal to semver"));
595+
for (AttributeMatcher matcher : parsedCondition.matcher().attributeMatchers()) {
596+
// Check the matcher is ALL_KEYS
597+
assertTrue(matcher.matcher().toString().equals(" >= semver 1\\.22\\.9"));
598+
return;
599+
}
600+
}
601+
}
602+
}
603+
assertTrue(false);
604+
}
605+
606+
@Test
607+
public void LessThanOrEqualSemverMatcher() throws IOException {
608+
SplitParser parser = new SplitParser();
609+
String splits = new String(Files.readAllBytes(Paths.get("src/test/resources/semver/semver-splits.json")), StandardCharsets.UTF_8);
610+
SplitChange change = Json.fromJson(splits, SplitChange.class);
611+
for (Split split : change.splits) {
612+
// should not cause exception
613+
ParsedSplit parsedSplit = parser.parse(split);
614+
if (split.name.equals("semver_less_or_equalto")) {
615+
for (ParsedCondition parsedCondition : parsedSplit.parsedConditions()) {
616+
assertTrue(parsedCondition.label().equals("less than or equal to semver"));
617+
for (AttributeMatcher matcher : parsedCondition.matcher().attributeMatchers()) {
618+
// Check the matcher is ALL_KEYS
619+
assertTrue(matcher.matcher().toString().equals(" <= semver 1\\.22\\.9"));
620+
return;
621+
}
622+
}
623+
}
624+
}
625+
assertTrue(false);
626+
}
627+
628+
@Test
629+
public void BetweenSemverMatcher() throws IOException {
630+
SplitParser parser = new SplitParser();
631+
String splits = new String(Files.readAllBytes(Paths.get("src/test/resources/semver/semver-splits.json")), StandardCharsets.UTF_8);
632+
SplitChange change = Json.fromJson(splits, SplitChange.class);
633+
for (Split split : change.splits) {
634+
// should not cause exception
635+
ParsedSplit parsedSplit = parser.parse(split);
636+
if (split.name.equals("semver_between")) {
637+
for (ParsedCondition parsedCondition : parsedSplit.parsedConditions()) {
638+
assertTrue(parsedCondition.label().equals("between semver"));
639+
for (AttributeMatcher matcher : parsedCondition.matcher().attributeMatchers()) {
640+
// Check the matcher is ALL_KEYS
641+
assertTrue(matcher.matcher().toString().equals(" between semver 1\\.22\\.9 and 2\\.1\\.0"));
642+
return;
643+
}
644+
}
645+
}
646+
}
647+
assertTrue(false);
648+
}
649+
650+
@Test
651+
public void InListSemverMatcher() throws IOException {
652+
SplitParser parser = new SplitParser();
653+
String splits = new String(Files.readAllBytes(Paths.get("src/test/resources/semver/semver-splits.json")), StandardCharsets.UTF_8);
654+
SplitChange change = Json.fromJson(splits, SplitChange.class);
655+
for (Split split : change.splits) {
656+
// should not cause exception
657+
ParsedSplit parsedSplit = parser.parse(split);
658+
if (split.name.equals("semver_inlist")) {
659+
for (ParsedCondition parsedCondition : parsedSplit.parsedConditions()) {
660+
assertTrue(parsedCondition.label().equals("in list semver"));
661+
for (AttributeMatcher matcher : parsedCondition.matcher().attributeMatchers()) {
662+
// Check the matcher is ALL_KEYS
663+
assertTrue(matcher.matcher().toString().startsWith(" in semver list"));
664+
return;
665+
}
666+
}
667+
}
668+
}
669+
assertTrue(false);
670+
}
671+
558672
public void set_matcher_test(Condition c, io.split.engine.matchers.Matcher m) {
559673

560674
// SegmentSynchronizationTask segmentFetcher = new SegmentSynchronizationTaskImp(fetcherMap);

0 commit comments

Comments
 (0)