]> git.eshelyaron.com Git - emacs.git/commitdiff
Add a unit test testing interaction between threads and processes.
authorPhilipp Stephani <phst@google.com>
Sat, 23 Jan 2021 18:10:22 +0000 (19:10 +0100)
committerPhilipp Stephani <phst@google.com>
Sat, 23 Jan 2021 18:10:22 +0000 (19:10 +0100)
This unit test tests that we can call 'accept-process-output' in
parallel from multiple threads.

* test/src/process-tests.el (process-tests/multiple-threads-waiting):
New unit test.

test/src/process-tests.el

index 949f73595b488042c72b8a88845e02e41fdaae91..676e1b1ac327d2a6c3f3d6893f81fd93f8cfd8cb 100644 (file)
@@ -789,6 +789,35 @@ have written output."
             (should (equal calls
                            (list (list process "finished\n"))))))))))
 
+(ert-deftest process-tests/multiple-threads-waiting ()
+  (skip-unless (fboundp 'make-thread))
+  (with-timeout (60 (ert-fail "Test timed out"))
+    (process-tests--with-processes processes
+      (let ((threads ())
+            (cat (executable-find "cat")))
+        (skip-unless cat)
+        (dotimes (i 10)
+          (let* ((name (format "test %d" i))
+                 (process (make-process :name name
+                                        :command (list cat)
+                                        :coding 'no-conversion
+                                        :noquery t
+                                        :connection-type 'pipe)))
+            (push process processes)
+            (set-process-thread process nil)
+            (push (make-thread
+                   (lambda ()
+                     (while (accept-process-output process)))
+                   name)
+                  threads)))
+        (mapc #'process-send-eof processes)
+        (cl-loop for process in processes
+                 and thread in threads
+                 do
+                 (thread-join thread)
+                 (should (eq (process-status process) 'exit))
+                 (should (eql (process-exit-status process) 0)))))))
+
 (defun process-tests--eval (command form)
   "Return a command that evaluates FORM in an Emacs subprocess.
 COMMAND must be a list returned by