123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- (define-module (test-suite test-ice-9-popen)
- #:use-module (test-suite lib))
- (define (read-string-to-eof port)
- (do ((lst '() (cons c lst))
- (c (read-char port) (read-char port)))
- ((eof-object? c)
- (list->string (reverse! lst)))))
- (define (with-epipe thunk)
- (dynamic-wind
- (lambda ()
- (sigaction SIGPIPE SIG_IGN))
- thunk
- restore-signals))
- (define-syntax-rule (if-supported body ...)
- (begin body ...))
- (if-supported
- (use-modules (ice-9 popen))
-
-
-
- (with-test-prefix "open-input-pipe"
- (pass-if-exception "no args" exception:wrong-num-args
- (open-input-pipe))
- (pass-if "port?"
- (port? (open-input-pipe "echo hello")))
- (pass-if "echo hello"
- (string=? "hello\n" (read-string-to-eof (open-input-pipe "echo hello"))))
-
- (pass-if "stdin==stderr"
- (let ((port (open-file "/dev/null" "r+")))
- (with-input-from-port port
- (lambda ()
- (with-error-to-port port
- (lambda ()
- (open-input-pipe "echo hello"))))))
- #t)
-
- (pass-if "stdout==stderr"
- (let ((port (open-file "/dev/null" "r+")))
- (with-output-to-port port
- (lambda ()
- (with-error-to-port port
- (lambda ()
- (open-input-pipe "echo hello"))))))
- #t)
- (pass-if "open-input-pipe process gets (current-input-port) as stdin"
- (let* ((p2c (pipe))
- (port (with-input-from-port (car p2c)
- (lambda ()
- (open-input-pipe "read line && echo $line")))))
- (display "hello\n" (cdr p2c))
- (force-output (cdr p2c))
- (let ((result (eq? (read port) 'hello)))
- (close-port (cdr p2c))
- (close-pipe port)
- result)))
-
-
-
-
-
-
-
-
-
-
-
- (pass-if "no duplicate"
- (let* ((c2p (pipe))
- (p2c (pipe))
- (port (with-error-to-port (cdr c2p)
- (lambda ()
- (with-input-from-port (car p2c)
- (lambda ()
- (open-input-pipe
- (format #f "exec 1>~a; echo closed 1>&2; \
- exec 2>~a; read REPLY"
- %null-device %null-device))))))))
- (close-port (cdr c2p))
- (let ((result (eof-object? (read-char port))))
- (display "hello!\n" (cdr p2c))
- (force-output (cdr p2c))
- (close-pipe port)
- result))))
-
-
-
- (with-test-prefix "open-output-pipe"
- (pass-if-exception "no args" exception:wrong-num-args
- (open-output-pipe))
- (pass-if "port?"
- (port? (open-output-pipe "exit 0")))
-
- (pass-if "stdin==stderr"
- (let ((port (open-file "/dev/null" "r+")))
- (with-input-from-port port
- (lambda ()
- (with-error-to-port port
- (lambda ()
- (open-output-pipe "exit 0"))))))
- #t)
-
- (pass-if "stdout==stderr"
- (let ((port (open-file "/dev/null" "r+")))
- (with-output-to-port port
- (lambda ()
- (with-error-to-port port
- (lambda ()
- (open-output-pipe "exit 0"))))))
- #t)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- (pass-if "no duplicate"
- (let* ((c2p (pipe))
- (port (with-error-to-port (cdr c2p)
- (lambda ()
- (open-output-pipe
- (string-append "exec guile --no-auto-compile -s \""
- (getenv "TEST_SUITE_DIR")
- "/tests/popen-child.scm\""))))))
- (close-port (cdr c2p))
- (with-epipe
- (lambda ()
- (let ((result
- (and (char? (read-char (car c2p)))
- (catch 'system-error
- (lambda ()
- (write-char #\x port)
- (force-output port)
- #f)
- (lambda (key name fmt args errno-list)
- (= (car errno-list) EPIPE))))))
-
-
- (close-port (car c2p))
- (close-pipe port)
- result))))))
-
-
-
- (with-test-prefix "close-pipe"
- (pass-if-exception "no args" exception:wrong-num-args
- (close-pipe))
- (pass-if "exit 0"
- (let ((st (close-pipe (open-output-pipe "exit 0"))))
- (and (status:exit-val st)
- (= 0 (status:exit-val st)))))
- (pass-if "exit 1"
- (let ((st (close-pipe (open-output-pipe "exit 1"))))
- (and (status:exit-val st)
- (= 1 (status:exit-val st)))))))
|