Fix (run-program) to cleanup fd handlers
[sbcl.git] / tests / run-program.impure.lisp
index c04337a..5c8b988 100644 (file)
@@ -31,8 +31,7 @@
               (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 "/usr/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)))))
+