Skip to content

Commit b979979

Browse files
nan-licursoragent
andcommitted
fix: make MockOneSignalClient hold/release atomic
Hold check and enqueue share one lock, and releaseHeldResponses clears the hold flag so in-flight test callbacks cannot be stranded. Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent f679286 commit b979979

2 files changed

Lines changed: 10 additions & 8 deletions

File tree

iOS_SDK/OneSignalSDK/OneSignalCoreMocks/MockOneSignalClient.swift

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -102,14 +102,16 @@ public class MockOneSignalClient: NSObject, IOneSignalClient {
102102
public func execute(_ request: OneSignalRequest, onSuccess successBlock: @escaping OSResultSuccessBlock, onFailure failureBlock: @escaping OSClientFailureBlock) {
103103
print("🧪 MockOneSignalClient execute called")
104104

105-
lock.withLock {
105+
// Check hold + enqueue under one lock so releaseHeldResponses can't miss a callback mid-hold.
106+
let shouldHold = lock.withLock { () -> Bool in
106107
startedRequests.append(request)
107-
}
108-
109-
if holdResponses {
110-
lock.withLock {
111-
heldExecutions.append((request, successBlock, failureBlock))
108+
guard holdResponses else {
109+
return false
112110
}
111+
heldExecutions.append((request, successBlock, failureBlock))
112+
return true
113+
}
114+
if shouldHold {
113115
return
114116
}
115117

@@ -122,9 +124,10 @@ public class MockOneSignalClient: NSObject, IOneSignalClient {
122124
}
123125
}
124126

125-
/// Completes every request currently held by `holdResponses`.
127+
/// Completes every request currently held by `holdResponses`, and stops holding further executes.
126128
public func releaseHeldResponses() {
127129
let held: [(request: OneSignalRequest, onSuccess: OSResultSuccessBlock, onFailure: OSClientFailureBlock)] = lock.withLock {
130+
holdResponses = false
128131
let copy = heldExecutions
129132
heldExecutions.removeAll()
130133
return copy

iOS_SDK/OneSignalSDK/OneSignalUserTests/Executors/SubscriptionUpdateRaceTests.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,6 @@ final class SubscriptionUpdateRaceTests: XCTestCase {
180180

181181
XCTAssertEqual(client.startedRequests.count, 1, "Follow-up must wait for in-flight UpdateSubscription")
182182

183-
client.holdResponses = false
184183
client.releaseHeldResponses()
185184
OneSignalCoreMocks.waitForBackgroundThreads(seconds: 0.5)
186185

0 commit comments

Comments
 (0)