Subject: 25.0.50; Python tests fail on MS-Windows -- portability issues

From: Eli Zaretskii <[email-masked]>
Date: Sat, 29 Aug 2015 15:13:33 +0300

As I reported in the past, some Python tests fail on MS-Windows.  13
of them, to be more accurate.  The changes below reduce those 13 to
just 4.

The main problems fixed by these changes are: (a) the assumption that
"/foo" is an absolute file name that expand-file-name cannot possibly
change, and (b) use of a literal ':' character is PATH-style lists of
directories.  Also, one of the failures was because
python-shell-calculate-command always quotes the interpreter's file
name on MS-Windows, which the test didn't expect.

Fabián, if these are OK with you, I will commit them.

I will file a separate bug about the other 4 failures, as I need help
there in figuring out how to fix them.

Thanks.

Here are the proposed changes, relative to today's master:

diff --git a/test/automated/python-tests.el b/test/automated/python-tests.el
index 30b1b48..219f99e 100644
--- a/test/automated/python-tests.el
+++ b/test/automated/python-tests.el
@@ -2436,7 +2436,7 @@ (ert-deftest python-shell-calculate-command-1 ()
         (python-shell-interpreter-args "-B"))
     (should (string=
              (format "%s %s"
-                     python-shell-interpreter
+                     (shell-quote-argument python-shell-interpreter)
                      python-shell-interpreter-args)
              (python-shell-calculate-command)))))
 
