Skip to content

Commit 249ab03

Browse files
author
Bilal Al
committed
added integration tests
1 parent 2dc15df commit 249ab03

File tree

4 files changed

+281
-5
lines changed

4 files changed

+281
-5
lines changed

client/src/test/java/io/split/client/SplitClientIntegrationTest.java

Lines changed: 237 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@
1010
import io.split.storages.pluggable.CustomStorageWrapperImp;
1111
import io.split.storages.pluggable.domain.EventConsumer;
1212
import io.split.storages.pluggable.domain.ImpressionConsumer;
13+
14+
import okhttp3.mockwebserver.Dispatcher;
1315
import okhttp3.mockwebserver.MockResponse;
16+
import okhttp3.mockwebserver.MockWebServer;
17+
import okhttp3.mockwebserver.RecordedRequest;
1418
import org.awaitility.Awaitility;
1519
import org.glassfish.grizzly.utils.Pair;
1620
import org.glassfish.jersey.media.sse.OutboundEvent;
@@ -21,6 +25,10 @@
2125
import java.io.IOException;
2226
import java.net.URISyntaxException;
2327

28+
import java.nio.Buffer;
29+
import java.nio.charset.StandardCharsets;
30+
import java.nio.file.Files;
31+
import java.nio.file.Paths;
2432
import java.util.ArrayList;
2533
import java.util.Arrays;
2634
import java.util.HashMap;
@@ -771,6 +779,235 @@ public void getTreatmentFlagSetWithPolling() throws Exception {
771779
splitServer.stop();
772780
}
773781

