HTTP1ToGRPCServerCodecTests.swift 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. /*
  2. * Copyright 2019, gRPC Authors All rights reserved.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. import EchoImplementation
  17. import EchoModel
  18. import Foundation
  19. @testable import GRPC
  20. import Logging
  21. import NIO
  22. import NIOHTTP1
  23. import XCTest
  24. class HTTP1ToGRPCServerCodecTests: GRPCTestCase {
  25. var channel: EmbeddedChannel!
  26. override func setUp() {
  27. super.setUp()
  28. let handler = HTTP1ToGRPCServerCodec(encoding: .disabled, logger: self.logger)
  29. self.channel = EmbeddedChannel(handler: handler)
  30. }
  31. override func tearDown() {
  32. XCTAssertNoThrow(try self.channel.finish())
  33. super.tearDown()
  34. }
  35. func makeRequestHead() -> HTTPRequestHead {
  36. return HTTPRequestHead(
  37. version: .init(major: 2, minor: 0),
  38. method: .POST,
  39. uri: "/echo.Echo/Get"
  40. )
  41. }
  42. func testSingleMessageFromMultipleBodyParts() throws {
  43. XCTAssertNoThrow(
  44. try self.channel
  45. .writeInbound(HTTPServerRequestPart.head(self.makeRequestHead()))
  46. )
  47. let requestPart = try self.channel.readInbound(as: _RawGRPCServerRequestPart.self)
  48. switch requestPart {
  49. case .some(.head):
  50. ()
  51. default:
  52. XCTFail("Unexpected request part: \(String(describing: requestPart))")
  53. }
  54. // Write a message across multiple buffers.
  55. let message = Echo_EchoRequest.with { $0.text = String(repeating: "x", count: 42) }
  56. let data = try message.serializedData()
  57. // Split the payload into two parts.
  58. let halfIndex = data.count / 2
  59. let firstChunk = data[0 ..< halfIndex]
  60. let secondChunk = data[halfIndex...]
  61. // Frame the message; send it in 2 parts.
  62. var firstBuffer = self.channel.allocator.buffer(capacity: firstChunk.count + 5)
  63. firstBuffer.writeInteger(UInt8(0))
  64. firstBuffer.writeInteger(UInt32(data.count))
  65. firstBuffer.writeBytes(firstChunk)
  66. XCTAssertNoThrow(try self.channel.writeInbound(HTTPServerRequestPart.body(firstBuffer)))
  67. var secondBuffer = self.channel.allocator.buffer(capacity: secondChunk.count)
  68. secondBuffer.writeBytes(secondChunk)
  69. XCTAssertNoThrow(try self.channel.writeInbound(HTTPServerRequestPart.body(secondBuffer)))
  70. let messagePart = try self.channel.readInbound(as: _RawGRPCServerRequestPart.self)
  71. switch messagePart {
  72. case var .some(.message(buffer)):
  73. XCTAssertEqual(data, buffer.readData(length: buffer.readableBytes)!)
  74. default:
  75. XCTFail("Unexpected request part: \(String(describing: requestPart))")
  76. }
  77. }
  78. func testMultipleMessagesFromSingleBodyPart() throws {
  79. XCTAssertNoThrow(
  80. try self.channel
  81. .writeInbound(HTTPServerRequestPart.head(self.makeRequestHead()))
  82. )
  83. let requestPart = try self.channel.readInbound(as: _RawGRPCServerRequestPart.self)
  84. switch requestPart {
  85. case .some(.head):
  86. ()
  87. default:
  88. XCTFail("Unexpected request part: \(String(describing: requestPart))")
  89. }
  90. // Write three messages into a single body.
  91. var buffer = self.channel.allocator.buffer(capacity: 0)
  92. let serializedMessages: [Data] = try ["foo", "bar", "baz"].map { text in
  93. Echo_EchoRequest.with { $0.text = text }
  94. }.map { request in
  95. try request.serializedData()
  96. }
  97. for data in serializedMessages {
  98. buffer.writeInteger(UInt8(0))
  99. buffer.writeInteger(UInt32(data.count))
  100. buffer.writeBytes(data)
  101. }
  102. XCTAssertNoThrow(try self.channel.writeInbound(HTTPServerRequestPart.body(buffer)))
  103. for message in serializedMessages {
  104. let requestPart = try self.channel.readInbound(as: _RawGRPCServerRequestPart.self)
  105. switch requestPart {
  106. case var .some(.message(buffer)):
  107. XCTAssertEqual(message, buffer.readData(length: buffer.readableBytes)!)
  108. default:
  109. XCTFail("Unexpected request part: \(String(describing: requestPart))")
  110. }
  111. }
  112. }
  113. }