Skip to content

Commit 8b98d59

Browse files
cmab endpoint templating added
1 parent ec9f4e8 commit 8b98d59

File tree

5 files changed

+86
-33
lines changed

5 files changed

+86
-33
lines changed

OptimizelySwiftSDK.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2028,6 +2028,7 @@
20282028
98261A252ED89A8500F7230A /* CmabConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98261A172ED89A8500F7230A /* CmabConfig.swift */; };
20292029
98261A262ED89A8500F7230A /* CmabConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98261A172ED89A8500F7230A /* CmabConfig.swift */; };
20302030
98261A272ED89A8500F7230A /* CmabConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98261A172ED89A8500F7230A /* CmabConfig.swift */; };
2031+
98261A472EDDC35900F7230A /* OptimizelyClientTests_Cmab_Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98261A462EDDC35900F7230A /* OptimizelyClientTests_Cmab_Config.swift */; };
20312032
982C071F2D8C82AE0068B1FF /* HoldoutTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 982C071E2D8C82AE0068B1FF /* HoldoutTests.swift */; };
20322033
982C07202D8C82AE0068B1FF /* HoldoutTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 982C071E2D8C82AE0068B1FF /* HoldoutTests.swift */; };
20332034
9841590F2E13013E0042C01E /* OptimizelyUserContextTests_Decide_Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9841590E2E13013E0042C01E /* OptimizelyUserContextTests_Decide_Async.swift */; };
@@ -2591,6 +2592,7 @@
25912592
98137C542A41E86F004896EB /* OptimizelyClientTests_Init_Async_Await.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptimizelyClientTests_Init_Async_Await.swift; sourceTree = "<group>"; };
25922593
98137C562A42BA0F004896EB /* OptimizelyUserContextTests_ODP_Aync_Await.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptimizelyUserContextTests_ODP_Aync_Await.swift; sourceTree = "<group>"; };
25932594
98261A172ED89A8500F7230A /* CmabConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CmabConfig.swift; sourceTree = "<group>"; };
2595+
98261A462EDDC35900F7230A /* OptimizelyClientTests_Cmab_Config.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptimizelyClientTests_Cmab_Config.swift; sourceTree = "<group>"; };
25942596
982C071E2D8C82AE0068B1FF /* HoldoutTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HoldoutTests.swift; sourceTree = "<group>"; };
25952597
9841590E2E13013E0042C01E /* OptimizelyUserContextTests_Decide_Async.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptimizelyUserContextTests_Decide_Async.swift; sourceTree = "<group>"; };
25962598
984159112E141B640042C01E /* OptimizelyUserContextTests_Decide_CMAB.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptimizelyUserContextTests_Decide_CMAB.swift; sourceTree = "<group>"; };
@@ -3244,6 +3246,7 @@
32443246
6E7519BE22C5211100B2B157 /* OptimizelyClientTests_Invalid.swift */,
32453247
6E593FB425BB9C5500EC72BC /* OptimizelyClientTests_Decide.swift */,
32463248
84518B1E287665020023F104 /* OptimizelyClientTests_ODP.swift */,
3249+
98261A462EDDC35900F7230A /* OptimizelyClientTests_Cmab_Config.swift */,
32473250
6E7519BA22C5211100B2B157 /* OptimizelyClientTests_Evaluation.swift */,
32483251
6E7519BB22C5211100B2B157 /* OptimizelyClientTests_DatafileHandler.swift */,
32493252
6E7519C022C5211100B2B157 /* OptimizelyClientTests_Variables.swift */,
@@ -4821,6 +4824,7 @@
48214824
6E75180822C520D400B2B157 /* DataStoreFile.swift in Sources */,
48224825
6E7518EC22C520D400B2B157 /* ConditionHolder.swift in Sources */,
48234826
6E7516AA22C520D400B2B157 /* DefaultLogger.swift in Sources */,
4827+
98261A472EDDC35900F7230A /* OptimizelyClientTests_Cmab_Config.swift in Sources */,
48244828
84E2E97A2855875E001114AB /* OdpEventManager.swift in Sources */,
48254829
6E75186822C520D400B2B157 /* Rollout.swift in Sources */,
48264830
6E9B11E122C548A200C22D81 /* OptimizelyClientTests_ObjcOthers.m in Sources */,

Sources/CMAB/CmabClient.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,11 +101,12 @@ class DefaultCmabClient: CmabClient {
101101
}
102102

