Skip to content

Commit f41ea90

Browse files
Merge pull request #180 from splitio/FME-12349-fallback-treatments-mobile
Add fallback treatments support (splitio_android & splitio_ios)
2 parents 5ded361 + 0898585 commit f41ea90

File tree

13 files changed

+147
-23
lines changed

13 files changed

+147
-23
lines changed

splitio/example/ios/Podfile.lock

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
PODS:
22
- Flutter (1.0.0)
3-
- Split (3.3.2)
4-
- splitio_ios (0.8.0):
3+
- Split (3.6.0)
4+
- splitio_ios (0.9.0):
55
- Flutter
6-
- Split (~> 3.3.2)
6+
- Split (~> 3.6.0)
77

88
DEPENDENCIES:
99
- Flutter (from `Flutter`)
@@ -20,9 +20,9 @@ EXTERNAL SOURCES:
2020
:path: ".symlinks/plugins/splitio_ios/ios"
2121

2222
SPEC CHECKSUMS:
23-
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
24-
Split: 0d4962a6c15180e1857c1a3753e1ae9c91a6150b
25-
splitio_ios: 438ad21d0dfe467670f8b9508773b77b16a71d6b
23+
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
24+
Split: 1e2176aacd6421029bea41413401389d86e3d50a
25+
splitio_ios: ad4f484a6c478bf7285e417ea8252371f66b54ff
2626

2727
PODFILE CHECKSUM: 4e8f8b2be68aeea4c0d5beb6ff1e79fface1d048
2828

splitio/lib/splitio.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ export 'package:splitio_platform_interface/split_view.dart';
1212
export 'package:splitio_platform_interface/split_certificate_pinning_configuration.dart';
1313
export 'package:splitio_platform_interface/split_evaluation_options.dart';
1414
export 'package:splitio_platform_interface/split_rollout_cache_configuration.dart';
15+
export 'package:splitio_platform_interface/split_fallback_treatment.dart';
16+
export 'package:splitio_platform_interface/split_fallback_treatments_configuration.dart';
1517

1618
typedef ClientReadinessCallback = void Function(SplitClient splitClient);
1719

splitio/pubspec.yaml

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,14 @@ flutter:
2121
dependencies:
2222
flutter:
2323
sdk: flutter
24-
splitio_android: ^1.0.0
25-
splitio_ios: ^1.0.0
26-
splitio_web: ^1.0.0
27-
splitio_platform_interface: ^2.0.0
24+
splitio_android: # ^1.0.0
25+
path: ../splitio_android
26+
splitio_ios: # ^1.0.0
27+
path: ../splitio_ios
28+
splitio_web: # ^1.0.0
29+
path: ../splitio_web
30+
splitio_platform_interface: # ^2.0.0
31+
path: ../splitio_platform_interface
2832
dev_dependencies:
2933
flutter_test:
3034
sdk: flutter

splitio_android/android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ android {
3838
}
3939

