@@ -200,6 +200,84 @@ final class SocketTests: XCTestCase {
200200 }
201201 }
202202 #endif
203+
204+ func testTCPNoDelay( ) async throws {
205+ // Create a TCP socket
206+ let socket = try await Socket ( IPv4Protocol . tcp)
207+ defer { Task { await socket. close ( ) } }
208+
209+ // Test setting TCP_NODELAY option
210+ let nodelay = TCPSocketOption . NoDelay ( true )
211+ try socket. setOption ( nodelay)
212+
213+ // Test getting TCP_NODELAY option
214+ let retrievedOption = try socket [ TCPSocketOption . NoDelay. self]
215+ XCTAssertEqual ( retrievedOption. boolValue, true )
216+
217+ // Test disabling TCP_NODELAY
218+ let disableNodelay = TCPSocketOption . NoDelay ( false )
219+ try socket. setOption ( disableNodelay)
220+
221+ let retrievedDisabled = try socket [ TCPSocketOption . NoDelay. self]
222+ XCTAssertEqual ( retrievedDisabled. boolValue, false )
223+
224+ // Test with boolean literal
225+ let literalOption : TCPSocketOption . NoDelay = true
226+ try socket. setOption ( literalOption)
227+
228+ let retrievedLiteral = try socket [ TCPSocketOption . NoDelay. self]
229+ XCTAssertEqual ( retrievedLiteral. boolValue, true )
230+ }
231+
232+ func testTCPNoDelayBehavior( ) async throws {
233+ // This test verifies that TCP_NODELAY option works by testing with a connected socket pair
234+ let port = UInt16 . random ( in: 8080 ..< . max)
235+ print ( " Testing TCP_NODELAY behavior on port \( port) " )
236+ let address = IPv4SocketAddress ( address: . any, port: port)
237+
238+ // Create server
239+ let server = try await Socket ( IPv4Protocol . tcp, bind: address)
240+ defer { Task { await server. close ( ) } }
241+
242+ // Start server listening
243+ try await server. listen ( )
244+
245+ // Connect client and verify TCP_NODELAY can be set
246+ let client = try await Socket ( IPv4Protocol . tcp)
247+ defer { Task { await client. close ( ) } }
248+
249+ // Test that we can set TCP_NODELAY before connecting
250+ try client. setOption ( TCPSocketOption . NoDelay ( true ) )
251+ let nodeDelayBeforeConnect = try client [ TCPSocketOption . NoDelay. self]
252+ XCTAssertEqual ( nodeDelayBeforeConnect. boolValue, true )
253+
254+ // Connect to server
255+ do { try await client. connect ( to: address) }
256+ catch Errno . socketIsConnected { }
257+
258+ // Accept connection on server side
259+ let serverConnection = try await server. accept ( )
260+ defer { Task { await serverConnection. close ( ) } }
261+
262+ // Verify TCP_NODELAY is still set after connection
263+ let nodeDelayAfterConnect = try client [ TCPSocketOption . NoDelay. self]
264+ XCTAssertEqual ( nodeDelayAfterConnect. boolValue, true )
265+
266+ // Test setting TCP_NODELAY on the server's accepted connection
267+ try serverConnection. setOption ( TCPSocketOption . NoDelay ( false ) )
268+ let serverNodeDelay = try serverConnection [ TCPSocketOption . NoDelay. self]
269+ XCTAssertEqual ( serverNodeDelay. boolValue, false )
270+
271+ // Demonstrate that small writes work with TCP_NODELAY
272+ // (The actual latency difference is hard to measure reliably on localhost)
273+ let testData = Data ( " Hello " . utf8)
274+ try await client. write ( testData)
275+
276+ let receivedData = try await serverConnection. read ( testData. count)
277+ XCTAssertEqual ( testData, receivedData)
278+
279+ print ( " Successfully tested TCP_NODELAY option setting and data transmission " )
280+ }
203281}
204282
205283var isRunningInCI : Bool {
0 commit comments