From 7fc27ea70bc7dc24776b2c098ac970f2f21e37fb Mon Sep 17 00:00:00 2001
From: Eli Zaretskii <eliz@gnu.org>
Date: Wed, 9 Aug 2017 20:15:46 +0300
Subject: [PATCH] Fix crashing emacs-module tests on MS-Windows

* src/w32fns.c (syms_of_w32fns) <w32-disable-abort-dialog>: New
variable.
(emacs_abort): If w32-disable-abort-dialog is non-nil, abort right
away, without displaying the Abort dialog, which waits for the user.

* test/src/emacs-module-tests.el (module--test-assertion): Run the
inferior Emacs with the w32 abort dialog disabled.  Expect the
status of the aborted Emacs sub-process to be 3 on MS-Windows and
2 on MS-DOS.
---
 src/w32fns.c                   |  8 ++++++++
 test/src/emacs-module-tests.el | 16 ++++++++++++----
 2 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/src/w32fns.c b/src/w32fns.c
index 457599fce0e..bf3c1d5d303 100644
--- a/src/w32fns.c
+++ b/src/w32fns.c
@@ -10708,6 +10708,11 @@ default value t means to add the width of one canonical character of the
 tip frame.  */);
   Vw32_tooltip_extra_pixels = Qt;
 
+  DEFVAR_BOOL ("w32-disable-abort-dialog",
+	       w32_disable_abort_dialog,
+	       doc: /* Non-nil means don't display the abort dialog when aborting.  */);
+  w32_disable_abort_dialog = 0;
+
 #if 0 /* TODO: Port to W32 */
   defsubr (&Sx_change_window_property);
   defsubr (&Sx_delete_window_property);
@@ -10902,6 +10907,9 @@ w32_backtrace (void **buffer, int limit)
 void
 emacs_abort (void)
 {
+  if (w32_disable_abort_dialog)
+    abort ();
+
   int button;
   button = MessageBox (NULL,
 		       "A fatal error has occurred!\n\n"
diff --git a/test/src/emacs-module-tests.el b/test/src/emacs-module-tests.el
index 2aa85f0b247..6a7ba5580da 100644
--- a/test/src/emacs-module-tests.el
+++ b/test/src/emacs-module-tests.el
@@ -208,14 +208,22 @@ must evaluate to a regular expression string."
      (with-temp-buffer
        (let* ((default-directory tempdir)
               (status (call-process mod-test-emacs nil t nil
-                                    "-batch" "-Q" "-module-assertions" "-eval"
+                                    "-batch" "-Q" "-module-assertions"
+                                    "-eval" "(setq w32-disable-abort-dialog t)"
+                                    "-eval"
                                     ,(prin1-to-string
                                       `(progn
                                          (require 'mod-test ,mod-test-file)
                                          ,@body)))))
-         (should (stringp status))
-         ;; eg "Aborted" or "Abort trap: 6"
-         (should (string-prefix-p "Abort" status))
+         ;; Aborting doesn't raise a signal on MS-DOS/Windows, but
+         ;; rather exits with a non-zero status: 2 on MS-DOS (see
+         ;; msdos.c:msdos_abort), 3 on Windows, per MSDN documentation
+         ;; of 'abort'.
+         (if (memq system-type '(ms-dos windows-nt))
+             (should (>= status 2))
+           (should (stringp status))
+           ;; eg "Aborted" or "Abort trap: 6"
+           (should (string-prefix-p "Abort" status)))
          (search-backward "Emacs module assertion: ")
          (goto-char (match-end 0))
          (should (string-match-p ,pattern
-- 
2.39.5