bpo-37359: Add --cleanup option to python3 -m test (GH-14332) (GH-14334)

* regrtest: Add --cleanup option to remove "test_python_*" directories
  of previous failed test jobs.
* Add "make cleantest" to run "python3 -m test --cleanup".

(cherry picked from commit 47fbc4e45b)
This commit is contained in:
Victor Stinner 2019-06-24 12:51:47 +02:00 committed by GitHub
parent 2e0ec5b4b7
commit 2ec4545ebe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 65 additions and 14 deletions

View File

@ -272,8 +272,10 @@ def _create_parser():
group.add_argument('--junit-xml', dest='xmlpath', metavar='FILENAME',
help='writes JUnit-style XML results to the specified '
'file')
group.add_argument('--tempdir', dest='tempdir', metavar='PATH',
group.add_argument('--tempdir', metavar='PATH',
help='override the working directory for the test run')
group.add_argument('--cleanup', action='store_true',
help='remove old test_python_* directories')
return parser

View File

@ -173,7 +173,19 @@ class Regrtest:
# Strip .py extensions.
removepy(ns.args)
return ns
if ns.huntrleaks:
warmup, repetitions, _ = ns.huntrleaks
if warmup < 1 or repetitions < 1:
msg = ("Invalid values for the --huntrleaks/-R parameters. The "
"number of warmups and repetitions must be at least 1 "
"each (1:1).")
print(msg, file=sys.stderr, flush=True)
sys.exit(2)
if ns.tempdir:
ns.tempdir = os.path.expanduser(ns.tempdir)
self.ns = ns
def find_tests(self, tests):
self.tests = tests
@ -537,7 +549,7 @@ class Regrtest:
for s in ET.tostringlist(root):
f.write(s)
def create_temp_dir(self):
def set_temp_dir(self):
if self.ns.tempdir:
self.tmp_dir = self.ns.tempdir
@ -558,6 +570,8 @@ class Regrtest:
self.tmp_dir = tempfile.gettempdir()
self.tmp_dir = os.path.abspath(self.tmp_dir)
def create_temp_dir(self):
os.makedirs(self.tmp_dir, exist_ok=True)
# Define a writable temp dir that will be used as cwd while running
@ -565,14 +579,34 @@ class Regrtest:
# testing (see the -j option).
pid = os.getpid()
if self.worker_test_name is not None:
test_cwd = 'worker_{}'.format(pid)
test_cwd = 'test_python_worker_{}'.format(pid)
else:
test_cwd = 'test_python_{}'.format(pid)
test_cwd = os.path.join(self.tmp_dir, test_cwd)
return test_cwd
def cleanup(self):
import glob
import shutil
path = os.path.join(self.tmp_dir, 'test_python_*')
print("Cleanup %s directory" % self.tmp_dir)
for name in glob.glob(path):
print("Remove directory: %s" % name)
if os.path.isdir(name):
support.rmtree(name)
else:
print("Remove file: %s" % name)
support.unlink(name)
def main(self, tests=None, **kwargs):
self.ns = self.parse_args(kwargs)
self.parse_args(kwargs)
self.set_temp_dir()
if self.ns.cleanup:
self.cleanup()
sys.exit(0)
test_cwd = self.create_temp_dir()
@ -597,15 +631,6 @@ class Regrtest:
return None
def _main(self, tests, kwargs):
if self.ns.huntrleaks:
warmup, repetitions, _ = self.ns.huntrleaks
if warmup < 1 or repetitions < 1:
msg = ("Invalid values for the --huntrleaks/-R parameters. The "
"number of warmups and repetitions must be at least 1 "
"each (1:1).")
print(msg, file=sys.stderr, flush=True)
sys.exit(2)
if self.worker_test_name is not None:
from test.libregrtest.runtest_mp import run_tests_worker
run_tests_worker(self.ns, self.worker_test_name)

View File

@ -1124,6 +1124,21 @@ class ArgsTestCase(BaseTestCase):
env_changed=[testname],
fail_env_changed=True)
def test_cleanup(self):
dirname = os.path.join(self.tmptestdir, "test_python_123")
os.mkdir(dirname)
filename = os.path.join(self.tmptestdir, "test_python_456")
open(filename, "wb").close()
names = [dirname, filename]
cmdargs = ['-m', 'test',
'--tempdir=%s' % self.tmptestdir,
'--cleanup']
self.run_python(cmdargs)
for name in names:
self.assertFalse(os.path.exists(name), name)
class TestUtils(unittest.TestCase):
def test_format_duration(self):

View File

@ -1102,6 +1102,11 @@ TESTTIMEOUT= 1200
.PHONY: test testall testuniversal buildbottest pythoninfo
# Remove "test_python_*" directories of previous failed test jobs.
# Pass TESTOPTS options because it can contain --tempdir option.
cleantest: build_all
$(TESTRUNNER) $(TESTOPTS) --cleanup
# Run a basic set of regression tests.
# This excludes some tests that are particularly resource-intensive.
test: @DEF_MAKE_RULE@ platform

View File

@ -0,0 +1,4 @@
Add --cleanup option to python3 -m test to remove ``test_python_*``
directories of previous failed jobs. Add "make cleantest" to run
``python3 -m test --cleanup``.