103103
func getUrl(ruleId: String) -> URL? {
104-
guard let baseURL = URL(string: predictionEndpoint) else {
104+
let urlString = String(format: predictionEndpoint, ruleId)
105+
guard let url = URL(string: urlString) else {
105106
self.logger.e("Invalid CMAB endpoint")
106107
return nil
107108
}
108-
return baseURL.appendingPathComponent(ruleId)
109+
return url
109110
}
110111

111112
private func doFetchWithRetry(

Sources/CMAB/CmabConfig.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import Foundation
1818

1919
let DEFAULT_CMAB_CACHE_TIMEOUT = 30 * 60 // 30 minutes
2020
let DEFAULT_CMAB_CACHE_SIZE = 100
21-
let CMAB_PREDICTION_END_POINT = "https://prediction.cmab.optimizely.com/predict"
21+
let CMAB_PREDICTION_END_POINT = "https://prediction.cmab.optimizely.com/predict/%@"
2222

2323
/// Configuration for CMAB (Contextual Multi-Armed Bandit) service
2424
public struct CmabConfig {
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
//
2+
// Copyright 2022, Optimizely, Inc. and contributors
3+
//
4+
// Licensed under the Apache License, Version 2.0 (the "License");
5+
// you may not use this file except in compliance with the License.
6+
// You may obtain a copy of the License at
7+
//
8+
// http://www.apache.org/licenses/LICENSE-2.0
9+
//
10+
// Unless required by applicable law or agreed to in writing, software
11+
// distributed under the License is distributed on an "AS IS" BASIS,
12+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
// See the License for the specific language governing permissions and
14+
// limitations under the License.
15+
//
16+
17+
import Foundation
18+
import XCTest
19+
20+
class OptimizelyClientTests_Cmab_Config: XCTestCase {
21+
22+
var optimizely: OptimizelyClient!
23+
24+
override func setUp() {
25+
super.setUp()
26+
27+
let datafile = OTUtils.loadJSONDatafile("decide_audience_segments")!
28+
optimizely = OptimizelyClient(sdkKey: OTUtils.randomSdkKey)
29+
try! optimizely.start(datafile: datafile)
30+
}
31+
32+
override func tearDown() {
33+
Utils.sdkVersion = OPTIMIZELYSDKVERSION
34+
Utils.swiftSdkClientName = "swift-sdk"
35+
}
36+
37+
// MARK: - ODP configuration
38+
39+
func test_config_default() {
40+
let optimizely = OptimizelyClient(sdkKey: OTUtils.randomSdkKey)
41+
let cmabService = ((optimizely.decisionService as! DefaultDecisionService).cmabService as! DefaultCmabService)
42+
let cmabCache = cmabService.cmabCache
43+
let cmabClient = cmabService.cmabClient as! DefaultCmabClient
44+
XCTAssertEqual(100, cmabCache.maxSize)
45+
XCTAssertEqual(30 * 60, cmabCache.timeoutInSecs)
46+
XCTAssertEqual("https://prediction.cmab.optimizely.com/predict/%@", cmabClient.predictionEndpoint)
47+
}
48+
49+
func test_cmab_custom_config() {
50+
var cmabConfig = CmabConfig(cacheSize: 50, cacheTimeoutInSecs: 120)
51+
var optimizely = OptimizelyClient(sdkKey: OTUtils.randomSdkKey, cmabConfig: cmabConfig)
52+
var cmabService = ((optimizely.decisionService as! DefaultDecisionService).cmabService as! DefaultCmabService)
53+
var cmabCache = cmabService.cmabCache
54+
var cmabClient = cmabService.cmabClient as! DefaultCmabClient
55+
XCTAssertEqual(50, cmabCache.maxSize)
56+
XCTAssertEqual(120, cmabCache.timeoutInSecs)
57+
XCTAssertEqual("https://prediction.cmab.optimizely.com/predict/rule_123", cmabClient.getUrl(ruleId: "rule_123")?.absoluteString)
58+
59+
cmabConfig = CmabConfig(cacheSize: 50, cacheTimeoutInSecs: -10, predictionEndpoint: "http://demo.cmab.com/%@/predict")
60+
optimizely = OptimizelyClient(sdkKey: OTUtils.randomSdkKey, cmabConfig: cmabConfig)
61+
cmabService = ((optimizely.decisionService as! DefaultDecisionService).cmabService as! DefaultCmabService)
62+
cmabCache = cmabService.cmabCache
63+
cmabClient = cmabService.cmabClient as! DefaultCmabClient
64+
XCTAssertEqual(50, cmabCache.maxSize)
65+
XCTAssertEqual(1800, cmabCache.timeoutInSecs)
66+
XCTAssertEqual("http://demo.cmab.com/rule_1234/predict", cmabClient.getUrl(ruleId: "rule_1234")?.absoluteString)
67+
68+
cmabConfig = CmabConfig(predictionEndpoint: "http://fowardslash.com/predict/%@/v1/")
69+
optimizely = OptimizelyClient(sdkKey: OTUtils.randomSdkKey, cmabConfig: cmabConfig)
70+
cmabService = ((optimizely.decisionService as! DefaultDecisionService).cmabService as! DefaultCmabService)
71+
cmabCache = cmabService.cmabCache
72+
cmabClient = cmabService.cmabClient as! DefaultCmabClient
73+
XCTAssertEqual(100, cmabCache.maxSize)
74+
XCTAssertEqual(1800, cmabCache.timeoutInSecs)
75+
XCTAssertEqual("http://fowardslash.com/predict/rule-12345/v1/", cmabClient.getUrl(ruleId: "rule-12345")?.absoluteString)
76+
}
77+
}

Tests/OptimizelyTests-APIs/OptimizelyClientTests_ODP.swift

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class OptimizelyClientTests_ODP: XCTestCase {
4242
let cmabClient = cmabService.cmabClient as! DefaultCmabClient
4343
XCTAssertEqual(100, cmabCache.maxSize)
4444
XCTAssertEqual(30 * 60, cmabCache.timeoutInSecs)
45-
XCTAssertEqual("https://prediction.cmab.optimizely.com/predict", cmabClient.predictionEndpoint)
45+
XCTAssertEqual("https://prediction.cmab.optimizely.com/predict/%@", cmabClient.predictionEndpoint)
4646
XCTAssertEqual(100, optimizely.odpManager.segmentManager?.segmentsCache.maxSize)
4747
XCTAssertEqual(600, optimizely.odpManager.segmentManager?.segmentsCache.timeoutInSecs)
4848
XCTAssertEqual(10, optimizely.odpManager.segmentManager?.apiMgr.resourceTimeoutInSecs)
@@ -66,35 +66,6 @@ class OptimizelyClientTests_ODP: XCTestCase {
6666
XCTAssertEqual(false, optimizely.odpManager.enabled)
6767
}
6868

69-
func test_cmab_custom_config() {
70-
var cmabConfig = CmabConfig(cacheSize: 50, cacheTimeoutInSecs: 120)
71-
var optimizely = OptimizelyClient(sdkKey: OTUtils.randomSdkKey, cmabConfig: cmabConfig)
72-
var cmabService = ((optimizely.decisionService as! DefaultDecisionService).cmabService as! DefaultCmabService)
73-
var cmabCache = cmabService.cmabCache
74-
var cmabClient = cmabService.cmabClient as! DefaultCmabClient
75-
XCTAssertEqual(50, cmabCache.maxSize)
76-
XCTAssertEqual(120, cmabCache.timeoutInSecs)
77-
XCTAssertEqual("https://prediction.cmab.optimizely.com/predict/rule_123", cmabClient.getUrl(ruleId: "rule_123")?.absoluteString)
78-
79-
cmabConfig = CmabConfig(cacheSize: 50, cacheTimeoutInSecs: -10, predictionEndpoint: "http://demo.cmab.com/predict")
80-
optimizely = OptimizelyClient(sdkKey: OTUtils.randomSdkKey, cmabConfig: cmabConfig)
81-
cmabService = ((optimizely.decisionService as! DefaultDecisionService).cmabService as! DefaultCmabService)
82-
cmabCache = cmabService.cmabCache
83-
cmabClient = cmabService.cmabClient as! DefaultCmabClient
84-
XCTAssertEqual(50, cmabCache.maxSize)
85-
XCTAssertEqual(1800, cmabCache.timeoutInSecs)
86-
XCTAssertEqual("http://demo.cmab.com/predict/rule_1234", cmabClient.getUrl(ruleId: "rule_1234")?.absoluteString)
87-
88-
cmabConfig = CmabConfig(predictionEndpoint: "http://fowardslash.com/predict/")
89-
optimizely = OptimizelyClient(sdkKey: OTUtils.randomSdkKey, cmabConfig: cmabConfig)
90-
cmabService = ((optimizely.decisionService as! DefaultDecisionService).cmabService as! DefaultCmabService)
91-
cmabCache = cmabService.cmabCache
92-
cmabClient = cmabService.cmabClient as! DefaultCmabClient
93-
XCTAssertEqual(100, cmabCache.maxSize)
94-
XCTAssertEqual(1800, cmabCache.timeoutInSecs)
95-
XCTAssertEqual("http://fowardslash.com/predict/rule-12345", cmabClient.getUrl(ruleId: "rule-12345")?.absoluteString)
96-
}
97-
9869
// MARK: - sendOdpEvent
9970

10071
func testSendOdpEvent_success() {

0 commit comments

Comments
 (0)