Skip to content

Commit e748d4d

Browse files
committed
Added ssl verification to unit tests.
1 parent e6dbc63 commit e748d4d

File tree

3 files changed

+119
-43
lines changed

3 files changed

+119
-43
lines changed

Tests/gRPCTests/GRPCTests.swift

Lines changed: 75 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -18,54 +18,26 @@
1818
import Dispatch
1919
@testable import gRPC
2020

21-
func Log(_ message : String) {
22-
FileHandle.standardError.write((message + "\n").data(using:.utf8)!)
23-
}
24-
25-
26-
2721
class gRPCTests: XCTestCase {
28-
29-
func testBasicSanity() {
30-
gRPC.initialize()
31-
let server = gRPC.Server(address:address)
32-
let sem = DispatchSemaphore(value: 0)
33-
34-
// start the server
35-
DispatchQueue.global().async() {
36-
do {
37-
try runServer(server:server)
38-
} catch (let error) {
39-
XCTFail("server error \(error)")
40-
}
41-
sem.signal() // when the server exits, the test is finished
42-
}
43-
44-
// run the client
45-
do {
46-
try runClient()
47-
} catch (let error) {
48-
XCTFail("client error \(error)")
49-
}
50-
51-
// stop the server
52-
server.stop()
53-
54-
// wait until the server has shut down
55-
_ = sem.wait(timeout: DispatchTime.distantFuture)
22+
func testConnectivity() {
23+
runTest(useSSL:false)
24+
}
25+
func testConnectivitySecure() {
26+
runTest(useSSL:true)
5627
}
5728
}
5829

5930
extension gRPCTests {
6031
static var allTests : [(String, (gRPCTests) -> () throws -> Void)] {
6132
return [
62-
("testBasicSanity", testBasicSanity),
33+
("testConnectivity", testConnectivity),
34+
("testConnectivitySecure", testConnectivitySecure),
6335
]
6436
}
6537
}
6638

67-
let address = "localhost:8081"
68-
let host = "foo.test.google.fr"
39+
let address = "localhost:8085"
40+
let host = "example.com"
6941
let clientText = "hello, server!"
7042
let serverText = "hello, client!"
7143
let initialClientMetadata =
@@ -85,6 +57,54 @@
8557
let statusCode = 0
8658
let statusMessage = "OK"
8759

60+
func runTest(useSSL: Bool) {
61+
gRPC.initialize()
62+
63+
let serverRunningSemaphore = DispatchSemaphore(value: 0)
64+
65+
// create the server
66+
var server : gRPC.Server!
67+
if useSSL {
68+
let certificateURL = URL(fileURLWithPath:"Tests/ssl.crt")
69+
let keyURL = URL(fileURLWithPath:"Tests/ssl.key")
70+
guard
71+
let certificate = try? String(contentsOf: certificateURL, encoding: .utf8),
72+
let key = try? String(contentsOf: keyURL, encoding: .utf8)
73+
else {
74+
return
75+
}
76+
server = gRPC.Server(address:address,
77+
key:key,
78+
certs:certificate)
79+
} else {
80+
server = gRPC.Server(address:address)
81+
}
82+
83+
// start the server
84+
DispatchQueue.global().async() {
85+
do {
86+
87+
try runServer(server:server)
88+
} catch (let error) {
89+
XCTFail("server error \(error)")
90+
}
91+
serverRunningSemaphore.signal() // when the server exits, the test is finished
92+
}
93+
94+
// run the client
95+
do {
96+
try runClient(useSSL:useSSL)
97+
} catch (let error) {
98+
XCTFail("client error \(error)")
99+
}
100+
101+
// stop the server
102+
server.stop()
103+
104+
// wait until the server has shut down
105+
_ = serverRunningSemaphore.wait(timeout: DispatchTime.distantFuture)
106+
}
107+
88108
func verify_metadata(_ metadata: Metadata, expected: [String:String]) {
89109
XCTAssertGreaterThanOrEqual(metadata.count(), expected.count)
90110
for i in 0..<metadata.count() {
@@ -94,12 +114,26 @@
94114
}
95115
}
96116

97-
func runClient() throws {
117+
func runClient(useSSL: Bool) throws {
98118
let message = clientText.data(using: .utf8)
99-
let channel = gRPC.Channel(address:address)
119+
var channel : gRPC.Channel!
120+
121+
if useSSL {
122+
let certificateURL = URL(fileURLWithPath:"Tests/ssl.crt")
123+
guard
124+
let certificates = try? String(contentsOf: certificateURL, encoding: .utf8)
125+
else {
126+
return
127+
}
128+
let host = "example.com"
129+
channel = gRPC.Channel(address:address, certificates:certificates, host:host)
130+
} else {
131+
channel = gRPC.Channel(address:address)
132+
}
133+
100134
channel.host = host
101135
for i in 0..<steps {
102-
let sem = DispatchSemaphore(value: 0)
136+
let sem = DispatchSemaphore(value: 0)
103137
let method = hello
104138
let call = channel.makeCall(method)
105139
let metadata = Metadata(initialClientMetadata)
@@ -123,7 +157,6 @@
123157
}
124158
// wait for the call to complete
125159
_ = sem.wait(timeout: DispatchTime.distantFuture)
126-
print("finished client step \(i)")
127160
}
128161
}
129162

@@ -132,10 +165,9 @@
132165
let sem = DispatchSemaphore(value: 0)
133166
server.run() {(requestHandler) in
134167
do {
135-
print("handling request \(requestHandler.method)")
136168
requestCount += 1
137169
XCTAssertEqual(requestHandler.host, host)
138-
XCTAssertEqual(requestHandler.method, hello)
170+
XCTAssertEqual(requestHandler.method, hello)
139171
let initialMetadata = requestHandler.requestMetadata
140172
verify_metadata(initialMetadata, expected: initialClientMetadata)
141173
let initialMetadataToSend = Metadata(initialServerMetadata)

Tests/ssl.crt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIICqDCCAZACCQDrPKlMWepoXTANBgkqhkiG9w0BAQUFADAWMRQwEgYDVQQDEwtl
3+
eGFtcGxlLmNvbTAeFw0xNzA5MDIwNDI3MTJaFw0xODA5MDIwNDI3MTJaMBYxFDAS
4+
BgNVBAMTC2V4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
5+
AQEAwOdzRLkm0cDQ+c323Ad4ugce5tgD1HE7DlJtULI94TUUVgiEPeLocOg7XM9B
6+
8rf+U5V2EQcXZn7ds2ZrLF5bRBa2BDIblaOvG5yE84igHknrIX1x6xoohFfoU3TW
7+
3F6ssrmklW1DwLLffTPaVGTRKUIaLdqOOPNSpeqhBGEHpiZS0I6pK52y+rkdOSBP
8+
57w7dCVBB/6VIsHerhka0cCkrqRBfB8kE3//0C0ivuv+vGJsRWPELVQYflF/ek2Q
9+
MZCOE+3ipBfiQgxue+Us9MM2VKhHfyqdSn5xwJYBZzEQRiyNcg0hbnN7EaPQK1yn
10+
EjeTIaLu5gtSv1oU5WP0MS5WYQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQCTKAnD
11+
H+WvEhecRjMYGImx3tMLT5BOvpudgr+W7j+Ad2+U08PO91WLsAHsN04ttE0KY8np
12+
iptt8IFtjl+lFz6gubHYF/8sRGo1v+dMD6Hq5de6PSu7NJJWjM7Dly7LH30H6RnU
13+
MGeu94xLSk8VcJ9qGBLstb2n59DRAR6Y2o+E1hK5waldBUdCGJEFLzlzNo04iB9r
14+
G4q+CHvZh1jFt2+uuzoX+XQVepsQHgSlQ+Bb8NK4b427yYfjIPzrNFn6UdEOP1AQ
15+
JYgxHXvdTLMX5tonEoKQqpNXI0EFl40VHOV9lzLRBFjs4OrLGZdn39DusaM82Dix
16+
o9PjRyElKKECSIw2
17+
-----END CERTIFICATE-----

Tests/ssl.key

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIIEowIBAAKCAQEAwOdzRLkm0cDQ+c323Ad4ugce5tgD1HE7DlJtULI94TUUVgiE
3+
PeLocOg7XM9B8rf+U5V2EQcXZn7ds2ZrLF5bRBa2BDIblaOvG5yE84igHknrIX1x
4+
6xoohFfoU3TW3F6ssrmklW1DwLLffTPaVGTRKUIaLdqOOPNSpeqhBGEHpiZS0I6p
5+
K52y+rkdOSBP57w7dCVBB/6VIsHerhka0cCkrqRBfB8kE3//0C0ivuv+vGJsRWPE
6+
LVQYflF/ek2QMZCOE+3ipBfiQgxue+Us9MM2VKhHfyqdSn5xwJYBZzEQRiyNcg0h
7+
bnN7EaPQK1ynEjeTIaLu5gtSv1oU5WP0MS5WYQIDAQABAoIBABnU5JKnWJNuBo3t
8+
DsmYFoqSuYigFKM2Jnpcf1b3B2JJAVgj+9FtuUKlVo2vE121VdFLimvtTyzigD2t
9+
0Vw3pnEPuYAGVbtMF/7SjtstyINF0r7BVaft8M8IFoxWcQ9Bfk7QnUGFSDVdvp+9
10+
edcjSP8FYwwQ4EqwCrk9GiLD+4o8C8G13humxH+yh6Hfx71UJ50aNibcNTaOw2ic
11+
vFqUiUcdGMP6J9kHZpkJ8U7E/i6as6fdc47waRUGr6z46aAfCIPxnOvy3FsVfC3i
12+
UsL2+Ilt3hdichxC4ZbzjjQ27VA6Vz9eG0nMh65GGAu0xxwY/tzCMljLQl2eJDdo
13+
fxkVwaECgYEA9GeqNSarR/vDtlrCZWnBdZxIaG021Yp1FR8VzD2jPcyPSgHvpTKT
14+
3sOUDa7NA1R9E67QucnrmhJViaE8jYDBclXeCiLK+8Pe+TEFR+dYW0M8jin150FD
15+
vxeAj7AbHxtxCyztAWyWwzy1brCFTLJr/K4u4RoCLRtaFrzi95+HzGsCgYEAyg5M
16+
xab+FO3zjfH8jmXUW2SHG1C8MdzK+tEM9p7S2Kh9DOpZJ/lyjrejSCYbVlARJwpK
17+
XVZ1GEiFCoK0Z/C7QP5of6olODrqRVrJeRWI24XqdFZbZ+WcxfnpMCWM6blT6SIy
18+
t3aMoZSWc6E0ncpwfVAvPNloRGtHHYAcc04RG2MCgYEA4wIGjifEn6+xMQdL2HZK
19+
QrtOZfBLJjzcUyn0TShTH2uJC+yQcphv0FFIiwz5T0aChm2xYV+zff/Zg2RHogcd
20+
pt0qx69Zak+cI0js5sRyxRHGhSVkSc/M5QknWE7yYgpTDVZFLTV3MxCIVK+QoJR4
21+
yNHgqSRHMS5elxAKoIWE1NECgYBQOMU6ZEbUwHTGkqEXWE6ryonpynAty9+7HWzs
22+
LbrA0oRzsEedm2hkSXzGlHqeFkP5IBjOXhk3fvNzbNl7uxRdhaSvqzoDzUBeMOF0
23+
9ZvUrKKddfvskDliUQrIVuBPm4k5Mp64QJUtQfVKC2L8kvd+iWt32UmQgJdHmymw
24+
jfo0yQKBgFXMrTCteQ51ljzpwhaOtaZb37FSOBrGJgieIu1YyV+ZsKBR/MSQiKtC
25+
uCafrJoNPhfztT5kowDl4vtEGfmpqmXKYbjKHTVEGtqpmY+ZieAuclcQLBeiM0hl
26+
xowANkoStkmyzjep7qIcFMj9B3+8a06rd1/sluojgBiVkrjUZPdW
27+
-----END RSA PRIVATE KEY-----

0 commit comments

Comments
 (0)