X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=contrib%2Fsb-bsd-sockets%2Ftests.lisp;h=7ce9d39ae5e717e4ac355864ab4fc84a2a202cac;hb=a37b7e2a4c93398af954c3f03c5412ead1c1c828;hp=827b7c09e2e485272036fa111c45cf919fd1f4ab;hpb=1483e561a090d9f07687da27f8dd10fcd4152be1;p=sbcl.git diff --git a/contrib/sb-bsd-sockets/tests.lisp b/contrib/sb-bsd-sockets/tests.lisp index 827b7c0..7ce9d39 100644 --- a/contrib/sb-bsd-sockets/tests.lisp +++ b/contrib/sb-bsd-sockets/tests.lisp @@ -50,7 +50,7 @@ (and (> (socket-file-descriptor s) 1) t)) t) -(deftest make-inet-socket-wrong +(deftest* (make-inet-socket-wrong) ;; fail to make a socket: check correct error return. There's no nice ;; way to check the condition stuff on its own, which is a shame (handler-case @@ -66,7 +66,7 @@ (:no-error nil)) t) -(deftest make-inet-socket-keyword-wrong +(deftest* (make-inet-socket-keyword-wrong) ;; same again with keywords (handler-case (make-instance 'inet-socket :type :stream :protocol :udp) @@ -83,36 +83,33 @@ t) -(deftest non-block-socket +(deftest* (non-block-socket) (let ((s (make-instance 'inet-socket :type :stream :protocol :tcp))) (setf (non-blocking-mode s) t) (non-blocking-mode s)) t) -(defun do-gc-portably () - ;; cmucl on linux has generational gc with a keyword argument, - ;; sbcl GC function takes same arguments no matter what collector is in - ;; use - #+(or sbcl gencgc) (SB-EXT:gc :full t) - ;; other platforms have full gc or nothing - #-(or sbcl gencgc) (sb-ext:gc)) - (deftest inet-socket-bind - (let ((s (make-instance 'inet-socket :type :stream :protocol (get-protocol-by-name "tcp")))) - ;; Given the functions we've got so far, if you can think of a - ;; better way to make sure the bind succeeded than trying it - ;; twice, let me know - ;; 1974 has no special significance, unless you're the same age as me - (do-gc-portably) ;gc should clear out any old sockets bound to this port - (socket-bind s (make-inet-address "127.0.0.1") 1974) - (handler-case - (let ((s2 (make-instance 'inet-socket :type :stream :protocol (get-protocol-by-name "tcp")))) - (socket-bind s2 (make-inet-address "127.0.0.1") 1974) - nil) - (address-in-use-error () t))) + (let* ((tcp (get-protocol-by-name "tcp")) + (address (make-inet-address "127.0.0.1")) + (s1 (make-instance 'inet-socket :type :stream :protocol tcp)) + (s2 (make-instance 'inet-socket :type :stream :protocol tcp))) + (unwind-protect + ;; Given the functions we've got so far, if you can think of a + ;; better way to make sure the bind succeeded than trying it + ;; twice, let me know + (progn + (socket-bind s1 address 0) + (handler-case + (let ((port (nth-value 1 (socket-name s1)))) + (socket-bind s2 address port) + nil) + (address-in-use-error () t))) + (socket-close s1) + (socket-close s2))) t) -(deftest simple-sockopt-test +(deftest* (simple-sockopt-test) ;; test we can set SO_REUSEADDR on a socket and retrieve it, and in ;; the process that all the weird macros in sockopt happened right. (let ((s (make-instance 'inet-socket :type :stream :protocol (get-protocol-by-name "tcp")))) @@ -177,8 +174,8 @@ ;;; to look at /etc/syslog.conf or local equivalent to find out where ;;; the message ended up +#-win32 (deftest simple-local-client - #-win32 (progn ;; SunOS (Solaris) and Darwin systems don't have a socket at ;; /dev/log. We might also be building in a chroot or @@ -311,4 +308,57 @@ (format t "Received ~A bytes from ~A:~A - ~A ~%" len address port (subseq buf 0 (min 10 len))))))) - +#+sb-thread +(deftest interrupt-io + (let (result) + (labels + ((client (port) + (setf result + (let ((s (make-instance 'inet-socket + :type :stream + :protocol :tcp))) + (socket-connect s #(127 0 0 1) port) + (let ((stream (socket-make-stream s + :input t + :output t + :buffering :none))) + (handler-case + (prog1 + (catch 'stop + (progn + (read-char stream) + (sleep 0.1) + (sleep 0.1) + (sleep 0.1))) + (close stream)) + (error (c) + c)))))) + (server () + (let ((s (make-instance 'inet-socket + :type :stream + :protocol :tcp))) + (setf (sockopt-reuse-address s) t) + (socket-bind s (make-inet-address "127.0.0.1") 0) + (socket-listen s 5) + (multiple-value-bind (* port) + (socket-name s) + (let* ((client (sb-thread:make-thread + (lambda () (client port)))) + (r (socket-accept s)) + (stream (socket-make-stream r + :input t + :output t + :buffering :none)) + (ok :ok)) + (socket-close s) + (sleep 5) + (sb-thread:interrupt-thread client + (lambda () (throw 'stop ok))) + (sleep 5) + (setf ok :not-ok) + (write-char #\x stream) + (close stream) + (socket-close r)))))) + (server)) + result) + :ok)