GRPCTests.swift 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. import XCTest
  2. import Foundation
  3. import Dispatch
  4. @testable import gRPC
  5. func Log(_ message : String) {
  6. FileHandle.standardError.write((message + "\n").data(using:.utf8)!)
  7. }
  8. class gRPCTests: XCTestCase {
  9. func testBasicSanity() {
  10. gRPC.initialize()
  11. let latch = CountDownLatch(2)
  12. DispatchQueue.global().async() {
  13. do {
  14. try server()
  15. } catch (let error) {
  16. XCTFail("server error \(error)")
  17. }
  18. latch.countDown()
  19. }
  20. DispatchQueue.global().async() {
  21. do {
  22. try client()
  23. } catch (let error) {
  24. XCTFail("client error \(error)")
  25. }
  26. latch.countDown()
  27. }
  28. latch.wait()
  29. }
  30. }
  31. extension gRPCTests {
  32. static var allTests : [(String, (gRPCTests) -> () throws -> Void)] {
  33. return [
  34. ("testBasicSanity", testBasicSanity),
  35. ]
  36. }
  37. }
  38. let address = "localhost:8999"
  39. let host = "foo.test.google.fr"
  40. let clientText = "hello, server!"
  41. let serverText = "hello, client!"
  42. let initialClientMetadata =
  43. ["x": "xylophone",
  44. "y": "yu",
  45. "z": "zither"]
  46. let initialServerMetadata =
  47. ["a": "Apple",
  48. "b": "Banana",
  49. "c": "Cherry"]
  50. let trailingServerMetadata =
  51. ["0": "zero",
  52. "1": "one",
  53. "2": "two"]
  54. let steps = 30
  55. let hello = "/hello"
  56. let goodbye = "/goodbye"
  57. let statusCode = 0
  58. let statusMessage = "OK"
  59. func verify_metadata(_ metadata: Metadata, expected: [String:String]) {
  60. XCTAssertGreaterThanOrEqual(metadata.count(), expected.count)
  61. for i in 0..<metadata.count() {
  62. if expected[metadata.key(i)] != nil {
  63. XCTAssertEqual(metadata.value(i), expected[metadata.key(i)])
  64. }
  65. }
  66. }
  67. func client() throws {
  68. let message = clientText.data(using: .utf8)
  69. let channel = gRPC.Channel(address:address)
  70. channel.host = host
  71. for i in 0..<steps {
  72. let latch = CountDownLatch(1)
  73. let method = (i < steps-1) ? hello : goodbye
  74. let call = channel.makeCall(method)
  75. let metadata = Metadata(initialClientMetadata)
  76. try call.start(.unary, metadata:metadata, message:message) {
  77. (response) in
  78. // verify the basic response from the server
  79. XCTAssertEqual(response.statusCode, statusCode)
  80. XCTAssertEqual(response.statusMessage, statusMessage)
  81. // verify the message from the server
  82. let resultData = response.resultData
  83. let messageString = String(data: resultData!, encoding: .utf8)
  84. XCTAssertEqual(messageString, serverText)
  85. // verify the initial metadata from the server
  86. let initialMetadata = response.initialMetadata!
  87. verify_metadata(initialMetadata, expected: initialServerMetadata)
  88. // verify the trailing metadata from the server
  89. let trailingMetadata = response.trailingMetadata!
  90. verify_metadata(trailingMetadata, expected: trailingServerMetadata)
  91. // report completion
  92. latch.countDown()
  93. }
  94. // wait for the call to complete
  95. latch.wait()
  96. }
  97. usleep(500) // temporarily delay calls to the channel destructor
  98. }
  99. func server() throws {
  100. let server = gRPC.Server(address:address)
  101. var requestCount = 0
  102. let latch = CountDownLatch(1)
  103. server.run() {(requestHandler) in
  104. do {
  105. requestCount += 1
  106. XCTAssertEqual(requestHandler.host, host)
  107. if (requestCount < steps) {
  108. XCTAssertEqual(requestHandler.method, hello)
  109. } else {
  110. XCTAssertEqual(requestHandler.method, goodbye)
  111. }
  112. let initialMetadata = requestHandler.requestMetadata
  113. verify_metadata(initialMetadata, expected: initialClientMetadata)
  114. let initialMetadataToSend = Metadata(initialServerMetadata)
  115. try requestHandler.receiveMessage(initialMetadata:initialMetadataToSend)
  116. {(messageData) in
  117. let messageString = String(data: messageData!, encoding: .utf8)
  118. XCTAssertEqual(messageString, clientText)
  119. }
  120. if requestHandler.method == goodbye {
  121. server.stop()
  122. }
  123. let replyMessage = serverText
  124. let trailingMetadataToSend = Metadata(trailingServerMetadata)
  125. try requestHandler.sendResponse(message:replyMessage.data(using: .utf8)!,
  126. statusCode:statusCode,
  127. statusMessage:statusMessage,
  128. trailingMetadata:trailingMetadataToSend)
  129. } catch (let error) {
  130. XCTFail("error \(error)")
  131. }
  132. }
  133. server.onCompletion() {
  134. // exit the server thread
  135. latch.countDown()
  136. }
  137. // wait for the server to exit
  138. latch.wait()
  139. }