ServerResponseTests.swift 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /*
  2. * Copyright 2023, 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 GRPCCore
  17. import Testing
  18. @Suite("ServerResponse")
  19. struct ServerResponseTests {
  20. @Test("ServerResponse(message:metadata:trailingMetadata:)")
  21. @available(gRPCSwift 2.0, *)
  22. func responseInitSuccess() throws {
  23. let response = ServerResponse(
  24. message: "message",
  25. metadata: ["metadata": "initial"],
  26. trailingMetadata: ["metadata": "trailing"]
  27. )
  28. let contents = try response.accepted.get()
  29. #expect(contents.message == "message")
  30. #expect(contents.metadata == ["metadata": "initial"])
  31. #expect(contents.trailingMetadata == ["metadata": "trailing"])
  32. }
  33. @Test("ServerResponse(of:error:)")
  34. @available(gRPCSwift 2.0, *)
  35. func responseInitError() throws {
  36. let error = RPCError(code: .aborted, message: "Aborted")
  37. let response = ServerResponse(of: String.self, error: error)
  38. switch response.accepted {
  39. case .success:
  40. Issue.record("Expected error")
  41. case .failure(let rpcError):
  42. #expect(rpcError == error)
  43. }
  44. }
  45. @Test("StreamingServerResponse(of:metadata:producer:)")
  46. @available(gRPCSwift 2.0, *)
  47. func streamingResponseInitSuccess() async throws {
  48. let response = StreamingServerResponse(
  49. of: String.self,
  50. metadata: ["metadata": "initial"]
  51. ) { _ in
  52. // Empty body.
  53. return ["metadata": "trailing"]
  54. }
  55. let contents = try response.accepted.get()
  56. #expect(contents.metadata == ["metadata": "initial"])
  57. let trailingMetadata = try await contents.producer(.failTestOnWrite())
  58. #expect(trailingMetadata == ["metadata": "trailing"])
  59. }
  60. @Test("StreamingServerResponse(of:error:)")
  61. @available(gRPCSwift 2.0, *)
  62. func streamingResponseInitError() async throws {
  63. let error = RPCError(code: .aborted, message: "Aborted")
  64. let response = StreamingServerResponse(of: String.self, error: error)
  65. switch response.accepted {
  66. case .success:
  67. Issue.record("Expected error")
  68. case .failure(let rpcError):
  69. #expect(rpcError == error)
  70. }
  71. }
  72. @Test("StreamingServerResponse(single:) (accepted)")
  73. @available(gRPCSwift 2.0, *)
  74. func singleToStreamConversionForSuccessfulResponse() async throws {
  75. let single = ServerResponse(
  76. message: "foo",
  77. metadata: ["metadata": "initial"],
  78. trailingMetadata: ["metadata": "trailing"]
  79. )
  80. let stream = StreamingServerResponse(single: single)
  81. let (messages, continuation) = AsyncStream.makeStream(of: String.self)
  82. let trailingMetadata: Metadata
  83. switch stream.accepted {
  84. case .success(let contents):
  85. trailingMetadata = try await contents.producer(.gathering(into: continuation))
  86. continuation.finish()
  87. case .failure(let error):
  88. throw error
  89. }
  90. #expect(stream.metadata == ["metadata": "initial"])
  91. let collected = try await messages.collect()
  92. #expect(collected == ["foo"])
  93. #expect(trailingMetadata == ["metadata": "trailing"])
  94. }
  95. @Test("StreamingServerResponse(single:) (rejected)")
  96. @available(gRPCSwift 2.0, *)
  97. func singleToStreamConversionForFailedResponse() async throws {
  98. let error = RPCError(code: .aborted, message: "aborted")
  99. let single = ServerResponse(of: String.self, error: error)
  100. let stream = StreamingServerResponse(single: single)
  101. switch stream.accepted {
  102. case .success:
  103. Issue.record("Expected error")
  104. case .failure(let rpcError):
  105. #expect(rpcError == error)
  106. }
  107. }
  108. @Test("Mutate metadata on response", arguments: [true, false])
  109. @available(gRPCSwift 2.0, *)
  110. func mutateMetadataOnResponse(accepted: Bool) {
  111. var response: ServerResponse<String>
  112. if accepted {
  113. response = ServerResponse(message: "")
  114. } else {
  115. response = ServerResponse(error: RPCError(code: .aborted, message: ""))
  116. }
  117. response.metadata.addString("value", forKey: "key")
  118. #expect(response.metadata == ["key": "value"])
  119. }
  120. @Test("Mutate metadata on streaming response", arguments: [true, false])
  121. @available(gRPCSwift 2.0, *)
  122. func mutateMetadataOnStreamingResponse(accepted: Bool) {
  123. var response: StreamingServerResponse<String>
  124. if accepted {
  125. response = StreamingServerResponse { _ in [:] }
  126. } else {
  127. response = StreamingServerResponse(error: RPCError(code: .aborted, message: ""))
  128. }
  129. response.metadata.addString("value", forKey: "key")
  130. #expect(response.metadata == ["key": "value"])
  131. }
  132. }