diff options
author | Victor Stinner <vstinner@redhat.com> | 2019-06-24 10:03:00 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-06-24 10:03:00 (GMT) |
commit | 47fbc4e45b35b3111e2d947a66490a43ac21d363 (patch) | |
tree | 9b10bbfc6521c08dc251a028bb6df790d55c2c96 | |
parent | 2ac3bab2a6e1f9e17fc0c58a26e8425bb93cb0f5 (diff) | |
download | cpython-47fbc4e45b35b3111e2d947a66490a43ac21d363.zip cpython-47fbc4e45b35b3111e2d947a66490a43ac21d363.tar.gz cpython-47fbc4e45b35b3111e2d947a66490a43ac21d363.tar.bz2 |
bpo-37359: Add --cleanup option to python3 -m test (GH-14332)
* regrtest: Add --cleanup option to remove "test_python_*" directories
of previous failed test jobs.
* Add "make cleantest" to run "python3 -m test --cleanup".
-rw-r--r-- | Lib/test/libregrtest/cmdline.py | 4 | ||||
-rw-r--r-- | Lib/test/libregrtest/main.py | 51 | ||||
-rw-r--r-- | Lib/test/test_regrtest.py | 15 | ||||
-rw-r--r-- | Makefile.pre.in | 5 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Tests/2019-06-24-10-47-07.bpo-37359.CkdtyO.rst | 4 |
5 files changed, 65 insertions, 14 deletions
diff --git a/Lib/test/libregrtest/cmdline.py b/Lib/test/libregrtest/cmdline.py index dc0d880..9f1bf68 100644 --- a/Lib/test/libregrtest/cmdline.py +++ b/Lib/test/libregrtest/cmdline.py @@ -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 diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index a9b2b35..98b4420 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -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) diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index 0a00925..2e5df00 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -1156,6 +1156,21 @@ class ArgsTestCase(BaseTestCase): fail_env_changed=True) self.assertIn("Warning -- Unraisable exception", output) + 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): diff --git a/Makefile.pre.in b/Makefile.pre.in index f629336..ef9a4f8 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1104,6 +1104,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 diff --git a/Misc/NEWS.d/next/Tests/2019-06-24-10-47-07.bpo-37359.CkdtyO.rst b/Misc/NEWS.d/next/Tests/2019-06-24-10-47-07.bpo-37359.CkdtyO.rst new file mode 100644 index 0000000..3d5350d --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-06-24-10-47-07.bpo-37359.CkdtyO.rst @@ -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``. + |