]> granicus.if.org Git - python/commitdiff
bpo-37421: Fix test_distutils.test_build_ext() (GH-14564)
authorVictor Stinner <vstinner@redhat.com>
Wed, 3 Jul 2019 09:12:27 +0000 (11:12 +0200)
committerGitHub <noreply@github.com>
Wed, 3 Jul 2019 09:12:27 +0000 (11:12 +0200)
test_distutils.test_build_ext() is now able to remove the temporary
directory on Windows: don't import the newly built C extension ("xx")
in the current process, but test it in a separated process.

Lib/distutils/tests/support.py
Lib/distutils/tests/test_build_ext.py
Misc/NEWS.d/next/Tests/2019-07-03-00-05-28.bpo-37421.ORGRSG.rst [new file with mode: 0644]

index 7385c6bbf67171c55c428ff46abfbd0277c74e94..041309851d0f39e6da461a5a4a55c51f785dd050 100644 (file)
@@ -6,6 +6,7 @@ import tempfile
 import unittest
 import sysconfig
 from copy import deepcopy
+import test.support
 
 from distutils import log
 from distutils.log import DEBUG, INFO, WARN, ERROR, FATAL
@@ -64,8 +65,8 @@ class TempdirManager(object):
         os.chdir(self.old_cwd)
         super().tearDown()
         while self.tempdirs:
-            d = self.tempdirs.pop()
-            shutil.rmtree(d, os.name in ('nt', 'cygwin'))
+            tmpdir = self.tempdirs.pop()
+            test.support.rmtree(tmpdir)
 
     def mkdtemp(self):
         """Create a temporary directory that will be cleaned up.
index 88847f9e9aa7b1a83cbaef1686930cb8deb9c156..52d36b2484f4147430a39aed911edb23efb81d64 100644 (file)
@@ -15,6 +15,7 @@ from distutils.errors import (
 
 import unittest
 from test import support
+from test.support.script_helper import assert_python_ok
 
 # http://bugs.python.org/issue4373
 # Don't load the xx module more than once.
@@ -26,11 +27,8 @@ class BuildExtTestCase(TempdirManager,
                        unittest.TestCase):
     def setUp(self):
         # Create a simple test environment
-        # Note that we're making changes to sys.path
         super(BuildExtTestCase, self).setUp()
         self.tmp_dir = self.mkdtemp()
-        self.sys_path = sys.path, sys.path[:]
-        sys.path.append(self.tmp_dir)
         import site
         self.old_user_base = site.USER_BASE
         site.USER_BASE = self.mkdtemp()
@@ -40,15 +38,11 @@ class BuildExtTestCase(TempdirManager,
         # bpo-30132: On Windows, a .pdb file may be created in the current
         # working directory. Create a temporary working directory to cleanup
         # everything at the end of the test.
-        self.temp_cwd = support.temp_cwd()
-        self.temp_cwd.__enter__()
-        self.addCleanup(self.temp_cwd.__exit__, None, None, None)
+        change_cwd = support.change_cwd(self.tmp_dir)
+        change_cwd.__enter__()
+        self.addCleanup(change_cwd.__exit__, None, None, None)
 
     def tearDown(self):
-        # Get everything back to normal
-        support.unload('xx')
-        sys.path = self.sys_path[0]
-        sys.path[:] = self.sys_path[1]
         import site
         site.USER_BASE = self.old_user_base
         from distutils.command import build_ext
@@ -88,19 +82,34 @@ class BuildExtTestCase(TempdirManager,
         else:
             ALREADY_TESTED = type(self).__name__
 
-        import xx
+        code = textwrap.dedent(f"""
+            tmp_dir = {self.tmp_dir!r}
 
-        for attr in ('error', 'foo', 'new', 'roj'):
-            self.assertTrue(hasattr(xx, attr))
+            import sys
+            import unittest
+            from test import support
 
-        self.assertEqual(xx.foo(2, 5), 7)
-        self.assertEqual(xx.foo(13,15), 28)
-        self.assertEqual(xx.new().demo(), None)
-        if support.HAVE_DOCSTRINGS:
-            doc = 'This is a template module just for instruction.'
-            self.assertEqual(xx.__doc__, doc)
-        self.assertIsInstance(xx.Null(), xx.Null)
-        self.assertIsInstance(xx.Str(), xx.Str)
+            sys.path.insert(0, tmp_dir)
+            import xx
+
+            class Tests(unittest.TestCase):
+                def test_xx(self):
+                    for attr in ('error', 'foo', 'new', 'roj'):
+                        self.assertTrue(hasattr(xx, attr))
+
+                    self.assertEqual(xx.foo(2, 5), 7)
+                    self.assertEqual(xx.foo(13,15), 28)
+                    self.assertEqual(xx.new().demo(), None)
+                    if support.HAVE_DOCSTRINGS:
+                        doc = 'This is a template module just for instruction.'
+                        self.assertEqual(xx.__doc__, doc)
+                    self.assertIsInstance(xx.Null(), xx.Null)
+                    self.assertIsInstance(xx.Str(), xx.Str)
+
+
+            unittest.main()
+        """)
+        assert_python_ok('-c', code)
 
     def test_solaris_enable_shared(self):
         dist = Distribution({'name': 'xx'})
diff --git a/Misc/NEWS.d/next/Tests/2019-07-03-00-05-28.bpo-37421.ORGRSG.rst b/Misc/NEWS.d/next/Tests/2019-07-03-00-05-28.bpo-37421.ORGRSG.rst
new file mode 100644 (file)
index 0000000..8610509
--- /dev/null
@@ -0,0 +1,3 @@
+test_distutils.test_build_ext() is now able to remove the temporary
+directory on Windows: don't import the newly built C extension ("xx") in the
+current process, but test it in a separated process.