diff --git a/splitio/example/ios/Podfile b/splitio/example/ios/Podfile index 2c068c4..0b6609e 100644 --- a/splitio/example/ios/Podfile +++ b/splitio/example/ios/Podfile @@ -32,6 +32,8 @@ target 'Runner' do use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + + pod 'Split', :git => 'https://github.com/splitio/ios-client.git', :branch => 'SDKS-9073_baseline' # TODO: remove; development only end post_install do |installer| diff --git a/splitio/example/ios/Podfile.lock b/splitio/example/ios/Podfile.lock index ddaefcf..56de32d 100644 --- a/splitio/example/ios/Podfile.lock +++ b/splitio/example/ios/Podfile.lock @@ -1,29 +1,34 @@ PODS: - Flutter (1.0.0) - - Split (3.0.0) + - Split (3.1.0) - splitio_ios (0.7.0): - Flutter - - Split (~> 3.0.0) + - Split DEPENDENCIES: - Flutter (from `Flutter`) + - Split (from `https://github.com/splitio/ios-client.git`, branch `SDKS-9073_baseline`) - splitio_ios (from `.symlinks/plugins/splitio_ios/ios`) -SPEC REPOS: - trunk: - - Split - EXTERNAL SOURCES: Flutter: :path: Flutter + Split: + :branch: SDKS-9073_baseline + :git: https://github.com/splitio/ios-client.git splitio_ios: :path: ".symlinks/plugins/splitio_ios/ios" +CHECKOUT OPTIONS: + Split: + :commit: 708427ff99d24e2f2ae6e5a672ee23efebafba06 + :git: https://github.com/splitio/ios-client.git + SPEC CHECKSUMS: Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 - Split: 66424040ad573d052f58269f841e71b34578a916 - splitio_ios: e4e3becbe89cae0a2fa9ca03a575c21f23af0d90 + Split: 17f15abcc74b39c3a8d670f59e787163626ad6b5 + splitio_ios: 00bf48283a9e3f9497a973d9b5cafc5d414dd427 -PODFILE CHECKSUM: 4e8f8b2be68aeea4c0d5beb6ff1e79fface1d048 +PODFILE CHECKSUM: a52d9df387b5aca8aed91ec989839c51add619b2 COCOAPODS: 1.15.0 diff --git a/splitio/example/pubspec.lock b/splitio/example/pubspec.lock index 00b0f01..a3269a9 100644 --- a/splitio/example/pubspec.lock +++ b/splitio/example/pubspec.lock @@ -177,18 +177,16 @@ packages: splitio_ios: dependency: transitive description: - name: splitio_ios - sha256: "7c7a2a60711b8e6267cde7e2754d30931dafc76b20b28e1356624963628cb166" - url: "https://pub.dev" - source: hosted + path: "../../splitio_ios" + relative: true + source: path version: "0.2.0" splitio_platform_interface: dependency: transitive description: - name: splitio_platform_interface - sha256: "2f0457991d18d654486264a66dacf54c7cf23cd88bbb73ed299d69dbbc2fd49b" - url: "https://pub.dev" - source: hosted + path: "../../splitio_platform_interface" + relative: true + source: path version: "1.5.0" stack_trace: dependency: transitive diff --git a/splitio/pubspec.yaml b/splitio/pubspec.yaml index f15dc10..73c522c 100644 --- a/splitio/pubspec.yaml +++ b/splitio/pubspec.yaml @@ -20,11 +20,12 @@ flutter: dependencies: flutter: sdk: flutter - splitio_android: + splitio_android: # ^0.2.0 path: ../splitio_android - splitio_ios: ^0.2.0 - splitio_platform_interface: ^1.5.0 - + splitio_ios: # ^0.2.0 + path: ../splitio_ios + splitio_platform_interface: # ^1.5.0 + path: ../splitio_platform_interface dev_dependencies: flutter_test: sdk: flutter diff --git a/splitio_android/pubspec.yaml b/splitio_android/pubspec.yaml index cc75d6e..79bcfb8 100644 --- a/splitio_android/pubspec.yaml +++ b/splitio_android/pubspec.yaml @@ -19,7 +19,8 @@ flutter: dependencies: flutter: sdk: flutter - splitio_platform_interface: ^1.5.0 + splitio_platform_interface: # ^1.5.0 + path: ../splitio_platform_interface dev_dependencies: flutter_test: diff --git a/splitio_ios/example/ios/Podfile b/splitio_ios/example/ios/Podfile index 8629561..c4289ff 100644 --- a/splitio_ios/example/ios/Podfile +++ b/splitio_ios/example/ios/Podfile @@ -32,6 +32,8 @@ target 'Runner' do use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + + pod 'Split', :git => 'https://github.com/splitio/ios-client.git', :branch => 'SDKS-9073_baseline' # TODO: remove; development only end target 'SplitTests' do @@ -39,6 +41,8 @@ target 'SplitTests' do use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + + pod 'Split', :git => 'https://github.com/splitio/ios-client.git', :branch => 'SDKS-9073_baseline' # TODO: remove; development only end post_install do |installer| diff --git a/splitio_ios/example/ios/Podfile.lock b/splitio_ios/example/ios/Podfile.lock index f1c80a0..5ee5b26 100644 --- a/splitio_ios/example/ios/Podfile.lock +++ b/splitio_ios/example/ios/Podfile.lock @@ -1,29 +1,34 @@ PODS: - Flutter (1.0.0) - - Split (3.0.0) + - Split (3.1.0) - splitio_ios (0.7.0): - Flutter - - Split (~> 3.0.0) + - Split DEPENDENCIES: - Flutter (from `Flutter`) + - Split (from `https://github.com/splitio/ios-client.git`, branch `SDKS-9073_baseline`) - splitio_ios (from `.symlinks/plugins/splitio_ios/ios`) -SPEC REPOS: - trunk: - - Split - EXTERNAL SOURCES: Flutter: :path: Flutter + Split: + :branch: SDKS-9073_baseline + :git: https://github.com/splitio/ios-client.git splitio_ios: :path: ".symlinks/plugins/splitio_ios/ios" +CHECKOUT OPTIONS: + Split: + :commit: 708427ff99d24e2f2ae6e5a672ee23efebafba06 + :git: https://github.com/splitio/ios-client.git + SPEC CHECKSUMS: Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 - Split: 66424040ad573d052f58269f841e71b34578a916 - splitio_ios: e4e3becbe89cae0a2fa9ca03a575c21f23af0d90 + Split: 17f15abcc74b39c3a8d670f59e787163626ad6b5 + splitio_ios: 00bf48283a9e3f9497a973d9b5cafc5d414dd427 -PODFILE CHECKSUM: aed42fc5c94ade572556b7ed357c5c57f1bd83a2 +PODFILE CHECKSUM: 3e7633332e3580ada5ac333ff9c0b05e8c0b7972 COCOAPODS: 1.15.0 diff --git a/splitio_ios/example/ios/SplitTests/ExtensionsTests.swift b/splitio_ios/example/ios/SplitTests/ExtensionsTests.swift index 8cc0e67..cdb123e 100644 --- a/splitio_ios/example/ios/SplitTests/ExtensionsTests.swift +++ b/splitio_ios/example/ios/SplitTests/ExtensionsTests.swift @@ -1,5 +1,6 @@ import XCTest import Split +@testable import splitio_ios class ExtensionsTests: XCTestCase { @@ -26,4 +27,30 @@ class ExtensionsTests: XCTestCase { "split": "my-split", "time": 16161616])) } + + func testSplitViewMapping() throws { + var splitView = SplitView() + splitView.name = "my-split" + splitView.trafficType = "account" + splitView.killed = true + splitView.treatments = ["on", "off"] + splitView.changeNumber = 121212 + splitView.configs = ["key": "value"] + splitView.defaultTreatment = "off" + splitView.sets = ["set1", "set2"] + splitView.impressionsDisabled = true + + let splitViewMap = SplitView.asMap(splitView: splitView) + XCTAssert(splitViewMap.count == 9) + XCTAssert(NSDictionary(dictionary: splitViewMap).isEqual(to: [ + "name": "my-split", + "trafficType": "account", + "killed": true, + "treatments": ["on", "off"], + "changeNumber": 121212, + "configs": ["key": "value"], + "defaultTreatment": "off", + "sets": ["set1", "set2"], + "impressionsDisabled": true])) + } } diff --git a/splitio_ios/example/ios/SplitTests/SplitClientConfigHelperTests.swift b/splitio_ios/example/ios/SplitTests/SplitClientConfigHelperTests.swift index d07edd7..2c29a06 100644 --- a/splitio_ios/example/ios/SplitTests/SplitClientConfigHelperTests.swift +++ b/splitio_ios/example/ios/SplitTests/SplitClientConfigHelperTests.swift @@ -127,12 +127,31 @@ class SplitClientConfigHelperTests: XCTestCase { ] let splitClientConfig: SplitClientConfig = SplitClientConfigHelper.fromMap(configurationMap: configValues, impressionListener: nil) - let actualConfig = splitClientConfig.certificatePinningConfig?.pins + let actualConfig = splitClientConfig.certificatePinningConfig!.pins - let containsPins = actualConfig?.contains { pin in - (pin.host == "host1" && pin.algo == KeyHashAlgo.sha256) && - (pin.host == "host1" && pin.algo == KeyHashAlgo.sha1) && + let containsPins = actualConfig.contains { pin in + (pin.host == "host1" && pin.algo == KeyHashAlgo.sha256) } && + actualConfig.contains { pin in + (pin.host == "host1" && pin.algo == KeyHashAlgo.sha1) } && + actualConfig.contains { pin in (pin.host == "host2" && pin.algo == KeyHashAlgo.sha256 ) } + + XCTAssertTrue(containsPins) + } + + func testRolloutCacheConfigurationValuesAreMappedCorrectly() { + let configValues = [ + "rolloutCacheConfiguration": [ + "expirationDays": 5, + "clearOnInit": true + ] + ] + + let splitClientConfig: SplitClientConfig = SplitClientConfigHelper.fromMap(configurationMap: configValues, impressionListener: nil) + let actualConfig = splitClientConfig.rolloutCacheConfiguration! + + XCTAssertEqual(5, actualConfig.expirationDays) + XCTAssertTrue(actualConfig.clearOnInit) } } diff --git a/splitio_ios/example/pubspec.lock b/splitio_ios/example/pubspec.lock index 23342f6..ec19606 100644 --- a/splitio_ios/example/pubspec.lock +++ b/splitio_ios/example/pubspec.lock @@ -166,14 +166,14 @@ packages: path: ".." relative: true source: path - version: "0.1.9" + version: "0.2.0" splitio_platform_interface: dependency: transitive description: path: "../../splitio_platform_interface" relative: true source: path - version: "1.4.0" + version: "1.5.0" stack_trace: dependency: transitive description: diff --git a/splitio_ios/ios/Classes/Extensions.swift b/splitio_ios/ios/Classes/Extensions.swift index d17250c..fdad567 100644 --- a/splitio_ios/ios/Classes/Extensions.swift +++ b/splitio_ios/ios/Classes/Extensions.swift @@ -1,7 +1,7 @@ import Split extension Impression { - public func toMap() -> [String: Any?] { + func toMap() -> [String: Any?] { ["key": keyName, "bucketingKey": bucketingKey, "split": feature, @@ -24,7 +24,8 @@ extension SplitView { "changeNumber": splitView.changeNumber, "configs": splitView.configs, "defaultTreatment": splitView.defaultTreatment, - "sets": splitView.sets + "sets": splitView.sets, + "impressionsDisabled": splitView.impressionsDisabled, ] } else { return [:] diff --git a/splitio_ios/ios/Classes/SplitClientConfigHelper.swift b/splitio_ios/ios/Classes/SplitClientConfigHelper.swift index 025237b..abe76d0 100644 --- a/splitio_ios/ios/Classes/SplitClientConfigHelper.swift +++ b/splitio_ios/ios/Classes/SplitClientConfigHelper.swift @@ -33,6 +33,9 @@ class SplitClientConfigHelper { static private let READY_TIMEOUT = "readyTimeout" static private let CERTIFICATE_PINNING_CONFIGURATION = "certificatePinningConfiguration" static private let CERTIFICATE_PINNING_CONFIGURATION_PINS = "pins"; + static private let ROLLOUT_CACHE_CONFIGURATION = "rolloutCacheConfiguration" + static private let ROLLOUT_CACHE_CONFIGURATION_EXPIRATION = "expirationDays" + static private let ROLLOUT_CACHE_CONFIGURATION_CLEAR_ON_INIT = "clearOnInit" static func fromMap(configurationMap: [String: Any?], impressionListener: SplitImpressionListener?) -> SplitClientConfig { let config = SplitClientConfig() @@ -117,31 +120,31 @@ class SplitClientConfigHelper { if configurationMap[SDK_ENDPOINT] != nil { if let sdkEndpoint = configurationMap[SDK_ENDPOINT] as? String { - serviceEndpointsBuilder.set(sdkEndpoint: sdkEndpoint) + _ = serviceEndpointsBuilder.set(sdkEndpoint: sdkEndpoint) } } if configurationMap[EVENTS_ENDPOINT] != nil { if let eventsEndpoint = configurationMap[EVENTS_ENDPOINT] as? String { - serviceEndpointsBuilder.set(eventsEndpoint: eventsEndpoint) + _ = serviceEndpointsBuilder.set(eventsEndpoint: eventsEndpoint) } } if configurationMap[SSE_AUTH_SERVICE_ENDPOINT] != nil { if let sseAuthServiceEndpoint = configurationMap[SSE_AUTH_SERVICE_ENDPOINT] as? String { - serviceEndpointsBuilder.set(authServiceEndpoint: sseAuthServiceEndpoint) + _ = serviceEndpointsBuilder.set(authServiceEndpoint: sseAuthServiceEndpoint) } } if configurationMap[STREAMING_SERVICE_ENDPOINT] != nil { if let streamingServiceEndpoint = configurationMap[STREAMING_SERVICE_ENDPOINT] as? String { - serviceEndpointsBuilder.set(streamingServiceEndpoint: streamingServiceEndpoint) + _ = serviceEndpointsBuilder.set(streamingServiceEndpoint: streamingServiceEndpoint) } } if configurationMap[TELEMETRY_SERVICE_ENDPOINT] != nil { if let telemetryServiceEndpoint = configurationMap[TELEMETRY_SERVICE_ENDPOINT] as? String { - serviceEndpointsBuilder.set(telemetryServiceEndpoint: telemetryServiceEndpoint) + _ = serviceEndpointsBuilder.set(telemetryServiceEndpoint: telemetryServiceEndpoint) } } @@ -234,6 +237,22 @@ class SplitClientConfigHelper { } } + if let rolloutCacheConfig = configurationMap[ROLLOUT_CACHE_CONFIGURATION] as? [String: Any?] { + let rolloutCacheConfigurationBuilder = RolloutCacheConfiguration.builder() + if rolloutCacheConfig[ROLLOUT_CACHE_CONFIGURATION_EXPIRATION] != nil { + if let expirationDays = rolloutCacheConfig[ROLLOUT_CACHE_CONFIGURATION_EXPIRATION] as? Int { + rolloutCacheConfigurationBuilder.set(expirationDays: expirationDays) + } + } + + if rolloutCacheConfig[ROLLOUT_CACHE_CONFIGURATION_CLEAR_ON_INIT] != nil { + if let clearOnInit = rolloutCacheConfig[ROLLOUT_CACHE_CONFIGURATION_CLEAR_ON_INIT] as? Bool { + rolloutCacheConfigurationBuilder.set(clearOnInit: clearOnInit) + } + } + config.rolloutCacheConfiguration = rolloutCacheConfigurationBuilder.build() + } + return config } diff --git a/splitio_ios/ios/splitio_ios.podspec b/splitio_ios/ios/splitio_ios.podspec index a593c06..78c16a3 100644 --- a/splitio_ios/ios/splitio_ios.podspec +++ b/splitio_ios/ios/splitio_ios.podspec @@ -15,7 +15,7 @@ split.io official Flutter plugin. s.source = { :path => '.' } s.source_files = 'Classes/**/*' s.dependency 'Flutter' - s.dependency 'Split', '~> 3.0.0' + s.dependency 'Split' # TODO: specify version s.platform = :ios, '9.0' # Flutter.framework does not contain a i386 slice. diff --git a/splitio_ios/pubspec.yaml b/splitio_ios/pubspec.yaml index 5e77494..06849c8 100644 --- a/splitio_ios/pubspec.yaml +++ b/splitio_ios/pubspec.yaml @@ -18,7 +18,8 @@ flutter: dependencies: flutter: sdk: flutter - splitio_platform_interface: ^1.5.0 + splitio_platform_interface: # ^1.5.0 + path: ../splitio_platform_interface dev_dependencies: flutter_test: