-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathSpeakerTests.swift
119 lines (112 loc) · 3.99 KB
/
SpeakerTests.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
@testable import Coder_Desktop
import Foundation
import Testing
@Suite(.timeLimit(.minutes(1)))
struct SpeakerTests: Sendable {
let pipeMT = Pipe()
let pipeTM = Pipe()
let uut: Speaker<Vpn_TunnelMessage, Vpn_ManagerMessage>
let sender: Sender<Vpn_ManagerMessage>
let dispatch: DispatchIO
let receiver: Receiver<Vpn_TunnelMessage>
let handshaker: Handshaker
init() {
let queue = DispatchQueue.global(qos: .utility)
uut = Speaker(
writeFD: pipeTM.fileHandleForWriting,
readFD: pipeMT.fileHandleForReading
)
dispatch = DispatchIO(
type: .stream,
fileDescriptor: pipeTM.fileHandleForReading.fileDescriptor,
queue: queue,
cleanupHandler: { error in print("cleanupHandler: \(error)") }
)
sender = Sender(writeFD: pipeMT.fileHandleForWriting)
receiver = Receiver(dispatch: dispatch, queue: queue)
handshaker = Handshaker(
writeFD: pipeMT.fileHandleForWriting,
dispatch: dispatch, queue: queue,
role: .manager
)
}
@Test func handshake() async throws {
async let v = handshaker.handshake()
try await uut.handshake()
#expect(try await v == ProtoVersion(1, 0))
}
@Test func handleSingleMessage() async throws {
var s = Vpn_ManagerMessage()
s.start = Vpn_StartRequest()
await #expect(throws: Never.self) {
try await sender.send(s)
}
let got = try #require(await uut.next())
guard case let .message(msg) = got else {
Issue.record("Received unexpected message from speaker")
return
}
#expect(msg.msg == .start(Vpn_StartRequest()))
try await sender.close()
}
@Test func handleRPC() async throws {
var s = Vpn_ManagerMessage()
s.start = Vpn_StartRequest()
s.rpc = Vpn_RPC()
s.rpc.msgID = 33
await #expect(throws: Never.self) {
try await sender.send(s)
}
let got = try #require(await uut.next())
guard case let .RPC(req) = got else {
Issue.record("Received unexpected message from speaker")
return
}
#expect(req.msg.msg == .start(Vpn_StartRequest()))
#expect(req.msg.rpc.msgID == 33)
var reply = Vpn_TunnelMessage()
reply.start = Vpn_StartResponse()
reply.rpc.responseTo = 33
try await req.sendReply(reply)
await uut.closeWrite()
var count = 0
await #expect(throws: Never.self) {
for try await reply in try await receiver.messages() {
count += 1
#expect(reply.rpc.responseTo == 33)
}
#expect(count == 1)
}
try await sender.close()
}
@Test func sendRPCs() async throws {
// Speaker must be reading from the receiver for `unaryRPC` to return
let readDone = Task {
for try await _ in uut {}
}
async let managerDone = Task {
var count = 0
for try await req in try await receiver.messages() {
#expect(req.msg == .networkSettings(Vpn_NetworkSettingsRequest()))
try #require(req.rpc.msgID != 0)
var reply = Vpn_ManagerMessage()
reply.networkSettings = Vpn_NetworkSettingsResponse()
reply.networkSettings.errorMessage = "test \(count)"
reply.rpc.responseTo = req.rpc.msgID
try await sender.send(reply)
count += 1
}
#expect(count == 2)
}
for i in 0 ..< 2 {
var req = Vpn_TunnelMessage()
req.networkSettings = Vpn_NetworkSettingsRequest()
let got = try await uut.unaryRPC(req)
#expect(got.networkSettings.errorMessage == "test \(i)")
}
await uut.closeWrite()
_ = await managerDone
try await sender.close()
try await readDone.value
}
}