(assert (= (read-byte in) i)))
(process-close process))))
-#+sb-thread
-(with-test (:name :run-program-cat-2)
+(with-test (:name :run-program-cat-2 :skipped-on '(not :sb-thread))
;; Tests that reading from a FIFO is interruptible.
(let* ((process (sb-ext:run-program "/bin/cat" '()
:wait nil
(assert (= 0 (read-sequence (make-array 8) out)))
(assert (equalp buf data)))))
+(with-test (:name :run-program-cat-4)
+ ;; Null broadcast stream as output
+ (let* ((process (sb-ext:run-program "/bin/cat" '() :wait nil
+ :output (make-broadcast-stream)
+ :input :stream))
+ (in (process-input process)))
+ (unwind-protect
+ (progn
+ (write-string "foobar" in)
+ (close in)
+ (process-wait process))
+ (process-close process))))
+
;;; Test driving an external program (cat) through pipes wrapped in
;;; composite streams.
(defparameter *cat-out-pipe* (make-pipe))
(defparameter *cat-out* (make-synonym-stream '*cat-out-pipe*))
-(with-test (:name :run-program-cat-2)
+(with-test (:name :run-program-cat-5)
(let ((cat (run-program "/bin/cat" nil :input *cat-in* :output *cat-out*
:wait nil)))
(dolist (test '("This is a test!"
(process-close proc)
(assert (not stopped))))))
+
+;; Check that in when you do run-program with :wait t that causes
+;; encoding error, it does not affect the following run-program
+(with-test (:name (:run-program :clean-exit-after-encoding-error))
+ (let ((had-error-p nil))
+ (flet ((barf (&optional (format :default))
+ (with-output-to-string (stream)
+ (run-program #-netbsd "/usr/bin/perl" #+netbsd "/usr/pkg/bin/perl"
+ '("-e" "print \"\\x20\\xfe\\xff\\x0a\"")
+ :output stream
+ :external-format format)))
+ (no-barf ()
+ (with-output-to-string (stream)
+ (run-program "/bin/echo"
+ '("This is a test")
+ :output stream))))
+ (handler-case
+ (barf :utf-8)
+ (error ()
+ (setq had-error-p t)))
+ (assert had-error-p)
+ ;; now run the harmless program
+ (setq had-error-p nil)
+ (handler-case
+ (no-barf)
+ (error ()
+ (setq had-error-p t)))
+ (assert (not had-error-p)))))
+
+(with-test (:name (:run-program :no-such-thing))
+ (assert (search "Couldn't execute"
+ (handler-case
+ (progn (run-program "no-such-program-we-hope" '()) nil)
+ (error (e)
+ (princ-to-string e))))))
+
+(with-test (:name (:run-program :not-executable))
+ (assert (search "Couldn't execute"
+ (handler-case
+ (progn (run-program "run-program.impure.lisp" '()) nil)
+ (error (e)
+ (princ-to-string e))))))
+
+(with-test (:name (:run-program :if-input-does-not-exist))
+ (let ((file (pathname (sb-posix:mktemp "rpXXXXXX"))))
+ (assert (null (sb-ext:run-program "/bin/cat" '() :input file)))
+ (assert (null (sb-ext:run-program "/bin/cat" '() :output #.(or *compile-file-truename*
+ *load-truename*)
+ :if-output-exists nil)))))