79 lines
2.7 KiB
Swift
79 lines
2.7 KiB
Swift
import Foundation
|
|
import Testing
|
|
@testable import ClawdbotKit
|
|
import ClawdbotProtocol
|
|
|
|
struct GatewayNodeSessionTests {
|
|
@Test
|
|
func invokeWithTimeoutReturnsUnderlyingResponseBeforeTimeout() async {
|
|
let request = BridgeInvokeRequest(id: "1", command: "x", paramsJSON: nil)
|
|
let response = await GatewayNodeSession.invokeWithTimeout(
|
|
request: request,
|
|
timeoutMs: 50,
|
|
onInvoke: { req in
|
|
#expect(req.id == "1")
|
|
return BridgeInvokeResponse(id: req.id, ok: true, payloadJSON: "{}", error: nil)
|
|
}
|
|
)
|
|
|
|
#expect(response.ok == true)
|
|
#expect(response.error == nil)
|
|
#expect(response.payloadJSON == "{}")
|
|
}
|
|
|
|
@Test
|
|
func invokeWithTimeoutReturnsTimeoutError() async {
|
|
let request = BridgeInvokeRequest(id: "abc", command: "x", paramsJSON: nil)
|
|
let response = await GatewayNodeSession.invokeWithTimeout(
|
|
request: request,
|
|
timeoutMs: 10,
|
|
onInvoke: { _ in
|
|
try? await Task.sleep(nanoseconds: 200_000_000) // 200ms
|
|
return BridgeInvokeResponse(id: "abc", ok: true, payloadJSON: "{}", error: nil)
|
|
}
|
|
)
|
|
|
|
#expect(response.ok == false)
|
|
#expect(response.error?.code == .unavailable)
|
|
#expect(response.error?.message.contains("timed out") == true)
|
|
}
|
|
|
|
@Test
|
|
func invokeWithTimeoutReturnsWhenHandlerNeverCompletes() async {
|
|
let request = BridgeInvokeRequest(id: "stall", command: "x", paramsJSON: nil)
|
|
let response = try? await AsyncTimeout.withTimeoutMs(
|
|
timeoutMs: 200,
|
|
onTimeout: { NSError(domain: "GatewayNodeSessionTests", code: 1) },
|
|
operation: {
|
|
await GatewayNodeSession.invokeWithTimeout(
|
|
request: request,
|
|
timeoutMs: 10,
|
|
onInvoke: { _ in
|
|
await withCheckedContinuation { _ in }
|
|
}
|
|
)
|
|
}
|
|
)
|
|
|
|
#expect(response != nil)
|
|
#expect(response?.ok == false)
|
|
#expect(response?.error?.code == .unavailable)
|
|
}
|
|
|
|
@Test
|
|
func invokeWithTimeoutZeroDisablesTimeout() async {
|
|
let request = BridgeInvokeRequest(id: "1", command: "x", paramsJSON: nil)
|
|
let response = await GatewayNodeSession.invokeWithTimeout(
|
|
request: request,
|
|
timeoutMs: 0,
|
|
onInvoke: { req in
|
|
try? await Task.sleep(nanoseconds: 5_000_000)
|
|
return BridgeInvokeResponse(id: req.id, ok: true, payloadJSON: nil, error: nil)
|
|
}
|
|
)
|
|
|
|
#expect(response.ok == true)
|
|
#expect(response.error == nil)
|
|
}
|
|
}
|