@@ -2445,14 +2445,17 @@ (ert-deftest python-shell-calculate-pythonpath-1 ()
   (let ((process-environment '("PYTHONPATH=/path0"))
         (python-shell-extra-pythonpaths '("/path1" "/path2")))
     (should (string= (python-shell-calculate-pythonpath)
-                     "/path1:/path2:/path0"))))
+                     (concat "/path1" path-separator
+                             "/path2" path-separator "/path0")))))
 
 (ert-deftest python-shell-calculate-pythonpath-2 ()
   "Test existing paths are moved to front."
-  (let ((process-environment '("PYTHONPATH=/path0:/path1"))
+  (let ((process-environment
+         (list (concat "PYTHONPATH=/path0" path-separator "/path1")))
         (python-shell-extra-pythonpaths '("/path1" "/path2")))
     (should (string= (python-shell-calculate-pythonpath)
-                     "/path1:/path2:/path0"))))
+                     (concat "/path1" path-separator
+                             "/path2" path-separator "/path0")))))
 
 (ert-deftest python-shell-calculate-process-environment-1 ()
   "Test `python-shell-process-environment' modification."
@@ -2468,7 +2471,9 @@ (ert-deftest python-shell-calculate-process-environment-2 ()
          (original-pythonpath (setenv "PYTHONPATH" "/path0"))
          (python-shell-extra-pythonpaths '("/path1" "/path2"))
          (process-environment (python-shell-calculate-process-environment)))
-    (should (equal (getenv "PYTHONPATH") "/path1:/path2:/path0"))))
+    (should (equal (getenv "PYTHONPATH")
+                   (concat "/path1" path-separator
+                           "/path2" path-separator "/path0")))))
 
 (ert-deftest python-shell-calculate-process-environment-3 ()
   "Test `python-shell-virtualenv-root' modification."
@@ -2545,7 +2550,8 @@ (ert-deftest python-shell-calculate-exec-path-2 ()
   (let* ((exec-path '("/path0"))
          (python-shell-virtualenv-root "/env")
          (new-exec-path (python-shell-calculate-exec-path)))
-    (should (equal new-exec-path '("/env/bin" "/path0")))))
+    (should (equal new-exec-path
+                   (list (expand-file-name "/env/bin") "/path0")))))
 
 (ert-deftest python-shell-calculate-exec-path-3 ()
   "Test complete `python-shell-virtualenv-root' modification."
@@ -2553,7 +2559,9 @@ (ert-deftest python-shell-calculate-exec-path-3 ()
          (python-shell-exec-path '("/path1" "/path2"))
          (python-shell-virtualenv-root "/env")
          (new-exec-path (python-shell-calculate-exec-path)))
-    (should (equal new-exec-path '("/env/bin" "/path1" "/path2" "/path0")))))
+    (should (equal new-exec-path
+                   (list (expand-file-name "/env/bin")
+                         "/path1" "/path2" "/path0")))))
 
 (ert-deftest python-shell-calculate-exec-path-4 ()
   "Test complete `python-shell-virtualenv-root' with remote."
@@ -2562,7 +2570,9 @@ (ert-deftest python-shell-calculate-exec-path-4 ()
          (python-shell-exec-path '("/path1" "/path2"))
          (python-shell-virtualenv-root "/env")
          (new-exec-path (python-shell-calculate-exec-path)))
-    (should (equal new-exec-path '("/env/bin" "/path1" "/path2" "/path0")))))
+    (should (equal new-exec-path
+                   (list (expand-file-name "/env/bin")
+                         "/path1" "/path2" "/path0")))))
 
 (ert-deftest python-shell-calculate-exec-path-5 ()
   "Test no side-effects on `exec-path'."
@@ -2590,7 +2600,9 @@ (ert-deftest python-shell-with-environment-1 ()
          (original-exec-path exec-path)
          (python-shell-virtualenv-root "/env"))
     (python-shell-with-environment
-      (should (equal exec-path '("/env/bin" "/path1" "/path2" "/path0")))
+     (should (equal exec-path
+                    (list (expand-file-name "/env/bin")
+                          "/path1" "/path2" "/path0")))
       (should (not (getenv "PYTHONHOME")))
       (should (string= (getenv "VIRTUAL_ENV") "/env")))
     (should (equal exec-path original-exec-path))))
@@ -2605,7 +2617,8 @@ (ert-deftest python-shell-with-environment-2 ()
          (python-shell-virtualenv-root "/env"))
     (python-shell-with-environment
       (should (equal (python-shell-calculate-exec-path)
-                     '("/env/bin" "/path1" "/path2" "/remote1" "/remote2")))
+                     (list (expand-file-name "/env/bin")
+                           "/path1" "/path2" "/remote1" "/remote2")))
       (let ((process-environment (python-shell-calculate-process-environment)))
         (should (not (getenv "PYTHONHOME")))
         (should (string= (getenv "VIRTUAL_ENV") "/env"))

In GNU Emacs 25.0.50.384 (i686-pc-mingw32)
 of 2015-08-29
Repository revision: 5e63c842007b0f85e91735a7c4e00be0b7fe9ba5
Windowing system distributor `Microsoft Corp.', version 5.1.2600
Configured using:
 `configure --prefix=/d/usr --enable-checking=yes,glyphs --with-wide-int
 'CFLAGS=-gdwarf-4 -g3 -O0''

Configured features:
XPM JPEG TIFF GIF PNG RSVG SOUND NOTIFY ACL GNUTLS LIBXML2 ZLIB
TOOLKIT_SCROLL_BARS

Important settings:
  value of $LANG: ENU
  locale-coding-system: cp1255

Major mode: Lisp Interaction

Minor modes in effect:
  tooltip-mode: t
  global-eldoc-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  tool-bar-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  line-number-mode: t
  transient-mark-mode: t

Recent messages:
For information about GNU Emacs and the GNU system, type C-h C-a.

Load-path shadows:
None found.

Features:
(shadow sort gnus-util mail-extr emacsbug message dired format-spec
rfc822 mml mml-sec mm-decode mm-bodies mm-encode mail-parse rfc2231
mailabbrev gmm-utils mailheader sendmail rfc2047 rfc2045 ietf-drums
mm-util help-fns help-mode easymenu cl-loaddefs pcase cl-lib mail-prsvr
mail-utils time-date mule-util tooltip eldoc electric uniquify
ediff-hook vc-hooks lisp-float-type mwheel dos-w32 ls-lisp disp-table
w32-win w32-vars term/common-win tool-bar dnd fontset image regexp-opt
fringe tabulated-list newcomment elisp-mode lisp-mode prog-mode register
page menu-bar rfn-eshadow timer select scroll-bar mouse jit-lock
font-lock syntax facemenu font-core frame cl-generic cham georgian
utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean
japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european
ethiopic indian cyrillic chinese charscript case-table epa-hook
jka-cmpr-hook help simple abbrev minibuffer cl-preloaded nadvice
loaddefs button faces cus-face macroexp files text-properties overlay
sha1 md5 base64 format env code-pages mule custom widget
hashtable-print-readable backquote w32notify w32 multi-tty
make-network-process emacs)

Memory information:
((conses 16 84975 6948)
 (symbols 56 19924 0)
 (miscs 48 36 107)
 (strings 16 15967 5012)
 (string-bytes 1 393017)
 (vectors 16 11212)
 (vector-slots 8 402827 5209)
 (floats 8 125 127)
 (intervals 40 260 63)
 (buffers 856 11))