GRPCTests.swift 4.1 KB

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