Commit 74c9dd57 authored by Victor Stinner's avatar Victor Stinner Committed by GitHub

bpo-37421: Fix test_distutils.test_build_ext() (GH-14564)

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.
parent 684cb47f
...@@ -6,6 +6,7 @@ import tempfile ...@@ -6,6 +6,7 @@ import tempfile
import unittest import unittest
import sysconfig import sysconfig
from copy import deepcopy from copy import deepcopy
import test.support
from distutils import log from distutils import log
from distutils.log import DEBUG, INFO, WARN, ERROR, FATAL from distutils.log import DEBUG, INFO, WARN, ERROR, FATAL
...@@ -64,8 +65,8 @@ class TempdirManager(object): ...@@ -64,8 +65,8 @@ class TempdirManager(object):
os.chdir(self.old_cwd) os.chdir(self.old_cwd)
super().tearDown() super().tearDown()
while self.tempdirs: while self.tempdirs:
d = self.tempdirs.pop() tmpdir = self.tempdirs.pop()
shutil.rmtree(d, os.name in ('nt', 'cygwin')) test.support.rmtree(tmpdir)
def mkdtemp(self): def mkdtemp(self):
"""Create a temporary directory that will be cleaned up. """Create a temporary directory that will be cleaned up.
......
...@@ -15,6 +15,7 @@ from distutils.errors import ( ...@@ -15,6 +15,7 @@ from distutils.errors import (
import unittest import unittest
from test import support from test import support
from test.support.script_helper import assert_python_ok
# http://bugs.python.org/issue4373 # http://bugs.python.org/issue4373
# Don't load the xx module more than once. # Don't load the xx module more than once.
...@@ -26,11 +27,8 @@ class BuildExtTestCase(TempdirManager, ...@@ -26,11 +27,8 @@ class BuildExtTestCase(TempdirManager,
unittest.TestCase): unittest.TestCase):
def setUp(self): def setUp(self):
# Create a simple test environment # Create a simple test environment
# Note that we're making changes to sys.path
super(BuildExtTestCase, self).setUp() super(BuildExtTestCase, self).setUp()
self.tmp_dir = self.mkdtemp() self.tmp_dir = self.mkdtemp()
self.sys_path = sys.path, sys.path[:]
sys.path.append(self.tmp_dir)
import site import site
self.old_user_base = site.USER_BASE self.old_user_base = site.USER_BASE
site.USER_BASE = self.mkdtemp() site.USER_BASE = self.mkdtemp()
...@@ -40,15 +38,11 @@ class BuildExtTestCase(TempdirManager, ...@@ -40,15 +38,11 @@ class BuildExtTestCase(TempdirManager,
# bpo-30132: On Windows, a .pdb file may be created in the current # bpo-30132: On Windows, a .pdb file may be created in the current
# working directory. Create a temporary working directory to cleanup # working directory. Create a temporary working directory to cleanup
# everything at the end of the test. # everything at the end of the test.
self.temp_cwd = support.temp_cwd() change_cwd = support.change_cwd(self.tmp_dir)
self.temp_cwd.__enter__() change_cwd.__enter__()
self.addCleanup(self.temp_cwd.__exit__, None, None, None) self.addCleanup(change_cwd.__exit__, None, None, None)
def tearDown(self): 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 import site
site.USER_BASE = self.old_user_base site.USER_BASE = self.old_user_base
from distutils.command import build_ext from distutils.command import build_ext
...@@ -88,19 +82,34 @@ class BuildExtTestCase(TempdirManager, ...@@ -88,19 +82,34 @@ class BuildExtTestCase(TempdirManager,
else: else:
ALREADY_TESTED = type(self).__name__ ALREADY_TESTED = type(self).__name__
import xx code = textwrap.dedent(f"""
tmp_dir = {self.tmp_dir!r}
for attr in ('error', 'foo', 'new', 'roj'): import sys
self.assertTrue(hasattr(xx, attr)) import unittest
from test import support
self.assertEqual(xx.foo(2, 5), 7) sys.path.insert(0, tmp_dir)
self.assertEqual(xx.foo(13,15), 28) import xx
self.assertEqual(xx.new().demo(), None)
if support.HAVE_DOCSTRINGS: class Tests(unittest.TestCase):
doc = 'This is a template module just for instruction.' def test_xx(self):
self.assertEqual(xx.__doc__, doc) for attr in ('error', 'foo', 'new', 'roj'):
self.assertIsInstance(xx.Null(), xx.Null) self.assertTrue(hasattr(xx, attr))
self.assertIsInstance(xx.Str(), xx.Str)
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): def test_solaris_enable_shared(self):
dist = Distribution({'name': 'xx'}) dist = Distribution({'name': 'xx'})
......
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.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment