[glib/fix-mkenums-genmarshal-test-windows: 4/4] GObject: Fix mkenums.py and genmarshal.py tests on Windows



commit 9ae14fba7421dfa07cedaf2aaf40f5eea96f064a
Author: Chun-wei Fan <fanchunwei src gnome org>
Date:   Mon Jun 24 18:33:39 2019 +0800

    GObject: Fix mkenums.py and genmarshal.py tests on Windows
    
    The two test scripts actually assumed some *NIX paradigms, so we need
    to adapt them so that they can work on Windows as well, the changes are
    namely:
    
    -Call the glib-mkenums and glib-genmarshal Python scripts with the
     Python interpreter, not just relying on shebang lines, on Windows.
     This is because the native Windows console (cmd.exe) does not support
     shebang lines, for subprocess.run().
    
    -Use NamedTemporaryFile with delete=False, otherwise Windows cannot find
     the temp files we need when running the tests.
    
    -Use universal_newlines=True for subprocess.run() so that we do not need
     to worry out line ending differences on different systems.
    
    -Make sure we are not in the temp directories we create, where the tests
     are being run, upon cleanup.  Windows does not like deleting
     directories that we are currently in.

 gobject/tests/genmarshal.py | 24 ++++++++++++++++++++----
 gobject/tests/mkenums.py    | 30 +++++++++++++++++++++++-------
 2 files changed, 43 insertions(+), 11 deletions(-)
---
diff --git a/gobject/tests/genmarshal.py b/gobject/tests/genmarshal.py
index 0da61f3a2..142ca8afa 100644
--- a/gobject/tests/genmarshal.py
+++ b/gobject/tests/genmarshal.py
@@ -24,6 +24,7 @@ import collections
 import os
 import shutil
 import subprocess
+import sys
 import tempfile
 from textwrap import dedent
 import unittest
@@ -46,9 +47,13 @@ class TestGenmarshal(unittest.TestCase):
     parsing and generation code out into a library and unit test that, and
     convert this test to just check command line behaviour.
     """
+    # Track the cwd, we want to back out to that to clean up our tempdir
+    cwd = ''
+
     def setUp(self):
         self.timeout_seconds = 10  # seconds per test
         self.tmpdir = tempfile.TemporaryDirectory()
+        self.cwd = os.getcwd()
         os.chdir(self.tmpdir.name)
         print('tmpdir:', self.tmpdir.name)
         if 'G_TEST_BUILDDIR' in os.environ:
@@ -60,10 +65,17 @@ class TestGenmarshal(unittest.TestCase):
         print('genmarshal:', self.__genmarshal)
 
     def tearDown(self):
+        os.chdir(self.cwd)
         self.tmpdir.cleanup()
 
     def runGenmarshal(self, *args):
         argv = [self.__genmarshal]
+
+        # shebang lines are not supported on native
+        # Windows consoles
+        if os.name == 'nt':
+            argv.insert(0, sys.executable)
+
         argv.extend(args)
         print('Running:', argv)
 
@@ -71,13 +83,16 @@ class TestGenmarshal(unittest.TestCase):
         env['LC_ALL'] = 'C.UTF-8'
         print('Environment:', env)
 
+        # We want to ensure consistent line endings...
         info = subprocess.run(argv, timeout=self.timeout_seconds,
                               stdout=subprocess.PIPE,
                               stderr=subprocess.PIPE,
-                              env=env)
+                              env=env,
+                              universal_newlines=True)
         info.check_returncode()
-        out = info.stdout.decode('utf-8').strip()
-        err = info.stderr.decode('utf-8').strip()
+
+        out = info.stdout.strip()
+        err = info.stderr.strip()
 
         # Known substitutions for standard boilerplate
         subs = {
@@ -156,7 +171,8 @@ class TestGenmarshal(unittest.TestCase):
 
     def runGenmarshalWithList(self, list_contents, *args):
         with tempfile.NamedTemporaryFile(dir=self.tmpdir.name,
-                                         suffix='.list') as list_file:
+                                         suffix='.list',
+                                         delete=False) as list_file:
             # Write out the list.
             list_file.write(list_contents.encode('utf-8'))
             print(list_file.name + ':', list_contents)
diff --git a/gobject/tests/mkenums.py b/gobject/tests/mkenums.py
index 84c1aa580..dca865dd2 100644
--- a/gobject/tests/mkenums.py
+++ b/gobject/tests/mkenums.py
@@ -24,6 +24,7 @@ import collections
 import os
 import shutil
 import subprocess
+import sys
 import tempfile
 import textwrap
 import unittest
@@ -46,11 +47,14 @@ class TestMkenums(unittest.TestCase):
     parsing and generation code out into a library and unit test that, and
     convert this test to just check command line behaviour.
     """
