From 9760c74bd0ff5b9a60f39f6f2f20952d1815c91c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Paul=20H=C3=A4nsch?= Date: Mon, 16 Mar 2026 22:47:03 +0100 Subject: [PATCH] more tests --- socket-tests.js | 97 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 83 insertions(+), 14 deletions(-) diff --git a/socket-tests.js b/socket-tests.js index 002d59e..bb640d8 100644 --- a/socket-tests.js +++ b/socket-tests.js @@ -15,6 +15,15 @@ function gassert(cond, msgstr, errstr, name) { } } +var family = {}; +family[net.AF_UNIX] = "AF_UNIX"; +family[net.AF_INET] = "AF_INET"; +family[net.AF_INET6] = "AF_INET6"; + +var type = {}; +type[net.SOCK_STREAM] = "SOCK_STREAM"; +type[net.SOCK_DGRAM] = "SOCK_DGRAM"; + function server() { function assert(cond, m, e) { gassert(cond, m, e, "Server"); } @@ -42,7 +51,7 @@ function server() { for (sock of [t4, t6, ux]) { std.printf("\n"); assert(true, "testing accept timeouts"); - assert(true, "Socketfamily: " + sock.family + " name: " + sock.localName + " port: " + sock.localPort); + assert(true, "Socketfamily: " + family[sock.family] + " name: " + sock.localName + " port: " + sock.localPort); sock.timeout = .000001; assert(sock.timeout == .000001, "set short timeout"); assert (! sock.accept(), "timeout during accept"); @@ -66,13 +75,40 @@ function server() { assert(sock.localName && !sock.localPort && !sock.peerName && !sock.peerPort, "unix socket has local Name but no port or peer (" + sock.localName + ")"); - //new os.Worker(scriptArgs[0]); + new os.Worker(scriptArgs[0]); + + assert(ct4 = t4.accept(), "received connection on ip4/tcp (by "+ct4.peerName+"/"+ct4.peerPort+")"); + assert(ct6 = t6.accept(), "received connection on ip6/tcp (by "+ct6.peerName+"/"+ct6.peerPort+")"); + assert(cux = ux.accept(), "received connection on unix"); + + assert(ct4.connected, "socket connected: ip4/tcp"); + assert(ct6.connected, "socket connected: ip6/tcp"); + assert(cux.connected, "socket connected: unix"); + assert(!u4.connected, "socket not connected: ip4/udp"); + assert(!u6.connected, "socket not connected: ip6/udp"); + + for ( sock of [ct4, ct6, cux, u4, u6] ) { + sock.timeout = -1; + assert(sock.recvString() === "ketchup", + "received string \"ketchup\" from "+sock.peerName+"/"+sock.peerPort+" ("+family[sock.family]+"/"+type[sock.type]+")") + sock.ketchupPort = sock.peerPort; + assert(sock.send(new Uint8Array([109,97,121,111]).buffer), "sent array buffer ("+family[sock.family]+"/"+type[sock.type]+")") + } std.printf("\n") - assert(!t4.close(), "closed ip4/tcp"); - assert(!t6.close(), "closed ip6/tcp"); - assert(!u4.close(), "closed ip4/udp"); - assert(!u6.close(), "closed ip6/udp"); + assert(!t4.close(), "closed ip4/tcp listener"); + assert(!t6.close(), "closed ip6/tcp listener"); + assert(!ux.close(), "closed unix listener"); + assert(!ct4.close(), "closed ip4/tcp connection"); + assert(!ct6.close(), "closed ip6/tcp connection"); + assert(!cux.close(), "closed unix connection"); + + assert(u4.recvString() === "mustard" && u4.ketchupPort != u4.peerPort, + "received string \"mustard\" from "+u4.peerName+"/"+u4.peerPort+" ("+family[u4.family]+"/"+type[u4.type]+")") + assert(u6.recvString() === "mustard" && u6.ketchupPort != u6.peerPort, + "received string \"mustard\" from "+u6.peerName+"/"+u6.peerPort+" ("+family[u6.family]+"/"+type[u6.type]+")") + assert(!u4.close(), "closed ip4/udp listener"); + assert(!u6.close(), "closed ip6/udp listener"); } function client() { @@ -80,25 +116,58 @@ function client() { assert(true, "running client"); var t4, t6, u4, u6, ux, sock; + assert(! net.getTimeout(), "default connect timeout unset"); + net.setTimeout(1); + assert(net.getTimeout() == 1, "set default connect timeout"); try { t4 = net.tcpConnect( "localhost", 1); } catch(e) {} - try { t6 = net.tcp6Connect("localhost", 1); } catch(e) {} - try { ux = net.unixConnect("/nonexist"); } catch(e) {} assert(!t4, "conrefused for ip4/tcp"); + try { t6 = net.tcp6Connect("localhost", 1); } catch(e) {} assert(!t6, "conrefused for ip6/tcp"); + try { ux = net.unixConnect("/nonexist"); } catch(e) {} assert(!ux, "conrefused for unix"); - // assert(t4 = net.tcpConnect("localhost", 1024), "listening on ip4/tcp"); - // assert(t6 = net.tcp6Connect("localhost", 1024), "listening on ip6/tcp"); - // assert(u4 = net.udpConnect("localhost", 1024), "listening on ip4/udp"); - // assert(u6 = net.udp6Connect("localhost", 1024), "listening on ip6/udp"); + assert(t4 = net.tcpConnect("localhost", 1024), "connected to ip4/tcp"); + assert(t6 = net.tcp6Connect("localhost", 1024), "connected to ip6/tcp"); + assert(u4 = net.udpConnect("localhost", 1024), "connected to ip4/udp"); + assert(u6 = net.udp6Connect("localhost", 1024), "connected to ip6/udp"); + assert(ux = net.unixConnect(xsock), "connected to unix"); + + for ( sock of [t4, t6, ux, u4, u6] ) { + assert(sock.connected, "socket connected: "+family[sock.family]+"/"+type[sock.type]+""); + sock.timeout = 0; + assert(!sock.recv(), "return of nonblocking read ("+family[sock.family]+"/"+type[sock.type]+")") + assert(sock.send("ketchup"), "sent string ("+family[sock.family]+"/"+type[sock.type]+")") + sock.timeout = -1; + assert(String.fromCharCode(... new Uint8Array(sock.recv())) === "mayo", "received ArrayBuffer \"mayo\" on "+family[sock.family]+"/"+type[sock.type]+""); + } + + assert(t4.recvString() === "", "short read from ip4/tcp"); + assert(!t4.connected, "socket not connected: ip4/tcp"); + assert(t6.recvString() === "", "short read from ip6/tcp"); + assert(!t6.connected, "socket not connected: ip6/tcp"); + assert(ux.recvString() === "", "short read from unix"); + assert(!ux.connected, "socket not connected: unix"); + + assert(!u4.close(), "closed ip4/udp client"); + assert(!u6.close(), "closed ip6/udp client"); + assert(u4 = net.udpConnect("localhost", 1024), "connected to ip4/udp"); + assert(u6 = net.udp6Connect("localhost", 1024), "connected to ip6/udp"); + assert(u4.send("mustard"), "send string from different ip4/udp connection") + assert(u6.send("mustard"), "send string from different ip6/udp connection") + + assert(!t4.close(), "closed ip4/tcp client"); + assert(!t6.close(), "closed ip6/tcp client"); + assert(!ux.close(), "closed unix client"); + assert(!u4.close(), "closed ip4/udp client"); + assert(!u6.close(), "closed ip6/udp client"); } if (os.Worker.parent) { client(); } else { // var w = new os.Worker(scriptArgs[0]); - //new os.Worker(scriptArgs[0]); - os.sleep(1); + // new os.Worker(scriptArgs[0]); + //os.sleep(2); server(); os.remove(xsock); } -- 2.39.5