summaryrefslogtreecommitdiffstats
path: root/tests/014
diff options
context:
space:
mode:
Diffstat (limited to 'tests/014')
-rw-r--r--tests/014/dgram-stream.expected0
-rw-r--r--tests/014/dgram-stream.tl8
-rw-r--r--tests/014/in6addr-str.tl120
-rw-r--r--tests/014/inaddr-str.tl78
-rw-r--r--tests/014/sockaddr-str.tl49
-rw-r--r--tests/014/socket-basic.expected0
-rw-r--r--tests/014/socket-basic.tl19
-rw-r--r--tests/014/socket-misc.tl20
-rw-r--r--tests/014/str-addr.tl68
9 files changed, 350 insertions, 12 deletions
diff --git a/tests/014/dgram-stream.expected b/tests/014/dgram-stream.expected
deleted file mode 100644
index e69de29b..00000000
--- a/tests/014/dgram-stream.expected
+++ /dev/null
diff --git a/tests/014/dgram-stream.tl b/tests/014/dgram-stream.tl
index 5902a84d..6890e300 100644
--- a/tests/014/dgram-stream.tl
+++ b/tests/014/dgram-stream.tl
@@ -1,7 +1,7 @@
(load "../common.tl")
(load "../sock-common.tl")
-(defvar family)
+(defvar *family*)
(defun server (svc-sock)
(whilet ((acc-sock (sock-accept svc-sock))
@@ -10,7 +10,7 @@
(close-stream acc-sock)))
(defun client (addr)
- (with-stream (cli-sock (open-socket family sock-dgram))
+ (with-stream (cli-sock (open-socket *family* sock-dgram))
(sock-connect cli-sock addr)
(dotimes (i 1000)
(print i cli-sock)
@@ -22,7 +22,7 @@
(flush-stream cli-sock)))
(defun dgram-test ()
- (let* ((svc-sock (open-socket family sock-dgram))
+ (let* ((svc-sock (open-socket *family* sock-dgram))
(svc-addr (bindfree svc-sock 1025 65535))
(server-pid (fork)))
(cond
@@ -37,6 +37,6 @@
(fboundp 'fork))
(let ((maybe-ipv6 (if (memq (os-symbol) '(:linux :macos :cygwin :cygnal))
(list af-inet6))))
- (each ((family ^(,af-inet ,*maybe-ipv6)))
+ (each ((*family* ^(,af-inet ,*maybe-ipv6)))
(unless (dgram-test)
(error "test failed")))))
diff --git a/tests/014/in6addr-str.tl b/tests/014/in6addr-str.tl
new file mode 100644
index 00000000..a85da416
--- /dev/null
+++ b/tests/014/in6addr-str.tl
@@ -0,0 +1,120 @@
+(load "../common.tl")
+
+(test (in6addr-str "junk") :error)
+
+(test (in6addr-str "0:0:0:0:0:0:0:0:0") :error)
+(test (in6addr-str "0:0:0:0:0:0") :error)
+(test (in6addr-str "0:0:0:0") :error)
+(test (in6addr-str "") :error)
+
+(test (in6addr-str "0:0:0:0:0:0:0:x:0") :error)
+
+(test (in6addr-str ":0:0:0:0:0:0:0:0:0") :error)
+(test (in6addr-str "0:0:0:0:0:0:0:0:0:") :error)
+
+(test (in6addr-str "0:0:0:0:0:0:0:0:FFFFF") :error)
+(test (in6addr-str "0:0:0:0:0:0:0:FFFFF:0") :error)
+(test (in6addr-str "0:0:0:0:0:0:FFFFF:0:0") :error)
+(test (in6addr-str "0:0:0:0:0:FFFFF:0:0:0") :error)
+(test (in6addr-str "0:0:0:0:FFFFF:0:0:0:0") :error)
+(test (in6addr-str "0:0:0:FFFFF:0:0:0:0:0") :error)
+(test (in6addr-str "0:0:FFFFF:0:0:0:0:0:0") :error)
+(test (in6addr-str "0:FFFFF:0:0:0:0:0:0:0") :error)
+(test (in6addr-str "FFFFF:0:0:0:0:0:0:0:0") :error)
+
+(test (in6addr-str "0:0:0:0:0:0:0:0/") :error)
+(test (in6addr-str "0:0:0:0:0:0:0:0/129") :error)
+(test (in6addr-str "[0:0:0:0:0:0:0:0]:") :error)
+(test (in6addr-str "[0:0:0:0:0:0:0:0]:65536") :error)
+
+(test (in6addr-str "0:0:0:0:0:0:0:0")
+ #S(sockaddr-in6 addr 0
+ port 0 flow-info 0 scope-id 0 prefix 128))
+(test (in6addr-str "1111:2222:3333:4444:5555:6666:7777:8888")
+ #S(sockaddr-in6 addr 22685837286468424649968941046919825544
+ port 0 flow-info 0 scope-id 0 prefix 128))
+(test (in6addr-str "FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF")
+ #S(sockaddr-in6 addr 340282366920938463463374607431768211455
+ port 0 flow-info 0 scope-id 0 prefix 128))
+
+(test (in6addr-str "[0:0:0:0:0:0:0:0]:42")
+ #S(sockaddr-in6 addr 0
+ port 42 flow-info 0 scope-id 0 prefix 128))
+(test (in6addr-str "[1111:2222:3333:4444:5555:6666:7777:8888]:42")
+ #S(sockaddr-in6 addr 22685837286468424649968941046919825544
+ port 42 flow-info 0 scope-id 0 prefix 128))
+(test (in6addr-str "[FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF]:42")
+ #S(sockaddr-in6 addr 340282366920938463463374607431768211455
+ port 42 flow-info 0 scope-id 0 prefix 128))
+
+(test (in6addr-str "0:0:0:0:0:0:0:0/16")
+ #S(sockaddr-in6 addr 0
+ port 0 flow-info 0 scope-id 0 prefix 16))
+(test (in6addr-str "1111:2222:3333:4444:5555:6666:7777:8888/16")
+ #S(sockaddr-in6 addr 22685144974938661909049738462362599424
+ port 0 flow-info 0 scope-id 0 prefix 16))
+(test (in6addr-str "FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF/16")
+ #S(sockaddr-in6 addr 340277174624079928635746076935438991360
+ port 0 flow-info 0 scope-id 0 prefix 16))
+(test (in6addr-str "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/16")
+ #S(sockaddr-in6 addr 340277174624079928635746076935438991360
+ port 0 flow-info 0 scope-id 0 prefix 16))
+
+(test (in6addr-str "[0:0:0:0:0:0:0:0/16]:42")
+ #S(sockaddr-in6 addr 0
+ port 42 flow-info 0 scope-id 0 prefix 16))
+(test (in6addr-str "[1111:2222:3333:4444:5555:6666:7777:8888/16]:42")
+ #S(sockaddr-in6 addr 22685144974938661909049738462362599424
+ port 42 flow-info 0 scope-id 0 prefix 16))
+(test (in6addr-str "[FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF/16]:42")
+ #S(sockaddr-in6 addr 340277174624079928635746076935438991360
+ port 42 flow-info 0 scope-id 0 prefix 16))
+
+(test (in6addr-str "1:2:3:4:5:6::7:8:9") :error)
+(test (in6addr-str "1:2:3:4:5:6::7:8:9") :error)
+(test (in6addr-str "1:2:3:4:5:6::7:8") :error)
+
+(test (in6addr-str "::1")
+ #S(sockaddr-in6 addr 1
+ port 0 flow-info 0 scope-id 0 prefix 128))
+
+(test (in6addr-str "1::")
+ #S(sockaddr-in6 addr 5192296858534827628530496329220096
+ port 0 flow-info 0 scope-id 0 prefix 128))
+
+(test (in6addr-str "1::1")
+ #S(sockaddr-in6 addr 5192296858534827628530496329220097
+ port 0 flow-info 0 scope-id 0 prefix 128))
+
+(test (in6addr-str "1:2::3:4")
+ #S(sockaddr-in6 addr 5192455314859856157205683417317380
+ port 0 flow-info 0 scope-id 0 prefix 128))
+
+(test (in6addr-str "::ffff:1.2.3.4.5") :error)
+(test (in6addr-str "::ffff:1.2.3.4:5") :error)
+(test (in6addr-str "::ffff:1.2.3") :error)
+(test (in6addr-str "::ffff:1.2.3:4") :error)
+
+(test (in6addr-str "::ffff:1.2.3.4")
+ #S(sockaddr-in6 addr 281470698652420
+ port 0 flow-info 0 scope-id 0 prefix 128))
+
+(test (in6addr-str "::FFFF:1.2.3.4")
+ #S(sockaddr-in6 addr 281470698652420
+ port 0 flow-info 0 scope-id 0 prefix 128))
+
+(test (in6addr-str "::FfFf:1.2.3.4")
+ #S(sockaddr-in6 addr 281470698652420
+ port 0 flow-info 0 scope-id 0 prefix 128))
+
+(test (in6addr-str "::FFFF:1.2.3.4/96")
+ #S(sockaddr-in6 addr 281470681743360
+ port 0 flow-info 0 scope-id 0 prefix 96))
+
+(test (in6addr-str "[::ffff:1.2.3.4]:42")
+ #S(sockaddr-in6 addr 281470698652420
+ port 42 flow-info 0 scope-id 0 prefix 128))
+
+(test (in6addr-str "[::FFFF:1.2.3.4/96]:42")
+ #S(sockaddr-in6 addr 281470681743360
+ port 42 flow-info 0 scope-id 0 prefix 96))
diff --git a/tests/014/inaddr-str.tl b/tests/014/inaddr-str.tl
new file mode 100644
index 00000000..67283188
--- /dev/null
+++ b/tests/014/inaddr-str.tl
@@ -0,0 +1,78 @@
+(load "../common.tl")
+
+(test (inaddr-str "junk") :error)
+(test (inaddr-str "0.0.0.0.0") :error)
+(test (inaddr-str "0.0.0") :error)
+(test (inaddr-str "0") :error)
+(test (inaddr-str "") :error)
+(test (inaddr-str "0.0.0.nnn") :error)
+(test (inaddr-str "0.0.0.256") :error)
+(test (inaddr-str "0.0.256.0") :error)
+(test (inaddr-str "0.256.0.0") :error)
+(test (inaddr-str "256.0.0.0") :error)
+(test (inaddr-str "0.0.0.0:65537") :error)
+(test (inaddr-str "0.0.0.0/33") :error)
+(test (inaddr-str "0.0.0.0/32:65537") :error)
+(test (inaddr-str "0.0.0.0/33:0") :error)
+(test (inaddr-str "0.0.0.0:0/0") :error)
+(test (inaddr-str "0.0.0.") :error)
+(test (inaddr-str "0.0..0") :error)
+(test (inaddr-str "0..0.0") :error)
+(test (inaddr-str ".0.0.0") :error)
+(test (inaddr-str "0.0.0.0:") :error)
+
+(test (inaddr-str "0.0.0.0")
+ #S(sockaddr-in addr 0 port 0 prefix 32))
+(test (inaddr-str "1.2.3.4")
+ #S(sockaddr-in addr 16909060 port 0 prefix 32))
+(test (inaddr-str "255.255.255.255")
+ #S(sockaddr-in addr 4294967295 port 0 prefix 32))
+
+(test (inaddr-str "0.0.0.0:0")
+ #S(sockaddr-in addr 0 port 0 prefix 32))
+(test (inaddr-str "1.2.3.4:5")
+ #S(sockaddr-in addr 16909060 port 5 prefix 32))
+(test (inaddr-str "255.255.255.255:65535")
+ #S(sockaddr-in addr 4294967295 port 65535 prefix 32))
+
+(test (inaddr-str "0.0.0.0/0")
+ #S(sockaddr-in addr 0 port 0 prefix 0))
+(test (inaddr-str "1.2.3.4/8")
+ #S(sockaddr-in addr 16777216 port 0 prefix 8))
+(test (inaddr-str "255.255.255.255/24")
+ #S(sockaddr-in addr 4294967040 port 0 prefix 24))
+
+(test (inaddr-str "0.0.0/0")
+ #S(sockaddr-in addr 0 port 0 prefix 0))
+(test (inaddr-str "0.0/0")
+ #S(sockaddr-in addr 0 port 0 prefix 0))
+(test (inaddr-str "0/0")
+ #S(sockaddr-in addr 0 port 0 prefix 0))
+
+(test (inaddr-str "1.2.3/8")
+ #S(sockaddr-in addr 16777216 port 0 prefix 8))
+(test (inaddr-str "1.2/8")
+ #S(sockaddr-in addr 16777216 port 0 prefix 8))
+(test (inaddr-str "1/8")
+ #S(sockaddr-in addr 16777216 port 0 prefix 8))
+
+(test (inaddr-str "0.0.0.0/0:1234")
+ #S(sockaddr-in addr 0 port 1234 prefix 0))
+(test (inaddr-str "1.2.3.4/8:1234")
+ #S(sockaddr-in addr 16777216 port 1234 prefix 8))
+(test (inaddr-str "255.255.255.255/24:1234")
+ #S(sockaddr-in addr 4294967040 port 1234 prefix 24))
+
+(test (inaddr-str "0.0.0/0:1234")
+ #S(sockaddr-in addr 0 port 1234 prefix 0))
+(test (inaddr-str "0.0/0:1234")
+ #S(sockaddr-in addr 0 port 1234 prefix 0))
+(test (inaddr-str "0/0:1234")
+ #S(sockaddr-in addr 0 port 1234 prefix 0))
+
+(test (inaddr-str "1.2.3/8:1234")
+ #S(sockaddr-in addr 16777216 port 1234 prefix 8))
+(test (inaddr-str "1.2/8:1234")
+ #S(sockaddr-in addr 16777216 port 1234 prefix 8))
+(test (inaddr-str "1/8:1234")
+ #S(sockaddr-in addr 16777216 port 1234 prefix 8))
diff --git a/tests/014/sockaddr-str.tl b/tests/014/sockaddr-str.tl
new file mode 100644
index 00000000..183c1a02
--- /dev/null
+++ b/tests/014/sockaddr-str.tl
@@ -0,0 +1,49 @@
+(load "../common.tl")
+
+(mtest
+ (sockaddr-str "") :error
+ (sockaddr-str "1") :error
+ (sockaddr-str "x") :error
+ (sockaddr-str "1:2") :error
+ (sockaddr-str "[]:") :error)
+
+(mtest
+ (sockaddr-str "[::1]:-1") :error
+ (sockaddr-str "[::1]:65536") :error
+ (sockaddr-str "1.2.3.4:-1") :error
+ (sockaddr-str "1.2.3.4:65536") :error
+ (sockaddr-str "1:2/8") :error)
+
+(mtest
+ (sockaddr-str "/") #S(sockaddr-un canonname nil path "/")
+ (sockaddr-str "/abc") #S(sockaddr-un canonname nil path "/abc"))
+
+(mtest
+ (sockaddr-str "[::1]:2") #S(sockaddr-in6 addr 1 port 2)
+ (sockaddr-str "[::1/1]:2") #S(sockaddr-in6 addr 0 port 2 prefix 1))
+
+(mtest
+ (sockaddr-str "::1") #S(sockaddr-in6 addr 1)
+ (sockaddr-str "::1/1") #S(sockaddr-in6 addr 0 prefix 1))
+
+(mtest
+ (sockaddr-str "::ffff:1.2.3.4") #S(sockaddr-in6 addr 281470698652420)
+ (sockaddr-str "::ffff:1.2.3.4/96") #S(sockaddr-in6 addr 281470681743360 prefix 96))
+
+(mtest
+ (sockaddr-str "1.2.3.4") #S(sockaddr-in addr 16909060)
+ (sockaddr-str "1.2.3.4/8") #S(sockaddr-in addr 16777216 prefix 8)
+ (sockaddr-str "1.2.3.4:16") #S(sockaddr-in addr 16909060 port 16)
+ (sockaddr-str "1.2.3.4/8:16") #S(sockaddr-in addr 16777216 prefix 8 port 16))
+
+(mtest
+ (sockaddr-str "1/8") #S(sockaddr-in addr 16777216 prefix 8)
+ (sockaddr-str "1.2/8") #S(sockaddr-in addr 16777216 prefix 8)
+ (sockaddr-str "1/8:5") #S(sockaddr-in addr 16777216 prefix 8 port 5)
+ (sockaddr-str "1.2/8:5") #S(sockaddr-in addr 16777216 prefix 8 port 5))
+
+(mtest
+ (sockaddr-str "1:2:3:4:5:6:7:8/127")
+ #S(sockaddr-in6 addr 5192455318486707404433266433261576 prefix 127)
+ (sockaddr-str "[1:2:3:4:5:6:7:8/127]:5")
+ #S(sockaddr-in6 addr 5192455318486707404433266433261576 prefix 127 port 5))
diff --git a/tests/014/socket-basic.expected b/tests/014/socket-basic.expected
deleted file mode 100644
index e69de29b..00000000
--- a/tests/014/socket-basic.expected
+++ /dev/null
diff --git a/tests/014/socket-basic.tl b/tests/014/socket-basic.tl
index efeed2d6..2e4d57a0 100644
--- a/tests/014/socket-basic.tl
+++ b/tests/014/socket-basic.tl
@@ -1,22 +1,25 @@
(load "../sock-common.tl")
+(load "../common.tl")
-(defvar socktype)
+(defvar *socktype*)
+
+(defvarl %iters% (if (meql (os-symbol) :macos :bsd :openbsd) 2000 5000))
(defun client (addr)
- (with-stream (cli-sock (open-socket af-inet socktype))
+ (with-stream (cli-sock (open-socket af-inet *socktype*))
(sock-connect cli-sock addr)
(put-string "5000" cli-sock)
(sock-shutdown cli-sock)
- (equal (read cli-sock) (range 1 5000))))
+ (equal (read cli-sock) (range 1 %iters%))))
(defun server (svc-sock)
(let* ((acc-sock (sock-accept svc-sock))
(query (read acc-sock)))
- (print (range 1 5000) acc-sock)
+ (print (range 1 %iters%) acc-sock)
(close-stream acc-sock)))
-(defun test ()
- (let* ((svc-sock (open-socket af-inet socktype))
+(defun sock-test ()
+ (let* ((svc-sock (open-socket af-inet *socktype*))
(svc-addr (bindfree svc-sock 1025 65535))
(child-pid (fork)))
(cond
@@ -26,6 +29,6 @@
(if (and (fboundp 'open-socket)
(fboundp 'fork))
- (each ((socktype (list sock-dgram sock-stream)))
- (unless (test)
+ (each ((*socktype* (list sock-dgram sock-stream)))
+ (unless (sock-test)
(error "test failed"))))
diff --git a/tests/014/socket-misc.tl b/tests/014/socket-misc.tl
new file mode 100644
index 00000000..5f533529
--- /dev/null
+++ b/tests/014/socket-misc.tl
@@ -0,0 +1,20 @@
+(load "../sock-common")
+(load "../common")
+
+(defmacro set-and-get (:env env place val)
+ (with-update-expander (getter setter) place env
+ ^(progn (,setter ,val) (,getter))))
+
+(with-stream (s (open-socket af-inet (logior sock-dgram sock-nonblock)))
+ (test (sock-listen s) t)
+ (let* ((orig #S(sockaddr-in))
+ (addr orig))
+ (rotate addr (sock-peer s))
+ (vtest (sock-peer s) orig)))
+
+(with-stream (s (open-socket af-inet sock-stream))
+ (test (nzerop (set-and-get (sock-opt s sol-socket so-reuseaddr) 1)) t)
+ (test (set-and-get (sock-opt s sol-socket so-reuseaddr (ffi int)) 0) 0)
+ (whenlet ((addr (bindfree s 1025 65535)))
+ ;; sock-bind enables so-reuseaddr.
+ (test (nzerop (sock-opt s sol-socket so-reuseaddr)) t)))
diff --git a/tests/014/str-addr.tl b/tests/014/str-addr.tl
new file mode 100644
index 00000000..49bc844a
--- /dev/null
+++ b/tests/014/str-addr.tl
@@ -0,0 +1,68 @@
+(load "../common.tl")
+
+(mtest
+ #S(sockaddr-un path "/foo").(str-addr) "/foo"
+ #S(sockaddr-un path nil).(str-addr) :error)
+
+(mtest
+ #S(sockaddr-in addr 0).(str-addr) "0.0.0.0"
+ #S(sockaddr-in addr #x01020304).(str-addr) "1.2.3.4"
+ #S(sockaddr-in addr #x01020304 prefix 8).(str-addr) "1.2.3.4/8"
+ #S(sockaddr-in addr #x01020304 prefix 16).(str-addr) "1.2.3.4/16"
+ #S(sockaddr-in addr #x01020304 prefix 24).(str-addr) "1.2.3.4/24"
+ #S(sockaddr-in addr #x01020304 prefix 31).(str-addr) "1.2.3.4/31"
+ #S(sockaddr-in addr #x01020304 prefix 32).(str-addr) "1.2.3.4"
+ #S(sockaddr-in addr #x01000000 prefix 8).(str-addr) "1/8"
+ #S(sockaddr-in addr #x01000000 prefix 16).(str-addr) "1/16"
+ #S(sockaddr-in addr #x01020000 prefix 16).(str-addr) "1.2/16"
+ #S(sockaddr-in addr #x01000000 prefix 24).(str-addr) "1/24"
+ #S(sockaddr-in addr #x01020000 prefix 24).(str-addr) "1.2/24"
+ #S(sockaddr-in addr #x01020300 prefix 24).(str-addr) "1.2.3/24"
+ #S(sockaddr-in addr #x01000000 prefix 31).(str-addr) "1/31"
+ #S(sockaddr-in addr 0 port 123).(str-addr) "0.0.0.0:123"
+ #S(sockaddr-in addr #x01020304 port 123).(str-addr) "1.2.3.4:123"
+ #S(sockaddr-in addr #x01020304 port 123 prefix 8).(str-addr) "1.2.3.4/8:123"
+ #S(sockaddr-in addr #x01020304 port 123 prefix 16).(str-addr) "1.2.3.4/16:123"
+ #S(sockaddr-in addr #x01020304 port 123 prefix 24).(str-addr) "1.2.3.4/24:123"
+ #S(sockaddr-in addr #x01020304 port 123 prefix 24).(str-addr) "1.2.3.4/24:123"
+ #S(sockaddr-in addr #x01020304 port 123 prefix 31).(str-addr) "1.2.3.4/31:123"
+ #S(sockaddr-in addr #x01020304 port 123 prefix 32).(str-addr) "1.2.3.4:123"
+ #S(sockaddr-in addr #x01000000 port 123 prefix 8).(str-addr) "1/8:123"
+ #S(sockaddr-in addr #x01000000 port 123 prefix 16).(str-addr) "1/16:123"
+ #S(sockaddr-in addr #x01020000 port 123 prefix 16).(str-addr) "1.2/16:123"
+ #S(sockaddr-in addr #x01000000 port 123 prefix 24).(str-addr) "1/24:123"
+ #S(sockaddr-in addr #x01020000 port 123 prefix 24).(str-addr) "1.2/24:123"
+ #S(sockaddr-in addr #x01020300 port 123 prefix 24).(str-addr) "1.2.3/24:123"
+ #S(sockaddr-in addr #x01000000 port 123 prefix 31).(str-addr) "1/31:123")
+
+(mtest
+ #S(sockaddr-in6 addr 0).(str-addr) "::"
+ #S(sockaddr-in6 addr #x80000000000000000000000000000001).(str-addr) "8000::1"
+ #S(sockaddr-in6 addr #x00000000000000000000000000000001).(str-addr) "::1"
+ #S(sockaddr-in6 addr #x80000000000000000000000000000000).(str-addr) "8000::"
+ #S(sockaddr-in6 addr #x00008000000000000000000000000001).(str-addr) "0:8000::1"
+ #S(sockaddr-in6 addr #x00000000000000000000000000010000).(str-addr) "::1:0"
+ #S(sockaddr-in6 addr #x00008000000000000000000000010000).(str-addr) "0:8000::1:0"
+ #S(sockaddr-in6 addr #x000000000000abcd0000000000000000).(str-addr) "0:0:0:abcd::"
+ #S(sockaddr-in6 addr #x0000000000000000abcd000000000000).(str-addr) "::abcd:0:0:0"
+ #S(sockaddr-in6 addr #x11112222333344445555666677778888).(str-addr) "1111:2222:3333:4444:5555:6666:7777:8888"
+ #S(sockaddr-in6 addr #x01000200030004000500060007000800).(str-addr) "100:200:300:400:500:600:700:800"
+ #S(sockaddr-in6 addr #x00008000000000000000000000010000 port 0).(str-addr) "0:8000::1:0"
+ #S(sockaddr-in6 addr #x00008000000000000000000000010000 port 123).(str-addr) "[0:8000::1:0]:123"
+ #S(sockaddr-in6 addr #x00008000000000000000000000010000 prefix 128).(str-addr) "0:8000::1:0"
+ #S(sockaddr-in6 addr #x00008000000000000000000000010000 prefix 127).(str-addr) "0:8000::1:0/127"
+ #S(sockaddr-in6 addr #x00008000000000000000000000010000 port 123 prefix 127).(str-addr) "[0:8000::1:0/127]:123")
+
+(mtest
+ #S(sockaddr-in6 addr #xffff00000000).(str-addr) "::ffff:0.0.0.0"
+ #S(sockaddr-in6 addr #xffff00000000 prefix 24).(str-addr) "::ffff:0/24"
+ #S(sockaddr-in6 addr #xffff01000000 prefix 24).(str-addr) "::ffff:1/24"
+ #S(sockaddr-in6 addr #xffff01020000 prefix 24).(str-addr) "::ffff:1.2/24"
+ #S(sockaddr-in6 addr #xffff01020300 prefix 24).(str-addr) "::ffff:1.2.3/24"
+ #S(sockaddr-in6 addr #xffff01020304 prefix 24).(str-addr) "::ffff:1.2.3.4/24"
+ #S(sockaddr-in6 addr #xffff00000000 port 123 ).(str-addr) "[::ffff:0.0.0.0]:123"
+ #S(sockaddr-in6 addr #xffff00000000 port 123 prefix 24).(str-addr) "[::ffff:0/24]:123"
+ #S(sockaddr-in6 addr #xffff01000000 port 123 prefix 24).(str-addr) "[::ffff:1/24]:123"
+ #S(sockaddr-in6 addr #xffff01020000 port 123 prefix 24).(str-addr) "[::ffff:1.2/24]:123"
+ #S(sockaddr-in6 addr #xffff01020300 port 123 prefix 24).(str-addr) "[::ffff:1.2.3/24]:123"
+ #S(sockaddr-in6 addr #xffff01020304 port 123 prefix 24).(str-addr) "[::ffff:1.2.3.4/24]:123")