+    # Track the cwd, we want to back out to that to clean up our tempdir
+    cwd = ''
     rspfile = False
 
     def setUp(self):
         self.timeout_seconds = 10  # seconds per test
         self.tmpdir = tempfile.TemporaryDirectory()
+        self.cwd = os.getcwd()
         os.chdir(self.tmpdir.name)
         print('tmpdir:', self.tmpdir.name)
         if 'G_TEST_BUILDDIR' in os.environ:
@@ -62,6 +66,7 @@ class TestMkenums(unittest.TestCase):
         print('rspfile: {}, mkenums:'.format(self.rspfile), self.__mkenums)
 
     def tearDown(self):
+        os.chdir(self.cwd)
         self.tmpdir.cleanup()
 
     def _write_rspfile(self, argv):
@@ -79,6 +84,12 @@ class TestMkenums(unittest.TestCase):
             rspfile = self._write_rspfile(args)
             args = ['@' + rspfile]
         argv = [self.__mkenums]
+
+        # shebang lines are not supported on native
+        # Windows consoles
+        if os.name == 'nt':
+            argv.insert(0, sys.executable)
+
         argv.extend(args)
         print('Running:', argv)
 
@@ -86,13 +97,16 @@ class TestMkenums(unittest.TestCase):
         env['LC_ALL'] = 'C.UTF-8'
         print('Environment:', env)
 
+        # We want to ensure consistent line endings...
         info = subprocess.run(argv, timeout=self.timeout_seconds,
                               stdout=subprocess.PIPE,
                               stderr=subprocess.PIPE,
-                              env=env)
+                              env=env,
+                              universal_newlines=True)
         info.check_returncode()
-        out = info.stdout.decode('utf-8').strip()
-        err = info.stderr.decode('utf-8').strip()
+
+        out = info.stdout.strip()
+        err = info.stderr.strip()
 
         # Known substitutions for standard boilerplate
         subs = {
@@ -111,7 +125,8 @@ class TestMkenums(unittest.TestCase):
 
     def runMkenumsWithTemplate(self, template_contents, *args):
         with tempfile.NamedTemporaryFile(dir=self.tmpdir.name,
-                                         suffix='.template') as template_file:
+                                         suffix='.template',
+                                         delete=False) as template_file:
             # Write out the template.
             template_file.write(template_contents.encode('utf-8'))
             print(template_file.name + ':', template_contents)
@@ -191,7 +206,8 @@ file-tail
 
     def runMkenumsWithHeader(self, h_contents, encoding='utf-8'):
         with tempfile.NamedTemporaryFile(dir=self.tmpdir.name,
-                                         suffix='.h') as h_file:
+                                         suffix='.h',
+                                         delete=False) as h_file:
             # Write out the header to be scanned.
             h_file.write(h_contents.encode(encoding))
             print(h_file.name + ':', h_contents)
@@ -381,9 +397,9 @@ comment: {standard_bottom_comment}
         '''
 
         with tempfile.NamedTemporaryFile(dir=self.tmpdir.name,
-                                         suffix='1.h') as h_file1, \
+                                         suffix='1.h', delete=False) as h_file1, \
                 tempfile.NamedTemporaryFile(dir=self.tmpdir.name,
-                                            suffix='2.h') as h_file2:
+                                            suffix='2.h', delete=False) as h_file2:
             # Write out the headers.
             h_file1.write(h_contents1.encode('utf-8'))
             h_file2.write(h_contents2.encode('utf-8'))


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]