X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=tests%2Fstream.impure.lisp;h=60c00c52f8d7cf6b3dc7721d2b40d8e52c3eca0b;hb=0a15b6bbf9d5d3a64b5ac08bb96b6e5ec221d2ae;hp=adf3986e7ba077b0d97cdf531d00b4b5c22ecf81;hpb=d508d8681eab5c3c3a36cb96c64a5367d0c7ddb3;p=sbcl.git diff --git a/tests/stream.impure.lisp b/tests/stream.impure.lisp index adf3986..60c00c5 100644 --- a/tests/stream.impure.lisp +++ b/tests/stream.impure.lisp @@ -607,4 +607,72 @@ (read-char-no-hang stream) (assert (< (- (get-universal-time) time) 2))))) +#-win32 +(require :sb-posix) + +#-win32 +(with-test (:name :interrupt-open) + (let ((fifo nil) + (to 0)) + (unwind-protect + (progn + ;; Make a FIFO + (setf fifo (sb-posix:mktemp "SBCL-fifo.XXXXXXX")) + (sb-posix:mkfifo fifo (logior sb-posix:s-iwusr sb-posix:s-irusr)) + ;; Try to open it (which hangs), and interrupt ourselves with a timer, + ;; continue (this used to result in an error due to open(2) returning with + ;; EINTR, then interupt again and unwind. + (handler-case + (with-timeout 2 + (handler-bind ((timeout (lambda (c) + (when (eql 1 (incf to)) + (continue c))))) + (with-timeout 1 + (with-open-file (f fifo :direction :input) + :open)))) + (timeout () + (if (eql 2 to) + :timeout + :wtf)) + (error (e) + e))) + (when fifo + (ignore-errors (delete-file fifo)))))) + +#-win32 +(require :sb-posix) +#-win32 +(with-test (:name :overeager-character-buffering) + (let ((fifo nil) + (proc nil)) + (maphash + (lambda (format _) + (declare (ignore _)) + (format t "trying ~A~%" format) + (finish-output t) + (unwind-protect + (progn + (setf fifo (sb-posix:mktemp "SBCL-fifo-XXXXXXX")) + (sb-posix:mkfifo fifo (logior sb-posix:s-iwusr sb-posix:s-irusr)) + ;; KLUDGE: because we have both ends in the same process, we would + ;; need to use O_NONBLOCK, but this works too. + (setf proc + (run-program "/bin/sh" + (list "-c" + (format nil "cat > ~A" (native-namestring fifo))) + :input :stream + :wait nil + :external-format format)) + (write-line "foobar" (process-input proc)) + (finish-output (process-input proc)) + (with-open-file (f fifo :direction :input :external-format format) + (assert (equal "foobar" (read-line f))))) + (when proc + (ignore-errors (process-close proc)) + (setf proc nil)) + (when fifo + (ignore-errors (delete-file fifo)) + (setf fifo nil)))) + sb-impl::*external-formats*))) + ;;; success