Download this file
| 1 | import XCTest |
| 2 | @testable import DocsKit |
| 3 | |
| 4 | final class DocumentPublicationTests: XCTestCase { |
| 5 | @MainActor func testConcurrentRequestsCannotRetireAnUnpublishedSource() async { |
| 6 | let publication = DocumentPublication() |
| 7 | var release: CheckedContinuation<Void, Never>? |
| 8 | var calls = 0, inside = 0, maximum = 0 |
| 9 | let first = Task { @MainActor in |
| 10 | await publication.run { |
| 11 | calls += 1; inside += 1; maximum = max(maximum, inside) |
| 12 | if calls == 1 { await withCheckedContinuation { release = $0 } } |
| 13 | inside -= 1 |
| 14 | } |
| 15 | } |
| 16 | while release == nil { await Task.yield() } |
| 17 | let second = Task { @MainActor in await publication.run { inside += 1; maximum = max(maximum, inside); inside -= 1 } } |
| 18 | await second.value |
| 19 | XCTAssertEqual(maximum, 1) |
| 20 | XCTAssertEqual(calls, 1) |
| 21 | release?.resume() |
| 22 | await first.value |
| 23 | XCTAssertEqual(maximum, 1) |
| 24 | XCTAssertEqual(calls, 2, "A request arriving while awaiting must publish fresh state afterward") |
| 25 | } |
| 26 | } |
| 27 | |