GRPCChannelHandlerTests.swift 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import Foundation
  2. import XCTest
  3. import NIO
  4. import NIOHTTP1
  5. @testable import SwiftGRPCNIO
  6. class GRPCChannelHandlerTests: GRPCChannelHandlerResponseCapturingTestCase {
  7. static var allTests: [(String, (GRPCChannelHandlerTests) -> () throws -> Void)] {
  8. return [
  9. ("testUnimplementedMethodReturnsUnimplementedStatus", testUnimplementedMethodReturnsUnimplementedStatus),
  10. ("testImplementedMethodReturnsHeadersMessageAndStatus", testImplementedMethodReturnsHeadersMessageAndStatus),
  11. ("testImplementedMethodReturnsStatusForBadlyFormedProto", testImplementedMethodReturnsStatusForBadlyFormedProto),
  12. ]
  13. }
  14. func testUnimplementedMethodReturnsUnimplementedStatus() throws {
  15. let responses = try waitForGRPCChannelHandlerResponses(count: 1) { channel in
  16. let requestHead = HTTPRequestHead(version: .init(major: 2, minor: 0), method: .POST, uri: "unimplementedMethodName")
  17. try channel.writeInbound(RawGRPCServerRequestPart.head(requestHead))
  18. }
  19. let expectedError = GRPCServerError.unimplementedMethod("unimplementedMethodName")
  20. XCTAssertEqual([expectedError], errorCollector.asGRPCServerErrors)
  21. responses[0].assertStatus { status in
  22. XCTAssertEqual(status, expectedError.asGRPCStatus())
  23. }
  24. }
  25. func testImplementedMethodReturnsHeadersMessageAndStatus() throws {
  26. let responses = try waitForGRPCChannelHandlerResponses(count: 3) { channel in
  27. let requestHead = HTTPRequestHead(version: .init(major: 2, minor: 0), method: .POST, uri: "/echo.Echo/Get")
  28. try channel.writeInbound(RawGRPCServerRequestPart.head(requestHead))
  29. let request = Echo_EchoRequest.with { $0.text = "echo!" }
  30. let requestData = try request.serializedData()
  31. var buffer = channel.allocator.buffer(capacity: requestData.count)
  32. buffer.writeBytes(requestData)
  33. try channel.writeInbound(RawGRPCServerRequestPart.message(buffer))
  34. }
  35. responses[0].assertHeaders()
  36. responses[1].assertMessage()
  37. responses[2].assertStatus { status in
  38. XCTAssertEqual(status.code, .ok)
  39. }
  40. }
  41. func testImplementedMethodReturnsStatusForBadlyFormedProto() throws {
  42. let responses = try waitForGRPCChannelHandlerResponses(count: 2) { channel in
  43. let requestHead = HTTPRequestHead(version: .init(major: 2, minor: 0), method: .POST, uri: "/echo.Echo/Get")
  44. try channel.writeInbound(RawGRPCServerRequestPart.head(requestHead))
  45. var buffer = channel.allocator.buffer(capacity: 3)
  46. buffer.writeBytes([1, 2, 3])
  47. try channel.writeInbound(RawGRPCServerRequestPart.message(buffer))
  48. }
  49. let expectedError = GRPCServerError.requestProtoDeserializationFailure
  50. XCTAssertEqual([expectedError], errorCollector.asGRPCServerErrors)
  51. responses[0].assertHeaders()
  52. responses[1].assertStatus { status in
  53. XCTAssertEqual(status, expectedError.asGRPCStatus())
  54. }
  55. }
  56. }