]> git.plutz.net Git - quickjs_net/commitdiff
more tests
authorPaul Hänsch <paul@plutz.net>
Mon, 16 Mar 2026 21:47:03 +0000 (22:47 +0100)
committerPaul Hänsch <paul@plutz.net>
Mon, 16 Mar 2026 21:47:03 +0000 (22:47 +0100)
socket-tests.js

index 002d59e770c8682009780e5ad8dba8dcc0fcbfbf..bb640d8540a5b656958132c382e526ae4b40e2f1 100644 (file)
@@ -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);
 }