Skip to content

Commit 428dc48

Browse files
committed
test: use LockIsolated
1 parent 3b20eb5 commit 428dc48

File tree

2 files changed

+63
-62
lines changed

2 files changed

+63
-62
lines changed

Tests/RealtimeTests/AuthTokenManagerTests.swift

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
// Created on 17/01/25.
66
//
77

8+
import ConcurrencyExtras
89
import Foundation
910
import XCTest
1011

@@ -37,43 +38,43 @@ final class AuthTokenManagerTests: XCTestCase {
3738
}
3839

3940
func testGetCurrentTokenCallsProviderWhenNoToken() async {
40-
var providerCallCount = 0
41+
let providerCallCount = LockIsolated(0)
4142

4243
manager = AuthTokenManager(
4344
initialToken: nil,
4445
tokenProvider: {
45-
providerCallCount += 1
46+
providerCallCount.withValue { $0 += 1 }
4647
return "provider-token"
4748
}
4849
)
4950

5051
let token = await manager.getCurrentToken()
5152

5253
XCTAssertEqual(token, "provider-token")
53-
XCTAssertEqual(providerCallCount, 1)
54+
XCTAssertEqual(providerCallCount.value, 1)
5455

5556
// Second call should use cached token, not call provider again
5657
let token2 = await manager.getCurrentToken()
5758

5859
XCTAssertEqual(token2, "provider-token")
59-
XCTAssertEqual(providerCallCount, 1, "Should not call provider again")
60+
XCTAssertEqual(providerCallCount.value, 1, "Should not call provider again")
6061
}
6162

6263
func testGetCurrentTokenReturnsInitialTokenWithoutCallingProvider() async {
63-
var providerCallCount = 0
64+
let providerCallCount = LockIsolated(0)
6465

6566
manager = AuthTokenManager(
6667
initialToken: "initial-token",
6768
tokenProvider: {
68-
providerCallCount += 1
69+
providerCallCount.withValue { $0 += 1 }
6970
return "provider-token"
7071
}
7172
)
7273

7374
let token = await manager.getCurrentToken()
7475

7576
XCTAssertEqual(token, "initial-token")
76-
XCTAssertEqual(providerCallCount, 0, "Should not call provider when token exists")
77+
XCTAssertEqual(providerCallCount.value, 0, "Should not call provider when token exists")
7778
}
7879

