From f2318da6b3b1e756103f93641bbb6adf23f5dd8d Mon Sep 17 00:00:00 2001 From: Nadia Mayor Date: Fri, 15 Sep 2023 18:45:15 -0300 Subject: [PATCH 1/4] [SDKS-7521] Add falgSet logic in SplitFetcherImp --- .../client/interceptors/FlagSetsFilter.java | 9 +++++ .../interceptors/FlagSetsFilterImpl.java | 40 +++++++++++++++++++ .../client/utils/FeatureFlagProcessor.java | 9 ++++- .../split/engine/common/PushManagerImp.java | 7 +++- .../split/engine/common/SyncManagerImp.java | 3 +- .../engine/experiments/SplitFetcherImp.java | 4 +- .../sse/workers/FeatureFlagWorkerImp.java | 8 +++- .../interceptors/FlagSetsFilterImplTest.java | 26 ++++++++++++ .../utils/FeatureFlagProcessorTest.java | 3 +- .../sse/workers/FeatureFlagWorkerImpTest.java | 8 ++-- .../engine/sse/workers/SplitsWorkerTest.java | 9 +++-- 11 files changed, 111 insertions(+), 15 deletions(-) create mode 100644 client/src/main/java/io/split/client/interceptors/FlagSetsFilter.java create mode 100644 client/src/main/java/io/split/client/interceptors/FlagSetsFilterImpl.java create mode 100644 client/src/test/java/io/split/client/interceptors/FlagSetsFilterImplTest.java diff --git a/client/src/main/java/io/split/client/interceptors/FlagSetsFilter.java b/client/src/main/java/io/split/client/interceptors/FlagSetsFilter.java new file mode 100644 index 000000000..ed16f761e --- /dev/null +++ b/client/src/main/java/io/split/client/interceptors/FlagSetsFilter.java @@ -0,0 +1,9 @@ +package io.split.client.interceptors; + +import java.util.HashSet; + +public interface FlagSetsFilter { + + boolean Intersect(HashSet sets); + boolean Intersect(String set); +} \ No newline at end of file diff --git a/client/src/main/java/io/split/client/interceptors/FlagSetsFilterImpl.java b/client/src/main/java/io/split/client/interceptors/FlagSetsFilterImpl.java new file mode 100644 index 000000000..48565f186 --- /dev/null +++ b/client/src/main/java/io/split/client/interceptors/FlagSetsFilterImpl.java @@ -0,0 +1,40 @@ +package io.split.client.interceptors; + +import java.util.HashSet; + +public class FlagSetsFilterImpl implements FlagSetsFilter { + + private final HashSet _flagSets; + private final boolean _shouldFilter; + + public FlagSetsFilterImpl(HashSet flagSets) { + _shouldFilter = !flagSets.isEmpty(); + _flagSets = flagSets; + } + @Override + public boolean Intersect(HashSet sets) { + if (!_shouldFilter) { + return true; + } + if (sets == null || sets.isEmpty()) { + return false; + } + for (String set: sets) { + if (_flagSets.contains(set)) { + return true; + } + } + return false; + } + + @Override + public boolean Intersect(String set) { + if (!_shouldFilter) { + return true; + } + if (set.isEmpty()){ + return false; + } + return _flagSets.contains(set); + } +} \ No newline at end of file diff --git a/client/src/main/java/io/split/client/utils/FeatureFlagProcessor.java b/client/src/main/java/io/split/client/utils/FeatureFlagProcessor.java index 2234f0a20..f17d328e9 100644 --- a/client/src/main/java/io/split/client/utils/FeatureFlagProcessor.java +++ b/client/src/main/java/io/split/client/utils/FeatureFlagProcessor.java @@ -2,6 +2,8 @@ import io.split.client.dtos.Split; import io.split.client.dtos.Status; +import io.split.client.interceptors.FlagSetsFilter; +import io.split.client.interceptors.FlagSetsFilterImpl; import io.split.engine.experiments.ParsedSplit; import io.split.engine.experiments.SplitParser; import org.slf4j.Logger; @@ -15,16 +17,21 @@ public class FeatureFlagProcessor { private static final Logger _log = LoggerFactory.getLogger(FeatureFlagProcessor.class); - public static FeatureFlagsToUpdate processFeatureFlagChanges(SplitParser splitParser, List splits) { + public static FeatureFlagsToUpdate processFeatureFlagChanges(SplitParser splitParser, List splits, HashSet configSets) { List toAdd = new ArrayList<>(); List toRemove = new ArrayList<>(); Set segments = new HashSet<>(); + FlagSetsFilter flagSetsFilter = new FlagSetsFilterImpl(configSets); for (Split split : splits) { if (split.status != Status.ACTIVE) { // archive. toRemove.add(split.name); continue; } + if (!flagSetsFilter.Intersect(split.sets)) { + toRemove.add(split.name); + continue; + } ParsedSplit parsedSplit = splitParser.parse(split); if (parsedSplit == null) { _log.debug(String.format("We could not parse the feature flag definition for: %s", split.name)); diff --git a/client/src/main/java/io/split/engine/common/PushManagerImp.java b/client/src/main/java/io/split/engine/common/PushManagerImp.java index 42343b9b4..86a32e9ea 100644 --- a/client/src/main/java/io/split/engine/common/PushManagerImp.java +++ b/client/src/main/java/io/split/engine/common/PushManagerImp.java @@ -23,6 +23,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.HashSet; import java.util.concurrent.Future; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ScheduledExecutorService; @@ -74,8 +75,10 @@ public static PushManagerImp build(Synchronizer synchronizer, TelemetryRuntimeProducer telemetryRuntimeProducer, ThreadFactory threadFactory, SplitParser splitParser, - SplitCacheProducer splitCacheProducer) { - FeatureFlagsWorker featureFlagsWorker = new FeatureFlagWorkerImp(synchronizer, splitParser, splitCacheProducer, telemetryRuntimeProducer); + SplitCacheProducer splitCacheProducer, + HashSet flagSets) { + FeatureFlagsWorker featureFlagsWorker = new FeatureFlagWorkerImp(synchronizer, splitParser, splitCacheProducer, + telemetryRuntimeProducer, flagSets); Worker segmentWorker = new SegmentsWorkerImp(synchronizer); PushStatusTracker pushStatusTracker = new PushStatusTrackerImp(statusMessages, telemetryRuntimeProducer); return new PushManagerImp(new AuthApiClientImp(authUrl, splitAPI.getHttpClient(), telemetryRuntimeProducer), diff --git a/client/src/main/java/io/split/engine/common/SyncManagerImp.java b/client/src/main/java/io/split/engine/common/SyncManagerImp.java index 97b2c7474..5482650ce 100644 --- a/client/src/main/java/io/split/engine/common/SyncManagerImp.java +++ b/client/src/main/java/io/split/engine/common/SyncManagerImp.java @@ -106,7 +106,8 @@ public static SyncManagerImp build(SplitTasks splitTasks, telemetryRuntimeProducer, config.getThreadFactory(), splitParser, - splitCacheProducer); + splitCacheProducer, + config.getSetsFilter()); return new SyncManagerImp(splitTasks, config.streamingEnabled(), diff --git a/client/src/main/java/io/split/engine/experiments/SplitFetcherImp.java b/client/src/main/java/io/split/engine/experiments/SplitFetcherImp.java index de8808a0c..2eb37b78d 100644 --- a/client/src/main/java/io/split/engine/experiments/SplitFetcherImp.java +++ b/client/src/main/java/io/split/engine/experiments/SplitFetcherImp.java @@ -10,6 +10,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.Arrays; import java.util.HashSet; import java.util.Set; @@ -118,7 +119,8 @@ private Set runWithoutExceptionHandling(FetchOptions options) throws Int // some other thread may have updated the shared state. exit return segments; } - FeatureFlagsToUpdate featureFlagsToUpdate = processFeatureFlagChanges(_parser, change.splits); + FeatureFlagsToUpdate featureFlagsToUpdate = processFeatureFlagChanges(_parser, change.splits, !options.flagSetsFilter().isEmpty() ? + new HashSet<>(Arrays.asList(options.flagSetsFilter().split(","))): new HashSet<>()); segments = featureFlagsToUpdate.getSegments(); _splitCacheProducer.update(featureFlagsToUpdate.getToAdd(), featureFlagsToUpdate.getToRemove(), change.till); _telemetryRuntimeProducer.recordSuccessfulSync(LastSynchronizationRecordsEnum.SPLITS, System.currentTimeMillis()); diff --git a/client/src/main/java/io/split/engine/sse/workers/FeatureFlagWorkerImp.java b/client/src/main/java/io/split/engine/sse/workers/FeatureFlagWorkerImp.java index 938963cec..caf8d04e3 100644 --- a/client/src/main/java/io/split/engine/sse/workers/FeatureFlagWorkerImp.java +++ b/client/src/main/java/io/split/engine/sse/workers/FeatureFlagWorkerImp.java @@ -13,6 +13,7 @@ import org.slf4j.LoggerFactory; import java.util.Collections; +import java.util.HashSet; import java.util.Set; import static com.google.common.base.Preconditions.checkNotNull; @@ -24,14 +25,16 @@ public class FeatureFlagWorkerImp extends Worker private final SplitParser _splitParser; private final SplitCacheProducer _splitCacheProducer; private final TelemetryRuntimeProducer _telemetryRuntimeProducer; + private final HashSet _flagSets; public FeatureFlagWorkerImp(Synchronizer synchronizer, SplitParser splitParser, SplitCacheProducer splitCacheProducer, - TelemetryRuntimeProducer telemetryRuntimeProducer) { + TelemetryRuntimeProducer telemetryRuntimeProducer, HashSet flagSets) { super("Feature flags"); _synchronizer = checkNotNull(synchronizer); _splitParser = splitParser; _splitCacheProducer = splitCacheProducer; _telemetryRuntimeProducer = telemetryRuntimeProducer; + _flagSets = flagSets; } @Override @@ -61,7 +64,8 @@ private boolean addOrUpdateFeatureFlag(FeatureFlagChangeNotification featureFlag if (featureFlagChangeNotification.getFeatureFlagDefinition() != null && featureFlagChangeNotification.getPreviousChangeNumber() == _splitCacheProducer.getChangeNumber()) { Split featureFlag = featureFlagChangeNotification.getFeatureFlagDefinition(); - FeatureFlagsToUpdate featureFlagsToUpdate = processFeatureFlagChanges(_splitParser, Collections.singletonList(featureFlag)); + FeatureFlagsToUpdate featureFlagsToUpdate = processFeatureFlagChanges(_splitParser, Collections.singletonList(featureFlag), + _flagSets); _splitCacheProducer.update(featureFlagsToUpdate.getToAdd(), featureFlagsToUpdate.getToRemove(), featureFlagChangeNotification.getChangeNumber()); Set segments = featureFlagsToUpdate.getSegments(); diff --git a/client/src/test/java/io/split/client/interceptors/FlagSetsFilterImplTest.java b/client/src/test/java/io/split/client/interceptors/FlagSetsFilterImplTest.java new file mode 100644 index 000000000..c9f4b384d --- /dev/null +++ b/client/src/test/java/io/split/client/interceptors/FlagSetsFilterImplTest.java @@ -0,0 +1,26 @@ +package io.split.client.interceptors; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.Arrays; +import java.util.HashSet; + +public class FlagSetsFilterImplTest { + + @Test + public void testIntersectSetsWithShouldFilter() { + FlagSetsFilter flagSetsFilter = new FlagSetsFilterImpl(new HashSet<>(Arrays.asList("a", "b"))); + Assert.assertTrue(flagSetsFilter.Intersect("a")); + Assert.assertTrue(flagSetsFilter.Intersect(new HashSet<>(Arrays.asList("a", "c")))); + Assert.assertFalse(flagSetsFilter.Intersect("c")); + Assert.assertFalse(flagSetsFilter.Intersect(new HashSet<>(Arrays.asList("d", "c")))); + } + + @Test + public void testIntersectSetsWithShouldNotFilter() { + FlagSetsFilter flagSetsFilter = new FlagSetsFilterImpl(new HashSet<>()); + Assert.assertTrue(flagSetsFilter.Intersect("a")); + Assert.assertTrue(flagSetsFilter.Intersect(new HashSet<>(Arrays.asList("a", "c")))); + } +} \ No newline at end of file diff --git a/client/src/test/java/io/split/client/utils/FeatureFlagProcessorTest.java b/client/src/test/java/io/split/client/utils/FeatureFlagProcessorTest.java index 5c81d12bf..b19ef809e 100644 --- a/client/src/test/java/io/split/client/utils/FeatureFlagProcessorTest.java +++ b/client/src/test/java/io/split/client/utils/FeatureFlagProcessorTest.java @@ -6,6 +6,7 @@ import org.junit.Test; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import static io.split.client.utils.FeatureFlagProcessor.processFeatureFlagChanges; @@ -25,7 +26,7 @@ public void testProcessFeatureFlagChanges() { featureFlags.add(featureFlagTest1); featureFlags.add(featureFlagTest2); - FeatureFlagsToUpdate featureFlagsToUpdate = processFeatureFlagChanges(splitParser, featureFlags); + FeatureFlagsToUpdate featureFlagsToUpdate = processFeatureFlagChanges(splitParser, featureFlags, new HashSet<>()); Assert.assertEquals(1, featureFlagsToUpdate.toAdd.size()); Assert.assertEquals(1, featureFlagsToUpdate.toRemove.size()); diff --git a/client/src/test/java/io/split/engine/sse/workers/FeatureFlagWorkerImpTest.java b/client/src/test/java/io/split/engine/sse/workers/FeatureFlagWorkerImpTest.java index 09dd66b38..c66233efd 100644 --- a/client/src/test/java/io/split/engine/sse/workers/FeatureFlagWorkerImpTest.java +++ b/client/src/test/java/io/split/engine/sse/workers/FeatureFlagWorkerImpTest.java @@ -16,6 +16,8 @@ import org.junit.Test; import org.mockito.Mockito; +import java.util.HashSet; + public class FeatureFlagWorkerImpTest { @Test @@ -24,7 +26,7 @@ public void testRefreshSplitsWithCorrectFF() { Synchronizer synchronizer = Mockito.mock(SynchronizerImp.class); SplitCacheProducer splitCacheProducer = Mockito.mock(SplitCacheProducer.class); TelemetryStorage telemetryRuntimeProducer = new InMemoryTelemetryStorage(); - FeatureFlagWorkerImp featureFlagsWorker = new FeatureFlagWorkerImp(synchronizer, splitParser, splitCacheProducer, telemetryRuntimeProducer); + FeatureFlagWorkerImp featureFlagsWorker = new FeatureFlagWorkerImp(synchronizer, splitParser, splitCacheProducer, telemetryRuntimeProducer, new HashSet<>()); String notification = "{\"id\":\"vQQ61wzBRO:0:0\",\"clientId\":\"pri:MTUxNzg3MDg1OQ==\",\"timestamp\":1684265694676,\"encoding\":\"json\",\"channel\":\"NzM2MDI5Mzc0_MjkyNTIzNjczMw==_splits\",\"data\":\"{\\\"type\\\":\\\"SPLIT_UPDATE\\\",\\\"changeNumber\\\":1684265694505,\\\"pcn\\\":0,\\\"c\\\":2,\\\"d\\\":\\\"eJzMk99u2kwQxV8lOtdryQZj8N6hD5QPlThSTVNVEUKDPYZt1jZar1OlyO9emf8lVFWv2ss5zJyd82O8hTWUZSqZvW04opwhUVdsIKBSSKR+10vS1HWW7pIdz2NyBjRwHS8IXEopTLgbQqDYT+ZUm3LxlV4J4mg81LpMyKqygPRc94YeM6eQTtjphp4fegLVXvD6Qdjt9wPXF6gs2bqCxPC/2eRpDIEXpXXblpGuWCDljGptZ4bJ5lxYSJRZBoFkTcWKozpfsoH0goHfCXpB6PfcngDpVQnZEUjKIlOr2uwWqiC3zU5L1aF+3p7LFhUkPv8/mY2nk3gGgZxssmZzb8p6A9n25ktVtA9iGI3ODXunQ3HDp+AVWT6F+rZWlrWq7MN+YkSWWvuTDvkMSnNV7J6oTdl6qKTEvGnmjcCGjL2IYC/ovPYgUKnvvPtbmrmApiVryLM7p2jE++AfH6fTx09/HvuF32LWnNjStM0Xh3c8ukZcsZlEi3h8/zCObsBpJ0acqYLTmFdtqitK1V6NzrfpdPBbLmVx4uK26e27izpDu/r5yf/16AXun2Cr4u6w591xw7+LfDidLj6Mv8TXwP8xbofv/c7UmtHMmx8BAAD//0fclvU=\\\"}\"}"; RawMessageNotification rawMessageNotification = Json.fromJson(notification, RawMessageNotification.class); GenericNotificationData genericNotificationData = Json.fromJson(rawMessageNotification.getData(), GenericNotificationData.class); @@ -42,7 +44,7 @@ public void testRefreshSplitsWithEmptyData() { Synchronizer synchronizer = Mockito.mock(SynchronizerImp.class); SplitCacheProducer splitCacheProducer = Mockito.mock(SplitCacheProducer.class); TelemetryStorage telemetryRuntimeProducer = new InMemoryTelemetryStorage(); - FeatureFlagWorkerImp featureFlagsWorker = new FeatureFlagWorkerImp(synchronizer, splitParser, splitCacheProducer, telemetryRuntimeProducer); + FeatureFlagWorkerImp featureFlagsWorker = new FeatureFlagWorkerImp(synchronizer, splitParser, splitCacheProducer, telemetryRuntimeProducer, new HashSet<>()); String notification = "{\"id\":\"vQQ61wzBRO:0:0\",\"clientId\":\"pri:MTUxNzg3MDg1OQ==\",\"timestamp\":1684265694676,\"encoding\":\"json\",\"channel\":\"NzM2MDI5Mzc0_MjkyNTIzNjczMw==_splits\",\"data\":\"{\\\"type\\\":\\\"SPLIT_UPDATE\\\",\\\"changeNumber\\\":1684265694505}\"}"; RawMessageNotification rawMessageNotification = Json.fromJson(notification, RawMessageNotification.class); GenericNotificationData genericNotificationData = Json.fromJson(rawMessageNotification.getData(), GenericNotificationData.class); @@ -60,7 +62,7 @@ public void testRefreshSplitsArchiveFF() { Synchronizer synchronizer = Mockito.mock(SynchronizerImp.class); SplitCacheProducer splitCacheProducer = new InMemoryCacheImp(1686165614090L); TelemetryStorage telemetryRuntimeProducer = new InMemoryTelemetryStorage(); - FeatureFlagWorkerImp featureFlagsWorker = new FeatureFlagWorkerImp(synchronizer, splitParser, splitCacheProducer, telemetryRuntimeProducer); + FeatureFlagWorkerImp featureFlagsWorker = new FeatureFlagWorkerImp(synchronizer, splitParser, splitCacheProducer, telemetryRuntimeProducer, new HashSet<>()); String notification = "{\"id\":\"vQQ61wzBRO:0:0\",\"clientId\":\"pri:MTUxNzg3MDg1OQ==\",\"timestamp\":1684265694676,\"encoding\":\"json\",\"channel\":\"NzM2MDI5Mzc0_MjkyNTIzNjczMw==_splits\",\"data\":\"{\\\"type\\\":\\\"SPLIT_UPDATE\\\",\\\"changeNumber\\\":1686165617166,\\\"pcn\\\":1686165614090,\\\"c\\\":2,\\\"d\\\":\\\"eJxsUdFu4jAQ/JVqnx3JDjTh/JZCrj2JBh0EqtOBIuNswKqTIMeuxKH8+ykhiKrqiyXvzM7O7lzAGlEUSqbnEyaiRODgGjRAQOXAIQ/puPB96tHHIPQYQ/QmFNErxEgG44DKnI2AQHXtTOI0my6WcXZAmxoUtsTKvil7nNZVoQ5RYdFERh7VBwK5TY60rqWwqq6AM0q/qa8Qc+As/EHZ5HHMCDR9wQ/9kIajcEygscK6BjhEy+nLr008AwLvSuuOVgjdIIEcC+H03RZw2Hg/n88JEJBHUR0wceUeDXAWTAIWPAYsZEFAQOhDDdwnIPslnOk9NcAvNwEOly3IWtdmC3wLe+1wCy0Q2Hh/zNvTV9xg3sFtr5irQe3v5f7twgAOy8V8vlinQKAUVh7RPJvanbrBsi73qurMQpTM7oSrzjueV6hR2tp05E8J39MV1hq1d7YrWWxsZ2cQGYjzeLXK0pcoyRbLLP69juZZuuiyxoPo2oa7ukqYc+JKNEq+XgVmwopucC6sGMSS9etTvAQCH0I7BO7Ttt21BE7C2E8XsN+l06h/CJy25CveH/eGM0rbHQEt9qiHnR62jtKR7N/8wafQ7tr/AQAA//8S4fPB\\\"}\"}"; RawMessageNotification rawMessageNotification = Json.fromJson(notification, RawMessageNotification.class); GenericNotificationData genericNotificationData = Json.fromJson(rawMessageNotification.getData(), GenericNotificationData.class); diff --git a/client/src/test/java/io/split/engine/sse/workers/SplitsWorkerTest.java b/client/src/test/java/io/split/engine/sse/workers/SplitsWorkerTest.java index d8a6811a5..78a30e43d 100644 --- a/client/src/test/java/io/split/engine/sse/workers/SplitsWorkerTest.java +++ b/client/src/test/java/io/split/engine/sse/workers/SplitsWorkerTest.java @@ -12,6 +12,7 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mockito; +import java.util.HashSet; import java.util.List; import static org.hamcrest.MatcherAssert.assertThat; @@ -26,7 +27,7 @@ public void addToQueueWithoutElementsWShouldNotTriggerFetch() throws Interrupted SplitCacheProducer splitCacheProducer = Mockito.mock(SplitCacheProducer.class); TelemetryRuntimeProducer telemetryRuntimeProducer = Mockito.mock(InMemoryTelemetryStorage.class); - FeatureFlagsWorker featureFlagsWorker = new FeatureFlagWorkerImp(splitFetcherMock, splitParser, splitCacheProducer, telemetryRuntimeProducer); + FeatureFlagsWorker featureFlagsWorker = new FeatureFlagWorkerImp(splitFetcherMock, splitParser, splitCacheProducer, telemetryRuntimeProducer, new HashSet<>()); featureFlagsWorker.start(); Thread.sleep(500); @@ -41,7 +42,7 @@ public void addToQueueWithElementsWShouldTriggerFetch() throws InterruptedExcept SplitCacheProducer splitCacheProducer = Mockito.mock(SplitCacheProducer.class); TelemetryRuntimeProducer telemetryRuntimeProducer = Mockito.mock(InMemoryTelemetryStorage.class); - FeatureFlagsWorker featureFlagsWorker = new FeatureFlagWorkerImp(syncMock, splitParser, splitCacheProducer, telemetryRuntimeProducer); + FeatureFlagsWorker featureFlagsWorker = new FeatureFlagWorkerImp(syncMock, splitParser, splitCacheProducer, telemetryRuntimeProducer, new HashSet<>()); featureFlagsWorker.start(); ArgumentCaptor cnCaptor = ArgumentCaptor.forClass(Long.class); @@ -76,7 +77,7 @@ public void killShouldTriggerFetch() { SplitParser splitParser = new SplitParser(); SplitCacheProducer splitCacheProducer = Mockito.mock(SplitCacheProducer.class); TelemetryRuntimeProducer telemetryRuntimeProducer = Mockito.mock(InMemoryTelemetryStorage.class); - FeatureFlagsWorker featureFlagsWorker = new FeatureFlagWorkerImp(syncMock, splitParser, splitCacheProducer, telemetryRuntimeProducer) { + FeatureFlagsWorker featureFlagsWorker = new FeatureFlagWorkerImp(syncMock, splitParser, splitCacheProducer, telemetryRuntimeProducer, new HashSet<>()) { }; featureFlagsWorker.start(); SplitKillNotification splitKillNotification = new SplitKillNotification(GenericNotificationData.builder() @@ -96,7 +97,7 @@ public void messagesNotProcessedWhenWorkerStopped() throws InterruptedException SplitParser splitParser = new SplitParser(); SplitCacheProducer splitCacheProducer = Mockito.mock(SplitCacheProducer.class); TelemetryRuntimeProducer telemetryRuntimeProducer = Mockito.mock(InMemoryTelemetryStorage.class); - FeatureFlagsWorker featureFlagsWorker = new FeatureFlagWorkerImp(syncMock, splitParser, splitCacheProducer, telemetryRuntimeProducer); + FeatureFlagsWorker featureFlagsWorker = new FeatureFlagWorkerImp(syncMock, splitParser, splitCacheProducer, telemetryRuntimeProducer, new HashSet<>()); featureFlagsWorker.start(); featureFlagsWorker.addToQueue(new FeatureFlagChangeNotification(GenericNotificationData.builder() .changeNumber(1585956698457L) From 0e14798a6f3077c7a16506ea1638ba50e699fc35 Mon Sep 17 00:00:00 2001 From: Nadia Mayor Date: Mon, 18 Sep 2023 11:04:52 -0300 Subject: [PATCH 2/4] [SDKS-7521] Add test case for FeatureFlagProcessor --- .../utils/FeatureFlagProcessorTest.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/client/src/test/java/io/split/client/utils/FeatureFlagProcessorTest.java b/client/src/test/java/io/split/client/utils/FeatureFlagProcessorTest.java index b19ef809e..6ce470534 100644 --- a/client/src/test/java/io/split/client/utils/FeatureFlagProcessorTest.java +++ b/client/src/test/java/io/split/client/utils/FeatureFlagProcessorTest.java @@ -6,6 +6,7 @@ import org.junit.Test; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashSet; import java.util.List; @@ -32,4 +33,44 @@ public void testProcessFeatureFlagChanges() { Assert.assertEquals(1, featureFlagsToUpdate.toRemove.size()); Assert.assertEquals(1, featureFlagsToUpdate.segments.size()); } + + @Test + public void testProcessFeatureFlagChangesWithSetsToAdd() { + SplitParser splitParser = new SplitParser(); + List featureFlags = new ArrayList<>(); + + String definition1 = "{\"trafficTypeName\":\"user\",\"id\":\"d431cdd0-b0be-11ea-8a80-1660ada9ce39\",\"name\":\"mauro_java\",\"trafficAllocation\":100,\"trafficAllocationSeed\":-92391491,\"seed\":-1769377604,\"status\":\"ACTIVE\",\"killed\":false,\"defaultTreatment\":\"off\",\"changeNumber\":1684329854385,\"algo\":2,\"configurations\":{},\"sets\":[\"set_1\",\"set_2\"],\"conditions\":[{\"conditionType\":\"WHITELIST\",\"matcherGroup\":{\"combiner\":\"AND\",\"matchers\":[{\"matcherType\":\"WHITELIST\",\"negate\":false,\"whitelistMatcherData\":{\"whitelist\":[\"admin\",\"mauro\",\"nico\"]}}]},\"partitions\":[{\"treatment\":\"off\",\"size\":100}],\"label\":\"whitelisted\"},{\"conditionType\":\"ROLLOUT\",\"matcherGroup\":{\"combiner\":\"AND\",\"matchers\":[{\"keySelector\":{\"trafficType\":\"user\"},\"matcherType\":\"IN_SEGMENT\",\"negate\":false,\"userDefinedSegmentMatcherData\":{\"segmentName\":\"maur-2\"}}]},\"partitions\":[{\"treatment\":\"on\",\"size\":0},{\"treatment\":\"off\",\"size\":100},{\"treatment\":\"V4\",\"size\":0},{\"treatment\":\"v5\",\"size\":0}],\"label\":\"in segment maur-2\"},{\"conditionType\":\"ROLLOUT\",\"matcherGroup\":{\"combiner\":\"AND\",\"matchers\":[{\"keySelector\":{\"trafficType\":\"user\"},\"matcherType\":\"ALL_KEYS\",\"negate\":false}]},\"partitions\":[{\"treatment\":\"on\",\"size\":0},{\"treatment\":\"off\",\"size\":100},{\"treatment\":\"V4\",\"size\":0},{\"treatment\":\"v5\",\"size\":0}],\"label\":\"default rule\"}]}"; + Split featureFlagTest1 = Json.fromJson(definition1, Split.class); + + String definition2 = "{\"trafficTypeName\":\"user\",\"id\":\"d704f220-0567-11ee-80ee-fa3c6460cd13\",\"name\":\"NET_CORE_getTreatmentWithConfigAfterArchive\",\"trafficAllocation\":100,\"trafficAllocationSeed\":179018541,\"seed\":272707374,\"status\":\"ARCHIVED\",\"killed\":false,\"defaultTreatment\":\"V-FGyN\",\"changeNumber\":1686165617166,\"algo\":2,\"configurations\":{\"V-FGyN\":\"{\\\"color\\\":\\\"blue\\\"}\",\"V-YrWB\":\"{\\\"color\\\":\\\"red\\\"}\"},\"conditions\":[{\"conditionType\":\"ROLLOUT\",\"matcherGroup\":{\"combiner\":\"AND\",\"matchers\":[{\"keySelector\":{\"trafficType\":\"user\",\"attribute\":\"test\"},\"matcherType\":\"LESS_THAN_OR_EQUAL_TO\",\"negate\":false,\"unaryNumericMatcherData\":{\"dataType\":\"NUMBER\",\"value\":20}}]},\"partitions\":[{\"treatment\":\"V-FGyN\",\"size\":0},{\"treatment\":\"V-YrWB\",\"size\":100}],\"label\":\"test \\u003c\\u003d 20\"}]}"; + Split featureFlagTest2 = Json.fromJson(definition2, Split.class); + + featureFlags.add(featureFlagTest1); + featureFlags.add(featureFlagTest2); + FeatureFlagsToUpdate featureFlagsToUpdate = processFeatureFlagChanges(splitParser, featureFlags, new HashSet<>(Arrays.asList("set_1"))); + + Assert.assertEquals(1, featureFlagsToUpdate.toAdd.size()); + Assert.assertEquals(1, featureFlagsToUpdate.toRemove.size()); + Assert.assertEquals(1, featureFlagsToUpdate.segments.size()); + } + + @Test + public void testProcessFeatureFlagChangesWithSetsToRemove() { + SplitParser splitParser = new SplitParser(); + List featureFlags = new ArrayList<>(); + + String definition1 = "{\"trafficTypeName\":\"user\",\"id\":\"d431cdd0-b0be-11ea-8a80-1660ada9ce39\",\"name\":\"mauro_java\",\"trafficAllocation\":100,\"trafficAllocationSeed\":-92391491,\"seed\":-1769377604,\"status\":\"ACTIVE\",\"killed\":false,\"defaultTreatment\":\"off\",\"changeNumber\":1684329854385,\"algo\":2,\"configurations\":{},\"sets\":[\"set_1\",\"set_2\"],\"conditions\":[{\"conditionType\":\"WHITELIST\",\"matcherGroup\":{\"combiner\":\"AND\",\"matchers\":[{\"matcherType\":\"WHITELIST\",\"negate\":false,\"whitelistMatcherData\":{\"whitelist\":[\"admin\",\"mauro\",\"nico\"]}}]},\"partitions\":[{\"treatment\":\"off\",\"size\":100}],\"label\":\"whitelisted\"},{\"conditionType\":\"ROLLOUT\",\"matcherGroup\":{\"combiner\":\"AND\",\"matchers\":[{\"keySelector\":{\"trafficType\":\"user\"},\"matcherType\":\"IN_SEGMENT\",\"negate\":false,\"userDefinedSegmentMatcherData\":{\"segmentName\":\"maur-2\"}}]},\"partitions\":[{\"treatment\":\"on\",\"size\":0},{\"treatment\":\"off\",\"size\":100},{\"treatment\":\"V4\",\"size\":0},{\"treatment\":\"v5\",\"size\":0}],\"label\":\"in segment maur-2\"},{\"conditionType\":\"ROLLOUT\",\"matcherGroup\":{\"combiner\":\"AND\",\"matchers\":[{\"keySelector\":{\"trafficType\":\"user\"},\"matcherType\":\"ALL_KEYS\",\"negate\":false}]},\"partitions\":[{\"treatment\":\"on\",\"size\":0},{\"treatment\":\"off\",\"size\":100},{\"treatment\":\"V4\",\"size\":0},{\"treatment\":\"v5\",\"size\":0}],\"label\":\"default rule\"}]}"; + Split featureFlagTest1 = Json.fromJson(definition1, Split.class); + + String definition2 = "{\"trafficTypeName\":\"user\",\"id\":\"d704f220-0567-11ee-80ee-fa3c6460cd13\",\"name\":\"NET_CORE_getTreatmentWithConfigAfterArchive\",\"trafficAllocation\":100,\"trafficAllocationSeed\":179018541,\"seed\":272707374,\"status\":\"ARCHIVED\",\"killed\":false,\"defaultTreatment\":\"V-FGyN\",\"changeNumber\":1686165617166,\"algo\":2,\"configurations\":{\"V-FGyN\":\"{\\\"color\\\":\\\"blue\\\"}\",\"V-YrWB\":\"{\\\"color\\\":\\\"red\\\"}\"},\"conditions\":[{\"conditionType\":\"ROLLOUT\",\"matcherGroup\":{\"combiner\":\"AND\",\"matchers\":[{\"keySelector\":{\"trafficType\":\"user\",\"attribute\":\"test\"},\"matcherType\":\"LESS_THAN_OR_EQUAL_TO\",\"negate\":false,\"unaryNumericMatcherData\":{\"dataType\":\"NUMBER\",\"value\":20}}]},\"partitions\":[{\"treatment\":\"V-FGyN\",\"size\":0},{\"treatment\":\"V-YrWB\",\"size\":100}],\"label\":\"test \\u003c\\u003d 20\"}]}"; + Split featureFlagTest2 = Json.fromJson(definition2, Split.class); + + featureFlags.add(featureFlagTest1); + featureFlags.add(featureFlagTest2); + FeatureFlagsToUpdate featureFlagsToUpdate = processFeatureFlagChanges(splitParser, featureFlags, new HashSet<>(Arrays.asList("set_3"))); + + Assert.assertEquals(0, featureFlagsToUpdate.toAdd.size()); + Assert.assertEquals(2, featureFlagsToUpdate.toRemove.size()); + Assert.assertEquals(0, featureFlagsToUpdate.segments.size()); + } } \ No newline at end of file From 7a534c66accdb6ff8ca49b4e539e36ac9a337347 Mon Sep 17 00:00:00 2001 From: Nadia Mayor Date: Mon, 18 Sep 2023 15:13:48 -0300 Subject: [PATCH 3/4] [SDKS-7521] Add setFlags in SplitFetcherImp --- .../main/java/io/split/client/SplitFactoryImpl.java | 10 ++++++---- .../io/split/engine/experiments/SplitFetcherImp.java | 7 ++++--- .../engine/common/LocalhostSynchronizerTest.java | 8 +++++--- .../split/engine/experiments/SplitFetcherImpTest.java | 4 +++- .../io/split/engine/experiments/SplitFetcherTest.java | 11 ++++++----- .../experiments/SplitSynchronizationTaskTest.java | 4 +++- .../segments/SegmentSynchronizationTaskImpTest.java | 3 ++- 7 files changed, 29 insertions(+), 18 deletions(-) diff --git a/client/src/main/java/io/split/client/SplitFactoryImpl.java b/client/src/main/java/io/split/client/SplitFactoryImpl.java index 88413bdbd..45c5f8f95 100644 --- a/client/src/main/java/io/split/client/SplitFactoryImpl.java +++ b/client/src/main/java/io/split/client/SplitFactoryImpl.java @@ -109,6 +109,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.stream.Collectors; @@ -200,7 +201,7 @@ public SplitFactoryImpl(String apiToken, SplitClientConfig config) throws URISyn SplitParser splitParser = new SplitParser(); // SplitFetcher - _splitFetcher = buildSplitFetcher(splitCache, splitParser); + _splitFetcher = buildSplitFetcher(splitCache, splitParser, config.getSetsFilter()); // SplitSynchronizationTask _splitSynchronizationTask = new SplitSynchronizationTask(_splitFetcher, @@ -377,7 +378,7 @@ protected SplitFactoryImpl(SplitClientConfig config) { SplitChangeFetcher splitChangeFetcher = createSplitChangeFetcher(config); SplitParser splitParser = new SplitParser(); - _splitFetcher = new SplitFetcherImp(splitChangeFetcher, splitParser, splitCache, _telemetryStorageProducer); + _splitFetcher = new SplitFetcherImp(splitChangeFetcher, splitParser, splitCache, _telemetryStorageProducer, config.getSetsFilter()); // SplitSynchronizationTask _splitSynchronizationTask = new SplitSynchronizationTask(_splitFetcher, splitCache, config.featuresRefreshRate(), config.getThreadFactory()); @@ -559,10 +560,11 @@ private SegmentSynchronizationTaskImp buildSegments(SplitClientConfig config, Se config.getThreadFactory()); } - private SplitFetcher buildSplitFetcher(SplitCacheProducer splitCacheProducer, SplitParser splitParser) throws URISyntaxException { + private SplitFetcher buildSplitFetcher(SplitCacheProducer splitCacheProducer, SplitParser splitParser, HashSet flagSets) throws + URISyntaxException { SplitChangeFetcher splitChangeFetcher = HttpSplitChangeFetcher.create(_httpclient, _rootTarget, _telemetryStorageProducer); - return new SplitFetcherImp(splitChangeFetcher, splitParser, splitCacheProducer, _telemetryStorageProducer); + return new SplitFetcherImp(splitChangeFetcher, splitParser, splitCacheProducer, _telemetryStorageProducer,flagSets); } private ImpressionsManagerImpl buildImpressionsManager(SplitClientConfig config, ImpressionsStorageConsumer impressionsStorageConsumer, diff --git a/client/src/main/java/io/split/engine/experiments/SplitFetcherImp.java b/client/src/main/java/io/split/engine/experiments/SplitFetcherImp.java index 2eb37b78d..ece114849 100644 --- a/client/src/main/java/io/split/engine/experiments/SplitFetcherImp.java +++ b/client/src/main/java/io/split/engine/experiments/SplitFetcherImp.java @@ -31,6 +31,7 @@ public class SplitFetcherImp implements SplitFetcher { private final SplitCacheProducer _splitCacheProducer; private final Object _lock = new Object(); private final TelemetryRuntimeProducer _telemetryRuntimeProducer; + private final HashSet _flagSets; /** * Contains all the traffic types that are currently being used by the splits and also the count @@ -44,11 +45,12 @@ public class SplitFetcherImp implements SplitFetcher { public SplitFetcherImp(SplitChangeFetcher splitChangeFetcher, SplitParser parser, SplitCacheProducer splitCacheProducer, - TelemetryRuntimeProducer telemetryRuntimeProducer) { + TelemetryRuntimeProducer telemetryRuntimeProducer, HashSet sets) { _splitChangeFetcher = checkNotNull(splitChangeFetcher); _parser = checkNotNull(parser); _splitCacheProducer = checkNotNull(splitCacheProducer); _telemetryRuntimeProducer = checkNotNull(telemetryRuntimeProducer); + _flagSets = sets; } @Override @@ -119,8 +121,7 @@ private Set runWithoutExceptionHandling(FetchOptions options) throws Int // some other thread may have updated the shared state. exit return segments; } - FeatureFlagsToUpdate featureFlagsToUpdate = processFeatureFlagChanges(_parser, change.splits, !options.flagSetsFilter().isEmpty() ? - new HashSet<>(Arrays.asList(options.flagSetsFilter().split(","))): new HashSet<>()); + FeatureFlagsToUpdate featureFlagsToUpdate = processFeatureFlagChanges(_parser, change.splits, _flagSets); segments = featureFlagsToUpdate.getSegments(); _splitCacheProducer.update(featureFlagsToUpdate.getToAdd(), featureFlagsToUpdate.getToRemove(), change.till); _telemetryRuntimeProducer.recordSuccessfulSync(LastSynchronizationRecordsEnum.SPLITS, System.currentTimeMillis()); diff --git a/client/src/test/java/io/split/engine/common/LocalhostSynchronizerTest.java b/client/src/test/java/io/split/engine/common/LocalhostSynchronizerTest.java index 4981cd6cc..e1369cfc9 100644 --- a/client/src/test/java/io/split/engine/common/LocalhostSynchronizerTest.java +++ b/client/src/test/java/io/split/engine/common/LocalhostSynchronizerTest.java @@ -22,6 +22,8 @@ import org.junit.Test; import org.mockito.Mockito; +import java.util.HashSet; + public class LocalhostSynchronizerTest { private static final TelemetryStorage TELEMETRY_STORAGE_NOOP = Mockito.mock(NoopTelemetryStorage.class); @@ -34,7 +36,7 @@ public void testSyncAll(){ SplitChangeFetcher splitChangeFetcher = new JsonLocalhostSplitChangeFetcher(inputStreamProvider); SplitParser splitParser = new SplitParser(); - SplitFetcher splitFetcher = new SplitFetcherImp(splitChangeFetcher, splitParser, splitCacheProducer, TELEMETRY_STORAGE_NOOP); + SplitFetcher splitFetcher = new SplitFetcherImp(splitChangeFetcher, splitParser, splitCacheProducer, TELEMETRY_STORAGE_NOOP, new HashSet<>()); SplitSynchronizationTask splitSynchronizationTask = new SplitSynchronizationTask(splitFetcher, splitCacheProducer, 1000L, null); SegmentChangeFetcher segmentChangeFetcher = new LocalhostSegmentChangeFetcher("src/test/resources/"); @@ -56,7 +58,7 @@ public void testPeriodicFetching() throws InterruptedException { SplitChangeFetcher splitChangeFetcher = Mockito.mock(JsonLocalhostSplitChangeFetcher.class); SplitParser splitParser = new SplitParser(); - SplitFetcher splitFetcher = new SplitFetcherImp(splitChangeFetcher, splitParser, splitCacheProducer, TELEMETRY_STORAGE_NOOP); + SplitFetcher splitFetcher = new SplitFetcherImp(splitChangeFetcher, splitParser, splitCacheProducer, TELEMETRY_STORAGE_NOOP, new HashSet<>()); SplitSynchronizationTask splitSynchronizationTask = new SplitSynchronizationTask(splitFetcher, splitCacheProducer, 1000L, null); FetchOptions fetchOptions = new FetchOptions.Builder().build(); @@ -82,7 +84,7 @@ public void testRefreshSplits() { SplitChangeFetcher splitChangeFetcher = Mockito.mock(SplitChangeFetcher.class); SplitParser splitParser = new SplitParser(); - SplitFetcher splitFetcher = new SplitFetcherImp(splitChangeFetcher, splitParser, splitCacheProducer, TELEMETRY_STORAGE_NOOP); + SplitFetcher splitFetcher = new SplitFetcherImp(splitChangeFetcher, splitParser, splitCacheProducer, TELEMETRY_STORAGE_NOOP, new HashSet<>()); SplitSynchronizationTask splitSynchronizationTask = new SplitSynchronizationTask(splitFetcher, splitCacheProducer, 1000L, null); SplitTasks splitTasks = SplitTasks.build(splitSynchronizationTask, null, null, null, null, null); LocalhostSynchronizer localhostSynchronizer = new LocalhostSynchronizer(splitTasks, splitFetcher, false); diff --git a/client/src/test/java/io/split/engine/experiments/SplitFetcherImpTest.java b/client/src/test/java/io/split/engine/experiments/SplitFetcherImpTest.java index 643ce86b8..5c4274aa8 100644 --- a/client/src/test/java/io/split/engine/experiments/SplitFetcherImpTest.java +++ b/client/src/test/java/io/split/engine/experiments/SplitFetcherImpTest.java @@ -12,6 +12,8 @@ import org.junit.Test; import org.mockito.Mockito; +import java.util.HashSet; + public class SplitFetcherImpTest { private static final TelemetryStorage TELEMETRY_STORAGE_NOOP = Mockito.mock(NoopTelemetryStorage.class); @@ -24,7 +26,7 @@ public void testLocalHost() { SplitChangeFetcher splitChangeFetcher = new JsonLocalhostSplitChangeFetcher(inputStreamProvider); SplitParser splitParser = new SplitParser(); FetchOptions fetchOptions = new FetchOptions.Builder().build(); - SplitFetcher splitFetcher = new SplitFetcherImp(splitChangeFetcher, splitParser, splitCacheProducer, TELEMETRY_STORAGE_NOOP); + SplitFetcher splitFetcher = new SplitFetcherImp(splitChangeFetcher, splitParser, splitCacheProducer, TELEMETRY_STORAGE_NOOP, new HashSet<>()); FetchResult fetchResult = splitFetcher.forceRefresh(fetchOptions); diff --git a/client/src/test/java/io/split/engine/experiments/SplitFetcherTest.java b/client/src/test/java/io/split/engine/experiments/SplitFetcherTest.java index a6be86240..9f8cb158a 100644 --- a/client/src/test/java/io/split/engine/experiments/SplitFetcherTest.java +++ b/client/src/test/java/io/split/engine/experiments/SplitFetcherTest.java @@ -26,6 +26,7 @@ import org.slf4j.LoggerFactory; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; @@ -64,7 +65,7 @@ public void works_when_we_start_with_any_state() throws InterruptedException { private void works(long startingChangeNumber) throws InterruptedException { AChangePerCallSplitChangeFetcher splitChangeFetcher = new AChangePerCallSplitChangeFetcher(); SplitCache cache = new InMemoryCacheImp(startingChangeNumber); - SplitFetcherImp fetcher = new SplitFetcherImp(splitChangeFetcher, new SplitParser(), cache, TELEMETRY_STORAGE); + SplitFetcherImp fetcher = new SplitFetcherImp(splitChangeFetcher, new SplitParser(), cache, TELEMETRY_STORAGE, new HashSet<>()); // execute the fetcher for a little bit. executeWaitAndTerminate(fetcher, 1, 3, TimeUnit.SECONDS); @@ -135,7 +136,7 @@ public void when_parser_fails_we_remove_the_experiment() throws InterruptedExcep SegmentChangeFetcher segmentChangeFetcher = mock(SegmentChangeFetcher.class); SegmentSynchronizationTask segmentSynchronizationTask = new SegmentSynchronizationTaskImp(segmentChangeFetcher, 1,10, segmentCache, TELEMETRY_STORAGE, cache, null); segmentSynchronizationTask.start(); - SplitFetcherImp fetcher = new SplitFetcherImp(splitChangeFetcher, new SplitParser(), cache, TELEMETRY_STORAGE); + SplitFetcherImp fetcher = new SplitFetcherImp(splitChangeFetcher, new SplitParser(), cache, TELEMETRY_STORAGE, new HashSet<>()); // execute the fetcher for a little bit. executeWaitAndTerminate(fetcher, 1, 5, TimeUnit.SECONDS); @@ -156,7 +157,7 @@ public void if_there_is_a_problem_talking_to_split_change_count_down_latch_is_no SegmentChangeFetcher segmentChangeFetcher = mock(SegmentChangeFetcher.class); SegmentSynchronizationTask segmentSynchronizationTask = new SegmentSynchronizationTaskImp(segmentChangeFetcher, 1,10, segmentCache, TELEMETRY_STORAGE, cache, null); segmentSynchronizationTask.start(); - SplitFetcherImp fetcher = new SplitFetcherImp(splitChangeFetcher, new SplitParser(), cache, TELEMETRY_STORAGE); + SplitFetcherImp fetcher = new SplitFetcherImp(splitChangeFetcher, new SplitParser(), cache, TELEMETRY_STORAGE, new HashSet<>()); // execute the fetcher for a little bit. executeWaitAndTerminate(fetcher, 1, 5, TimeUnit.SECONDS); @@ -197,7 +198,7 @@ public void works_with_user_defined_segments() throws Exception { when(segmentChangeFetcher.fetch(anyString(), anyLong(), any())).thenReturn(segmentChange); SegmentSynchronizationTask segmentSynchronizationTask = new SegmentSynchronizationTaskImp(segmentChangeFetcher, 1,10, segmentCache, Mockito.mock(TelemetryStorage.class), cache, null); segmentSynchronizationTask.start(); - SplitFetcherImp fetcher = new SplitFetcherImp(experimentChangeFetcher, new SplitParser(), cache, TELEMETRY_STORAGE); + SplitFetcherImp fetcher = new SplitFetcherImp(experimentChangeFetcher, new SplitParser(), cache, TELEMETRY_STORAGE, new HashSet<>()); // execute the fetcher for a little bit. executeWaitAndTerminate(fetcher, 1, 5, TimeUnit.SECONDS); @@ -217,7 +218,7 @@ public void testBypassCdnClearedAfterFirstHit() { SplitChangeFetcher mockFetcher = Mockito.mock(SplitChangeFetcher.class); SplitParser mockParser = new SplitParser(); SplitCache mockCache = new InMemoryCacheImp(); - SplitFetcherImp fetcher = new SplitFetcherImp(mockFetcher, mockParser, mockCache, Mockito.mock(TelemetryRuntimeProducer.class)); + SplitFetcherImp fetcher = new SplitFetcherImp(mockFetcher, mockParser, mockCache, Mockito.mock(TelemetryRuntimeProducer.class), new HashSet<>()); SplitChange response1 = new SplitChange(); diff --git a/client/src/test/java/io/split/engine/experiments/SplitSynchronizationTaskTest.java b/client/src/test/java/io/split/engine/experiments/SplitSynchronizationTaskTest.java index d53ac89e7..5689ed92f 100644 --- a/client/src/test/java/io/split/engine/experiments/SplitSynchronizationTaskTest.java +++ b/client/src/test/java/io/split/engine/experiments/SplitSynchronizationTaskTest.java @@ -9,6 +9,8 @@ import org.junit.Test; import org.mockito.Mockito; +import java.util.HashSet; + public class SplitSynchronizationTaskTest { private static final TelemetryStorage TELEMETRY_STORAGE_NOOP = Mockito.mock(NoopTelemetryStorage.class); @@ -20,7 +22,7 @@ public void testLocalhost() throws InterruptedException { SplitChangeFetcher splitChangeFetcher = Mockito.mock(JsonLocalhostSplitChangeFetcher.class); SplitParser splitParser = new SplitParser(); FetchOptions fetchOptions = new FetchOptions.Builder().build(); - SplitFetcher splitFetcher = new SplitFetcherImp(splitChangeFetcher, splitParser, splitCacheProducer, TELEMETRY_STORAGE_NOOP); + SplitFetcher splitFetcher = new SplitFetcherImp(splitChangeFetcher, splitParser, splitCacheProducer, TELEMETRY_STORAGE_NOOP, new HashSet<>()); SplitSynchronizationTask splitSynchronizationTask = new SplitSynchronizationTask(splitFetcher, splitCacheProducer, 1000, null); diff --git a/client/src/test/java/io/split/engine/segments/SegmentSynchronizationTaskImpTest.java b/client/src/test/java/io/split/engine/segments/SegmentSynchronizationTaskImpTest.java index 32ba6fa0b..87f39a8cc 100644 --- a/client/src/test/java/io/split/engine/segments/SegmentSynchronizationTaskImpTest.java +++ b/client/src/test/java/io/split/engine/segments/SegmentSynchronizationTaskImpTest.java @@ -31,6 +31,7 @@ import java.io.InputStream; import java.lang.reflect.Field; import java.lang.reflect.Modifier; +import java.util.HashSet; import java.util.List; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ExecutorService; @@ -159,7 +160,7 @@ public void testLocalhostSegmentChangeFetcher() throws InterruptedException, Fil SplitChangeFetcher splitChangeFetcher = new JsonLocalhostSplitChangeFetcher(inputStreamProvider); SplitParser splitParser = new SplitParser(); FetchOptions fetchOptions = new FetchOptions.Builder().build(); - SplitFetcher splitFetcher = new SplitFetcherImp(splitChangeFetcher, splitParser, splitCacheProducer, TELEMETRY_STORAGE_NOOP); + SplitFetcher splitFetcher = new SplitFetcherImp(splitChangeFetcher, splitParser, splitCacheProducer, TELEMETRY_STORAGE_NOOP, new HashSet<>()); SplitSynchronizationTask splitSynchronizationTask = new SplitSynchronizationTask(splitFetcher, splitCacheProducer, 1000, null); From 0422653c2e9da5a5bce24ea84245ef768a36d260 Mon Sep 17 00:00:00 2001 From: Nadia Mayor Date: Mon, 18 Sep 2023 15:26:29 -0300 Subject: [PATCH 4/4] [SDKS-7521] Update FalgSetsFilter --- .../java/io/split/client/interceptors/FlagSetsFilter.java | 4 ++-- .../io/split/client/interceptors/FlagSetsFilterImpl.java | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/client/src/main/java/io/split/client/interceptors/FlagSetsFilter.java b/client/src/main/java/io/split/client/interceptors/FlagSetsFilter.java index ed16f761e..20a7d1449 100644 --- a/client/src/main/java/io/split/client/interceptors/FlagSetsFilter.java +++ b/client/src/main/java/io/split/client/interceptors/FlagSetsFilter.java @@ -1,9 +1,9 @@ package io.split.client.interceptors; -import java.util.HashSet; +import java.util.Set; public interface FlagSetsFilter { - boolean Intersect(HashSet sets); + boolean Intersect(Set sets); boolean Intersect(String set); } \ No newline at end of file diff --git a/client/src/main/java/io/split/client/interceptors/FlagSetsFilterImpl.java b/client/src/main/java/io/split/client/interceptors/FlagSetsFilterImpl.java index 48565f186..ff6178958 100644 --- a/client/src/main/java/io/split/client/interceptors/FlagSetsFilterImpl.java +++ b/client/src/main/java/io/split/client/interceptors/FlagSetsFilterImpl.java @@ -1,18 +1,18 @@ package io.split.client.interceptors; -import java.util.HashSet; +import java.util.Set; public class FlagSetsFilterImpl implements FlagSetsFilter { - private final HashSet _flagSets; + private final Set _flagSets; private final boolean _shouldFilter; - public FlagSetsFilterImpl(HashSet flagSets) { + public FlagSetsFilterImpl(Set flagSets) { _shouldFilter = !flagSets.isEmpty(); _flagSets = flagSets; } @Override - public boolean Intersect(HashSet sets) { + public boolean Intersect(Set sets) { if (!_shouldFilter) { return true; }