@@ -22,18 +22,21 @@ struct TunnelDaemonTests {
2222 let executableURL = try createTempExecutable ( content: longRunningScript)
2323 defer { try ? FileManager . default. removeItem ( at: executableURL) }
2424
25- var failureCalled = false
26- let daemon = try await TunnelDaemon ( binaryPath: executableURL) { _ in
27- failureCalled = true
25+ let ( errors , continuation ) = AsyncStream . makeStream ( of : TunnelDaemonError . self )
26+ let daemon = try await TunnelDaemon ( binaryPath: executableURL) { error in
27+ continuation . yield ( error )
2828 }
2929
3030 await #expect( daemon. state. isRunning)
31- #expect( !failureCalled)
3231 await #expect( daemon. readHandle. fileDescriptor >= 0 )
3332 await #expect( daemon. writeHandle. fileDescriptor >= 0 )
3433
3534 try await daemon. close ( )
3635 await #expect( daemon. state. isStopped)
36+
37+ continuation. finish ( )
38+ let failure = await errors. first ( where: { _ in true } )
39+ #expect( failure == nil , " onFail should not have been called " )
3740 }
3841
3942 @Test func daemonHandlesFailure( ) async throws {
@@ -45,14 +48,16 @@ struct TunnelDaemonTests {
4548 let executableURL = try createTempExecutable ( content: immediateExitScript)
4649 defer { try ? FileManager . default. removeItem ( at: executableURL) }
4750
48- var capturedError : TunnelDaemonError ?
51+ let ( errors , continuation ) = AsyncStream . makeStream ( of : TunnelDaemonError . self )
4952 let daemon = try await TunnelDaemon ( binaryPath: executableURL) { error in
50- capturedError = error
53+ continuation . yield ( error)
5154 }
55+ _ = daemon // ensure daemon stays alive
5256
53- #expect( await eventually ( timeout: . milliseconds( 500 ) , interval: . milliseconds( 10 ) ) { @MainActor in
54- capturedError != nil
55- } )
57+ guard let capturedError = await errors. first ( where: { _ in true } ) else {
58+ Issue . record ( " onFail was never called " )
59+ return
60+ }
5661
5762 if case let . terminated( termination) = capturedError {
5863 if case let . exited( status) = termination {
@@ -61,7 +66,7 @@ struct TunnelDaemonTests {
6166 Issue . record ( " Expected exited termination, got \( termination) " )
6267 }
6368 } else {
64- Issue . record ( " Expected terminated error, got \( String ( describing : capturedError) ) " )
69+ Issue . record ( " Expected terminated error, got \( capturedError) " )
6570 }
6671
6772 await #expect( daemon. state. isFailed)
@@ -77,9 +82,9 @@ struct TunnelDaemonTests {
7782 let executableURL = try createTempExecutable ( content: script)
7883 defer { try ? FileManager . default. removeItem ( at: executableURL) }
7984
80- var capturedError : TunnelDaemonError ?
85+ let ( errors , continuation ) = AsyncStream . makeStream ( of : TunnelDaemonError . self )
8186 let daemon = try await TunnelDaemon ( binaryPath: executableURL) { error in
82- capturedError = error
87+ continuation . yield ( error)
8388 }
8489
8590 await #expect( daemon. state. isRunning)
@@ -91,9 +96,10 @@ struct TunnelDaemonTests {
9196
9297 kill ( pid, SIGKILL)
9398
94- #expect( await eventually ( timeout: . milliseconds( 500 ) , interval: . milliseconds( 10 ) ) { @MainActor in
95- capturedError != nil
96- } )
99+ guard let capturedError = await errors. first ( where: { _ in true } ) else {
100+ Issue . record ( " onFail was never called " )
101+ return
102+ }
97103
98104 if case let . terminated( termination) = capturedError {
99105 if case let . unhandledException( status) = termination {
@@ -102,7 +108,7 @@ struct TunnelDaemonTests {
102108 Issue . record ( " Expected unhandledException termination, got \( termination) " )
103109 }
104110 } else {
105- Issue . record ( " Expected terminated error, got \( String ( describing : capturedError) ) " )
111+ Issue . record ( " Expected terminated error, got \( capturedError) " )
106112 }
107113 }
108114
0 commit comments