@@ -2148,7 +2148,51 @@ final class TestURLSession: LoopbackServerTest, @unchecked Sendable {
21482148 XCTAssertEqual ( delegate. callbacks. count, callbacks. count)
21492149 XCTAssertEqual ( delegate. callbacks, callbacks, " Callbacks for \( #function) " )
21502150 }
2151-
2151+
2152+ func test_webSocketShared( ) async throws {
2153+ guard #available( macOS 12 , iOS 13 . 0 , watchOS 6 . 0 , tvOS 13 . 0 , * ) else { return }
2154+ guard URLSessionWebSocketTask . supportsWebSockets else {
2155+ print ( " libcurl lacks WebSockets support, skipping \( #function) " )
2156+ return
2157+ }
2158+
2159+ let urlString = " ws://127.0.0.1: \( TestURLSession . serverPort) /web-socket "
2160+ let url = try XCTUnwrap ( URL ( string: urlString) )
2161+
2162+ let task = URLSession . shared. webSocketTask ( with: url)
2163+ task. resume ( )
2164+
2165+ // We interleave sending and receiving, as the test HTTPServer implementation is barebones, and can't handle receiving more than one frame at a time. So, this back-and-forth acts as a gating mechanism
2166+ try await task. send ( . string( " Hello " ) )
2167+
2168+ let stringMessage = try await task. receive ( )
2169+ switch stringMessage {
2170+ case . string( let str) :
2171+ XCTAssert ( str == " Hello " )
2172+ default :
2173+ XCTFail ( " Unexpected String Message " )
2174+ }
2175+
2176+ try await task. send ( . data( Data ( [ 0x20 , 0x22 , 0x10 , 0x03 ] ) ) )
2177+
2178+ let dataMessage = try await task. receive ( )
2179+ switch dataMessage {
2180+ case . data( let data) :
2181+ XCTAssert ( data == Data ( [ 0x20 , 0x22 , 0x10 , 0x03 ] ) )
2182+ default :
2183+ XCTFail ( " Unexpected Data Message " )
2184+ }
2185+
2186+ do {
2187+ try await task. sendPing ( )
2188+ // Server hasn't closed the connection yet
2189+ } catch {
2190+ // Server closed the connection before we could process the pong
2191+ let urlError = try XCTUnwrap ( error as? URLError )
2192+ XCTAssertEqual ( urlError. _nsError. code, NSURLErrorNetworkConnectionLost)
2193+ }
2194+ }
2195+
21522196 func test_webSocketSpecificProtocol( ) async throws {
21532197 guard #available( macOS 12 , iOS 13 . 0 , watchOS 6 . 0 , tvOS 13 . 0 , * ) else { return }
21542198 guard URLSessionWebSocketTask . supportsWebSockets else {
0 commit comments