Skip to content

Commit efaac85

Browse files
Merge pull request #227 from splitio/polishing
Adding tests
2 parents df8dcc9 + a62f0ac commit efaac85

File tree

12 files changed

+316
-94
lines changed

12 files changed

+316
-94
lines changed

client/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@
121121
<dependency>
122122
<groupId>com.google.guava</groupId>
123123
<artifactId>guava</artifactId>
124-
<version>29.0-jre</version>
124+
<version>30.0-jre</version>
125125
</dependency>
126126
<dependency>
127127
<groupId>org.slf4j</groupId>

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public class SplitFactoryBuilder {
2525
* @throws IOException if the SDK was being started in 'localhost' mode, but
2626
* there were problems reading the override file from disk.
2727
*/
28-
public static SplitFactory build(String apiToken) throws Exception {
28+
public static SplitFactory build(String apiToken) throws IOException, URISyntaxException {
2929
return build(apiToken, SplitClientConfig.builder().build());
3030
}
3131

@@ -36,7 +36,7 @@ public static SplitFactory build(String apiToken) throws Exception {
3636
* @throws java.io.IOException if the SDK was being started in 'localhost' mode, but
3737
* there were problems reading the override file from disk.
3838
*/
39-
public static synchronized SplitFactory build(String apiToken, SplitClientConfig config) throws Exception {
39+
public static synchronized SplitFactory build(String apiToken, SplitClientConfig config) throws IOException, URISyntaxException {
4040
ApiKeyValidator.validate(apiToken);
4141

4242
if (LocalhostSplitFactory.LOCALHOST.equals(apiToken)) {
@@ -66,7 +66,7 @@ public static SplitFactory local(SplitClientConfig config) throws IOException, U
6666
return LocalhostSplitFactory.createLocalhostSplitFactory(config);
6767
}
6868

69-
public static void main(String... args) throws Exception {
69+
public static void main(String... args) throws IOException, URISyntaxException {
7070
if (args.length != 1) {
7171
System.out.println("Usage: <api_token>");
7272
System.exit(1);

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

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import io.split.integrations.IntegrationsConfig;
2828
import io.split.telemetry.storage.InMemoryTelemetryStorage;
2929
import io.split.telemetry.storage.TelemetryStorage;
30-
import io.split.telemetry.synchronizer.SynchronizerMemory;
30+
import io.split.telemetry.synchronizer.TelemetrySubmitter;
3131
import io.split.telemetry.synchronizer.TelemetrySyncTask;
3232
import io.split.telemetry.synchronizer.TelemetrySynchronizer;
3333
import org.apache.hc.client5.http.auth.AuthScope;
@@ -123,7 +123,7 @@ public SplitFactoryImpl(String apiToken, SplitClientConfig config) throws URISyn
123123
// Cache Initialisations
124124
_segmentCache = new SegmentCacheInMemoryImpl();
125125
_splitCache = new InMemoryCacheImp();
126-
_telemetrySynchronizer = new SynchronizerMemory(_httpclient, URI.create(config.get_telemetryURL()), _telemetryStorage, _splitCache, _segmentCache, _telemetryStorage, _startTime);
126+
_telemetrySynchronizer = new TelemetrySubmitter(_httpclient, URI.create(config.get_telemetryURL()), _telemetryStorage, _splitCache, _segmentCache, _telemetryStorage, _startTime);
127127

128128

129129
// Segments
@@ -182,18 +182,22 @@ public synchronized void destroy() {
182182
if (!isTerminated) {
183183
_log.info("Shutdown called for split");
184184
try {
185-
_segmentSynchronizationTaskImp.close();
186-
_log.info("Successful shutdown of segment fetchers");
187-
_splitSynchronizationTask.close();
188-
_log.info("Successful shutdown of splits");
185+
long splitCount = _splitCache.getAll().stream().count();
186+
long segmentCount = _segmentCache.getAll().stream().count();
187+
long segmentKeyCount = _segmentCache.getAllKeys().stream().count();
189188
_impressionsManager.close();
190189
_log.info("Successful shutdown of impressions manager");
191190
_eventClient.close();
192191
_log.info("Successful shutdown of eventClient");
192+
_segmentSynchronizationTaskImp.close();
193+
_log.info("Successful shutdown of segment fetchers");
194+
_splitSynchronizationTask.close();
195+
_log.info("Successful shutdown of splits");
193196
_syncManager.shutdown();
194197
_log.info("Successful shutdown of syncManager");
195198
_telemetryStorage.recordSessionLength(System.currentTimeMillis() - _startTime);
196-
_telemetrySyncTask.stopScheduledTask();
199+
_telemetrySyncTask.stopScheduledTask(splitCount, segmentCount, segmentKeyCount);
200+
_log.info("Successful shutdown of telemetry sync task");
197201
_httpclient.close();
198202
_log.info("Successful shutdown of httpclient");
199203
} catch (IOException e) {

client/src/main/java/io/split/telemetry/synchronizer/SynchronizerMemory.java renamed to client/src/main/java/io/split/telemetry/synchronizer/TelemetrySubmitter.java

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.split.telemetry.synchronizer;
22

3+
import com.google.common.annotations.VisibleForTesting;
34
import io.split.cache.SegmentCache;
45
import io.split.cache.SplitCache;
56
import io.split.client.SplitClientConfig;
@@ -23,7 +24,7 @@
2324
import java.util.List;
2425
import java.util.Map;
2526

26-
public class SynchronizerMemory implements TelemetrySynchronizer{
27+
public class TelemetrySubmitter implements TelemetrySynchronizer{
2728

2829
private static final int OPERATION_MODE = 0;
2930
private static final String STORAGE = "memory";
@@ -34,7 +35,7 @@ public class SynchronizerMemory implements TelemetrySynchronizer{
3435
private SegmentCache _segmentCache;
3536
private final long _initStartTime;
3637

37-
public SynchronizerMemory(CloseableHttpClient client, URI telemetryRootEndpoint, TelemetryStorageConsumer telemetryStorageConsumer, SplitCache splitCache,
38+
public TelemetrySubmitter(CloseableHttpClient client, URI telemetryRootEndpoint, TelemetryStorageConsumer telemetryStorageConsumer, SplitCache splitCache,
3839
SegmentCache segmentCache, TelemetryRuntimeProducer telemetryRuntimeProducer, long initStartTime) throws URISyntaxException {
3940
_httpHttpTelemetryMemorySender = HttpTelemetryMemorySender.create(client, telemetryRootEndpoint, telemetryRuntimeProducer);
4041
_teleTelemetryStorageConsumer = telemetryStorageConsumer;
@@ -53,7 +54,17 @@ public void synchronizeStats() throws Exception {
5354
_httpHttpTelemetryMemorySender.postStats(generateStats());
5455
}
5556

56-
private Stats generateStats() throws Exception {
57+
@Override
58+
public void finalSynchronization(long splitCount, long segmentCount, long segmentKeyCount) throws Exception {
59+
Stats stats = generateStats();
60+
stats.set_splitCount(splitCount);
61+
stats.set_segmentCount(segmentCount);
62+
stats.set_segmentKeyCount(segmentKeyCount);
63+
_httpHttpTelemetryMemorySender.postStats(stats);
64+
}
65+
66+
@VisibleForTesting
67+
Stats generateStats() throws Exception {
5768
Stats stats = new Stats();
5869
stats.set_lastSynchronization(_teleTelemetryStorageConsumer.getLastSynchronization());
5970
stats.set_methodLatencies(_teleTelemetryStorageConsumer.popLatencies());
@@ -76,7 +87,8 @@ private Stats generateStats() throws Exception {
7687
return stats;
7788
}
7889

79-
private Config generateConfig(SplitClientConfig splitClientConfig, long readyTimestamp, Map<String, Long> factoryInstances, List<String> tags) {
90+
@VisibleForTesting
91+
Config generateConfig(SplitClientConfig splitClientConfig, long readyTimestamp, Map<String, Long> factoryInstances, List<String> tags) {
8092
Config config = new Config();
8193
Rates rates = new Rates();
8294
URLOverrides urlOverrides = new URLOverrides();
@@ -93,11 +105,11 @@ private Config generateConfig(SplitClientConfig splitClientConfig, long readyTim
93105
rates.set_segments(splitClientConfig.segmentsRefreshRate());
94106
rates.set_splits(splitClientConfig.featuresRefreshRate());
95107

96-
urlOverrides.set_auth(SplitClientConfig.AUTH_ENDPOINT.equals(splitClientConfig.authServiceURL()));
97-
urlOverrides.set_stream(SplitClientConfig.STREAMING_ENDPOINT.equals(splitClientConfig.streamingServiceURL()));
98-
urlOverrides.set_sdk(SplitClientConfig.SDK_ENDPOINT.equals(splitClientConfig.endpoint()));
99-
urlOverrides.set_events(SplitClientConfig.EVENTS_ENDPOINT.equals(splitClientConfig.eventsEndpoint()));
100-
urlOverrides.set_telemetry(SplitClientConfig.TELEMETRY_ENDPOINT.equals(splitClientConfig.get_telemetryURL()));
108+
urlOverrides.set_auth(!SplitClientConfig.AUTH_ENDPOINT.equals(splitClientConfig.authServiceURL()));
109+
urlOverrides.set_stream(!SplitClientConfig.STREAMING_ENDPOINT.equals(splitClientConfig.streamingServiceURL()));
110+
urlOverrides.set_sdk(!SplitClientConfig.SDK_ENDPOINT.equals(splitClientConfig.endpoint()));
111+
urlOverrides.set_events(!SplitClientConfig.EVENTS_ENDPOINT.equals(splitClientConfig.eventsEndpoint()));
112+
urlOverrides.set_telemetry(!SplitClientConfig.TELEMETRY_ENDPOINT.equals(splitClientConfig.get_telemetryURL()));
101113

102114
config.set_burTimeouts(_teleTelemetryStorageConsumer.getBURTimeouts());
103115
config.set_nonReadyUsages(_teleTelemetryStorageConsumer.getNonReadyUsages());

client/src/main/java/io/split/telemetry/synchronizer/TelemetrySyncTask.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
import com.google.common.annotations.VisibleForTesting;
44
import com.google.common.util.concurrent.ThreadFactoryBuilder;
5+
import io.split.client.SplitManagerImpl;
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
58

69
import java.util.concurrent.Executors;
710
import java.util.concurrent.ScheduledExecutorService;
@@ -10,6 +13,7 @@
1013

1114
public class TelemetrySyncTask {
1215

16+
private static final Logger _log = LoggerFactory.getLogger(TelemetrySyncTask.class);
1317
private final ScheduledExecutorService _telemetrySyncScheduledExecutorService;
1418
private final TelemetrySynchronizer _telemetrySynchronizer;
1519
private final int _telemetryRefreshRate;
@@ -30,21 +34,21 @@ public TelemetrySyncTask(int telemetryRefreshRate, TelemetrySynchronizer telemet
3034
}
3135

3236
@VisibleForTesting
33-
protected void startScheduledTask() throws Exception {
37+
protected void startScheduledTask() {
3438
_telemetrySyncScheduledExecutorService.scheduleWithFixedDelay(() -> {
3539
try {
3640
_telemetrySynchronizer.synchronizeStats();
3741
} catch (Exception e) {
3842
e.printStackTrace();
3943
}
40-
},0l, _telemetryRefreshRate, TimeUnit.SECONDS);
44+
},_telemetryRefreshRate, _telemetryRefreshRate, TimeUnit.SECONDS);
4145
}
4246

43-
public void stopScheduledTask() {
47+
public void stopScheduledTask(long splitCount, long segmentCount, long segmentKeyCount) {
4448
try {
45-
_telemetrySynchronizer.synchronizeStats();
49+
_telemetrySynchronizer.finalSynchronization(splitCount, segmentCount, segmentKeyCount);
4650
} catch (Exception e) {
47-
e.printStackTrace();
51+
_log.warn("Error trying to send telemetry stats.");
4852
}
4953
_telemetrySyncScheduledExecutorService.shutdown();
5054
}

client/src/main/java/io/split/telemetry/synchronizer/TelemetrySynchronizer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@
88
public interface TelemetrySynchronizer {
99
void synchronizeConfig(SplitClientConfig config, long timeUntilReady, Map<String, Long> factoryInstances, List<String> tags);
1010
void synchronizeStats() throws Exception;
11+
void finalSynchronization(long splitCount, long segmentCount, long segmentKeyCount) throws Exception;
1112
}

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
package io.split.client;
22

33
import io.split.client.impressions.ImpressionsManager;
4+
import io.split.engine.segments.SegmentSynchronizationTaskImp;
45
import io.split.integrations.IntegrationsConfig;
6+
import io.split.telemetry.storage.TelemetryStorage;
57
import junit.framework.TestCase;
68
import org.junit.Test;
9+
import org.mockito.Mockito;
710

11+
import java.lang.reflect.Field;
12+
import java.lang.reflect.Modifier;
813
import java.net.URISyntaxException;
914

1015
public class SplitFactoryImplTest extends TestCase {
@@ -89,6 +94,7 @@ public void testFactoryInstantiationWithProxy() throws Exception {
8994

9095
@Test
9196
public void testFactoryDestroy() throws Exception {
97+
TelemetryStorage telemetryStorage = Mockito.mock(TelemetryStorage.class);
9298
SplitClientConfig splitClientConfig = SplitClientConfig.builder()
9399
.enableDebug()
94100
.impressionsMode(ImpressionsManager.Mode.DEBUG)
@@ -98,10 +104,20 @@ public void testFactoryDestroy() throws Exception {
98104
.authServiceURL(AUTH_SERVICE)
99105
.setBlockUntilReadyTimeout(10000)
100106
.build();
107+
101108
SplitFactoryImpl splitFactory = new SplitFactoryImpl(API_KEY, splitClientConfig);
109+
//Before destroy we replace telemetryStorage via reflection.
110+
Field factoryDestroy = SplitFactoryImpl.class.getDeclaredField("_telemetryStorage");
111+
factoryDestroy.setAccessible(true);
112+
Field modifiersField = Field.class.getDeclaredField("modifiers");
113+
modifiersField.setAccessible(true);
114+
modifiersField.setInt(factoryDestroy, factoryDestroy.getModifiers() & ~Modifier.FINAL);
115+
116+
factoryDestroy.set(splitFactory, telemetryStorage);
102117
splitFactory.destroy();
103118

104119
assertTrue(splitFactory.isDestroyed());
120+
Mockito.verify(telemetryStorage, Mockito.times(1)).recordSessionLength(Mockito.anyLong());
105121
}
106122

107123
}

client/src/test/java/io/split/client/impressions/ImpressionsManagerImplTest.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
import io.split.client.dtos.KeyImpression;
55
import io.split.client.dtos.TestImpressions;
66

7+
import io.split.telemetry.domain.enums.ImpressionsDataTypeEnum;
78
import io.split.telemetry.storage.InMemoryTelemetryStorage;
89
import io.split.telemetry.storage.TelemetryStorage;
10+
import org.junit.Before;
911
import org.junit.Ignore;
1012
import org.junit.Test;
1113
import org.junit.runner.RunWith;
@@ -21,15 +23,19 @@
2123

2224
import static org.hamcrest.Matchers.*;
2325
import static org.junit.Assert.assertThat;
24-
import static org.mockito.Mockito.never;
25-
import static org.mockito.Mockito.verify;
26+
import static org.mockito.Mockito.*;
2627

2728
/**
2829
* Created by patricioe on 6/20/16.
2930
*/
3031
@RunWith(MockitoJUnitRunner.class)
3132
public class ImpressionsManagerImplTest {
32-
private static final TelemetryStorage TELEMETRY_STORAGE = Mockito.mock(InMemoryTelemetryStorage.class);
33+
private static TelemetryStorage TELEMETRY_STORAGE = Mockito.mock(InMemoryTelemetryStorage.class);
34+
35+
@Before
36+
public void setUp() {
37+
TELEMETRY_STORAGE = Mockito.mock(InMemoryTelemetryStorage.class);
38+
}
3339

3440
@Captor
3541
private ArgumentCaptor<List<TestImpressions>> impressionsCaptor;
@@ -102,6 +108,7 @@ public void worksButDropsImpressions() throws URISyntaxException {
102108
List<TestImpressions> captured = impressionsCaptor.getValue();
103109

104110
assertThat(captured.size(), is(equalTo(3)));
111+
Mockito.verify(TELEMETRY_STORAGE, times(1)).recordImpressionStats(ImpressionsDataTypeEnum.IMPRESSIONS_DROPPED, 1);
105112
}
106113

107114
@Test
@@ -138,6 +145,8 @@ public void works4ImpressionsInOneTest() throws URISyntaxException {
138145
assertThat(captured.size(), is(equalTo(1)));
139146
assertThat(captured.get(0).keyImpressions.size(), is(equalTo(4)));
140147
assertThat(captured.get(0).keyImpressions.get(0), is(equalTo(ki1)));
148+
Mockito.verify(TELEMETRY_STORAGE, times(2)).recordImpressionStats(ImpressionsDataTypeEnum.IMPRESSIONS_DEDUPED, 1);
149+
Mockito.verify(TELEMETRY_STORAGE, times(4)).recordImpressionStats(ImpressionsDataTypeEnum.IMPRESSIONS_QUEUED, 1);
141150
}
142151

143152
@Test

client/src/test/java/io/split/engine/sse/AuthApiClientTest.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,20 @@
88
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
99
import org.apache.hc.core5.http.HttpStatus;
1010
import org.junit.Assert;
11+
import org.junit.Before;
1112
import org.junit.Test;
1213
import org.mockito.Mockito;
1314

1415
import java.io.IOException;
1516
import java.lang.reflect.InvocationTargetException;
1617

1718
public class AuthApiClientTest {
18-
private static final TelemetryStorage TELEMETRY_STORAGE = Mockito.mock(InMemoryTelemetryStorage.class);
19+
private static TelemetryStorage TELEMETRY_STORAGE = Mockito.mock(InMemoryTelemetryStorage.class);
20+
21+
@Before
22+
public void setUp() {
23+
TELEMETRY_STORAGE = Mockito.mock(InMemoryTelemetryStorage.class);
24+
}
1925
@Test
2026
public void authenticateWithPushEnabledShouldReturnSuccess() throws IOException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
2127
CloseableHttpClient httpClientMock = TestHelper.mockHttpClient("streaming-auth-push-enabled.json", HttpStatus.SC_OK);
@@ -28,6 +34,9 @@ public void authenticateWithPushEnabledShouldReturnSuccess() throws IOException,
2834
Assert.assertFalse(result.isRetry());
2935
Assert.assertFalse(StringUtils.isEmpty(result.getToken()));
3036
Assert.assertTrue(result.getExpiration() > 0);
37+
Mockito.verify(TELEMETRY_STORAGE, Mockito.times(1)).recordTokenRefreshes();
38+
Mockito.verify(TELEMETRY_STORAGE, Mockito.times(1)).recordSyncLatency(Mockito.anyObject(), Mockito.anyLong());
39+
Mockito.verify(TELEMETRY_STORAGE, Mockito.times(1)).recordSuccessfulSync(Mockito.anyObject(), Mockito.anyLong());
3140

3241
}
3342

@@ -95,5 +104,6 @@ public void authenticateServerUnauthorizedShouldReturnErrorWithoutRetry() throws
95104
Assert.assertTrue(StringUtils.isEmpty(result.getChannels()));
96105
Assert.assertTrue(StringUtils.isEmpty(result.getToken()));
97106
Assert.assertFalse(result.isRetry());
107+
Mockito.verify(TELEMETRY_STORAGE, Mockito.times(1)).recordAuthRejections();
98108
}
99109
}

client/src/test/java/io/split/telemetry/synchronizer/SynchronizerMemoryTest.java

Lines changed: 0 additions & 58 deletions
This file was deleted.

0 commit comments

Comments
 (0)