diff --git a/client/src/main/java/io/split/client/impressions/ImpressionsManagerImpl.java b/client/src/main/java/io/split/client/impressions/ImpressionsManagerImpl.java index 07ef85605..384264332 100644 --- a/client/src/main/java/io/split/client/impressions/ImpressionsManagerImpl.java +++ b/client/src/main/java/io/split/client/impressions/ImpressionsManagerImpl.java @@ -61,7 +61,7 @@ public static ImpressionsManagerImpl instanceForTest(SplitClientConfig config, ImpressionsStorageProducer impressionsStorageProducer, ProcessImpressionStrategy processImpressionStrategy, ImpressionCounter counter, - ImpressionListener listener) throws URISyntaxException { + ImpressionListener listener) { return new ImpressionsManagerImpl(config, impressionsSender, telemetryRuntimeProducer, impressionsStorageConsumer, impressionsStorageProducer, processImpressionStrategy, counter, listener); } @@ -73,7 +73,7 @@ private ImpressionsManagerImpl(SplitClientConfig config, ImpressionsStorageProducer impressionsStorageProducer, ProcessImpressionStrategy processImpressionStrategy, ImpressionCounter impressionCounter, - ImpressionListener impressionListener) throws URISyntaxException { + ImpressionListener impressionListener) { _config = checkNotNull(config); @@ -117,7 +117,7 @@ public void track(List impressions) { ImpressionsResult impressionsResult = _processImpressionStrategy.process(impressions); List impressionsForLogs = impressionsResult.getImpressionsToQueue(); - List impressionsToListener = impressionsResult.getImpressionsToQueue(); + List impressionsToListener = impressionsResult.getImpressionsToListener(); int totalImpressions = impressionsForLogs.size(); long queued = _impressionsStorageProducer.put(impressionsForLogs.stream().map(KeyImpression::fromImpression).collect(Collectors.toList())); diff --git a/client/src/test/java/io/split/client/impressions/ImpressionsManagerImplTest.java b/client/src/test/java/io/split/client/impressions/ImpressionsManagerImplTest.java index b5732a61b..f066f1d81 100644 --- a/client/src/test/java/io/split/client/impressions/ImpressionsManagerImplTest.java +++ b/client/src/test/java/io/split/client/impressions/ImpressionsManagerImplTest.java @@ -28,6 +28,7 @@ import java.net.URISyntaxException; import java.util.AbstractMap; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Optional; @@ -55,6 +56,9 @@ public void setUp() { @Captor private ArgumentCaptor> impressionsCaptor; + @Captor + private ArgumentCaptor> impressionKeyList; + @Captor private ArgumentCaptor uniqueKeysCaptor; @@ -100,7 +104,133 @@ public void works() throws URISyntaxException { } @Test - public void worksButDropsImpressions() throws URISyntaxException { + public void testImpressionListenerOptimize() { + SplitClientConfig config = SplitClientConfig.builder() + .impressionsQueueSize(10) + .endpoint("nowhere.com", "nowhere.com") + .impressionsMode(ImpressionsManager.Mode.OPTIMIZED) + .build(); + ImpressionsStorage storage = Mockito.mock(InMemoryImpressionsStorage.class); + + ImpressionsSender senderMock = Mockito.mock(ImpressionsSender.class); + ImpressionCounter impressionCounter = new ImpressionCounter(); + ImpressionObserver impressionObserver = new ImpressionObserver(200); + TelemetryStorageProducer telemetryStorageProducer = new InMemoryTelemetryStorage(); + + ProcessImpressionStrategy processImpressionStrategy = new ProcessImpressionOptimized(true, impressionObserver, impressionCounter, telemetryStorageProducer); + + ImpressionListener impressionListener = Mockito.mock(AsynchronousImpressionListener.class); + + ImpressionsManagerImpl treatmentLog = ImpressionsManagerImpl.instanceForTest(config, senderMock, TELEMETRY_STORAGE, storage, storage, processImpressionStrategy, impressionCounter, impressionListener); + treatmentLog.start(); + + KeyImpression ki1 = keyImpression("test1", "adil", "on", 1L, 1L); + KeyImpression ki2 = keyImpression("test1", "adil", "on", 1L, 1L); + KeyImpression ki3 = keyImpression("test1", "pato", "on", 3L, 2L); + KeyImpression ki4 = keyImpression("test2", "pato", "on", 4L, 3L); + + List impressionList = new ArrayList<>(); + impressionList.add(new Impression(ki1.keyName, null, ki1.feature, ki1.treatment, ki1.time, null, ki1.changeNumber, null)); + impressionList.add(new Impression(ki2.keyName, null, ki2.feature, ki2.treatment, ki2.time, null, ki2.changeNumber, null)); + impressionList.add(new Impression(ki3.keyName, null, ki3.feature, ki3.treatment, ki3.time, null, ki3.changeNumber, null)); + impressionList.add(new Impression(ki4.keyName, null, ki4.feature, ki4.treatment, ki4.time, null, ki4.changeNumber, null)); + + treatmentLog.track(impressionList); + verify(impressionListener, times(4)).log(Mockito.anyObject()); + + verify(storage).put(impressionKeyList.capture()); + + List captured = impressionKeyList.getValue(); + + Assert.assertEquals(3, captured.size()); + } + + @Test + public void testImpressionListenerDebug() { + SplitClientConfig config = SplitClientConfig.builder() + .impressionsQueueSize(6) + .endpoint("nowhere.com", "nowhere.com") + .impressionsMode(ImpressionsManager.Mode.DEBUG) + .build(); + ImpressionsStorage storage = Mockito.mock(InMemoryImpressionsStorage.class); + + ImpressionsSender senderMock = Mockito.mock(ImpressionsSender.class); + ImpressionCounter impressionCounter = Mockito.mock(ImpressionCounter.class); + ImpressionObserver impressionObserver = new ImpressionObserver(200); + + ProcessImpressionStrategy processImpressionStrategy = new ProcessImpressionDebug(true, impressionObserver); + + ImpressionListener impressionListener = Mockito.mock(AsynchronousImpressionListener.class); + + ImpressionsManagerImpl treatmentLog = ImpressionsManagerImpl.instanceForTest(config, senderMock, TELEMETRY_STORAGE, storage, storage, processImpressionStrategy, impressionCounter, impressionListener); + treatmentLog.start(); + + KeyImpression ki1 = keyImpression("test1", "adil", "on", 1L, 1L); + KeyImpression ki2 = keyImpression("test1", "adil", "on", 1L, 1L); + KeyImpression ki3 = keyImpression("test1", "pato", "on", 3L, 2L); + KeyImpression ki4 = keyImpression("test2", "pato", "on", 4L, 3L); + + List impressionList = new ArrayList<>(); + impressionList.add(new Impression(ki1.keyName, null, ki1.feature, ki1.treatment, ki1.time, null, ki1.changeNumber, null)); + impressionList.add(new Impression(ki2.keyName, null, ki2.feature, ki2.treatment, ki2.time, null, ki2.changeNumber, null)); + impressionList.add(new Impression(ki3.keyName, null, ki3.feature, ki3.treatment, ki3.time, null, ki3.changeNumber, null)); + impressionList.add(new Impression(ki4.keyName, null, ki4.feature, ki4.treatment, ki4.time, null, ki4.changeNumber, null)); + + treatmentLog.track(impressionList); + verify(impressionListener, times(4)).log(Mockito.anyObject()); + + verify(storage).put(impressionKeyList.capture()); + + List captured = impressionKeyList.getValue(); + + Assert.assertEquals(4, captured.size()); + } + + @Test + public void testImpressionListenerNone() { + SplitClientConfig config = SplitClientConfig.builder() + .impressionsQueueSize(10) + .endpoint("nowhere.com", "nowhere.com") + .impressionsMode(ImpressionsManager.Mode.NONE) + .build(); + ImpressionsStorage storage = Mockito.mock(InMemoryImpressionsStorage.class); + + ImpressionsSender senderMock = Mockito.mock(ImpressionsSender.class); + TelemetrySynchronizer telemetrySynchronizer = Mockito.mock(TelemetryInMemorySubmitter.class); + ImpressionCounter impressionCounter = new ImpressionCounter(); + UniqueKeysTracker uniqueKeysTracker = new UniqueKeysTrackerImp(telemetrySynchronizer, 1000, 1000, null); + uniqueKeysTracker.start(); + + ProcessImpressionStrategy processImpressionStrategy = new ProcessImpressionNone(true, uniqueKeysTracker, impressionCounter); + + ImpressionListener impressionListener = Mockito.mock(AsynchronousImpressionListener.class); + + ImpressionsManagerImpl treatmentLog = ImpressionsManagerImpl.instanceForTest(config, senderMock, TELEMETRY_STORAGE, storage, storage, processImpressionStrategy, impressionCounter, impressionListener); + treatmentLog.start(); + + KeyImpression ki1 = keyImpression("test1", "adil", "on", 1L, 1L); + KeyImpression ki2 = keyImpression("test1", "adil", "on", 1L, 1L); + KeyImpression ki3 = keyImpression("test1", "pato", "on", 3L, 2L); + KeyImpression ki4 = keyImpression("test2", "pato", "on", 4L, 3L); + + List impressionList = new ArrayList<>(); + impressionList.add(new Impression(ki1.keyName, null, ki1.feature, ki1.treatment, ki1.time, null, ki1.changeNumber, null)); + impressionList.add(new Impression(ki2.keyName, null, ki2.feature, ki2.treatment, ki2.time, null, ki2.changeNumber, null)); + impressionList.add(new Impression(ki3.keyName, null, ki3.feature, ki3.treatment, ki3.time, null, ki3.changeNumber, null)); + impressionList.add(new Impression(ki4.keyName, null, ki4.feature, ki4.treatment, ki4.time, null, ki4.changeNumber, null)); + + treatmentLog.track(impressionList); + verify(impressionListener, times(4)).log(Mockito.anyObject()); + + verify(storage).put(impressionKeyList.capture()); + + List captured = impressionKeyList.getValue(); + + Assert.assertEquals(0, captured.size()); + } + + @Test + public void worksButDropsImpressions() { SplitClientConfig config = SplitClientConfig.builder() .impressionsQueueSize(3) @@ -141,7 +271,7 @@ public void worksButDropsImpressions() throws URISyntaxException { } @Test - public void works4ImpressionsInOneTest() throws URISyntaxException { + public void works4ImpressionsInOneTest() { SplitClientConfig config = SplitClientConfig.builder() .impressionsQueueSize(10) @@ -184,7 +314,7 @@ public void works4ImpressionsInOneTest() throws URISyntaxException { } @Test - public void worksNoImpressions() throws URISyntaxException { + public void worksNoImpressions() { SplitClientConfig config = SplitClientConfig.builder() .impressionsQueueSize(10) @@ -210,7 +340,7 @@ public void worksNoImpressions() throws URISyntaxException { } @Test - public void alreadySeenImpressionsAreMarked() throws URISyntaxException { + public void alreadySeenImpressionsAreMarked() { SplitClientConfig config = SplitClientConfig.builder() .impressionsQueueSize(10) .endpoint("nowhere.com", "nowhere.com") @@ -266,7 +396,7 @@ public void alreadySeenImpressionsAreMarked() throws URISyntaxException { } @Test - public void testImpressionsStandaloneModeOptimizedMode() throws URISyntaxException { + public void testImpressionsStandaloneModeOptimizedMode() { SplitClientConfig config = SplitClientConfig.builder() .impressionsQueueSize(10) .endpoint("nowhere.com", "nowhere.com") @@ -322,7 +452,7 @@ public void testImpressionsStandaloneModeOptimizedMode() throws URISyntaxExcepti } @Test - public void testImpressionsStandaloneModeDebugMode() throws URISyntaxException { + public void testImpressionsStandaloneModeDebugMode() { SplitClientConfig config = SplitClientConfig.builder() .impressionsQueueSize(10) .endpoint("nowhere.com", "nowhere.com") @@ -370,7 +500,7 @@ public void testImpressionsStandaloneModeDebugMode() throws URISyntaxException { } @Test - public void testImpressionsStandaloneModeNoneMode() throws URISyntaxException { + public void testImpressionsStandaloneModeNoneMode() { SplitClientConfig config = SplitClientConfig.builder() .impressionsQueueSize(10) .endpoint("nowhere.com", "nowhere.com") @@ -426,7 +556,7 @@ public void testImpressionsStandaloneModeNoneMode() throws URISyntaxException { } @Test - public void testImpressionsConsumerModeOptimizedMode() throws URISyntaxException { + public void testImpressionsConsumerModeOptimizedMode() { SplitClientConfig config = SplitClientConfig.builder() .impressionsQueueSize(10) .endpoint("nowhere.com", "nowhere.com") @@ -483,7 +613,7 @@ public void testImpressionsConsumerModeOptimizedMode() throws URISyntaxException } @Test - public void testImpressionsConsumerModeNoneMode() throws URISyntaxException { + public void testImpressionsConsumerModeNoneMode() { SplitClientConfig config = SplitClientConfig.builder() .impressionsQueueSize(10) .endpoint("nowhere.com", "nowhere.com") @@ -540,7 +670,7 @@ public void testImpressionsConsumerModeNoneMode() throws URISyntaxException { } @Test - public void testImpressionsConsumerModeDebugMode() throws URISyntaxException { + public void testImpressionsConsumerModeDebugMode() { SplitClientConfig config = SplitClientConfig.builder() .impressionsQueueSize(10) .endpoint("nowhere.com", "nowhere.com") @@ -590,7 +720,7 @@ public void testImpressionsConsumerModeDebugMode() throws URISyntaxException { } @Test - public void testCounterStandaloneModeOptimizedMode() throws URISyntaxException { + public void testCounterStandaloneModeOptimizedMode() { SplitClientConfig config = SplitClientConfig.builder() .impressionsQueueSize(10) .endpoint("nowhere.com", "nowhere.com") @@ -609,7 +739,7 @@ public void testCounterStandaloneModeOptimizedMode() throws URISyntaxException { Assert.assertNotNull(manager.getCounter()); } @Test - public void testCounterStandaloneModeDebugMode() throws URISyntaxException { + public void testCounterStandaloneModeDebugMode() { SplitClientConfig config = SplitClientConfig.builder() .impressionsQueueSize(10) .endpoint("nowhere.com", "nowhere.com") @@ -627,7 +757,7 @@ public void testCounterStandaloneModeDebugMode() throws URISyntaxException { } @Test - public void testCounterStandaloneModeNoseMode() throws URISyntaxException { + public void testCounterStandaloneModeNoneMode() { SplitClientConfig config = SplitClientConfig.builder() .impressionsQueueSize(10) .endpoint("nowhere.com", "nowhere.com") @@ -645,7 +775,7 @@ public void testCounterStandaloneModeNoseMode() throws URISyntaxException { } @Test - public void testCounterConsumerModeOptimizedMode() throws URISyntaxException { + public void testCounterConsumerModeOptimizedMode() { SplitClientConfig config = SplitClientConfig.builder() .impressionsQueueSize(10) .endpoint("nowhere.com", "nowhere.com") @@ -665,7 +795,7 @@ public void testCounterConsumerModeOptimizedMode() throws URISyntaxException { } @Test - public void testCounterConsumerModeDebugMode() throws URISyntaxException { + public void testCounterConsumerModeDebugMode() { SplitClientConfig config = SplitClientConfig.builder() .impressionsQueueSize(10) .endpoint("nowhere.com", "nowhere.com") @@ -684,7 +814,7 @@ public void testCounterConsumerModeDebugMode() throws URISyntaxException { } @Test - public void testCounterConsumerModeNoneMode() throws URISyntaxException { + public void testCounterConsumerModeNoneMode() { SplitClientConfig config = SplitClientConfig.builder() .impressionsQueueSize(10) .endpoint("nowhere.com", "nowhere.com")