From 6fd9433693c0027e3b858f94de42759e3dd2eafc Mon Sep 17 00:00:00 2001 From: Gaston Thea Date: Fri, 3 Nov 2023 16:06:14 -0300 Subject: [PATCH 1/2] Update android-client to 3.4.0 --- splitio_android/android/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/splitio_android/android/build.gradle b/splitio_android/android/build.gradle index 7a017ac..a2871bd 100644 --- a/splitio_android/android/build.gradle +++ b/splitio_android/android/build.gradle @@ -22,7 +22,7 @@ rootProject.allprojects { apply plugin: 'com.android.library' android { - compileSdkVersion 31 + compileSdk 31 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 @@ -30,13 +30,13 @@ android { } defaultConfig { - minSdkVersion 16 + minSdk 16 consumerProguardFiles 'split-proguard-rules.pro' } dependencies { - implementation 'io.split.client:android-client:3.3.0' + implementation 'io.split.client:android-client:3.4.0' implementation 'com.squareup.okhttp3:okhttp:3.12.13' testImplementation 'junit:junit:4.13.2' From 84aa0c3a19ae507ad67f8284151684597d0af1d7 Mon Sep 17 00:00:00 2001 From: Gaston Thea Date: Fri, 3 Nov 2023 17:27:01 -0300 Subject: [PATCH 2/2] Evaluation & config in Android --- .../io/split/splitio/EvaluationWrapper.java | 8 +++ .../splitio/SplitClientConfigHelper.java | 16 ++++-- .../io/split/splitio/SplitWrapperImpl.java | 40 +++++++++++++++ .../splitio/SplitClientConfigHelperTest.java | 43 +++++++++++++--- .../split/splitio/SplitWrapperImplTest.java | 51 +++++++++++++++++++ 5 files changed, 145 insertions(+), 13 deletions(-) diff --git a/splitio_android/android/src/main/java/io/split/splitio/EvaluationWrapper.java b/splitio_android/android/src/main/java/io/split/splitio/EvaluationWrapper.java index c6dc7fa..62ed6d0 100644 --- a/splitio_android/android/src/main/java/io/split/splitio/EvaluationWrapper.java +++ b/splitio_android/android/src/main/java/io/split/splitio/EvaluationWrapper.java @@ -13,4 +13,12 @@ interface EvaluationWrapper { SplitResult getTreatmentWithConfig(String matchingKey, String bucketingKey, String splitName, Map attributes); Map getTreatmentsWithConfig(String matchingKey, String bucketingKey, List splitNames, Map attributes); + + Map getTreatmentsByFlagSet(String matchingKey, String bucketingKey, String flagSet, Map attributes); + + Map getTreatmentsByFlagSets(String matchingKey, String bucketingKey, List flagSets, Map attributes); + + Map getTreatmentsWithConfigByFlagSet(String matchingKey, String bucketingKey, String flagSet, Map attributes); + + Map getTreatmentsWithConfigByFlagSets(String matchingKey, String bucketingKey, List flagSets, Map attributes); } diff --git a/splitio_android/android/src/main/java/io/split/splitio/SplitClientConfigHelper.java b/splitio_android/android/src/main/java/io/split/splitio/SplitClientConfigHelper.java index 80f58cc..8aa0e78 100644 --- a/splitio_android/android/src/main/java/io/split/splitio/SplitClientConfigHelper.java +++ b/splitio_android/android/src/main/java/io/split/splitio/SplitClientConfigHelper.java @@ -39,6 +39,7 @@ class SplitClientConfigHelper { private static final String SYNC_CONFIG = "syncConfig"; private static final String SYNC_CONFIG_NAMES = "syncConfigNames"; private static final String SYNC_CONFIG_PREFIXES = "syncConfigPrefixes"; + private static final String SYNC_CONFIG_SETS = "syncConfigFlagSets"; private static final String IMPRESSIONS_MODE = "impressionsMode"; private static final String SYNC_ENABLED = "syncEnabled"; private static final String USER_CONSENT = "userConsent"; @@ -152,14 +153,19 @@ static SplitClientConfig fromMap(@NonNull Map configurationMap, if (syncConfig != null) { List names = syncConfig.get(SYNC_CONFIG_NAMES); List prefixes = syncConfig.get(SYNC_CONFIG_PREFIXES); + List flagSets = syncConfig.get(SYNC_CONFIG_SETS); SyncConfig.Builder syncConfigBuilder = SyncConfig.builder(); - if (names != null && !names.isEmpty()) { - syncConfigBuilder.addSplitFilter(SplitFilter.byName(names)); - } + if (flagSets != null && !flagSets.isEmpty()) { + syncConfigBuilder.addSplitFilter(SplitFilter.bySet(flagSets)); + } else { + if (names != null && !names.isEmpty()) { + syncConfigBuilder.addSplitFilter(SplitFilter.byName(names)); + } - if (prefixes != null && !prefixes.isEmpty()) { - syncConfigBuilder.addSplitFilter(SplitFilter.byPrefix(prefixes)); + if (prefixes != null && !prefixes.isEmpty()) { + syncConfigBuilder.addSplitFilter(SplitFilter.byPrefix(prefixes)); + } } builder.syncConfig(syncConfigBuilder.build()); diff --git a/splitio_android/android/src/main/java/io/split/splitio/SplitWrapperImpl.java b/splitio_android/android/src/main/java/io/split/splitio/SplitWrapperImpl.java index b445908..4e765ef 100644 --- a/splitio_android/android/src/main/java/io/split/splitio/SplitWrapperImpl.java +++ b/splitio_android/android/src/main/java/io/split/splitio/SplitWrapperImpl.java @@ -127,6 +127,46 @@ public Map getTreatmentsWithConfig(String matchingKey, Stri return client.getTreatmentsWithConfig(splitNames, attributes); } + @Override + public Map getTreatmentsByFlagSet(String matchingKey, String bucketingKey, String flagSet, Map attributes) { + SplitClient client = getInitializedClient(matchingKey, bucketingKey); + if (client == null) { + return new HashMap<>(); + } + + return client.getTreatmentsByFlagSet(flagSet, attributes); + } + + @Override + public Map getTreatmentsByFlagSets(String matchingKey, String bucketingKey, List flagSets, Map attributes) { + SplitClient client = getInitializedClient(matchingKey, bucketingKey); + if (client == null) { + return new HashMap<>(); + } + + return client.getTreatmentsByFlagSets(flagSets, attributes); + } + + @Override + public Map getTreatmentsWithConfigByFlagSet(String matchingKey, String bucketingKey, String flagSet, Map attributes) { + SplitClient client = getInitializedClient(matchingKey, bucketingKey); + if (client == null) { + return new HashMap<>(); + } + + return client.getTreatmentsWithConfigByFlagSet(flagSet, attributes); + } + + @Override + public Map getTreatmentsWithConfigByFlagSets(String matchingKey, String bucketingKey, List flagSets, Map attributes) { + SplitClient client = getInitializedClient(matchingKey, bucketingKey); + if (client == null) { + return new HashMap<>(); + } + + return client.getTreatmentsWithConfigByFlagSets(flagSets, attributes); + } + @Override public boolean setAttribute(String matchingKey, @Nullable String bucketingKey, String attributeName, Object value) { SplitClient client = getInitializedClient(matchingKey, bucketingKey); diff --git a/splitio_android/android/src/test/java/io/split/splitio/SplitClientConfigHelperTest.java b/splitio_android/android/src/test/java/io/split/splitio/SplitClientConfigHelperTest.java index aa9b7f4..6c16b8f 100644 --- a/splitio_android/android/src/test/java/io/split/splitio/SplitClientConfigHelperTest.java +++ b/splitio_android/android/src/test/java/io/split/splitio/SplitClientConfigHelperTest.java @@ -44,10 +44,6 @@ public void configValuesAreMappedCorrectly() { configValues.put("authServiceEndpoint", "sseAuthServiceEndpoint.split.io"); configValues.put("streamingServiceEndpoint", "streamingServiceEndpoint.split.io"); configValues.put("telemetryServiceEndpoint", "telemetryServiceEndpoint.split.io"); - Map> syncConfigMap = new HashMap<>(); - syncConfigMap.put("syncConfigNames", Arrays.asList("split1", "split2")); - syncConfigMap.put("syncConfigPrefixes", Arrays.asList("split_", "my_split_")); - configValues.put("syncConfig", syncConfigMap); configValues.put("impressionsMode", "none"); configValues.put("syncEnabled", false); configValues.put("userConsent", "declined"); @@ -73,10 +69,6 @@ public void configValuesAreMappedCorrectly() { assertEquals("sseAuthServiceEndpoint.split.io", splitClientConfig.authServiceUrl()); assertEquals("streamingServiceEndpoint.split.io", splitClientConfig.streamingServiceUrl()); assertEquals("telemetryServiceEndpoint.split.io", splitClientConfig.telemetryEndpoint()); - assertEquals(Arrays.asList("split1", "split2"), splitClientConfig.syncConfig().getFilters().get(0).getValues()); - assertEquals(SplitFilter.Type.BY_NAME, splitClientConfig.syncConfig().getFilters().get(0).getType()); - assertEquals(Arrays.asList("split_", "my_split_"), splitClientConfig.syncConfig().getFilters().get(1).getValues()); - assertEquals(SplitFilter.Type.BY_PREFIX, splitClientConfig.syncConfig().getFilters().get(1).getType()); assertEquals(ImpressionsMode.NONE, splitClientConfig.impressionsMode()); assertFalse(splitClientConfig.syncEnabled()); assertEquals(UserConsent.DECLINED, splitClientConfig.userConsent()); @@ -151,4 +143,39 @@ public void impressionsModeValuesAreMappedCorrectly() { assertEquals(ImpressionsMode.NONE, noneConfig.impressionsMode()); assertEquals(ImpressionsMode.OPTIMIZED, optimizedConfig.impressionsMode()); } + + @Test + public void syncConfigWithoutFlagSetsIsMappedCorrectly() { + Map configValues = new HashMap<>(); + Map> syncConfigMap = new HashMap<>(); + syncConfigMap.put("syncConfigNames", Arrays.asList("split1", "split2")); + syncConfigMap.put("syncConfigPrefixes", Arrays.asList("split_", "my_split_")); + configValues.put("syncConfig", syncConfigMap); + + SplitClientConfig splitClientConfig = SplitClientConfigHelper + .fromMap(configValues, mock(ImpressionListener.class)); + + assertEquals(2, splitClientConfig.syncConfig().getFilters().size()); + assertEquals(Arrays.asList("split1", "split2"), splitClientConfig.syncConfig().getFilters().get(0).getValues()); + assertEquals(SplitFilter.Type.BY_NAME, splitClientConfig.syncConfig().getFilters().get(0).getType()); + assertEquals(Arrays.asList("split_", "my_split_"), splitClientConfig.syncConfig().getFilters().get(1).getValues()); + assertEquals(SplitFilter.Type.BY_PREFIX, splitClientConfig.syncConfig().getFilters().get(1).getType()); + } + + @Test + public void syncConfigWithFlagSetsIsMappedCorrectly() { + Map configValues = new HashMap<>(); + Map> syncConfigMap = new HashMap<>(); + syncConfigMap.put("syncConfigNames", Arrays.asList("split1", "split2")); + syncConfigMap.put("syncConfigPrefixes", Arrays.asList("split_", "my_split_")); + syncConfigMap.put("syncConfigFlagSets", Arrays.asList("set_1", "set_2")); + configValues.put("syncConfig", syncConfigMap); + + SplitClientConfig splitClientConfig = SplitClientConfigHelper + .fromMap(configValues, mock(ImpressionListener.class)); + + assertEquals(1, splitClientConfig.syncConfig().getFilters().size()); + assertEquals(Arrays.asList("set_1", "set_2"), splitClientConfig.syncConfig().getFilters().get(0).getValues()); + assertEquals(SplitFilter.Type.BY_SET, splitClientConfig.syncConfig().getFilters().get(0).getType()); + } } diff --git a/splitio_android/android/src/test/java/io/split/splitio/SplitWrapperImplTest.java b/splitio_android/android/src/test/java/io/split/splitio/SplitWrapperImplTest.java index 200f785..733fb31 100644 --- a/splitio_android/android/src/test/java/io/split/splitio/SplitWrapperImplTest.java +++ b/splitio_android/android/src/test/java/io/split/splitio/SplitWrapperImplTest.java @@ -15,6 +15,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Set; @@ -100,6 +101,56 @@ public void testGetTreatmentsWithConfig() { verify(clientMock).getTreatmentsWithConfig(Arrays.asList("split1", "split2"), Collections.singletonMap("age", 50)); } + @Test + public void testGetTreatmentsByFlagSet() { + SplitClient clientMock = mock(SplitClient.class); + when(mSplitFactory.client("key", null)).thenReturn(clientMock); + when(mUsedKeys.contains(new Key("key", null))).thenReturn(true); + + Map attrs = Collections.singletonMap("age", 50); + mSplitWrapper.getTreatmentsByFlagSet("key", null, "flag-set", attrs); + + verify(clientMock).getTreatmentsByFlagSet("flag-set", attrs); + } + + @Test + public void testGetTreatmentsByFlagSets() { + SplitClient clientMock = mock(SplitClient.class); + when(mSplitFactory.client("key", null)).thenReturn(clientMock); + when(mUsedKeys.contains(new Key("key", null))).thenReturn(true); + + Map attrs = Collections.singletonMap("age", 50); + List sets = Arrays.asList("set_1", "set_2"); + mSplitWrapper.getTreatmentsByFlagSets("key", null, sets, attrs); + + verify(clientMock).getTreatmentsByFlagSets(sets, attrs); + } + + @Test + public void testGetTreatmentsWithConfigByFlagSet() { + SplitClient clientMock = mock(SplitClient.class); + when(mSplitFactory.client("key", null)).thenReturn(clientMock); + when(mUsedKeys.contains(new Key("key", null))).thenReturn(true); + + Map attrs = Collections.singletonMap("age", 50); + mSplitWrapper.getTreatmentsWithConfigByFlagSet("key", null,"set_1", attrs); + + verify(clientMock).getTreatmentsWithConfigByFlagSet("set_1", attrs); + } + + @Test + public void testGetTreatmentsWithConfigByFlagSets() { + SplitClient clientMock = mock(SplitClient.class); + when(mSplitFactory.client("key", null)).thenReturn(clientMock); + when(mUsedKeys.contains(new Key("key", null))).thenReturn(true); + + Map attrs = Collections.singletonMap("age", 50); + List sets = Arrays.asList("set_1", "set_2"); + mSplitWrapper.getTreatmentsWithConfigByFlagSets("key", null, sets, attrs); + + verify(clientMock).getTreatmentsWithConfigByFlagSets(sets, attrs); + } + @Test public void testTrack() { SplitClient clientMock = mock(SplitClient.class);