Skip to content

Commit 49b207a

Browse files
Add more tests for ThreadLocal and LazyThreadLocal
1 parent 9a141cb commit 49b207a

File tree

2 files changed

+66
-1
lines changed

2 files changed

+66
-1
lines changed

Tests/JavaScriptEventLoopTests/WebWorkerTaskExecutorTests.swift

+50-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#if compiler(>=6.1) && _runtime(_multithreaded)
22
import XCTest
3-
import JavaScriptKit
43
import _CJavaScriptKit // For swjs_get_worker_thread_id
4+
@testable import JavaScriptKit
55
@testable import JavaScriptEventLoop
66

77
@_extern(wasm, module: "JavaScriptEventLoopTestSupportTests", name: "isMainThread")
@@ -151,6 +151,55 @@ final class WebWorkerTaskExecutorTests: XCTestCase {
151151
executor.terminate()
152152
}
153153

154+
func testThreadLocalPerThreadValues() async throws {
155+
struct Check {
156+
@ThreadLocal(boxing: ())
157+
static var value: Int?
158+
}
159+
let executor = try await WebWorkerTaskExecutor(numberOfThreads: 1)
160+
XCTAssertNil(Check.value)
161+
Check.value = 42
162+
XCTAssertEqual(Check.value, 42)
163+
164+
let task = Task(executorPreference: executor) {
165+
XCTAssertEqual(Check.value, nil)
166+
Check.value = 100
167+
XCTAssertEqual(Check.value, 100)
168+
return Check.value
169+
}
170+
let result = await task.value
171+
XCTAssertEqual(result, 100)
172+
XCTAssertEqual(Check.value, 42)
173+
}
174+
175+
func testLazyThreadLocalPerThreadInitialization() async throws {
176+
struct Check {
177+
static var valueToInitialize = 42
178+
static var countOfInitialization = 0
179+
@LazyThreadLocal(initialize: {
180+
countOfInitialization += 1
181+
return valueToInitialize
182+
})
183+
static var value: Int
184+
}
185+
let executor = try await WebWorkerTaskExecutor(numberOfThreads: 1)
186+
XCTAssertEqual(Check.countOfInitialization, 0)
187+
XCTAssertEqual(Check.value, 42)
188+
XCTAssertEqual(Check.countOfInitialization, 1)
189+
190+
Check.valueToInitialize = 100
191+
192+
let task = Task(executorPreference: executor) {
193+
XCTAssertEqual(Check.countOfInitialization, 1)
194+
XCTAssertEqual(Check.value, 100)
195+
XCTAssertEqual(Check.countOfInitialization, 2)
196+
return Check.value
197+
}
198+
let result = await task.value
199+
XCTAssertEqual(result, 100)
200+
XCTAssertEqual(Check.countOfInitialization, 2)
201+
}
202+
154203
/*
155204
func testDeinitJSObjectOnDifferentThread() async throws {
156205
let executor = try await WebWorkerTaskExecutor(numberOfThreads: 1)

Tests/JavaScriptKitTests/ThreadLocalTests.swift

+16
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,16 @@ import XCTest
33

44
final class ThreadLocalTests: XCTestCase {
55
class MyHeapObject {}
6+
struct MyStruct {
7+
var object: MyHeapObject
8+
}
69

710
func testLeak() throws {
811
struct Check {
912
@ThreadLocal
1013
var value: MyHeapObject?
14+
@ThreadLocal(boxing: ())
15+
var value2: MyStruct?
1116
}
1217
weak var weakObject: MyHeapObject?
1318
do {
@@ -19,6 +24,17 @@ final class ThreadLocalTests: XCTestCase {
1924
XCTAssertTrue(check.value === object)
2025
}
2126
XCTAssertNil(weakObject)
27+
28+
weak var weakObject2: MyHeapObject?
29+
do {
30+
let object = MyHeapObject()
31+
weakObject2 = object
32+
let check = Check()
33+
check.value2 = MyStruct(object: object)
34+
XCTAssertNotNil(check.value2)
35+
XCTAssertTrue(check.value2!.object === object)
36+
}
37+
XCTAssertNil(weakObject2)
2238
}
2339

2440
func testLazyThreadLocal() throws {

0 commit comments

Comments
 (0)