Browse Source

Added ssl verification to unit tests.

Tim Burks 8 years ago
parent
commit
e748d4db73
3 changed files with 119 additions and 43 deletions
  1. 75 43
      Tests/gRPCTests/GRPCTests.swift
  2. 17 0
      Tests/ssl.crt
  3. 27 0
      Tests/ssl.key

+ 75 - 43
Tests/gRPCTests/GRPCTests.swift

@@ -18,54 +18,26 @@
  import Dispatch
  @testable import gRPC
 
- func Log(_ message : String) {
-  FileHandle.standardError.write((message + "\n").data(using:.utf8)!)
- }
-
-
-
  class gRPCTests: XCTestCase {
-
-  func testBasicSanity() {
-    gRPC.initialize()
-    let server = gRPC.Server(address:address)
-    let sem = DispatchSemaphore(value: 0)
-
-    // start the server
-    DispatchQueue.global().async() {
-      do {
-        try runServer(server:server)
-      } catch (let error) {
-        XCTFail("server error \(error)")
-      }
-      sem.signal() // when the server exits, the test is finished
-    }
-
-    // run the client
-    do {
-      try runClient()
-    } catch (let error) {
-      XCTFail("client error \(error)")
-    }
-	
-    // stop the server
-    server.stop()
-	
-    // wait until the server has shut down
-    _ = sem.wait(timeout: DispatchTime.distantFuture)
+  func testConnectivity() {
+    runTest(useSSL:false)
+  }
+  func testConnectivitySecure() {
+    runTest(useSSL:true)
   }
  }
 
  extension gRPCTests {
   static var allTests : [(String, (gRPCTests) -> () throws -> Void)] {
     return [
-      ("testBasicSanity", testBasicSanity),
+      ("testConnectivity", testConnectivity),
+      ("testConnectivitySecure", testConnectivitySecure),
     ]
   }
  }
 
- let address = "localhost:8081"
- let host = "foo.test.google.fr"
+ let address = "localhost:8085"
+ let host = "example.com"
  let clientText = "hello, server!"
  let serverText = "hello, client!"
  let initialClientMetadata =
@@ -85,6 +57,54 @@
  let statusCode = 0
  let statusMessage = "OK"
 
+ func runTest(useSSL: Bool) {
+  gRPC.initialize()
+
+  let serverRunningSemaphore = DispatchSemaphore(value: 0)
+
+  // create the server
+  var server : gRPC.Server!
+  if useSSL {
+    let certificateURL = URL(fileURLWithPath:"Tests/ssl.crt")
+    let keyURL = URL(fileURLWithPath:"Tests/ssl.key")
+    guard
+      let certificate = try? String(contentsOf: certificateURL, encoding: .utf8),
+      let key = try? String(contentsOf: keyURL, encoding: .utf8)
+      else {
+        return
+    }
+    server = gRPC.Server(address:address,
+                         key:key,
+                         certs:certificate)
+  } else {
+    server = gRPC.Server(address:address)
+  }
+
+  // start the server
+  DispatchQueue.global().async() {
+    do {
+
+      try runServer(server:server)
+    } catch (let error) {
+      XCTFail("server error \(error)")
+    }
+    serverRunningSemaphore.signal() // when the server exits, the test is finished
+  }
+
+  // run the client
+  do {
+    try runClient(useSSL:useSSL)
+  } catch (let error) {
+    XCTFail("client error \(error)")
+  }
+
+  // stop the server
+  server.stop()
+
+  // wait until the server has shut down
+  _ = serverRunningSemaphore.wait(timeout: DispatchTime.distantFuture)
+ }
+
  func verify_metadata(_ metadata: Metadata, expected: [String:String]) {
   XCTAssertGreaterThanOrEqual(metadata.count(), expected.count)
   for i in 0..<metadata.count() {
@@ -94,12 +114,26 @@
   }
  }
 
- func runClient() throws {
+ func runClient(useSSL: Bool) throws {
   let message = clientText.data(using: .utf8)
-  let channel = gRPC.Channel(address:address)
+  var channel : gRPC.Channel!
+
+  if useSSL {
+    let certificateURL = URL(fileURLWithPath:"Tests/ssl.crt")
+    guard
+      let certificates = try? String(contentsOf: certificateURL, encoding: .utf8)
+      else {
+        return
+    }
+    let host = "example.com"
+    channel = gRPC.Channel(address:address, certificates:certificates, host:host)
+  } else {
+    channel = gRPC.Channel(address:address)
+  }
+
   channel.host = host
   for i in 0..<steps {
-      let sem = DispatchSemaphore(value: 0)
+    let sem = DispatchSemaphore(value: 0)
     let method = hello
     let call = channel.makeCall(method)
     let metadata = Metadata(initialClientMetadata)
@@ -123,7 +157,6 @@
     }
     // wait for the call to complete
     _ = sem.wait(timeout: DispatchTime.distantFuture)
-    print("finished client step \(i)")
   }
  }
 
@@ -132,10 +165,9 @@
   let sem = DispatchSemaphore(value: 0)
   server.run() {(requestHandler) in
     do {
-      print("handling request \(requestHandler.method)")
       requestCount += 1
       XCTAssertEqual(requestHandler.host, host)
-        XCTAssertEqual(requestHandler.method, hello)
+      XCTAssertEqual(requestHandler.method, hello)
       let initialMetadata = requestHandler.requestMetadata
       verify_metadata(initialMetadata, expected: initialClientMetadata)
       let initialMetadataToSend = Metadata(initialServerMetadata)

+ 17 - 0
Tests/ssl.crt

@@ -0,0 +1,17 @@
+-----BEGIN CERTIFICATE-----
+MIICqDCCAZACCQDrPKlMWepoXTANBgkqhkiG9w0BAQUFADAWMRQwEgYDVQQDEwtl
+eGFtcGxlLmNvbTAeFw0xNzA5MDIwNDI3MTJaFw0xODA5MDIwNDI3MTJaMBYxFDAS
+BgNVBAMTC2V4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAwOdzRLkm0cDQ+c323Ad4ugce5tgD1HE7DlJtULI94TUUVgiEPeLocOg7XM9B
+8rf+U5V2EQcXZn7ds2ZrLF5bRBa2BDIblaOvG5yE84igHknrIX1x6xoohFfoU3TW
+3F6ssrmklW1DwLLffTPaVGTRKUIaLdqOOPNSpeqhBGEHpiZS0I6pK52y+rkdOSBP
+57w7dCVBB/6VIsHerhka0cCkrqRBfB8kE3//0C0ivuv+vGJsRWPELVQYflF/ek2Q
+MZCOE+3ipBfiQgxue+Us9MM2VKhHfyqdSn5xwJYBZzEQRiyNcg0hbnN7EaPQK1yn
+EjeTIaLu5gtSv1oU5WP0MS5WYQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQCTKAnD
+H+WvEhecRjMYGImx3tMLT5BOvpudgr+W7j+Ad2+U08PO91WLsAHsN04ttE0KY8np
+iptt8IFtjl+lFz6gubHYF/8sRGo1v+dMD6Hq5de6PSu7NJJWjM7Dly7LH30H6RnU
+MGeu94xLSk8VcJ9qGBLstb2n59DRAR6Y2o+E1hK5waldBUdCGJEFLzlzNo04iB9r
+G4q+CHvZh1jFt2+uuzoX+XQVepsQHgSlQ+Bb8NK4b427yYfjIPzrNFn6UdEOP1AQ
+JYgxHXvdTLMX5tonEoKQqpNXI0EFl40VHOV9lzLRBFjs4OrLGZdn39DusaM82Dix
+o9PjRyElKKECSIw2
+-----END CERTIFICATE-----

+ 27 - 0
Tests/ssl.key

@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEowIBAAKCAQEAwOdzRLkm0cDQ+c323Ad4ugce5tgD1HE7DlJtULI94TUUVgiE
+PeLocOg7XM9B8rf+U5V2EQcXZn7ds2ZrLF5bRBa2BDIblaOvG5yE84igHknrIX1x
+6xoohFfoU3TW3F6ssrmklW1DwLLffTPaVGTRKUIaLdqOOPNSpeqhBGEHpiZS0I6p
+K52y+rkdOSBP57w7dCVBB/6VIsHerhka0cCkrqRBfB8kE3//0C0ivuv+vGJsRWPE
+LVQYflF/ek2QMZCOE+3ipBfiQgxue+Us9MM2VKhHfyqdSn5xwJYBZzEQRiyNcg0h
+bnN7EaPQK1ynEjeTIaLu5gtSv1oU5WP0MS5WYQIDAQABAoIBABnU5JKnWJNuBo3t
+DsmYFoqSuYigFKM2Jnpcf1b3B2JJAVgj+9FtuUKlVo2vE121VdFLimvtTyzigD2t
+0Vw3pnEPuYAGVbtMF/7SjtstyINF0r7BVaft8M8IFoxWcQ9Bfk7QnUGFSDVdvp+9
+edcjSP8FYwwQ4EqwCrk9GiLD+4o8C8G13humxH+yh6Hfx71UJ50aNibcNTaOw2ic
+vFqUiUcdGMP6J9kHZpkJ8U7E/i6as6fdc47waRUGr6z46aAfCIPxnOvy3FsVfC3i
+UsL2+Ilt3hdichxC4ZbzjjQ27VA6Vz9eG0nMh65GGAu0xxwY/tzCMljLQl2eJDdo
+fxkVwaECgYEA9GeqNSarR/vDtlrCZWnBdZxIaG021Yp1FR8VzD2jPcyPSgHvpTKT
+3sOUDa7NA1R9E67QucnrmhJViaE8jYDBclXeCiLK+8Pe+TEFR+dYW0M8jin150FD
+vxeAj7AbHxtxCyztAWyWwzy1brCFTLJr/K4u4RoCLRtaFrzi95+HzGsCgYEAyg5M
+xab+FO3zjfH8jmXUW2SHG1C8MdzK+tEM9p7S2Kh9DOpZJ/lyjrejSCYbVlARJwpK
+XVZ1GEiFCoK0Z/C7QP5of6olODrqRVrJeRWI24XqdFZbZ+WcxfnpMCWM6blT6SIy
+t3aMoZSWc6E0ncpwfVAvPNloRGtHHYAcc04RG2MCgYEA4wIGjifEn6+xMQdL2HZK
+QrtOZfBLJjzcUyn0TShTH2uJC+yQcphv0FFIiwz5T0aChm2xYV+zff/Zg2RHogcd
+pt0qx69Zak+cI0js5sRyxRHGhSVkSc/M5QknWE7yYgpTDVZFLTV3MxCIVK+QoJR4
+yNHgqSRHMS5elxAKoIWE1NECgYBQOMU6ZEbUwHTGkqEXWE6ryonpynAty9+7HWzs
+LbrA0oRzsEedm2hkSXzGlHqeFkP5IBjOXhk3fvNzbNl7uxRdhaSvqzoDzUBeMOF0
+9ZvUrKKddfvskDliUQrIVuBPm4k5Mp64QJUtQfVKC2L8kvd+iWt32UmQgJdHmymw
+jfo0yQKBgFXMrTCteQ51ljzpwhaOtaZb37FSOBrGJgieIu1YyV+ZsKBR/MSQiKtC
+uCafrJoNPhfztT5kowDl4vtEGfmpqmXKYbjKHTVEGtqpmY+ZieAuclcQLBeiM0hl
+xowANkoStkmyzjep7qIcFMj9B3+8a06rd1/sluojgBiVkrjUZPdW
+-----END RSA PRIVATE KEY-----