7980
func testUpdateTokenReturnsTrueWhenChanged() async {
@@ -107,26 +108,28 @@ final class AuthTokenManagerTests: XCTestCase {
107108
}
108109

109110
func testRefreshTokenCallsProvider() async {
110-
var providerCallCount = 0
111+
let providerCallCount = LockIsolated(0)
111112

112113
manager = AuthTokenManager(
113114
initialToken: "initial-token",
114115
tokenProvider: {
115-
providerCallCount += 1
116-
return "refreshed-token-\(providerCallCount)"
116+
providerCallCount.withValue {
117+
$0 += 1
118+
return "refreshed-token-\($0)"
119+
}
117120
}
118121
)
119122

120123
let token1 = await manager.refreshToken()
121124

122125
XCTAssertEqual(token1, "refreshed-token-1")
123-
XCTAssertEqual(providerCallCount, 1)
126+
XCTAssertEqual(providerCallCount.value, 1)
124127

125128
// Refresh again
126129
let token2 = await manager.refreshToken()
127130

128131
XCTAssertEqual(token2, "refreshed-token-2")
129-
XCTAssertEqual(providerCallCount, 2)
132+
XCTAssertEqual(providerCallCount.value, 2)
130133
}
131134

132135
func testRefreshTokenWithoutProviderReturnsCurrentToken() async {

Tests/RealtimeTests/MessageRouterTests.swift

Lines changed: 48 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
// Created on 17/01/25.
66
//
77

8+
import ConcurrencyExtras
89
import Foundation
910
import XCTest
1011

@@ -41,15 +42,15 @@ final class MessageRouterTests: XCTestCase {
4142
// MARK: - Tests
4243

4344
func testRouteToRegisteredChannel() async {
44-
var channelAMessages: [RealtimeMessageV2] = []
45-
var channelBMessages: [RealtimeMessageV2] = []
45+
let channelAMessages = LockIsolated([RealtimeMessageV2]())
46+
let channelBMessages = LockIsolated([RealtimeMessageV2]())
4647

4748
await router.registerChannel(topic: "channel-a") { message in
48-
channelAMessages.append(message)
49+
channelAMessages.withValue { $0.append(message) }
4950
}
5051

5152
await router.registerChannel(topic: "channel-b") { message in
52-
channelBMessages.append(message)
53+
channelBMessages.withValue { $0.append(message) }
5354
}
5455

5556
let messageA = makeMessage(topic: "channel-a", event: "test")
@@ -58,11 +59,11 @@ final class MessageRouterTests: XCTestCase {
5859
await router.route(messageA)
5960
await router.route(messageB)
6061

61-
XCTAssertEqual(channelAMessages.count, 1)
62-
XCTAssertEqual(channelAMessages.first?.topic, "channel-a")
62+
XCTAssertEqual(channelAMessages.value.count, 1)
63+
XCTAssertEqual(channelAMessages.value.first?.topic, "channel-a")
6364

64-
XCTAssertEqual(channelBMessages.count, 1)
65-
XCTAssertEqual(channelBMessages.first?.topic, "channel-b")
65+
XCTAssertEqual(channelBMessages.value.count, 1)
66+
XCTAssertEqual(channelBMessages.value.first?.topic, "channel-b")
6667
}
6768

6869
func testRouteToUnregisteredChannelDoesNotCrash() async {
@@ -73,10 +74,10 @@ final class MessageRouterTests: XCTestCase {
7374
}
7475

7576
func testSystemHandlerReceivesAllMessages() async {
76-
var systemMessages: [RealtimeMessageV2] = []
77+
let systemMessages = LockIsolated([RealtimeMessageV2]())
7778

7879
await router.registerSystemHandler { message in
79-
systemMessages.append(message)
80+
systemMessages.withValue { $0.append(message) }
8081
}
8182

8283
let message1 = makeMessage(topic: "channel-a", event: "event1")
@@ -87,42 +88,42 @@ final class MessageRouterTests: XCTestCase {
8788
await router.route(message2)
8889
await router.route(message3)
8990

90-
XCTAssertEqual(systemMessages.count, 3)
91-
XCTAssertEqual(systemMessages[0].topic, "channel-a")
92-
XCTAssertEqual(systemMessages[1].topic, "channel-b")
93-
XCTAssertEqual(systemMessages[2].topic, "channel-c")
91+
XCTAssertEqual(systemMessages.value.count, 3)
92+
XCTAssertEqual(systemMessages.value[0].topic, "channel-a")
93+
XCTAssertEqual(systemMessages.value[1].topic, "channel-b")
94+
XCTAssertEqual(systemMessages.value[2].topic, "channel-c")
9495
}
9596

9697
func testBothSystemAndChannelHandlersReceiveMessage() async {
97-
var systemMessages: [RealtimeMessageV2] = []
98-
var channelMessages: [RealtimeMessageV2] = []
98+
let systemMessages = LockIsolated([RealtimeMessageV2]())
99+
let channelMessages = LockIsolated([RealtimeMessageV2]())
99100

100101
await router.registerSystemHandler { message in
101-
systemMessages.append(message)
102+
systemMessages.withValue { $0.append(message) }
102103
}
103104

104105
await router.registerChannel(topic: "test-channel") { message in
105-
channelMessages.append(message)
106+
channelMessages.withValue { $0.append(message) }
106107
}
107108

108109
let message = makeMessage(topic: "test-channel", event: "test")
109110
await router.route(message)
110111

111-
XCTAssertEqual(systemMessages.count, 1)
112-
XCTAssertEqual(channelMessages.count, 1)
112+
XCTAssertEqual(systemMessages.value.count, 1)
113+
XCTAssertEqual(channelMessages.value.count, 1)
113114
}
114115

115116
func testUnregisterChannelStopsRoutingToIt() async {
116-
var channelMessages: [RealtimeMessageV2] = []
117+
let channelMessages = LockIsolated([RealtimeMessageV2]())
117118

118119
await router.registerChannel(topic: "test-channel") { message in
119-
channelMessages.append(message)
120+
channelMessages.withValue { $0.append(message) }
120121
}
121122

122123
let message1 = makeMessage(topic: "test-channel", event: "test1")
123124
await router.route(message1)
124125

125-
XCTAssertEqual(channelMessages.count, 1)
126+
XCTAssertEqual(channelMessages.value.count, 1)
126127

127128
// Unregister
128129
await router.unregisterChannel(topic: "test-channel")
@@ -131,47 +132,47 @@ final class MessageRouterTests: XCTestCase {
131132
await router.route(message2)
132133

133134
// Should still be 1 (not routed after unregister)
134-
XCTAssertEqual(channelMessages.count, 1)
135+
XCTAssertEqual(channelMessages.value.count, 1)
135136
}
136137

137138
func testReregisterChannelReplacesHandler() async {
138-
var handler1Messages: [RealtimeMessageV2] = []
139-
var handler2Messages: [RealtimeMessageV2] = []
139+
let handler1Messages = LockIsolated([RealtimeMessageV2]())
140+
let handler2Messages = LockIsolated([RealtimeMessageV2]())
140141

141142
await router.registerChannel(topic: "test-channel") { message in
142-
handler1Messages.append(message)
143+
handler1Messages.withValue { $0.append(message) }
143144
}
144145

145146
let message1 = makeMessage(topic: "test-channel", event: "test1")
146147
await router.route(message1)
147148

148-
XCTAssertEqual(handler1Messages.count, 1)
149-
XCTAssertEqual(handler2Messages.count, 0)
149+
XCTAssertEqual(handler1Messages.value.count, 1)
150+
XCTAssertEqual(handler2Messages.value.count, 0)
150151

151152
// Re-register with new handler
152153
await router.registerChannel(topic: "test-channel") { message in
153-
handler2Messages.append(message)
154+
handler2Messages.withValue { $0.append(message) }
154155
}
155156

156157
let message2 = makeMessage(topic: "test-channel", event: "test2")
157158
await router.route(message2)
158159

159160
// First handler should not receive second message
160-
XCTAssertEqual(handler1Messages.count, 1)
161+
XCTAssertEqual(handler1Messages.value.count, 1)
161162
// Second handler should receive it
162-
XCTAssertEqual(handler2Messages.count, 1)
163+
XCTAssertEqual(handler2Messages.value.count, 1)
163164
}
164165

165166
func testResetRemovesAllHandlers() async {
166-
var channelMessages: [RealtimeMessageV2] = []
167-
var systemMessages: [RealtimeMessageV2] = []
167+
let channelMessages = LockIsolated([RealtimeMessageV2]())
168+
let systemMessages = LockIsolated([RealtimeMessageV2]())
168169

169170
await router.registerChannel(topic: "channel-a") { message in
170-
channelMessages.append(message)
171+
channelMessages.withValue { $0.append(message) }
171172
}
172173

173174
await router.registerSystemHandler { message in
174-
systemMessages.append(message)
175+
systemMessages.withValue { $0.append(message) }
175176
}
176177

177178
let message1 = makeMessage(topic: "channel-a", event: "test1")
@@ -187,8 +188,8 @@ final class MessageRouterTests: XCTestCase {
187188
await router.route(message2)
188189

189190
// No more messages after reset
190-
XCTAssertEqual(channelMessages.count, 1)
191-
XCTAssertEqual(systemMessages.count, 1)
191+
XCTAssertEqual(channelMessages.value.count, 1)
192+
XCTAssertEqual(systemMessages.value.count, 1)
192193
}
193194

194195
func testChannelCountReflectsRegistrations() async {
@@ -213,32 +214,29 @@ final class MessageRouterTests: XCTestCase {
213214
}
214215

215216
func testMultipleSystemHandlers() async {
216-
var system1Messages: [RealtimeMessageV2] = []
217-
var system2Messages: [RealtimeMessageV2] = []
217+
let system1Messages = LockIsolated([RealtimeMessageV2]())
218+
let system2Messages = LockIsolated([RealtimeMessageV2]())
218219

219220
await router.registerSystemHandler { message in
220-
system1Messages.append(message)
221+
system1Messages.withValue { $0.append(message) }
221222
}
222223

223224
await router.registerSystemHandler { message in
224-
system2Messages.append(message)
225+
system2Messages.withValue { $0.append(message) }
225226
}
226227

227228
let message = makeMessage(topic: "test", event: "test")
228229
await router.route(message)
229230

230-
XCTAssertEqual(system1Messages.count, 1)
231-
XCTAssertEqual(system2Messages.count, 1)
231+
XCTAssertEqual(system1Messages.value.count, 1)
232+
XCTAssertEqual(system2Messages.value.count, 1)
232233
}
233234

234235
func testConcurrentRouting() async {
235-
var receivedCount = 0
236-
let lock = NSLock()
236+
let receivedCount = LockIsolated(0)
237237

238238
await router.registerChannel(topic: "test-channel") { _ in
239-
lock.lock()
240-
receivedCount += 1
241-
lock.unlock()
239+
receivedCount.withValue { $0 += 1 }
242240
}
243241

244242
// Route messages concurrently
@@ -253,6 +251,6 @@ final class MessageRouterTests: XCTestCase {
253251
await group.waitForAll()
254252
}
255253

256-
XCTAssertEqual(receivedCount, 100, "Should receive all messages")
254+
XCTAssertEqual(receivedCount.value, 100, "Should receive all messages")
257255
}
258256
}

0 commit comments

Comments
 (0)