Skip to content

Commit 72846b7

Browse files
1. Turn on concurrency debug. 2. Fix unit tests.
1 parent a3e0e02 commit 72846b7

File tree

5 files changed

+193
-121
lines changed

5 files changed

+193
-121
lines changed

swift-sdk.xcodeproj/xcshareddata/xcschemes/swift-sdk.xcscheme

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,12 @@
183183
ReferencedContainer = "container:swift-sdk.xcodeproj">
184184
</BuildableReference>
185185
</BuildableProductRunnable>
186+
<CommandLineArguments>
187+
<CommandLineArgument
188+
argument = "-com.apple.CoreData.ConcurrencyDebug 1"
189+
isEnabled = "YES">
190+
</CommandLineArgument>
191+
</CommandLineArguments>
186192
</LaunchAction>
187193
<ProfileAction
188194
buildConfiguration = "Release"

tests/common/CommonMocks.swift

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ class MockNetworkSession: NetworkSessionProtocol {
202202
}
203203

204204
var responseCallback: ((URL) -> MockResponse?)?
205+
var queue: DispatchQueue
205206

206207
var timeout: TimeInterval = 60.0
207208

@@ -238,8 +239,10 @@ class MockNetworkSession: NetworkSessionProtocol {
238239
self.init(responseCallback: responseCallback)
239240
}
240241

241-
init(responseCallback: ((URL) -> MockResponse?)?) {
242+
init(responseCallback: ((URL) -> MockResponse?)?,
243+
queue: DispatchQueue = DispatchQueue.main) {
242244
self.responseCallback = responseCallback
245+
self.queue = queue
243246
}
244247

245248
func makeRequest(_ request: URLRequest, completionHandler: @escaping NetworkSessionProtocol.CompletionHandler) {
@@ -261,16 +264,16 @@ class MockNetworkSession: NetworkSessionProtocol {
261264

262265
let delay = mockResponse?.delay ?? 0
263266
if delay == 0 {
264-
DispatchQueue.main.async {
267+
queue.async {
265268
block()
266269
}
267270
} else {
268271
if delay < timeout {
269-
DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
272+
queue.asyncAfter(deadline: .now() + delay) {
270273
block()
271274
}
272275
} else {
273-
DispatchQueue.main.asyncAfter(deadline: .now() + timeout) {
276+
queue.asyncAfter(deadline: .now() + timeout) {
274277
let error = NetworkError(reason: "The request timed out.")
275278
completionHandler(nil, nil, error)
276279
self.callback?(nil, nil, error)
@@ -299,11 +302,11 @@ class MockNetworkSession: NetworkSessionProtocol {
299302

300303
let delay = mockResponse?.delay ?? 0
301304
if delay == 0 {
302-
DispatchQueue.main.async {
305+
queue.async {
303306
block()
304307
}
305308
} else {
306-
DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
309+
queue.asyncAfter(deadline: .now() + delay) {
307310
block()
308311
}
309312
}

tests/offline-events-tests/HealthMonitorTests.swift

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,18 @@ class HealthMonitorTests: XCTestCase {
4747

4848
func testSwitchProcessorsWhenNumTasksExceedsMaxTasks() throws {
4949
let expectation1 = expectation(description: #function)
50-
expectation1.expectedFulfillmentCount = 3
5150
let networkSession = MockNetworkSession(statusCode: 200)
51+
networkSession.queue = DispatchQueue.global(qos: .userInitiated)
5252
var processorMap = [String: String]()
5353
networkSession.requestCallback = { request in
5454
if request.url!.absoluteString.contains(Const.Path.trackEvent) {
5555
let eventName = request.bodyDict["eventName"] as! String
56-
let processor = request.allHTTPHeaderFields?[JsonKey.Header.requestProcessor]!
57-
processorMap[eventName] = processor!
58-
expectation1.fulfill()
56+
let processor = (request.allHTTPHeaderFields?[JsonKey.Header.requestProcessor]!)!
57+
processorMap[eventName] = processor
58+
59+
if eventName == "myEvent", processor == "Offline" {
60+
expectation1.fulfill()
61+
}
5962
}
6063
}
6164
let localStorage = MockLocalStorage()
@@ -66,15 +69,30 @@ class HealthMonitorTests: XCTestCase {
6669
maxTasks: 1)
6770

6871
internalAPI.track("myEvent")
69-
internalAPI.track("myEvent2").onSuccess { _ in
70-
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
71-
internalAPI.track("myEvent3")
72+
73+
wait(for: [expectation1], timeout: testExpectationTimeout)
74+
75+
let changedToOnline = TestUtils.tryUntil(attempts: 10) {
76+
internalAPI.track("myEvent2")
77+
} test: {
78+
if let value = processorMap["myEvent2"], value == "Online" {
79+
return true
80+
} else {
81+
return false
7282
}
7383
}
74-
wait(for: [expectation1], timeout: testExpectationTimeout)
75-
XCTAssertEqual(processorMap["myEvent"], "Offline")
76-
XCTAssertEqual(processorMap["myEvent2"], "Online")
77-
XCTAssertEqual(processorMap["myEvent3"], "Offline")
84+
XCTAssertTrue(changedToOnline)
85+
86+
let changedBackToOffline = TestUtils.tryUntil(attempts: 10) {
87+
internalAPI.track("myEvent3")
88+
} test: {
89+
if let value = processorMap["myEvent3"], value == "Offline" {
90+
return true
91+
} else {
92+
return false
93+
}
94+
}
95+
XCTAssertTrue(changedBackToOffline)
7896
}
7997

8098
func testCountTasksException() throws {

0 commit comments

Comments
 (0)