Skip to content

Commit e25db22

Browse files
authored
Swift testing (#29)
1 parent 9baa477 commit e25db22

File tree

5 files changed

+84
-89
lines changed

5 files changed

+84
-89
lines changed

Tests/WebSocketTests/AutobahnTests.swift

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,17 @@ import Foundation
1616
import Logging
1717
import NIOConcurrencyHelpers
1818
import NIOPosix
19+
import Testing
1920
import WSClient
2021
import WSCompression
21-
import XCTest
2222

2323
/// The Autobahn|Testsuite provides a fully automated test suite to verify client and server
2424
/// implementations of The WebSocket Protocol for specification conformance and implementation robustness.
2525
/// You can find out more at https://github.com/crossbario/autobahn-testsuite
2626
///
2727
/// Before running these tests run `./scripts/autobahn-server.sh` to running the test server.
28-
final class AutobahnTests: XCTestCase {
28+
@Suite(.disabled(if: ci), .serialized)
29+
struct AutobahnTests {
2930
/// To run all the autobahn compression tests takes a long time. By default we only run a selection.
3031
/// The `AUTOBAHN_ALL_TESTS` environment flag triggers running all of them.
3132
var runAllTests: Bool { ProcessInfo.processInfo.environment["AUTOBAHN_ALL_TESTS"] == "true" }
@@ -52,17 +53,14 @@ final class AutobahnTests: XCTestCase {
5253
return
5354
}
5455
}
55-
return try result.withLockedValue { try XCTUnwrap($0) }
56+
return try result.withLockedValue { try #require($0) }
5657
}
5758

5859
/// Run a number of autobahn tests
5960
func autobahnTests(
6061
cases: Set<Int>,
6162
extensions: [WebSocketExtensionFactory] = [.perMessageDeflate(maxDecompressedFrameSize: 16_777_216)]
6263
) async throws {
63-
// These are broken in CI currently
64-
try XCTSkipIf(ProcessInfo.processInfo.environment["CI"] != nil)
65-
6664
struct CaseInfo: Decodable {
6765
let id: String
6866
let description: String
@@ -102,7 +100,7 @@ final class AutobahnTests: XCTestCase {
102100

103101
// get case status
104102
let status = try await getValue("getCaseStatus?case=\(index)&agent=swift-websocket", as: CaseStatus.self)
105-
XCTAssert(status.behavior == "OK" || status.behavior == "INFORMATIONAL" || status.behavior == "NON-STRICT")
103+
#expect(status.behavior == "OK" || status.behavior == "INFORMATIONAL" || status.behavior == "NON-STRICT")
106104
}
107105

108106
try await WebSocketClient.connect(
@@ -117,35 +115,35 @@ final class AutobahnTests: XCTestCase {
117115
}
118116
}
119117

120-
func test_1_Framing() async throws {
118+
@Test func test_1_Framing() async throws {
121119
try await self.autobahnTests(cases: .init(1..<17))
122120
}
123121

124-
func test_2_PingPongs() async throws {
122+
@Test func test_2_PingPongs() async throws {
125123
try await self.autobahnTests(cases: .init(17..<28))
126124
}
127125

128-
func test_3_ReservedBits() async throws {
126+
@Test func test_3_ReservedBits() async throws {
129127
try await self.autobahnTests(cases: .init(28..<35))
130128
}
131129

132-
func test_4_Opcodes() async throws {
130+
@Test func test_4_Opcodes() async throws {
133131
try await self.autobahnTests(cases: .init(35..<45))
134132
}
135133

136-
func test_5_Fragmentation() async throws {
134+
@Test func test_5_Fragmentation() async throws {
137135
try await self.autobahnTests(cases: .init(45..<65))
138136
}
139137

140-
func test_6_UTF8Handling() async throws {
138+
@Test func test_6_UTF8Handling() async throws {
141139
// UTF8 validation is available on swift 5.10 or earlier
142140
#if compiler(<6)
143141
try XCTSkipIf(true)
144142
#endif
145143
try await self.autobahnTests(cases: .init(65..<210))
146144
}
147145

148-
func test_7_CloseHandling() async throws {
146+
@Test func test_7_CloseHandling() async throws {
149147
// UTF8 validation is available on swift 5.10 or earlier
150148
#if compiler(<6)
151149
try await self.autobahnTests(cases: .init(210..<222))
@@ -155,27 +153,27 @@ final class AutobahnTests: XCTestCase {
155153
#endif
156154
}
157155

158-
func test_9_Performance() async throws {
156+
@Test func test_9_Performance() async throws {
159157
if !self.runAllTests {
160158
try await self.autobahnTests(cases: .init([247, 260, 270, 281, 291, 296]))
161159
} else {
162160
try await self.autobahnTests(cases: .init(247..<301))
163161
}
164162
}
165163

166-
func test_10_AutoFragmentation() async throws {
164+
@Test func test_10_AutoFragmentation() async throws {
167165
try await self.autobahnTests(cases: .init([301]))
168166
}
169167

170-
func test_12_CompressionDifferentPayloads() async throws {
168+
@Test func test_12_CompressionDifferentPayloads() async throws {
171169
if !self.runAllTests {
172170
try await self.autobahnTests(cases: .init([302, 330, 349, 360, 388]))
173171
} else {
174172
try await self.autobahnTests(cases: .init(302..<391))
175173
}
176174
}
177175

178-
func test_13_CompressionDifferentParameters() async throws {
176+
@Test func test_13_CompressionDifferentParameters() async throws {
179177
if !self.runAllTests {
180178
try await self.autobahnTests(
181179
cases: .init([392]),
@@ -255,3 +253,5 @@ final class AutobahnTests: XCTestCase {
255253
}
256254
}
257255
}
256+
257+
var ci: Bool { ProcessInfo.processInfo.environment["CI"] != nil }

Tests/WebSocketTests/ClientChannelTests.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,17 @@
1313
//===----------------------------------------------------------------------===//
1414

1515
import Logging
16-
import XCTest
16+
import Testing
1717

1818
@testable import WSClient
1919

20-
final class ClientChannelTests: XCTestCase {
20+
struct ClientChannelTests {
2121

22-
func testInitialRequestHeader() async throws {
22+
@Test func testInitialRequestHeader() async throws {
2323
let ws = try WebSocketClientChannel(handler: { _, _, _ in }, url: "wss://echo.websocket.org:443/ws", configuration: .init())
2424

25-
XCTAssertEqual(ws.urlPath, "/ws")
26-
XCTAssertEqual(ws.hostHeader, "echo.websocket.org:443")
27-
XCTAssertEqual(ws.originHeader, "wss://echo.websocket.org")
25+
#expect(ws.urlPath == "/ws")
26+
#expect(ws.hostHeader == "echo.websocket.org:443")
27+
#expect(ws.originHeader == "wss://echo.websocket.org")
2828
}
2929
}

Tests/WebSocketTests/ClientTests.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ import Logging
1616
import NIOCore
1717
import NIOSSL
1818
import NIOWebSocket
19+
import Testing
1920
import WSClient
20-
import XCTest
2121

22-
final class WebSocketClientTests: XCTestCase {
22+
struct WebSocketClientTests {
2323

24-
func testEchoServer() async throws {
24+
@Test func testEchoServer() async throws {
2525
let clientLogger = {
2626
var logger = Logger(label: "client")
2727
logger.logLevel = .trace
@@ -40,7 +40,7 @@ final class WebSocketClientTests: XCTestCase {
4040
}
4141
}
4242

43-
func testEchoServerWithSNIHostname() async throws {
43+
@Test func testEchoServerWithSNIHostname() async throws {
4444
let clientLogger = {
4545
var logger = Logger(label: "client")
4646
logger.logLevel = .trace

Tests/WebSocketTests/WebSocketExtensionNegotiationTests.swift

Lines changed: 30 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -14,79 +14,74 @@
1414

1515
import HTTPTypes
1616
import NIOWebSocket
17-
import XCTest
17+
import Testing
1818

1919
@testable import WSCompression
2020
@testable import WSCore
2121

22-
final class WebSocketExtensionNegotiationTests: XCTestCase {
23-
func testExtensionHeaderParsing() {
22+
struct WebSocketExtensionNegotiationTests {
23+
@Test func testExtensionHeaderParsing() {
2424
let headers: HTTPFields = .init([
2525
.init(name: .secWebSocketExtensions, value: "permessage-deflate; client_max_window_bits; server_max_window_bits=10"),
2626
.init(name: .secWebSocketExtensions, value: "permessage-deflate;client_max_window_bits"),
2727
])
2828
let extensions = WebSocketExtensionHTTPParameters.parseHeaders(headers)
29-
XCTAssertEqual(
30-
extensions,
31-
[
29+
#expect(
30+
extensions == [
3231
.init("permessage-deflate", parameters: ["client_max_window_bits": .null, "server_max_window_bits": .value("10")]),
3332
.init("permessage-deflate", parameters: ["client_max_window_bits": .null]),
3433
]
3534
)
3635
}
3736

38-
func testDeflateServerResponse() {
37+
@Test func testDeflateServerResponse() {
3938
let requestHeaders: [WebSocketExtensionHTTPParameters] = [
4039
.init("permessage-deflate", parameters: ["client_max_window_bits": .value("10")])
4140
]
4241
let ext = PerMessageDeflateExtensionBuilder(clientNoContextTakeover: true, serverNoContextTakeover: true)
4342
let serverResponse = ext.serverResponseHeader(to: requestHeaders)
44-
XCTAssertEqual(
45-
serverResponse,
46-
"permessage-deflate;client_max_window_bits=10;client_no_context_takeover;server_no_context_takeover"
43+
#expect(
44+
serverResponse == "permessage-deflate;client_max_window_bits=10;client_no_context_takeover;server_no_context_takeover"
4745
)
4846
}
4947

50-
func testDeflateServerResponseClientMaxWindowBits() {
48+
@Test func testDeflateServerResponseClientMaxWindowBits() {
5149
let requestHeaders: [WebSocketExtensionHTTPParameters] = [
5250
.init("permessage-deflate", parameters: ["client_max_window_bits": .null])
5351
]
5452
let ext1 = PerMessageDeflateExtensionBuilder(serverNoContextTakeover: true)
5553
let serverResponse1 = ext1.serverResponseHeader(to: requestHeaders)
56-
XCTAssertEqual(
57-
serverResponse1,
58-
"permessage-deflate;server_no_context_takeover"
54+
#expect(
55+
serverResponse1 == "permessage-deflate;server_no_context_takeover"
5956
)
6057
let ext2 = PerMessageDeflateExtensionBuilder(clientNoContextTakeover: true, serverMaxWindow: 12)
6158
let serverResponse2 = ext2.serverResponseHeader(to: requestHeaders)
62-
XCTAssertEqual(
63-
serverResponse2,
64-
"permessage-deflate;client_no_context_takeover;server_max_window_bits=12"
59+
#expect(
60+
serverResponse2 == "permessage-deflate;client_no_context_takeover;server_max_window_bits=12"
6561
)
6662
}
6763

68-
func testUnregonisedExtensionServerResponse() throws {
64+
@Test func testUnregonisedExtensionServerResponse() throws {
6965
let serverExtensions: [WebSocketExtensionBuilder] = [PerMessageDeflateExtensionBuilder()]
7066
let (headers, extensions) = try serverExtensions.serverExtensionNegotiation(
7167
requestHeaders: [
7268
.secWebSocketExtensions: "permessage-foo;bar=baz",
7369
.secWebSocketExtensions: "permessage-deflate;client_max_window_bits=10",
7470
]
7571
)
76-
XCTAssertEqual(
77-
headers[.secWebSocketExtensions],
78-
"permessage-deflate;client_max_window_bits=10"
72+
#expect(
73+
headers[.secWebSocketExtensions] == "permessage-deflate;client_max_window_bits=10"
7974
)
80-
XCTAssertEqual(extensions.count, 1)
81-
let firstExtension = try XCTUnwrap(extensions.first)
82-
XCTAssert(firstExtension is PerMessageDeflateExtension)
75+
#expect(extensions.count == 1)
76+
let firstExtension = try #require(extensions.first)
77+
#expect(firstExtension is PerMessageDeflateExtension)
8378

8479
let requestExtensions = try serverExtensions.buildClientExtensions(from: headers)
85-
XCTAssertEqual(requestExtensions.count, 1)
86-
XCTAssert(requestExtensions[0] is PerMessageDeflateExtension)
80+
#expect(requestExtensions.count == 1)
81+
#expect(requestExtensions[0] is PerMessageDeflateExtension)
8782
}
8883

89-
func testNonNegotiableClientExtension() throws {
84+
@Test func testNonNegotiableClientExtension() throws {
9085
struct MyExtension: WebSocketExtension {
9186
var name = "my-extension"
9287

@@ -106,12 +101,12 @@ final class WebSocketExtensionNegotiationTests: XCTestCase {
106101
}.build()
107102
]
108103
let clientExtensions = try clientExtensionBuilders.buildClientExtensions(from: [:])
109-
XCTAssertEqual(clientExtensions.count, 1)
110-
let myExtension = try XCTUnwrap(clientExtensions.first)
111-
XCTAssert(myExtension is MyExtension)
104+
#expect(clientExtensions.count == 1)
105+
let myExtension = try #require(clientExtensions.first)
106+
#expect(myExtension is MyExtension)
112107
}
113108

114-
func testNonNegotiableServerExtension() throws {
109+
@Test func testNonNegotiableServerExtension() throws {
115110
struct MyExtension: WebSocketExtension {
116111
var name = "my-extension"
117112

@@ -129,9 +124,9 @@ final class WebSocketExtensionNegotiationTests: XCTestCase {
129124
let (headers, serverExtensions) = try serverExtensionBuilders.serverExtensionNegotiation(
130125
requestHeaders: [:]
131126
)
132-
XCTAssertEqual(headers.count, 0)
133-
XCTAssertEqual(serverExtensions.count, 1)
134-
let myExtension = try XCTUnwrap(serverExtensions.first)
135-
XCTAssert(myExtension is MyExtension)
127+
#expect(headers.count == 0)
128+
#expect(serverExtensions.count == 1)
129+
let myExtension = try #require(serverExtensions.first)
130+
#expect(myExtension is MyExtension)
136131
}
137132
}

0 commit comments

Comments
 (0)