]> code.delx.au - gnu-emacs/blobdiff - test/automated/process-tests.el
* lisp/emacs-lisp/package.el (package-unpack): Load before compiling
[gnu-emacs] / test / automated / process-tests.el
index dabfbc56b78dd9eb5a13756c49e45c3f40b02c21..ee9e4f3589199c11997bd378e6a15d619848fe68 100644 (file)
     sentinel-called))
 
 (ert-deftest process-test-sentinel-accept-process-output ()
+  (skip-unless (executable-find "bash"))
   (should (process-test-sentinel-wait-function-working-p
            #'accept-process-output)))
 
 (ert-deftest process-test-sentinel-sit-for ()
+  (skip-unless (executable-find "bash"))
   (should
    (process-test-sentinel-wait-function-working-p (lambda () (sit-for 0.01 t)))))
 
             ;; to force quoting.
             (setq batfile (make-temp-file "echo args" nil ".bat"))
             (with-temp-file batfile
-              (insert "@echo arg1 = %1, arg2 = %2\n"))
+              (insert "@echo arg1=%1, arg2=%2\n"))
             (with-temp-buffer
               (call-process batfile nil '(t t) t "x &y")
-              (should (string= (buffer-string) "arg1 = \"x &y\", arg2 = \n")))
+              (should (string= (buffer-string) "arg1=\"x &y\", arg2=\n")))
             (with-temp-buffer
               (call-process-shell-command
                (mapconcat #'shell-quote-argument (list batfile "x &y") " ")
                nil '(t t) t)
-              (should (string= (buffer-string) "arg1 = \"x &y\", arg2 = \n"))))
+              (should (string= (buffer-string) "arg1=\"x &y\", arg2=\n"))))
         (when batfile (delete-file batfile))))))
 
+(ert-deftest process-test-stderr-buffer ()
+  (skip-unless (executable-find "bash"))
+  (let* ((stdout-buffer (generate-new-buffer "*stdout*"))
+        (stderr-buffer (generate-new-buffer "*stderr*"))
+        (proc (make-process :name "test"
+                            :command (list "bash" "-c"
+                                           (concat "echo hello stdout!; "
+                                                   "echo hello stderr! >&2; "
+                                                   "exit 20"))
+                            :buffer stdout-buffer
+                            :stderr stderr-buffer))
+        (sentinel-called nil)
+        (start-time (float-time)))
+    (set-process-sentinel proc (lambda (proc msg)
+                                (setq sentinel-called t)))
+    (while (not (or sentinel-called
+                   (> (- (float-time) start-time)
+                      process-test-sentinel-wait-timeout)))
+      (accept-process-output))
+    (cl-assert (eq (process-status proc) 'exit))
+    (cl-assert (= (process-exit-status proc) 20))
+    (should (with-current-buffer stdout-buffer
+             (goto-char (point-min))
+             (looking-at "hello stdout!")))
+    (should (with-current-buffer stderr-buffer
+             (goto-char (point-min))
+             (looking-at "hello stderr!")))))
+
+(ert-deftest process-test-stderr-filter ()
+  (skip-unless (executable-find "bash"))
+  (let* ((sentinel-called nil)
+        (stderr-sentinel-called nil)
+        (stdout-output nil)
+        (stderr-output nil)
+        (stdout-buffer (generate-new-buffer "*stdout*"))
+        (stderr-buffer (generate-new-buffer "*stderr*"))
+        (stderr-proc (make-pipe-process :name "stderr"
+                                        :buffer stderr-buffer))
+        (proc (make-process :name "test" :buffer stdout-buffer
+                            :command (list "bash" "-c"
+                                           (concat "echo hello stdout!; "
+                                                   "echo hello stderr! >&2; "
+                                                   "exit 20"))
+                            :stderr stderr-proc))
+        (start-time (float-time)))
+    (set-process-filter proc (lambda (proc input)
+                              (push input stdout-output)))
+    (set-process-sentinel proc (lambda (proc msg)
+                                (setq sentinel-called t)))
+    (set-process-filter stderr-proc (lambda (proc input)
+                                     (push input stderr-output)))
+    (set-process-sentinel stderr-proc (lambda (proc input)
+                                       (setq stderr-sentinel-called t)))
+    (while (not (or sentinel-called
+                   (> (- (float-time) start-time)
+                      process-test-sentinel-wait-timeout)))
+      (accept-process-output))
+    (cl-assert (eq (process-status proc) 'exit))
+    (cl-assert (= (process-exit-status proc) 20))
+    (should sentinel-called)
+    (should (equal 1 (with-current-buffer stdout-buffer
+                      (point-max))))
+    (should (equal "hello stdout!\n"
+                  (mapconcat #'identity (nreverse stdout-output) "")))
+    (should stderr-sentinel-called)
+    (should (equal 1 (with-current-buffer stderr-buffer
+                      (point-max))))
+    (should (equal "hello stderr!\n"
+                  (mapconcat #'identity (nreverse stderr-output) "")))))
+
+(ert-deftest start-process-should-not-modify-arguments ()
+  "`start-process' must not modify its arguments in-place."
+  ;; See bug#21831.
+  (let* ((path (pcase system-type
+                 ((or 'windows-nt 'ms-dos)
+                  ;; Make sure the file name uses forward slashes.
+                  ;; The original bug was that 'start-process' would
+                  ;; convert forward slashes to backslashes.
+                  (expand-file-name (executable-find "attrib.exe")))
+                 (_ "/bin//sh")))
+         (samepath (copy-sequence path)))
+    ;; Make sure 'start-process' actually goes all the way and invokes
+    ;; the program.
+    (should (process-live-p (condition-case nil
+                                (start-process "" nil path)
+                              (error nil))))
+    (should (equal path samepath))))
+
 (provide 'process-tests)