X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=tests%2Fstream.impure.lisp;h=adf3986e7ba077b0d97cdf531d00b4b5c22ecf81;hb=57eae6573811f44abe167a9015116d95371543bb;hp=f39e3c01f242341506818c4332b5b185e77834cf;hpb=f12d81a211d0445806d3e9cae350dd328abda333;p=sbcl.git diff --git a/tests/stream.impure.lisp b/tests/stream.impure.lisp index f39e3c0..adf3986 100644 --- a/tests/stream.impure.lisp +++ b/tests/stream.impure.lisp @@ -526,5 +526,85 @@ (assert (= 3 (read-sequence buffer s :start 2 :end 3))) (file-position s :end) (assert (= 3 (read-sequence buffer s :start 3)))))) + +;;; In 1.0.27 (and also 0.9.16; presumably in between, too), binary +;;; input operations on a bivalent stream did something bad after +;;; unread-char: READ-BYTE would return the character, and +;;; READ-SEQUENCE into a byte buffer would lose when attempting to +;;; store the character in the vector. +(let ((pathname "bivalent-stream-unread-char-test.tmp")) + (with-open-file (s pathname + :element-type :default + :direction :io :if-exists :rename) + (write-char #\a s) + (file-position s :start) + (unread-char (read-char s) s) + (assert (integerp (read-byte s)))) + (delete-file pathname)) + +(let ((pathname "bivalent-stream-unread-char-test.tmp")) + (with-open-file (s pathname + :element-type :default + :direction :io :if-exists :rename) + (write-char #\a s) + (file-position s :start) + (unread-char (read-char s) s) + (assert (let ((buffer (make-array 10 :element-type '(unsigned-byte 8)))) + (read-sequence buffer s)))) + (delete-file pathname)) + +#+sb-unicode +(let ((pathname "bivalent-stream-unread-char-test.tmp")) + (with-open-file (s pathname + :element-type :default + :direction :io :if-exists :rename + :external-format :utf8) + (write-char (code-char 192) s) + (file-position s :start) + (unread-char (read-char s) s) + (assert (integerp (read-byte s)))) + (delete-file pathname)) + +#+sb-unicode +(let ((pathname "bivalent-stream-unread-char-test.tmp")) + (with-open-file (s pathname + :element-type :default + :direction :io :if-exists :rename + :external-format :utf8) + (write-char (code-char 192) s) + (file-position s :start) + (unread-char (read-char s) s) + (assert (let ((buffer (make-array 10 :element-type '(unsigned-byte 8)))) + (read-sequence buffer s)))) + (delete-file pathname)) + +(with-test (:name :delete-file-on-streams) + (with-open-file (f "delete-file-on-stream-test.tmp" + :direction :io) + (delete-file f) + #-win32 + (progn + (write-line "still open" f) + (file-position f :start) + (assert (equal "still open" (read-line f))))) + (assert (not (probe-file "delete-file-on-stream-test.tmp")))) +;;; READ-CHAR-NO-HANG on bivalent streams (as returned by RUN-PROGRAM) +;;; was wrong. CSR managed to promote the wrongness to all streams in +;;; the 1.0.32.x series, breaking slime instantly. +(with-test (:name :read-char-no-hang-after-unread-char) + (let* ((process (run-program "/bin/sh" '("-c" "echo a && sleep 10") + :output :stream :wait nil)) + (stream (process-output process)) + (char (read-char stream))) + (assert (char= char #\a)) + (unread-char char stream) + (assert (char= (read-char stream) #\a)) + (assert (char= (read-char stream) #\Newline)) + (let ((time (get-universal-time))) + ;; no input, not yet known to be at EOF: should return + ;; immediately + (read-char-no-hang stream) + (assert (< (- (get-universal-time) time) 2))))) + ;;; success