|
|
@@ -414,4 +414,126 @@ final class AsyncClientCancellationTests: GRPCTestCase {
|
|
|
XCTAssertFalse(error is CancellationError)
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ func testCancelUnary() async throws {
|
|
|
+ // We don't want the RPC to complete before we cancel it so use the never resolving service.
|
|
|
+ let echo = try self.startServerAndClient(service: NeverResolvingEchoProvider())
|
|
|
+
|
|
|
+ do {
|
|
|
+ let get = echo.makeGetCall(.with { $0.text = "foo bar baz" })
|
|
|
+ let task = Task { try await get.initialMetadata }
|
|
|
+ task.cancel()
|
|
|
+ await XCTAssertThrowsError(try await task.value)
|
|
|
+ }
|
|
|
+
|
|
|
+ do {
|
|
|
+ let get = echo.makeGetCall(.with { $0.text = "foo bar baz" })
|
|
|
+ let task = Task { try await get.response }
|
|
|
+ task.cancel()
|
|
|
+ await XCTAssertThrowsError(try await task.value)
|
|
|
+ }
|
|
|
+
|
|
|
+ do {
|
|
|
+ let get = echo.makeGetCall(.with { $0.text = "foo bar baz" })
|
|
|
+ let task = Task { try await get.trailingMetadata }
|
|
|
+ task.cancel()
|
|
|
+ await XCTAssertNoThrowAsync(try await task.value)
|
|
|
+ }
|
|
|
+
|
|
|
+ do {
|
|
|
+ let get = echo.makeGetCall(.with { $0.text = "foo bar baz" })
|
|
|
+ let task = Task { await get.status }
|
|
|
+ task.cancel()
|
|
|
+ let status = await task.value
|
|
|
+ XCTAssertEqual(status.code, .cancelled)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ func testCancelClientStreaming() async throws {
|
|
|
+ // We don't want the RPC to complete before we cancel it so use the never resolving service.
|
|
|
+ let echo = try self.startServerAndClient(service: NeverResolvingEchoProvider())
|
|
|
+
|
|
|
+ do {
|
|
|
+ let collect = echo.makeCollectCall()
|
|
|
+ let task = Task { try await collect.initialMetadata }
|
|
|
+ task.cancel()
|
|
|
+ await XCTAssertThrowsError(try await task.value)
|
|
|
+ }
|
|
|
+
|
|
|
+ do {
|
|
|
+ let collect = echo.makeCollectCall()
|
|
|
+ let task = Task { try await collect.response }
|
|
|
+ task.cancel()
|
|
|
+ await XCTAssertThrowsError(try await task.value)
|
|
|
+ }
|
|
|
+
|
|
|
+ do {
|
|
|
+ let collect = echo.makeCollectCall()
|
|
|
+ let task = Task { try await collect.trailingMetadata }
|
|
|
+ task.cancel()
|
|
|
+ await XCTAssertNoThrowAsync(try await task.value)
|
|
|
+ }
|
|
|
+
|
|
|
+ do {
|
|
|
+ let collect = echo.makeCollectCall()
|
|
|
+ let task = Task { await collect.status }
|
|
|
+ task.cancel()
|
|
|
+ let status = await task.value
|
|
|
+ XCTAssertEqual(status.code, .cancelled)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ func testCancelServerStreaming() async throws {
|
|
|
+ // We don't want the RPC to complete before we cancel it so use the never resolving service.
|
|
|
+ let echo = try self.startServerAndClient(service: NeverResolvingEchoProvider())
|
|
|
+
|
|
|
+ do {
|
|
|
+ let expand = echo.makeExpandCall(.with { $0.text = "foo bar baz" })
|
|
|
+ let task = Task { try await expand.initialMetadata }
|
|
|
+ task.cancel()
|
|
|
+ await XCTAssertThrowsError(try await task.value)
|
|
|
+ }
|
|
|
+
|
|
|
+ do {
|
|
|
+ let expand = echo.makeExpandCall(.with { $0.text = "foo bar baz" })
|
|
|
+ let task = Task { try await expand.trailingMetadata }
|
|
|
+ task.cancel()
|
|
|
+ await XCTAssertNoThrowAsync(try await task.value)
|
|
|
+ }
|
|
|
+
|
|
|
+ do {
|
|
|
+ let expand = echo.makeExpandCall(.with { $0.text = "foo bar baz" })
|
|
|
+ let task = Task { await expand.status }
|
|
|
+ task.cancel()
|
|
|
+ let status = await task.value
|
|
|
+ XCTAssertEqual(status.code, .cancelled)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ func testCancelBidirectionalStreaming() async throws {
|
|
|
+ // We don't want the RPC to complete before we cancel it so use the never resolving service.
|
|
|
+ let echo = try self.startServerAndClient(service: NeverResolvingEchoProvider())
|
|
|
+
|
|
|
+ do {
|
|
|
+ let update = echo.makeUpdateCall()
|
|
|
+ let task = Task { try await update.initialMetadata }
|
|
|
+ task.cancel()
|
|
|
+ await XCTAssertThrowsError(try await task.value)
|
|
|
+ }
|
|
|
+
|
|
|
+ do {
|
|
|
+ let update = echo.makeUpdateCall()
|
|
|
+ let task = Task { try await update.trailingMetadata }
|
|
|
+ task.cancel()
|
|
|
+ await XCTAssertNoThrowAsync(try await task.value)
|
|
|
+ }
|
|
|
+
|
|
|
+ do {
|
|
|
+ let update = echo.makeUpdateCall()
|
|
|
+ let task = Task { await update.status }
|
|
|
+ task.cancel()
|
|
|
+ let status = await task.value
|
|
|
+ XCTAssertEqual(status.code, .cancelled)
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|