Skip to content

Commit 502954c

Browse files
authored
Fix auto poll initial config load from cache (#44)
* Fix initial config load when auto poll enabled with results from cache * Update AutoPollingTests.swift
1 parent c63143e commit 502954c

File tree

6 files changed

+42
-26
lines changed

6 files changed

+42
-26
lines changed

Diff for: ConfigCat.podspec

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
Pod::Spec.new do |spec|
22

33
spec.name = "ConfigCat"
4-
spec.version = "11.0.2"
4+
spec.version = "11.0.3"
55
spec.summary = "ConfigCat Swift SDK"
66
spec.swift_version = "5.0"
77

Diff for: ConfigCat.xcconfig

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,4 @@ SUPPORTED_PLATFORMS = macosx iphoneos iphonesimulator watchos watchsimulator app
3838
SWIFT_VERSION = 5.0
3939

4040
// ConfigCat SDK version
41-
MARKETING_VERSION = 11.0.2
41+
MARKETING_VERSION = 11.0.3

Diff for: README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ The following device platform versions are supported:
4545

4646
``` swift
4747
dependencies: [
48-
.package(url: "https://github.com/configcat/swift-sdk", from: "11.0.2")
48+
.package(url: "https://github.com/configcat/swift-sdk", from: "11.0.3")
4949
]
5050
```
5151

Diff for: Sources/ConfigCat/ConfigService.swift

+18-22
Original file line numberDiff line numberDiff line change
@@ -99,28 +99,24 @@ class ConfigService {
9999
}
100100

101101
func settings(completion: @escaping (SettingsResult) -> Void) {
102-
switch pollingMode {
103-
case let lazyMode as LazyLoadingMode:
104-
fetchIfOlder(threshold: Date().subtract(seconds: lazyMode.cacheRefreshIntervalInSeconds)!) { result in
105-
switch result {
106-
case .success(let entry): completion(!entry.isEmpty
107-
? SettingsResult(settings: entry.config.settings, fetchTime: entry.fetchTime)
108-
: .empty)
109-
case .failure(_, let entry): completion(!entry.isEmpty
110-
? SettingsResult(settings: entry.config.settings, fetchTime: entry.fetchTime)
111-
: .empty)
112-
}
113-
}
114-
default:
115-
fetchIfOlder(threshold: .distantPast, preferCache: initialized) { result in
116-
switch result {
117-
case .success(let entry): completion(!entry.isEmpty
118-
? SettingsResult(settings: entry.config.settings, fetchTime: entry.fetchTime)
119-
: .empty)
120-
case .failure(_, let entry): completion(!entry.isEmpty
121-
? SettingsResult(settings: entry.config.settings, fetchTime: entry.fetchTime)
122-
: .empty)
123-
}
102+
var threshold = Date.distantPast
103+
var preferCache = initialized
104+
if let lazyMode = pollingMode as? LazyLoadingMode {
105+
threshold = Date().subtract(seconds: lazyMode.cacheRefreshIntervalInSeconds)!
106+
preferCache = false
107+
}
108+
else if let autoPoll = pollingMode as? AutoPollingMode, !initialized {
109+
threshold = Date().subtract(seconds: autoPoll.autoPollIntervalInSeconds)!
110+
}
111+
112+
fetchIfOlder(threshold: threshold, preferCache: preferCache) { result in
113+
switch result {
114+
case .success(let entry): completion(!entry.isEmpty
115+
? SettingsResult(settings: entry.config.settings, fetchTime: entry.fetchTime)
116+
: .empty)
117+
case .failure(_, let entry): completion(!entry.isEmpty
118+
? SettingsResult(settings: entry.config.settings, fetchTime: entry.fetchTime)
119+
: .empty)
124120
}
125121
}
126122
}

Diff for: Sources/ConfigCat/Utils.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ extension Equatable {
4747
}
4848

4949
class Constants {
50-
static let version: String = "11.0.2"
50+
static let version: String = "11.0.3"
5151
static let configJsonName: String = "config_v6.json"
5252
static let configJsonCacheVersion: String = "v2"
5353
static let globalBaseUrl: String = "https://cdn-global.configcat.com"

Diff for: Tests/ConfigCatTests/AutoPollingTests.swift

+20
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,26 @@ class AutoPollingTests: XCTestCase {
210210

211211
XCTAssertEqual(1, engine.requests.count)
212212
}
213+
214+
func testPollsWhenCacheExpired() {
215+
let engine = MockEngine()
216+
engine.enqueueResponse(response: Response(body: String(format: testJsonFormat, "test1"), statusCode: 200))
217+
218+
let initValue = String(format: testJsonFormat, "test").asEntryString(date: Date().subtract(seconds: 5)!)
219+
let cache = SingleValueCache(initValue: initValue)
220+
let mode = PollingModes.autoPoll(autoPollIntervalInSeconds: 2)
221+
let fetcher = ConfigFetcher(httpEngine: engine, logger: InternalLogger.noLogger, sdkKey: "", mode: mode.identifier, dataGovernance: .global)
222+
let service = ConfigService(log: InternalLogger.noLogger, fetcher: fetcher, cache: cache, pollingMode: mode, hooks: Hooks(), sdkKey: "", offline: false)
223+
224+
let expectation1 = expectation(description: "wait for settings")
225+
service.settings { settingsResult in
226+
XCTAssertEqual("test1", settingsResult.settings["fakeKey"]?.value.stringValue)
227+
expectation1.fulfill()
228+
}
229+
wait(for: [expectation1], timeout: 5)
230+
231+
XCTAssertEqual(1, engine.requests.count)
232+
}
213233

214234
func testOnlineOffline() {
215235
let engine = MockEngine()

0 commit comments

Comments
 (0)