782+
@Test
783+
public void ImpressionToggleOptimizedModeTest() throws Exception {
784+
String splits = new String(Files.readAllBytes(Paths.get("src/test/resources/splits_imp_toggle.json")), StandardCharsets.UTF_8);
785+
List<RecordedRequest> allRequests = new ArrayList<>();
786+
787+
Dispatcher dispatcher = new Dispatcher() {
788+
@Override
789+
public MockResponse dispatch(RecordedRequest request) {
790+
allRequests.add(request);
791+
switch (request.getPath()) {
792+
case "/api/splitChanges?s=1.1&since=-1":
793+
return new MockResponse().setResponseCode(200).setBody(splits);
794+
case "/api/splitChanges?s=1.1&since=1602796638344":
795+
return new MockResponse().setResponseCode(200).setBody("{\"splits\": [], \"since\":1602796638344, \"till\":1602796638344}");
796+
case "/api/testImpressions/bulk":
797+
return new MockResponse().setResponseCode(200);
798+
case "/api/testImpressions/count":
799+
return new MockResponse().setResponseCode(200);
800+
case "/v1/keys/ss":
801+
return new MockResponse().setResponseCode(200);
802+
case "/v1/metrics/usage":
803+
return new MockResponse().setResponseCode(200);
804+
case "/v1/metrics/config":
805+
return new MockResponse().setResponseCode(200);
806+
}
807+
return new MockResponse().setResponseCode(404);
808+
}
809+
};
810+
811+
MockWebServer server = new MockWebServer();
812+
server.setDispatcher(dispatcher);
813+
814+
server.start();
815+
String serverURL = String.format("http://%s:%s", server.getHostName(), server.getPort());
816+
SplitClientConfig config = SplitClientConfig.builder()
817+
.setBlockUntilReadyTimeout(10000)
818+
.endpoint(serverURL, serverURL)
819+
.authServiceURL(String.format("%s/api/auth/enabled", serverURL))
820+
.telemetryURL(serverURL + "/v1")
821+
.streamingEnabled(false)
822+
.featuresRefreshRate(5)
823+
.impressionsMode(ImpressionsManager.Mode.OPTIMIZED)
824+
.build();
825+
826+
SplitFactory factory = SplitFactoryBuilder.build("fake-api-token", config);
827+
SplitClient client = factory.client();
828+
client.blockUntilReady();
829+
830+
Assert.assertEquals("off", client.getTreatment("user1", "without_impression_toggle", null));
831+
Assert.assertEquals("off", client.getTreatment("user2", "impression_toggle_on", null));
832+
Assert.assertEquals("off", client.getTreatment("user3", "impression_toggle_off", null));
833+
Thread.sleep(1000);
834+
client.destroy();
835+
boolean check1 = false, check2 = false;
836+
for (int i=0; i < allRequests.size(); i++ ) {
837+
if (allRequests.get(i).getPath().equals("/api/testImpressions/bulk") ) {
838+
check1 = true;
839+
String body = allRequests.get(i).getBody().readUtf8();
840+
Assert.assertTrue(body.contains("without_impression_toggle"));
841+
Assert.assertTrue(body.contains("impression_toggle_on"));
842+
Assert.assertFalse(body.contains("impression_toggle_off"));
843+
}
844+
if (allRequests.get(i).getPath().equals("/v1/keys/ss")) {
845+
check2 = true;
846+
String body = allRequests.get(i).getBody().readUtf8();
847+
Assert.assertFalse(body.contains("without_impression_toggle"));
848+
Assert.assertFalse(body.contains("impression_toggle_on"));
849+
Assert.assertTrue(body.contains("impression_toggle_off"));
850+
}
851+
}
852+
server.shutdown();
853+
Assert.assertTrue(check1);
854+
Assert.assertTrue(check2);
855+
}
856+
857+
@Test
858+
public void ImpressionToggleDebugModeTest() throws Exception {
859+
String splits = new String(Files.readAllBytes(Paths.get("src/test/resources/splits_imp_toggle.json")), StandardCharsets.UTF_8);
860+
List<RecordedRequest> allRequests = new ArrayList<>();
861+
862+
Dispatcher dispatcher = new Dispatcher() {
863+
@Override
864+
public MockResponse dispatch(RecordedRequest request) {
865+
allRequests.add(request);
866+
switch (request.getPath()) {
867+
case "/api/splitChanges?s=1.1&since=-1":
868+
return new MockResponse().setResponseCode(200).setBody(splits);
869+
case "/api/splitChanges?s=1.1&since=1602796638344":
870+
return new MockResponse().setResponseCode(200).setBody("{\"splits\": [], \"since\":1602796638344, \"till\":1602796638344}");
871+
case "/api/testImpressions/bulk":
872+
return new MockResponse().setResponseCode(200);
873+
case "/api/testImpressions/count":
874+
return new MockResponse().setResponseCode(200);
875+
case "/v1/keys/ss":
876+
return new MockResponse().setResponseCode(200);
877+
case "/v1/metrics/usage":
878+
return new MockResponse().setResponseCode(200);
879+
case "/v1/metrics/config":
880+
return new MockResponse().setResponseCode(200);
881+
}
882+
return new MockResponse().setResponseCode(404);
883+
}
884+
};
885+
886+
MockWebServer server = new MockWebServer();
887+
server.setDispatcher(dispatcher);
888+
889+
server.start();
890+
String serverURL = String.format("http://%s:%s", server.getHostName(), server.getPort());
891+
SplitClientConfig config = SplitClientConfig.builder()
892+
.setBlockUntilReadyTimeout(10000)
893+
.endpoint(serverURL, serverURL)
894+
.telemetryURL(serverURL + "/v1")
895+
.authServiceURL(String.format("%s/api/auth/enabled", serverURL))
896+
.streamingEnabled(false)
897+
.featuresRefreshRate(5)
898+
.impressionsMode(ImpressionsManager.Mode.DEBUG)
899+
.build();
900+
901+
SplitFactory factory = SplitFactoryBuilder.build("fake-api-token", config);
902+
SplitClient client = factory.client();
903+
client.blockUntilReady();
904+
905+
Assert.assertEquals("off", client.getTreatment("user1", "without_impression_toggle", null));
906+
Assert.assertEquals("off", client.getTreatment("user2", "impression_toggle_on", null));
907+
Assert.assertEquals("off", client.getTreatment("user3", "impression_toggle_off", null));
908+
Thread.sleep(1000);
909+
client.destroy();
910+
boolean check1 = false, check2 = false;
911+
for (int i=0; i < allRequests.size(); i++ ) {
912+
if (allRequests.get(i).getPath().equals("/api/testImpressions/bulk") ) {
913+
check1 = true;
914+
String body = allRequests.get(i).getBody().readUtf8();
915+
Assert.assertTrue(body.contains("without_impression_toggle"));
916+
Assert.assertTrue(body.contains("impression_toggle_on"));
917+
Assert.assertFalse(body.contains("impression_toggle_off"));
918+
}
919+
if (allRequests.get(i).getPath().equals("/v1/keys/ss")) {
920+
check2 = true;
921+
String body = allRequests.get(i).getBody().readUtf8();
922+
Assert.assertFalse(body.contains("without_impression_toggle"));
923+
Assert.assertFalse(body.contains("impression_toggle_on"));
924+
Assert.assertTrue(body.contains("impression_toggle_off"));
925+
}
926+
}
927+
server.shutdown();
928+
Assert.assertTrue(check1);
929+
Assert.assertTrue(check2);
930+
}
931+
932+
@Test
933+
public void ImpressionToggleNoneModeTest() throws Exception {
934+
String splits = new String(Files.readAllBytes(Paths.get("src/test/resources/splits_imp_toggle.json")), StandardCharsets.UTF_8);
935+
List<RecordedRequest> allRequests = new ArrayList<>();
936+
937+
Dispatcher dispatcher = new Dispatcher() {
938+
@Override
939+
public MockResponse dispatch(RecordedRequest request) {
940+
allRequests.add(request);
941+
switch (request.getPath()) {
942+
case "/api/splitChanges?s=1.1&since=-1":
943+
return new MockResponse().setResponseCode(200).setBody(splits);
944+
case "/api/splitChanges?s=1.1&since=1602796638344":
945+
return new MockResponse().setResponseCode(200).setBody("{\"splits\": [], \"since\":1602796638344, \"till\":1602796638344}");
946+
case "/api/testImpressions/bulk":
947+
return new MockResponse().setResponseCode(200);
948+
case "/api/testImpressions/count":
949+
return new MockResponse().setResponseCode(200);
950+
case "/v1/keys/ss":
951+
return new MockResponse().setResponseCode(200);
952+
case "/v1/metrics/usage":
953+
return new MockResponse().setResponseCode(200);
954+
case "/v1/metrics/config":
955+
return new MockResponse().setResponseCode(200);
956+
}
957+
return new MockResponse().setResponseCode(404);
958+
}
959+
};
960+
961+
MockWebServer server = new MockWebServer();
962+
server.setDispatcher(dispatcher);
963+
964+
server.start();
965+
String serverURL = String.format("http://%s:%s", server.getHostName(), server.getPort());
966+
SplitClientConfig config = SplitClientConfig.builder()
967+
.setBlockUntilReadyTimeout(10000)
968+
.endpoint(serverURL, serverURL)
969+
.telemetryURL(serverURL + "/v1")
970+
.authServiceURL(String.format("%s/api/auth/enabled", serverURL))
971+
.streamingEnabled(false)
972+
.featuresRefreshRate(5)
973+
.impressionsMode(ImpressionsManager.Mode.NONE)
974+
.build();
975+
976+
SplitFactory factory = SplitFactoryBuilder.build("fake-api-token", config);
977+
SplitClient client = factory.client();
978+
client.blockUntilReady();
979+
980+
Assert.assertEquals("off", client.getTreatment("user1", "without_impression_toggle", null));
981+
Assert.assertEquals("off", client.getTreatment("user2", "impression_toggle_on", null));
982+
Assert.assertEquals("off", client.getTreatment("user3", "impression_toggle_off", null));
983+
Thread.sleep(1000);
984+
client.destroy();
985+
boolean check1 = false, check2 = false, check3 = false;
986+
for (int i=0; i < allRequests.size(); i++ ) {
987+
if (allRequests.get(i).getPath().equals("/api/testImpressions/bulk") ) {
988+
check1 = true;
989+
}
990+
if (allRequests.get(i).getPath().equals("/v1/keys/ss")) {
991+
check2 = true;
992+
String body = allRequests.get(i).getBody().readUtf8();
993+
Assert.assertTrue(body.contains("without_impression_toggle"));
994+
Assert.assertTrue(body.contains("impression_toggle_on"));
995+
Assert.assertTrue(body.contains("impression_toggle_off"));
996+
}
997+
if (allRequests.get(i).getPath().equals("/api/testImpressions/count")) {
998+
check3 = true;
999+
String body = allRequests.get(i).getBody().readUtf8();
1000+
Assert.assertTrue(body.contains("without_impression_toggle"));
1001+
Assert.assertTrue(body.contains("impression_toggle_on"));
1002+
Assert.assertTrue(body.contains("impression_toggle_off"));
1003+
}
1004+
}
1005+
server.shutdown();
1006+
Assert.assertFalse(check1);
1007+
Assert.assertTrue(check2);
1008+
Assert.assertTrue(check3);
1009+
}
1010+
7741011
private SSEMockServer buildSSEMockServer(SSEMockServer.SseEventQueue eventQueue) {
7751012
return new SSEMockServer(eventQueue, (token, version, channel) -> {
7761013
if (!"1.1".equals(version)) {

client/src/test/java/io/split/client/SplitManagerImplTest.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,14 @@
22

33
import com.google.common.collect.Lists;
44
import io.split.client.api.SplitView;
5+
import io.split.client.dtos.Split;
6+
import io.split.client.dtos.SplitChange;
7+
import io.split.client.utils.Json;
58
import io.split.engine.ConditionsTestUtil;
69
import io.split.engine.SDKReadinessGates;
710
import io.split.engine.experiments.ParsedCondition;
811
import io.split.engine.experiments.ParsedSplit;
12+
import io.split.engine.experiments.SplitParser;
913
import io.split.engine.matchers.AllKeysMatcher;
1014
import io.split.engine.matchers.CombiningMatcher;
1115
import io.split.grammar.Treatments;
@@ -16,6 +20,10 @@
1620
import org.junit.Before;
1721
import org.junit.Test;
1822

23+
import java.io.IOException;
24+
import java.nio.charset.StandardCharsets;
25+
import java.nio.file.Files;
26+
import java.nio.file.Paths;
1927
import java.util.ArrayList;
2028
import java.util.Arrays;
2129
import java.util.HashMap;
@@ -24,6 +32,8 @@
2432
import java.util.Map;
2533
import java.util.concurrent.TimeoutException;
2634

35+
import static org.junit.Assert.assertFalse;
36+
import static org.junit.Assert.assertTrue;
2737
import static org.mockito.Mockito.mock;
2838
import static org.mockito.Mockito.times;
2939
import static org.mockito.Mockito.verify;
@@ -220,4 +230,26 @@ public void splitCallWithEmptySets() {
220230
private ParsedCondition getTestCondition(String treatment) {
221231
return ParsedCondition.createParsedConditionForTests(CombiningMatcher.of(new AllKeysMatcher()), Lists.newArrayList(ConditionsTestUtil.partition(treatment, 10)));
222232
}
233+
234+
@Test
235+
public void ImpressionToggleParseTest() throws IOException {
236+
SplitParser parser = new SplitParser();
237+
String splits = new String(Files.readAllBytes(Paths.get("src/test/resources/splits_imp_toggle.json")), StandardCharsets.UTF_8);
238+
SplitChange change = Json.fromJson(splits, SplitChange.class);
239+
SplitCacheConsumer splitCacheConsumer = mock(SplitCacheConsumer.class);
240+
for (Split split : change.splits) {
241+
ParsedSplit parsedSplit = parser.parse(split);
242+
when(splitCacheConsumer.get(split.name)).thenReturn(parsedSplit);
243+
}
244+
SplitManagerImpl splitManager = new SplitManagerImpl(splitCacheConsumer,
245+
mock(SplitClientConfig.class),
246+
mock(SDKReadinessGates.class), TELEMETRY_STORAGE);
247+
248+
SplitView splitView = splitManager.split("without_impression_toggle");
249+
assertTrue(splitView.trackImpression);
250+
splitView = splitManager.split("impression_toggle_on");
251+
assertTrue(splitView.trackImpression);
252+
splitView = splitManager.split("impression_toggle_off");
253+
assertFalse(splitView.trackImpression);
254+
}
223255
}

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

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.junit.Test;
3737
import org.mockito.Mockito;
3838

39+
import javax.validation.constraints.AssertTrue;
3940
import java.io.IOException;
4041
import java.nio.charset.StandardCharsets;
4142
import java.nio.file.Files;
@@ -645,19 +646,25 @@ public void ImpressionToggleParseTest() throws IOException {
645646
SplitParser parser = new SplitParser();
646647
String splits = new String(Files.readAllBytes(Paths.get("src/test/resources/splits_imp_toggle.json")), StandardCharsets.UTF_8);
647648
SplitChange change = Json.fromJson(splits, SplitChange.class);
649+
boolean check1 = false, check2 = false, check3 = false;
648650
for (Split split : change.splits) {
649-
// should not cause exception
650651
ParsedSplit parsedSplit = parser.parse(split);
651652
if (split.name.equals("without_impression_toggle")) {
652-
assertTrue(split.trackImpression);
653+
assertTrue(parsedSplit.trackImpression());
654+
check1 = true;
653655
}
654656
if (split.name.equals("impression_toggle_on")) {
655-
assertTrue(split.trackImpression);
657+
assertTrue(parsedSplit.trackImpression());
658+
check2 = true;
656659
}
657660
if (split.name.equals("impression_toggle_off")) {
658-
assertFalse(split.trackImpression);
661+
assertFalse(parsedSplit.trackImpression());
662+
check3 = true;
659663
}
660664
}
665+
assertTrue(check1);
666+
assertTrue(check2);
667+
assertTrue(check3);
661668
}
662669

663670
public void setMatcherTest(Condition c, io.split.engine.matchers.Matcher m) {

client/src/test/resources/splits_imp_toggle.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,5 +151,5 @@
151151
}
152152
],
153153
"since": -1,
154-
"till": 1585948850109
154+
"till": 1602796638344
155155
}

0 commit comments

Comments
 (0)