UnaryServerHandlerTests.swift 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666
  1. /*
  2. * Copyright 2021, 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. @testable import GRPC
  17. import NIO
  18. import NIOHPACK
  19. import XCTest
  20. // MARK: - Utils
  21. final class ResponseRecorder: GRPCServerResponseWriter {
  22. var metadata: HPACKHeaders?
  23. var messages: [ByteBuffer] = []
  24. var status: GRPCStatus?
  25. var trailers: HPACKHeaders?
  26. func sendMetadata(_ metadata: HPACKHeaders, promise: EventLoopPromise<Void>?) {
  27. XCTAssertNil(self.metadata)
  28. self.metadata = metadata
  29. promise?.succeed(())
  30. }
  31. func sendMessage(
  32. _ bytes: ByteBuffer,
  33. metadata: MessageMetadata,
  34. promise: EventLoopPromise<Void>?
  35. ) {
  36. self.messages.append(bytes)
  37. promise?.succeed(())
  38. }
  39. func sendEnd(status: GRPCStatus, trailers: HPACKHeaders, promise: EventLoopPromise<Void>?) {
  40. XCTAssertNil(self.status)
  41. XCTAssertNil(self.trailers)
  42. self.status = status
  43. self.trailers = trailers
  44. promise?.succeed(())
  45. }
  46. }
  47. protocol ServerHandlerTestCase: GRPCTestCase {
  48. var eventLoop: EmbeddedEventLoop { get }
  49. var allocator: ByteBufferAllocator { get }
  50. var recorder: ResponseRecorder { get }
  51. }
  52. extension ServerHandlerTestCase {
  53. func makeCallHandlerContext() -> CallHandlerContext {
  54. return CallHandlerContext(
  55. errorDelegate: nil,
  56. logger: self.logger,
  57. encoding: .disabled,
  58. eventLoop: self.eventLoop,
  59. path: "/ignored",
  60. remoteAddress: nil,
  61. responseWriter: self.recorder,
  62. allocator: self.allocator
  63. )
  64. }
  65. }
  66. // MARK: - Unary
  67. class UnaryServerHandlerTests: GRPCTestCase, ServerHandlerTestCase {
  68. let eventLoop = EmbeddedEventLoop()
  69. let allocator = ByteBufferAllocator()
  70. let recorder = ResponseRecorder()
  71. private func makeHandler(
  72. function: @escaping (String, StatusOnlyCallContext) -> EventLoopFuture<String>
  73. ) -> UnaryServerHandler<StringSerializer, StringDeserializer> {
  74. return UnaryServerHandler(
  75. context: self.makeCallHandlerContext(),
  76. requestDeserializer: StringDeserializer(),
  77. responseSerializer: StringSerializer(),
  78. interceptors: [],
  79. userFunction: function
  80. )
  81. }
  82. private func echo(_ request: String, context: StatusOnlyCallContext) -> EventLoopFuture<String> {
  83. return context.eventLoop.makeSucceededFuture(request)
  84. }
  85. private func neverComplete(
  86. _ request: String,
  87. context: StatusOnlyCallContext
  88. ) -> EventLoopFuture<String> {
  89. let scheduled = context.eventLoop.scheduleTask(deadline: .distantFuture) {
  90. return request
  91. }
  92. return scheduled.futureResult
  93. }
  94. private func neverCalled(
  95. _ request: String,
  96. context: StatusOnlyCallContext
  97. ) -> EventLoopFuture<String> {
  98. XCTFail("Unexpected function invocation")
  99. return context.eventLoop.makeFailedFuture(GRPCError.InvalidState(""))
  100. }
  101. func testHappyPath() {
  102. let handler = self.makeHandler(function: self.echo(_:context:))
  103. handler.receiveMetadata([:])
  104. assertThat(self.recorder.metadata, .is([:]))
  105. let buffer = ByteBuffer(string: "hello")
  106. handler.receiveMessage(buffer)
  107. handler.receiveEnd()
  108. handler.finish()
  109. assertThat(self.recorder.messages.first, .is(buffer))
  110. assertThat(self.recorder.status, .notNil(.hasCode(.ok)))
  111. assertThat(self.recorder.trailers, .is([:]))
  112. }
  113. func testThrowingDeserializer() {
  114. let handler = UnaryServerHandler(
  115. context: self.makeCallHandlerContext(),
  116. requestDeserializer: ThrowingStringDeserializer(),
  117. responseSerializer: StringSerializer(),
  118. interceptors: [],
  119. userFunction: self.neverCalled(_:context:)
  120. )
  121. handler.receiveMetadata([:])
  122. assertThat(self.recorder.metadata, .is([:]))
  123. let buffer = ByteBuffer(string: "hello")
  124. handler.receiveMessage(buffer)
  125. assertThat(self.recorder.messages, .isEmpty())
  126. assertThat(self.recorder.status, .notNil(.hasCode(.internalError)))
  127. }
  128. func testThrowingSerializer() {
  129. let handler = UnaryServerHandler(
  130. context: self.makeCallHandlerContext(),
  131. requestDeserializer: StringDeserializer(),
  132. responseSerializer: ThrowingStringSerializer(),
  133. interceptors: [],
  134. userFunction: self.echo(_:context:)
  135. )
  136. handler.receiveMetadata([:])
  137. assertThat(self.recorder.metadata, .is([:]))
  138. let buffer = ByteBuffer(string: "hello")
  139. handler.receiveMessage(buffer)
  140. handler.receiveEnd()
  141. assertThat(self.recorder.messages, .isEmpty())
  142. assertThat(self.recorder.status, .notNil(.hasCode(.internalError)))
  143. }
  144. func testUserFunctionReturnsFailedFuture() {
  145. let handler = self.makeHandler { _, context in
  146. return context.eventLoop.makeFailedFuture(GRPCStatus(code: .unavailable, message: ":("))
  147. }
  148. handler.receiveMetadata([:])
  149. assertThat(self.recorder.metadata, .is([:]))
  150. let buffer = ByteBuffer(string: "hello")
  151. handler.receiveMessage(buffer)
  152. assertThat(self.recorder.messages, .isEmpty())
  153. assertThat(self.recorder.status, .notNil(.hasCode(.unavailable)))
  154. assertThat(self.recorder.status?.message, .is(":("))
  155. }
  156. func testReceiveMessageBeforeHeaders() {
  157. let handler = self.makeHandler(function: self.neverCalled(_:context:))
  158. handler.receiveMessage(ByteBuffer(string: "foo"))
  159. assertThat(self.recorder.metadata, .is(.nil()))
  160. assertThat(self.recorder.messages, .isEmpty())
  161. assertThat(self.recorder.status, .notNil(.hasCode(.internalError)))
  162. }
  163. func testReceiveMultipleHeaders() {
  164. let handler = self.makeHandler(function: self.neverCalled(_:context:))
  165. handler.receiveMetadata([:])
  166. assertThat(self.recorder.metadata, .is([:]))
  167. handler.receiveMetadata([:])
  168. assertThat(self.recorder.messages, .isEmpty())
  169. assertThat(self.recorder.status, .notNil(.hasCode(.internalError)))
  170. }
  171. func testReceiveMultipleMessages() {
  172. let handler = self.makeHandler(function: self.neverComplete(_:context:))
  173. handler.receiveMetadata([:])
  174. assertThat(self.recorder.metadata, .is([:]))
  175. let buffer = ByteBuffer(string: "hello")
  176. handler.receiveMessage(buffer)
  177. handler.receiveEnd()
  178. // Send another message before the function completes.
  179. handler.receiveMessage(buffer)
  180. assertThat(self.recorder.messages, .isEmpty())
  181. assertThat(self.recorder.status, .notNil(.hasCode(.internalError)))
  182. }
  183. func testFinishBeforeStarting() {
  184. let handler = self.makeHandler(function: self.neverCalled(_:context:))
  185. handler.finish()
  186. assertThat(self.recorder.metadata, .is(.nil()))
  187. assertThat(self.recorder.messages, .isEmpty())
  188. assertThat(self.recorder.status, .is(.nil()))
  189. assertThat(self.recorder.trailers, .is(.nil()))
  190. }
  191. func testFinishAfterHeaders() {
  192. let handler = self.makeHandler(function: self.neverCalled(_:context:))
  193. handler.receiveMetadata([:])
  194. assertThat(self.recorder.metadata, .is([:]))
  195. handler.finish()
  196. assertThat(self.recorder.messages, .isEmpty())
  197. assertThat(self.recorder.status, .notNil(.hasCode(.unavailable)))
  198. assertThat(self.recorder.trailers, .is([:]))
  199. }
  200. func testFinishAfterMessage() {
  201. let handler = self.makeHandler(function: self.neverComplete(_:context:))
  202. handler.receiveMetadata([:])
  203. handler.receiveMessage(ByteBuffer(string: "hello"))
  204. handler.finish()
  205. assertThat(self.recorder.messages, .isEmpty())
  206. assertThat(self.recorder.status, .notNil(.hasCode(.unavailable)))
  207. assertThat(self.recorder.trailers, .is([:]))
  208. }
  209. }
  210. // MARK: - Client Streaming
  211. class ClientStreamingServerHandlerTests: GRPCTestCase, ServerHandlerTestCase {
  212. let eventLoop = EmbeddedEventLoop()
  213. let allocator = ByteBufferAllocator()
  214. let recorder = ResponseRecorder()
  215. private func makeHandler(
  216. observerFactory: @escaping (UnaryResponseCallContext<String>)
  217. -> EventLoopFuture<(StreamEvent<String>) -> Void>
  218. ) -> ClientStreamingServerHandler<StringSerializer, StringDeserializer> {
  219. return ClientStreamingServerHandler(
  220. context: self.makeCallHandlerContext(),
  221. requestDeserializer: StringDeserializer(),
  222. responseSerializer: StringSerializer(),
  223. interceptors: [],
  224. observerFactory: observerFactory
  225. )
  226. }
  227. private func joinWithSpaces(
  228. context: UnaryResponseCallContext<String>
  229. ) -> EventLoopFuture<(StreamEvent<String>) -> Void> {
  230. var messages: [String] = []
  231. func onEvent(_ event: StreamEvent<String>) {
  232. switch event {
  233. case let .message(message):
  234. messages.append(message)
  235. case .end:
  236. context.responsePromise.succeed(messages.joined(separator: " "))
  237. }
  238. }
  239. return context.eventLoop.makeSucceededFuture(onEvent(_:))
  240. }
  241. private func neverReceivesMessage(
  242. context: UnaryResponseCallContext<String>
  243. ) -> EventLoopFuture<(StreamEvent<String>) -> Void> {
  244. func onEvent(_ event: StreamEvent<String>) {
  245. switch event {
  246. case let .message(message):
  247. XCTFail("Unexpected message: '\(message)'")
  248. case .end:
  249. context.responsePromise.succeed("")
  250. }
  251. }
  252. return context.eventLoop.makeSucceededFuture(onEvent(_:))
  253. }
  254. private func neverCalled(
  255. context: UnaryResponseCallContext<String>
  256. ) -> EventLoopFuture<(StreamEvent<String>) -> Void> {
  257. XCTFail("This observer factory should never be called")
  258. return context.eventLoop.makeFailedFuture(GRPCStatus(code: .aborted, message: nil))
  259. }
  260. func testHappyPath() {
  261. let handler = self.makeHandler(observerFactory: self.joinWithSpaces(context:))
  262. handler.receiveMetadata([:])
  263. assertThat(self.recorder.metadata, .is([:]))
  264. handler.receiveMessage(ByteBuffer(string: "1"))
  265. handler.receiveMessage(ByteBuffer(string: "2"))
  266. handler.receiveMessage(ByteBuffer(string: "3"))
  267. handler.receiveEnd()
  268. handler.finish()
  269. assertThat(self.recorder.messages.first, .is(ByteBuffer(string: "1 2 3")))
  270. assertThat(self.recorder.status, .notNil(.hasCode(.ok)))
  271. assertThat(self.recorder.trailers, .is([:]))
  272. }
  273. func testThrowingDeserializer() {
  274. let handler = ClientStreamingServerHandler(
  275. context: self.makeCallHandlerContext(),
  276. requestDeserializer: ThrowingStringDeserializer(),
  277. responseSerializer: StringSerializer(),
  278. interceptors: [],
  279. observerFactory: self.neverReceivesMessage(context:)
  280. )
  281. handler.receiveMetadata([:])
  282. assertThat(self.recorder.metadata, .is([:]))
  283. let buffer = ByteBuffer(string: "hello")
  284. handler.receiveMessage(buffer)
  285. assertThat(self.recorder.messages, .isEmpty())
  286. assertThat(self.recorder.status, .notNil(.hasCode(.internalError)))
  287. }
  288. func testThrowingSerializer() {
  289. let handler = ClientStreamingServerHandler(
  290. context: self.makeCallHandlerContext(),
  291. requestDeserializer: StringDeserializer(),
  292. responseSerializer: ThrowingStringSerializer(),
  293. interceptors: [],
  294. observerFactory: self.joinWithSpaces(context:)
  295. )
  296. handler.receiveMetadata([:])
  297. assertThat(self.recorder.metadata, .is([:]))
  298. let buffer = ByteBuffer(string: "hello")
  299. handler.receiveMessage(buffer)
  300. handler.receiveEnd()
  301. assertThat(self.recorder.messages, .isEmpty())
  302. assertThat(self.recorder.status, .notNil(.hasCode(.internalError)))
  303. }
  304. func testObserverFactoryReturnsFailedFuture() {
  305. let handler = self.makeHandler { context in
  306. context.eventLoop.makeFailedFuture(GRPCStatus(code: .unavailable, message: ":("))
  307. }
  308. handler.receiveMetadata([:])
  309. assertThat(self.recorder.messages, .isEmpty())
  310. assertThat(self.recorder.status, .notNil(.hasCode(.unavailable)))
  311. assertThat(self.recorder.status?.message, .is(":("))
  312. }
  313. func testDelayedObserverFactory() {
  314. let promise = self.eventLoop.makePromise(of: Void.self)
  315. let handler = self.makeHandler { context in
  316. return promise.futureResult.flatMap {
  317. self.joinWithSpaces(context: context)
  318. }
  319. }
  320. handler.receiveMetadata([:])
  321. // Queue up some messages.
  322. handler.receiveMessage(ByteBuffer(string: "1"))
  323. handler.receiveMessage(ByteBuffer(string: "2"))
  324. handler.receiveMessage(ByteBuffer(string: "3"))
  325. // Succeed the observer block.
  326. promise.succeed(())
  327. // A few more messages.
  328. handler.receiveMessage(ByteBuffer(string: "4"))
  329. handler.receiveMessage(ByteBuffer(string: "5"))
  330. handler.receiveEnd()
  331. assertThat(self.recorder.messages.first, .is(ByteBuffer(string: "1 2 3 4 5")))
  332. assertThat(self.recorder.status, .notNil(.hasCode(.ok)))
  333. }
  334. func testDelayedObserverFactoryAllMessagesBeforeSucceeding() {
  335. let promise = self.eventLoop.makePromise(of: Void.self)
  336. let handler = self.makeHandler { context in
  337. return promise.futureResult.flatMap {
  338. self.joinWithSpaces(context: context)
  339. }
  340. }
  341. handler.receiveMetadata([:])
  342. // Queue up some messages.
  343. handler.receiveMessage(ByteBuffer(string: "1"))
  344. handler.receiveMessage(ByteBuffer(string: "2"))
  345. handler.receiveMessage(ByteBuffer(string: "3"))
  346. handler.receiveEnd()
  347. // Succeed the observer block.
  348. promise.succeed(())
  349. assertThat(self.recorder.messages.first, .is(ByteBuffer(string: "1 2 3")))
  350. assertThat(self.recorder.status, .notNil(.hasCode(.ok)))
  351. }
  352. func testReceiveMessageBeforeHeaders() {
  353. let handler = self.makeHandler(observerFactory: self.neverCalled(context:))
  354. handler.receiveMessage(ByteBuffer(string: "foo"))
  355. assertThat(self.recorder.metadata, .is(.nil()))
  356. assertThat(self.recorder.messages, .isEmpty())
  357. assertThat(self.recorder.status, .notNil(.hasCode(.internalError)))
  358. }
  359. func testReceiveMultipleHeaders() {
  360. let handler = self.makeHandler(observerFactory: self.neverReceivesMessage(context:))
  361. handler.receiveMetadata([:])
  362. assertThat(self.recorder.metadata, .is([:]))
  363. handler.receiveMetadata([:])
  364. assertThat(self.recorder.messages, .isEmpty())
  365. assertThat(self.recorder.status, .notNil(.hasCode(.internalError)))
  366. }
  367. func testFinishBeforeStarting() {
  368. let handler = self.makeHandler(observerFactory: self.neverCalled(context:))
  369. handler.finish()
  370. assertThat(self.recorder.metadata, .is(.nil()))
  371. assertThat(self.recorder.messages, .isEmpty())
  372. assertThat(self.recorder.status, .is(.nil()))
  373. assertThat(self.recorder.trailers, .is(.nil()))
  374. }
  375. func testFinishAfterHeaders() {
  376. let handler = self.makeHandler(observerFactory: self.joinWithSpaces(context:))
  377. handler.receiveMetadata([:])
  378. assertThat(self.recorder.metadata, .is([:]))
  379. handler.finish()
  380. assertThat(self.recorder.messages, .isEmpty())
  381. assertThat(self.recorder.status, .notNil(.hasCode(.unavailable)))
  382. assertThat(self.recorder.trailers, .is([:]))
  383. }
  384. func testFinishAfterMessage() {
  385. let handler = self.makeHandler(observerFactory: self.joinWithSpaces(context:))
  386. handler.receiveMetadata([:])
  387. handler.receiveMessage(ByteBuffer(string: "hello"))
  388. handler.finish()
  389. assertThat(self.recorder.messages, .isEmpty())
  390. assertThat(self.recorder.status, .notNil(.hasCode(.unavailable)))
  391. assertThat(self.recorder.trailers, .is([:]))
  392. }
  393. }
  394. class ServerStreamingServerHandlerTests: GRPCTestCase, ServerHandlerTestCase {
  395. let eventLoop = EmbeddedEventLoop()
  396. let allocator = ByteBufferAllocator()
  397. let recorder = ResponseRecorder()
  398. private func makeHandler(
  399. userFunction: @escaping (String, StreamingResponseCallContext<String>)
  400. -> EventLoopFuture<GRPCStatus>
  401. ) -> ServerStreamingServerHandler<StringSerializer, StringDeserializer> {
  402. return ServerStreamingServerHandler(
  403. context: self.makeCallHandlerContext(),
  404. requestDeserializer: StringDeserializer(),
  405. responseSerializer: StringSerializer(),
  406. interceptors: [],
  407. userFunction: userFunction
  408. )
  409. }
  410. private func breakOnSpaces(
  411. _ request: String,
  412. context: StreamingResponseCallContext<String>
  413. ) -> EventLoopFuture<GRPCStatus> {
  414. let parts = request.components(separatedBy: " ")
  415. context.sendResponses(parts, promise: nil)
  416. return context.eventLoop.makeSucceededFuture(.ok)
  417. }
  418. private func neverCalled(
  419. _ request: String,
  420. context: StreamingResponseCallContext<String>
  421. ) -> EventLoopFuture<GRPCStatus> {
  422. XCTFail("Unexpected invocation")
  423. return context.eventLoop.makeSucceededFuture(.processingError)
  424. }
  425. private func neverComplete(
  426. _ request: String,
  427. context: StreamingResponseCallContext<String>
  428. ) -> EventLoopFuture<GRPCStatus> {
  429. return context.eventLoop.scheduleTask(deadline: .distantFuture) {
  430. return .processingError
  431. }.futureResult
  432. }
  433. func testHappyPath() {
  434. let handler = self.makeHandler(userFunction: self.breakOnSpaces(_:context:))
  435. handler.receiveMetadata([:])
  436. assertThat(self.recorder.metadata, .is([:]))
  437. handler.receiveMessage(ByteBuffer(string: "a b"))
  438. handler.receiveEnd()
  439. handler.finish()
  440. assertThat(
  441. self.recorder.messages,
  442. .is([ByteBuffer(string: "a"), ByteBuffer(string: "b")])
  443. )
  444. assertThat(self.recorder.status, .notNil(.hasCode(.ok)))
  445. assertThat(self.recorder.trailers, .is([:]))
  446. }
  447. func testThrowingDeserializer() {
  448. let handler = ServerStreamingServerHandler(
  449. context: self.makeCallHandlerContext(),
  450. requestDeserializer: ThrowingStringDeserializer(),
  451. responseSerializer: StringSerializer(),
  452. interceptors: [],
  453. userFunction: self.neverCalled(_:context:)
  454. )
  455. handler.receiveMetadata([:])
  456. assertThat(self.recorder.metadata, .is([:]))
  457. let buffer = ByteBuffer(string: "hello")
  458. handler.receiveMessage(buffer)
  459. assertThat(self.recorder.messages, .isEmpty())
  460. assertThat(self.recorder.status, .notNil(.hasCode(.internalError)))
  461. }
  462. func testThrowingSerializer() {
  463. let handler = ServerStreamingServerHandler(
  464. context: self.makeCallHandlerContext(),
  465. requestDeserializer: StringDeserializer(),
  466. responseSerializer: ThrowingStringSerializer(),
  467. interceptors: [],
  468. userFunction: self.breakOnSpaces(_:context:)
  469. )
  470. handler.receiveMetadata([:])
  471. assertThat(self.recorder.metadata, .is([:]))
  472. let buffer = ByteBuffer(string: "1 2 3")
  473. handler.receiveMessage(buffer)
  474. handler.receiveEnd()
  475. assertThat(self.recorder.messages, .isEmpty())
  476. assertThat(self.recorder.status, .notNil(.hasCode(.internalError)))
  477. }
  478. func testUserFunctionReturnsFailedFuture() {
  479. let handler = self.makeHandler { _, context in
  480. return context.eventLoop.makeFailedFuture(GRPCStatus(code: .unavailable, message: ":("))
  481. }
  482. handler.receiveMetadata([:])
  483. assertThat(self.recorder.metadata, .is([:]))
  484. let buffer = ByteBuffer(string: "hello")
  485. handler.receiveMessage(buffer)
  486. assertThat(self.recorder.messages, .isEmpty())
  487. assertThat(self.recorder.status, .notNil(.hasCode(.unavailable)))
  488. assertThat(self.recorder.status?.message, .is(":("))
  489. }
  490. func testReceiveMessageBeforeHeaders() {
  491. let handler = self.makeHandler(userFunction: self.neverCalled(_:context:))
  492. handler.receiveMessage(ByteBuffer(string: "foo"))
  493. assertThat(self.recorder.metadata, .is(.nil()))
  494. assertThat(self.recorder.messages, .isEmpty())
  495. assertThat(self.recorder.status, .notNil(.hasCode(.internalError)))
  496. }
  497. func testReceiveMultipleHeaders() {
  498. let handler = self.makeHandler(userFunction: self.neverCalled(_:context:))
  499. handler.receiveMetadata([:])
  500. assertThat(self.recorder.metadata, .is([:]))
  501. handler.receiveMetadata([:])
  502. assertThat(self.recorder.messages, .isEmpty())
  503. assertThat(self.recorder.status, .notNil(.hasCode(.internalError)))
  504. }
  505. func testReceiveMultipleMessages() {
  506. let handler = self.makeHandler(userFunction: self.neverComplete(_:context:))
  507. handler.receiveMetadata([:])
  508. assertThat(self.recorder.metadata, .is([:]))
  509. let buffer = ByteBuffer(string: "hello")
  510. handler.receiveMessage(buffer)
  511. handler.receiveEnd()
  512. // Send another message before the function completes.
  513. handler.receiveMessage(buffer)
  514. assertThat(self.recorder.messages, .isEmpty())
  515. assertThat(self.recorder.status, .notNil(.hasCode(.internalError)))
  516. }
  517. func testFinishBeforeStarting() {
  518. let handler = self.makeHandler(userFunction: self.neverCalled(_:context:))
  519. handler.finish()
  520. assertThat(self.recorder.metadata, .is(.nil()))
  521. assertThat(self.recorder.messages, .isEmpty())
  522. assertThat(self.recorder.status, .is(.nil()))
  523. assertThat(self.recorder.trailers, .is(.nil()))
  524. }
  525. func testFinishAfterHeaders() {
  526. let handler = self.makeHandler(userFunction: self.neverCalled(_:context:))
  527. handler.receiveMetadata([:])
  528. assertThat(self.recorder.metadata, .is([:]))
  529. handler.finish()
  530. assertThat(self.recorder.messages, .isEmpty())
  531. assertThat(self.recorder.status, .notNil(.hasCode(.unavailable)))
  532. assertThat(self.recorder.trailers, .is([:]))
  533. }
  534. func testFinishAfterMessage() {
  535. let handler = self.makeHandler(userFunction: self.neverComplete(_:context:))
  536. handler.receiveMetadata([:])
  537. handler.receiveMessage(ByteBuffer(string: "hello"))
  538. handler.finish()
  539. assertThat(self.recorder.messages, .isEmpty())
  540. assertThat(self.recorder.status, .notNil(.hasCode(.unavailable)))
  541. assertThat(self.recorder.trailers, .is([:]))
  542. }
  543. }