testsuite/driver: More Unicode awareness
authorBen Gamari <bgamari.foss@gmail.com>
Mon, 17 Oct 2016 00:49:36 +0000 (20:49 -0400)
committerBen Gamari <ben@smart-cactus.org>
Mon, 17 Oct 2016 18:33:29 +0000 (14:33 -0400)
Explicitly specify utf8 encoding in a few spots which were failing on
Windows with Python 3.

Test Plan: Validate

Reviewers: austin, thomie

Differential Revision: https://phabricator.haskell.org/D2602

GHC Trac Issues: #9184

testsuite/driver/runtests.py
testsuite/driver/testlib.py

index 8a11f44..abbf3c8 100644 (file)
@@ -208,7 +208,7 @@ from testlib import *
 # On Windows we need to set $PATH to include the paths to all the DLLs
 # in order for the dynamic library tests to work.
 if windows or darwin:
-    pkginfo = getStdout([config.ghc_pkg, 'dump'])
+    pkginfo = str(getStdout([config.ghc_pkg, 'dump']))
     topdir = config.libdir
     if windows:
         mingw = os.path.join(topdir, '../mingw/bin')
@@ -303,7 +303,12 @@ for file in t_files:
     if_verbose(2, '====> Scanning %s' % file)
     newTestDir(tempdir, os.path.dirname(file))
     try:
-        exec(open(file).read())
+        if PYTHON3:
+            src = io.open(file, encoding='utf8').read()
+        else:
+            src = open(file).read()
+
+        exec(src)
     except Exception as e:
         traceback.print_exc()
         framework_fail(file, '', str(e))
index f2098d2..55d209e 100644 (file)
@@ -826,9 +826,9 @@ def do_test(name, way, func, args, files):
         src_makefile = in_srcdir('Makefile')
         dst_makefile = in_testdir('Makefile')
         if os.path.exists(src_makefile):
-            with open(src_makefile, 'r') as src:
+            with io.open(src_makefile, 'r', encoding='utf8') as src:
                 makefile = re.sub('TOP=.*', 'TOP=' + config.top, src.read(), 1)
-                with open(dst_makefile, 'w') as dst:
+                with io.open(dst_makefile, 'w', encoding='utf8') as dst:
                     dst.write(makefile)
 
     if config.use_threads:
@@ -1289,20 +1289,20 @@ def interpreter_run(name, way, extra_hc_opts, top_mod):
 
     delimiter = '===== program output begins here\n'
 
-    with open(script, 'w') as f:
+    with io.open(script, 'w', encoding='utf8') as f:
         # set the prog name and command-line args to match the compiled
         # environment.
-        f.write(':set prog ' + name + '\n')
-        f.write(':set args ' + opts.extra_run_opts + '\n')
+        f.write(u':set prog ' + name + u'\n')
+        f.write(u':set args ' + opts.extra_run_opts + u'\n')
         # Add marker lines to the stdout and stderr output files, so we
         # can separate GHCi's output from the program's.
-        f.write(':! echo ' + delimiter)
-        f.write(':! echo 1>&2 ' + delimiter)
+        f.write(u':! echo ' + delimiter)
+        f.write(u':! echo 1>&2 ' + delimiter)
         # Set stdout to be line-buffered to match the compiled environment.
-        f.write('System.IO.hSetBuffering System.IO.stdout System.IO.LineBuffering\n')
+        f.write(u'System.IO.hSetBuffering System.IO.stdout System.IO.LineBuffering\n')
         # wrapping in GHC.TopHandler.runIO ensures we get the same output
         # in the event of an exception as for the compiled program.
-        f.write('GHC.TopHandler.runIOFastExit Main.main Prelude.>> Prelude.return ()\n')
+        f.write(u'GHC.TopHandler.runIOFastExit Main.main Prelude.>> Prelude.return ()\n')
 
     stdin = in_testdir(opts.stdin if opts.stdin else add_suffix(name, 'stdin'))
     if os.path.exists(stdin):