// socket_diagnostic.wren - Diagnose socket issues import "socket" for Socket, SocketInstance foreign class Host { foreign static signalDone() } var mainFiber = Fiber.new { System.print("=== Socket Diagnostic Test ===\n") // Test 1: Basic socket creation System.print("Test 1: Socket creation") var sock1 = SocketInstance.new() if (sock1 && !sock1[0]) { System.print(" ✓ Socket created successfully") sock1[1].close() } else { System.print(" ✗ Failed: %(sock1 ? sock1[0] : "null result")") } // Test 2: Bind to different ports System.print("\nTest 2: Port binding") var ports = [18000, 18001, 18002, 18003, 18004] var boundSockets = [] for (port in ports) { var result = SocketInstance.new() if (result && !result[0]) { var sock = result[1] var bindResult = sock.bind("127.0.0.1", port) if (bindResult && !bindResult[0]) { System.print(" ✓ Bound to port %(port)") boundSockets.add(sock) } else { System.print(" ✗ Failed to bind port %(port): %(bindResult ? bindResult[0] : "null")") sock.close() } } } // Clean up for (sock in boundSockets) { sock.close() } // Test 3: Listen without bind (should fail) System.print("\nTest 3: Listen without bind") var result = SocketInstance.new() if (result && !result[0]) { var sock = result[1] var listenResult = sock.listen(5) if (listenResult && listenResult[0]) { System.print(" ✓ Correctly failed: %(listenResult[0])") } else { System.print(" ✗ Unexpectedly succeeded") } sock.close() } // Test 4: Full server setup System.print("\nTest 4: Full server setup") result = SocketInstance.new() if (!result || result[0]) { System.print(" ✗ Failed to create server socket") } else { var serverSock = result[1] System.print(" ✓ Server socket created") var bindResult = serverSock.bind("0.0.0.0", 18080) if (!bindResult || bindResult[0]) { System.print(" ✗ Bind failed: %(bindResult ? bindResult[0] : "null")") serverSock.close() } else { System.print(" ✓ Bound to 0.0.0.0:18080") var listenResult = serverSock.listen(10) if (!listenResult || listenResult[0]) { System.print(" ✗ Listen failed: %(listenResult ? listenResult[0] : "null")") } else { System.print(" ✓ Listening with backlog 10") } serverSock.close() } } // Test 5: Rapid open/close System.print("\nTest 5: Rapid socket open/close") var successCount = 0 for (i in 1..100) { var r = SocketInstance.new() if (r && !r[0]) { successCount = successCount + 1 r[1].close() } } System.print(" Created and closed %(successCount)/100 sockets") // Test 6: Connect to non-existent server (should fail quickly) System.print("\nTest 6: Connect to non-existent server") var startTime = System.clock var connectResult = SocketInstance.connect("127.0.0.1", 19999) var elapsed = System.clock - startTime if (connectResult && connectResult[0]) { System.print(" ✓ Correctly failed in %(elapsed)s: %(connectResult[0])") } else { System.print(" ✗ Unexpectedly succeeded") if (connectResult && connectResult[1]) { connectResult[1].close() } } // Test 7: Actual echo test with verbose output System.print("\nTest 7: Simple echo test") // Create server var serverResult = SocketInstance.new() if (!serverResult || serverResult[0]) { System.print(" ✗ Server socket creation failed: %(serverResult ? serverResult[0] : "null")") } else { var serverSock = serverResult[1] System.print(" ✓ Server socket created") // Try multiple ports in case one is in use var serverPort = 0 var bindSuccess = false for (port in [20000, 20001, 20002, 20003, 20004]) { var bindResult = serverSock.bind("127.0.0.1", port) if (bindResult && !bindResult[0]) { serverPort = port bindSuccess = true System.print(" ✓ Server bound to port %(port)") break } } if (!bindSuccess) { System.print(" ✗ Could not bind to any port") serverSock.close() } else { var listenResult = serverSock.listen(5) if (!listenResult || listenResult[0]) { System.print(" ✗ Listen failed: %(listenResult ? listenResult[0] : "null")") serverSock.close() } else { System.print(" ✓ Server listening") // Server fiber var serverDone = false var serverFiber = Fiber.new { System.print(" [Server] Waiting for connection...") var attempts = 0 while (attempts < 500) { var acceptResult = serverSock.accept() if (acceptResult && !acceptResult[0] && acceptResult[1]) { System.print(" [Server] ✓ Accepted connection") var clientSock = SocketInstance.fromFd(acceptResult[1]) // Read from client var readAttempts = 0 while (readAttempts < 100) { var readResult = clientSock.read(256) if (readResult && !readResult[0] && readResult[1] && readResult[1].count > 0) { System.print(" [Server] ✓ Received: %(readResult[1])") // Echo back var writeErr = clientSock.write(readResult[1]) if (writeErr) { System.print(" [Server] ✗ Write failed: %(writeErr)") } else { System.print(" [Server] ✓ Echoed back") } break } readAttempts = readAttempts + 1 Fiber.yield() } clientSock.close() break } attempts = attempts + 1 Fiber.yield() } if (attempts >= 500) { System.print(" [Server] ✗ No connection after %(attempts) attempts") } serverDone = true } // Client fiber var clientDone = false var clientFiber = Fiber.new { // Wait a bit for server to be ready for (i in 1..10) Fiber.yield() System.print(" [Client] Connecting to port %(serverPort)...") var connectResult = SocketInstance.connect("127.0.0.1", serverPort) if (!connectResult || connectResult[0]) { System.print(" [Client] ✗ Connect failed: %(connectResult ? connectResult[0] : "null")") } else { var clientSock = connectResult[1] System.print(" [Client] ✓ Connected") var message = "Hello, Server!" var writeErr = clientSock.write(message) if (writeErr) { System.print(" [Client] ✗ Write failed: %(writeErr)") } else { System.print(" [Client] ✓ Sent: %(message)") // Read echo var readAttempts = 0 while (readAttempts < 100) { var readResult = clientSock.read(256) if (readResult && !readResult[0] && readResult[1] && readResult[1].count > 0) { System.print(" [Client] ✓ Received echo: %(readResult[1])") break } readAttempts = readAttempts + 1 Fiber.yield() } } clientSock.close() } clientDone = true } // Run both fibers serverFiber.call() clientFiber.call() var iterations = 0 while ((!serverDone || !clientDone) && iterations < 1000) { if (!serverDone) serverFiber.call() if (!clientDone) clientFiber.call() iterations = iterations + 1 Fiber.yield() } System.print(" Test completed after %(iterations) iterations") serverSock.close() } } } System.print("\n=== Diagnostic Complete ===") Host.signalDone() while(true) { Fiber.yield() } }