4040
dependencies {
41-
implementation 'io.split.client:android-client:5.3.1'
41+
implementation 'io.split.client:android-client:5.4.2'
4242

4343
testImplementation 'junit:junit:4.13.2'
4444
testImplementation 'org.mockito:mockito-core:3.12.4'

splitio_android/android/src/main/java/io/split/splitio/SplitClientConfigHelper.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import io.split.android.client.network.CertificatePinningConfiguration;
2020
import io.split.android.client.shared.UserConsent;
2121
import io.split.android.client.utils.logger.SplitLogLevel;
22+
import io.split.android.client.fallback.FallbackTreatmentsConfiguration;
23+
import io.split.android.client.fallback.FallbackTreatment;
2224

2325
class SplitClientConfigHelper {
2426

@@ -55,6 +57,11 @@ class SplitClientConfigHelper {
5557
private static final String ROLLOUT_CACHE_CONFIGURATION = "rolloutCacheConfiguration";
5658
private static final String ROLLOUT_CACHE_CONFIGURATION_EXPIRATION = "expirationDays";
5759
private static final String ROLLOUT_CACHE_CONFIGURATION_CLEAR_ON_INIT = "clearOnInit";
60+
private static final String FALLBACK_TREATMENTS = "fallbackTreatments";
61+
private static final String FALLBACK_TREATMENTS_GLOBAL = "global";
62+
private static final String FALLBACK_TREATMENTS_BY_FLAG = "byFlag";
63+
private static final String FALLBACK_TREATMENT_VALUE = "treatment";
64+
private static final String FALLBACK_TREATMENT_CONFIG = "config";
5865

5966
/**
6067
* Creates a {@link SplitClientConfig} object from a map.
@@ -262,6 +269,29 @@ static SplitClientConfig fromMap(@NonNull Map<String, Object> configurationMap,
262269
}
263270
}
264271

272+
Map<String, Object> fallbackTreatments = getObjectMap(configurationMap, FALLBACK_TREATMENTS);
273+
if (fallbackTreatments != null) {
274+
Map<String, Object> global = getObjectMap(fallbackTreatments, FALLBACK_TREATMENTS_GLOBAL);
275+
Map<String, Object> byFlag = getObjectMap(fallbackTreatments, FALLBACK_TREATMENTS_BY_FLAG);
276+
if (global != null || byFlag != null) {
277+
FallbackTreatmentsConfiguration.Builder fallbackTreatmentsBuilder = FallbackTreatmentsConfiguration.builder();
278+
if (global != null) {
279+
fallbackTreatmentsBuilder.global(new FallbackTreatment(getString(global, FALLBACK_TREATMENT_VALUE), getString(global, FALLBACK_TREATMENT_CONFIG)));
280+
}
281+
if (byFlag != null) {
282+
Map<String, FallbackTreatment> byFlagMap = new HashMap<>();
283+
for (Map.Entry<String, Object> entry : byFlag.entrySet()) {
284+
Map<String, Object> byFlagFallbackTreatment = getObjectMap(byFlag, entry.getKey());
285+
if (byFlagFallbackTreatment != null) {
286+
byFlagMap.put(entry.getKey(), new FallbackTreatment(getString(byFlagFallbackTreatment, FALLBACK_TREATMENT_VALUE), getString(byFlagFallbackTreatment, FALLBACK_TREATMENT_CONFIG)));
287+
}
288+
}
289+
fallbackTreatmentsBuilder.byFlag(byFlagMap);
290+
}
291+
builder.fallbackTreatments(fallbackTreatmentsBuilder.build());
292+
}
293+
}
294+
265295
return builder.serviceEndpoints(serviceEndpointsBuilder.build()).build();
266296
}
267297

splitio_android/android/src/test/java/io/split/splitio/SplitClientConfigHelperTest.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import io.split.android.client.utils.logger.LogPrinter;
2828
import io.split.android.client.utils.logger.Logger;
2929
import io.split.android.client.utils.logger.SplitLogLevel;
30+
import io.split.android.client.fallback.FallbackTreatmentsConfiguration;
31+
import io.split.android.client.fallback.FallbackTreatment;
3032

3133
public class SplitClientConfigHelperTest {
3234

@@ -235,4 +237,33 @@ public void rolloutCacheConfigurationValuesAreMappedCorrectly() {
235237
assertEquals(5, splitClientConfig.rolloutCacheConfiguration().getExpirationDays());
236238
assertTrue(splitClientConfig.rolloutCacheConfiguration().isClearOnInit());
237239
}
240+
241+
@Test
242+
public void fallbackTreatmentsValuesAreMappedCorrectly() {
243+
Map<String, Object> globalFallbackTreatment = new HashMap<>();
244+
globalFallbackTreatment.put("treatment", "global-control");
245+
globalFallbackTreatment.put("config", "global-config");
246+
247+
Map<String, Object> feature1FallbackTreatment = new HashMap<>();
248+
feature1FallbackTreatment.put("treatment", "feature1-control");
249+
feature1FallbackTreatment.put("config", null);
250+
251+
Map<String, Object> byFlagFallbackTreatments = new HashMap<>();
252+
byFlagFallbackTreatments.put("feature1", feature1FallbackTreatment);
253+
254+
Map<String, Object> fallbackTreatmentsValues = new HashMap<>();
255+
fallbackTreatmentsValues.put("global", globalFallbackTreatment);
256+
fallbackTreatmentsValues.put("byFlag", byFlagFallbackTreatments);
257+
258+
Map<String, Object> configValues = new HashMap<>();
259+
configValues.put("fallbackTreatments", fallbackTreatmentsValues);
260+
261+
SplitClientConfig splitClientConfig = SplitClientConfigHelper
262+
.fromMap(configValues, mock(ImpressionListener.class));
263+
264+
FallbackTreatmentsConfiguration fallbackTreatmentsConfiguration = splitClientConfig.fallbackTreatments();
265+
266+
assertEquals(new FallbackTreatment("global-control", "global-config"), fallbackTreatmentsConfiguration.getGlobal());
267+
assertEquals(Map.of("feature1", new FallbackTreatment("feature1-control", null)), fallbackTreatmentsConfiguration.getByFlag());
268+
}
238269
}

splitio_android/pubspec.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ flutter:
1919
dependencies:
2020
flutter:
2121
sdk: flutter
22-
splitio_platform_interface: ^2.0.0
22+
splitio_platform_interface: # ^2.0.0
23+
path: ../splitio_platform_interface
2324

2425
dev_dependencies:
2526
flutter_test:

splitio_ios/example/ios/Podfile.lock

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
PODS:
22
- Flutter (1.0.0)
3-
- Split (3.3.2)
4-
- splitio_ios (0.8.0):
3+
- Split (3.6.0)
4+
- splitio_ios (0.9.0):
55
- Flutter
6-
- Split (~> 3.3.2)
6+
- Split (~> 3.6.0)
77

88
DEPENDENCIES:
99
- Flutter (from `Flutter`)
@@ -20,10 +20,10 @@ EXTERNAL SOURCES:
2020
:path: ".symlinks/plugins/splitio_ios/ios"
2121

2222
SPEC CHECKSUMS:
23-
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
24-
Split: 0d4962a6c15180e1857c1a3753e1ae9c91a6150b
25-
splitio_ios: 438ad21d0dfe467670f8b9508773b77b16a71d6b
23+
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
24+
Split: 1e2176aacd6421029bea41413401389d86e3d50a
25+
splitio_ios: ad4f484a6c478bf7285e417ea8252371f66b54ff
2626

27-
PODFILE CHECKSUM: aed42fc5c94ade572556b7ed357c5c57f1bd83a2
27+
PODFILE CHECKSUM: ba5baa820782b9e142d3ba97a6b84de9feaaceda
2828

2929
COCOAPODS: 1.16.2

splitio_ios/example/ios/SplitTests/SplitClientConfigHelperTests.swift

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,4 +154,29 @@ class SplitClientConfigHelperTests: XCTestCase {
154154
XCTAssertEqual(5, actualConfig.expirationDays)
155155
XCTAssertTrue(actualConfig.clearOnInit)
156156
}
157+
158+
func testFallbackTreatmentsConfigurationValuesAreMappedCorrectly() {
159+
let configValues = [
160+
"fallbackTreatments": [
161+
"global": [
162+
"treatment": "on",
163+
"config": "{\"key\": \"value\"}"
164+
],
165+
"byFlag": [
166+
"feature1": [
167+
"treatment": "off",
168+
"config": nil
169+
]
170+
]
171+
]
172+
]
173+
174+
let splitClientConfig: SplitClientConfig = SplitClientConfigHelper.fromMap(configurationMap: configValues, impressionListener: nil)
175+
let actualConfig = splitClientConfig.fallbackTreatments
176+
177+
XCTAssertEqual("on", actualConfig.global?.treatment)
178+
XCTAssertEqual("{\"key\": \"value\"}", actualConfig.global?.config)
179+
XCTAssertEqual("off", actualConfig.byFlag["feature1"]?.treatment)
180+
XCTAssertNil(actualConfig.byFlag["feature1"]?.config)
181+
}
157182
}

splitio_ios/ios/Classes/SplitClientConfigHelper.swift

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ class SplitClientConfigHelper {
3636
static private let ROLLOUT_CACHE_CONFIGURATION = "rolloutCacheConfiguration"
3737
static private let ROLLOUT_CACHE_CONFIGURATION_EXPIRATION = "expirationDays"
3838
static private let ROLLOUT_CACHE_CONFIGURATION_CLEAR_ON_INIT = "clearOnInit"
39+
static private let FALLBACK_TREATMENTS = "fallbackTreatments";
40+
static private let FALLBACK_TREATMENTS_GLOBAL = "global";
41+
static private let FALLBACK_TREATMENTS_BY_FLAG = "byFlag";
42+
static private let FALLBACK_TREATMENT_VALUE = "treatment";
43+
static private let FALLBACK_TREATMENT_CONFIG = "config";
3944

4045
static func fromMap(configurationMap: [String: Any?], impressionListener: SplitImpressionListener?) -> SplitClientConfig {
4146
let config = SplitClientConfig()
@@ -253,6 +258,30 @@ class SplitClientConfigHelper {
253258
config.rolloutCacheConfiguration = rolloutCacheConfigurationBuilder.build()
254259
}
255260

261+
if let fallbackTreatmentConfig = configurationMap[FALLBACK_TREATMENTS] as? [String: Any?] {
262+
let fallbackTreatmentConfiguration = FallbackTreatmentsConfig.builder()
263+
264+
if let globalTreatment = fallbackTreatmentConfig[FALLBACK_TREATMENTS_GLOBAL] as? [String: Any?] {
265+
fallbackTreatmentConfiguration.global(FallbackTreatment(
266+
treatment: globalTreatment[FALLBACK_TREATMENT_VALUE] as! String,
267+
config: globalTreatment[FALLBACK_TREATMENT_CONFIG] as? String
268+
))
269+
}
270+
271+
if let byFlagTreatments = fallbackTreatmentConfig[FALLBACK_TREATMENTS_BY_FLAG] as? [String: [String: Any?]] {
272+
var byFlag: [String: FallbackTreatment] = [:]
273+
for (key, value) in byFlagTreatments {
274+
byFlag[key] = FallbackTreatment(
275+
treatment: value[FALLBACK_TREATMENT_VALUE] as! String,
276+
config: value[FALLBACK_TREATMENT_CONFIG] as? String
277+
)
278+
}
279+
fallbackTreatmentConfiguration.byFlag(byFlag)
280+
}
281+
282+
config.fallbackTreatments = fallbackTreatmentConfiguration.build()
283+
}
284+
256285
return config
257286
}
258287

0 commit comments

Comments
 (0)