| 
									
										
										
										
											2016-03-22 15:14:09 +01:00
										 |  |  | import datetime | 
					
						
							| 
									
										
										
										
											2015-10-03 00:21:12 +02:00
										 |  |  | import faulthandler | 
					
						
							| 
									
										
										
										
											2016-09-08 21:46:56 -07:00
										 |  |  | import locale | 
					
						
							| 
									
										
										
										
											2015-09-26 10:38:01 +02:00
										 |  |  | import os | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  | import platform | 
					
						
							|  |  |  | import random | 
					
						
							| 
									
										
										
										
											2015-09-26 10:38:01 +02:00
										 |  |  | import re | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | import sysconfig | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  | import tempfile | 
					
						
							| 
									
										
										
										
											2016-03-22 15:14:09 +01:00
										 |  |  | import time | 
					
						
							| 
									
										
										
										
											2017-06-16 17:36:19 +08:00
										 |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2015-10-11 10:37:25 +02:00
										 |  |  | from test.libregrtest.cmdline import _parse_args | 
					
						
							| 
									
										
										
										
											2015-09-26 10:38:01 +02:00
										 |  |  | from test.libregrtest.runtest import ( | 
					
						
							| 
									
										
										
										
											2017-06-16 17:36:19 +08:00
										 |  |  |     findtests, runtest, get_abs_module, | 
					
						
							| 
									
										
										
										
											2015-10-11 10:37:25 +02:00
										 |  |  |     STDTESTS, NOTTESTS, PASSED, FAILED, ENV_CHANGED, SKIPPED, RESOURCE_DENIED, | 
					
						
							| 
									
										
										
										
											2018-11-29 17:17:44 +00:00
										 |  |  |     INTERRUPTED, CHILD_ERROR, TEST_DID_NOT_RUN, | 
					
						
							| 
									
										
										
										
											2019-05-13 19:17:54 +02:00
										 |  |  |     PROGRESS_MIN_TIME, format_test_result, is_failed) | 
					
						
							| 
									
										
										
										
											2015-09-30 02:17:28 +02:00
										 |  |  | from test.libregrtest.setup import setup_tests | 
					
						
							| 
									
										
										
										
											2018-06-01 11:04:45 +02:00
										 |  |  | from test.libregrtest.utils import removepy, count, format_duration, printlist | 
					
						
							| 
									
										
										
										
											2015-09-26 10:38:01 +02:00
										 |  |  | from test import support | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  | class Regrtest: | 
					
						
							| 
									
										
										
										
											2015-09-26 10:38:01 +02:00
										 |  |  |     """Execute a test suite.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     This also parses command-line options and modifies its behavior | 
					
						
							|  |  |  |     accordingly. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     tests -- a list of strings containing test names (optional) | 
					
						
							|  |  |  |     testdir -- the directory in which to look for tests (optional) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Users other than the Python test suite will certainly want to | 
					
						
							|  |  |  |     specify testdir; if it's omitted, the directory containing the | 
					
						
							|  |  |  |     Python test suite is searched for. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     If the tests argument is omitted, the tests listed on the | 
					
						
							|  |  |  |     command-line will be used.  If that's empty, too, then all *.py | 
					
						
							|  |  |  |     files beginning with test_ will be used. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The other default arguments (verbose, quiet, exclude, | 
					
						
							|  |  |  |     single, randomize, findleaks, use_resources, trace, coverdir, | 
					
						
							|  |  |  |     print_slow, and random_seed) allow programmers calling main() | 
					
						
							|  |  |  |     directly to set the values that would normally be set by flags | 
					
						
							|  |  |  |     on the command line. | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |     def __init__(self): | 
					
						
							|  |  |  |         # Namespace of command line options | 
					
						
							|  |  |  |         self.ns = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # tests | 
					
						
							|  |  |  |         self.tests = [] | 
					
						
							|  |  |  |         self.selected = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # test results | 
					
						
							|  |  |  |         self.good = [] | 
					
						
							|  |  |  |         self.bad = [] | 
					
						
							|  |  |  |         self.skipped = [] | 
					
						
							|  |  |  |         self.resource_denieds = [] | 
					
						
							|  |  |  |         self.environment_changed = [] | 
					
						
							| 
									
										
										
										
											2018-11-29 17:17:44 +00:00
										 |  |  |         self.run_no_tests = [] | 
					
						
							| 
									
										
										
										
											2019-04-26 08:40:25 +02:00
										 |  |  |         self.rerun = [] | 
					
						
							| 
									
										
										
										
											2018-06-08 09:53:51 +02:00
										 |  |  |         self.first_result = None | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |         self.interrupted = False | 
					
						
							| 
									
										
										
										
											2015-09-26 10:38:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |         # used by --slow | 
					
						
							|  |  |  |         self.test_times = [] | 
					
						
							| 
									
										
										
										
											2015-09-26 10:38:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |         # used by --coverage, trace.Trace instance | 
					
						
							|  |  |  |         self.tracer = None | 
					
						
							| 
									
										
										
										
											2015-09-26 10:38:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |         # used to display the progress bar "[ 3/100]" | 
					
						
							| 
									
										
										
										
											2016-03-22 15:14:09 +01:00
										 |  |  |         self.start_time = time.monotonic() | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |         self.test_count = '' | 
					
						
							|  |  |  |         self.test_count_width = 1 | 
					
						
							| 
									
										
										
										
											2015-09-26 10:38:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |         # used by --single | 
					
						
							|  |  |  |         self.next_single_test = None | 
					
						
							|  |  |  |         self.next_single_filename = None | 
					
						
							| 
									
										
										
										
											2015-09-26 10:38:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-18 09:10:26 -07:00
										 |  |  |         # used by --junit-xml | 
					
						
							|  |  |  |         self.testsuite_xml = None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-14 15:49:16 +02:00
										 |  |  |         # misc | 
					
						
							| 
									
										
										
										
											2019-04-26 11:12:26 +02:00
										 |  |  |         self.win_load_tracker = None | 
					
						
							| 
									
										
										
										
											2019-05-14 15:49:16 +02:00
										 |  |  |         self.tmp_dir = None | 
					
						
							|  |  |  |         self.worker_test_name = None | 
					
						
							| 
									
										
										
										
											2019-04-26 11:12:26 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 08:40:25 +02:00
										 |  |  |     def get_executed(self): | 
					
						
							|  |  |  |         return (set(self.good) | set(self.bad) | set(self.skipped) | 
					
						
							|  |  |  |                 | set(self.resource_denieds) | set(self.environment_changed) | 
					
						
							|  |  |  |                 | set(self.run_no_tests)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 09:56:37 +02:00
										 |  |  |     def accumulate_result(self, result, rerun=False): | 
					
						
							| 
									
										
										
										
											2019-04-26 04:08:53 +02:00
										 |  |  |         test_name = result.test_name | 
					
						
							|  |  |  |         ok = result.result | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 09:56:37 +02:00
										 |  |  |         if ok not in (CHILD_ERROR, INTERRUPTED) and not rerun: | 
					
						
							| 
									
										
										
										
											2019-04-26 04:08:53 +02:00
										 |  |  |             self.test_times.append((result.test_time, test_name)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-26 10:38:01 +02:00
										 |  |  |         if ok == PASSED: | 
					
						
							| 
									
										
										
										
											2019-04-26 04:08:53 +02:00
										 |  |  |             self.good.append(test_name) | 
					
						
							| 
									
										
										
										
											2017-02-06 12:42:00 +01:00
										 |  |  |         elif ok in (FAILED, CHILD_ERROR): | 
					
						
							| 
									
										
										
										
											2019-04-26 09:56:37 +02:00
										 |  |  |             if not rerun: | 
					
						
							|  |  |  |                 self.bad.append(test_name) | 
					
						
							| 
									
										
										
										
											2015-09-26 10:38:01 +02:00
										 |  |  |         elif ok == ENV_CHANGED: | 
					
						
							| 
									
										
										
										
											2019-04-26 04:08:53 +02:00
										 |  |  |             self.environment_changed.append(test_name) | 
					
						
							| 
									
										
										
										
											2015-09-26 10:38:01 +02:00
										 |  |  |         elif ok == SKIPPED: | 
					
						
							| 
									
										
										
										
											2019-04-26 04:08:53 +02:00
										 |  |  |             self.skipped.append(test_name) | 
					
						
							| 
									
										
										
										
											2015-09-26 10:38:01 +02:00
										 |  |  |         elif ok == RESOURCE_DENIED: | 
					
						
							| 
									
										
										
										
											2019-04-26 04:08:53 +02:00
										 |  |  |             self.skipped.append(test_name) | 
					
						
							|  |  |  |             self.resource_denieds.append(test_name) | 
					
						
							| 
									
										
										
										
											2018-11-29 17:17:44 +00:00
										 |  |  |         elif ok == TEST_DID_NOT_RUN: | 
					
						
							| 
									
										
										
										
											2019-04-26 04:08:53 +02:00
										 |  |  |             self.run_no_tests.append(test_name) | 
					
						
							| 
									
										
										
										
											2019-04-26 09:56:37 +02:00
										 |  |  |         elif ok == INTERRUPTED: | 
					
						
							|  |  |  |             self.interrupted = True | 
					
						
							|  |  |  |         else: | 
					
						
							| 
									
										
										
										
											2017-05-09 11:34:01 +02:00
										 |  |  |             raise ValueError("invalid test result: %r" % ok) | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 09:56:37 +02:00
										 |  |  |         if rerun and ok not in {FAILED, CHILD_ERROR, INTERRUPTED}: | 
					
						
							|  |  |  |             self.bad.remove(test_name) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 04:08:53 +02:00
										 |  |  |         xml_data = result.xml_data | 
					
						
							| 
									
										
										
										
											2018-09-18 09:10:26 -07:00
										 |  |  |         if xml_data: | 
					
						
							|  |  |  |             import xml.etree.ElementTree as ET | 
					
						
							|  |  |  |             for e in xml_data: | 
					
						
							|  |  |  |                 try: | 
					
						
							|  |  |  |                     self.testsuite_xml.append(ET.fromstring(e)) | 
					
						
							|  |  |  |                 except ET.ParseError: | 
					
						
							|  |  |  |                     print(xml_data, file=sys.__stderr__) | 
					
						
							|  |  |  |                     raise | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 04:08:53 +02:00
										 |  |  |     def display_progress(self, test_index, text): | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |         if self.ns.quiet: | 
					
						
							|  |  |  |             return | 
					
						
							| 
									
										
										
										
											2017-05-04 15:21:12 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # "[ 51/405/1] test_tcl passed" | 
					
						
							|  |  |  |         line = f"{test_index:{self.test_count_width}}{self.test_count}" | 
					
						
							| 
									
										
										
										
											2017-08-10 16:19:03 +02:00
										 |  |  |         fails = len(self.bad) + len(self.environment_changed) | 
					
						
							|  |  |  |         if fails and not self.ns.pgo: | 
					
						
							|  |  |  |             line = f"{line}/{fails}" | 
					
						
							| 
									
										
										
										
											2019-04-26 04:08:53 +02:00
										 |  |  |         line = f"[{line}] {text}" | 
					
						
							| 
									
										
										
										
											2017-05-04 15:21:12 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # add the system load prefix: "load avg: 1.80 " | 
					
						
							| 
									
										
										
										
											2019-04-26 11:12:26 +02:00
										 |  |  |         load_avg = self.getloadavg() | 
					
						
							|  |  |  |         if load_avg is not None: | 
					
						
							|  |  |  |             line = f"load avg: {load_avg:.2f} {line}" | 
					
						
							| 
									
										
										
										
											2017-05-04 15:21:12 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # add the timestamp prefix:  "0:01:05 " | 
					
						
							| 
									
										
										
										
											2016-08-17 12:22:52 +02:00
										 |  |  |         test_time = time.monotonic() - self.start_time | 
					
						
							|  |  |  |         test_time = datetime.timedelta(seconds=int(test_time)) | 
					
						
							| 
									
										
										
										
											2017-05-04 15:21:12 +02:00
										 |  |  |         line = f"{test_time} {line}" | 
					
						
							| 
									
										
										
										
											2016-03-22 15:14:09 +01:00
										 |  |  |         print(line, flush=True) | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-30 01:13:53 +02:00
										 |  |  |     def parse_args(self, kwargs): | 
					
						
							|  |  |  |         ns = _parse_args(sys.argv[1:], **kwargs) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-03 00:21:12 +02:00
										 |  |  |         if ns.timeout and not hasattr(faulthandler, 'dump_traceback_later'): | 
					
						
							|  |  |  |             print("Warning: The timeout option requires " | 
					
						
							|  |  |  |                   "faulthandler.dump_traceback_later", file=sys.stderr) | 
					
						
							|  |  |  |             ns.timeout = None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-18 09:10:26 -07:00
										 |  |  |         if ns.xmlpath: | 
					
						
							|  |  |  |             support.junit_xml_list = self.testsuite_xml = [] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-14 15:49:16 +02:00
										 |  |  |         worker_args = ns.worker_args | 
					
						
							|  |  |  |         if worker_args is not None: | 
					
						
							|  |  |  |             from test.libregrtest.runtest_mp import parse_worker_args | 
					
						
							|  |  |  |             ns, test_name = parse_worker_args(ns.worker_args) | 
					
						
							|  |  |  |             ns.worker_args = worker_args | 
					
						
							|  |  |  |             self.worker_test_name = test_name | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |         # Strip .py extensions. | 
					
						
							| 
									
										
										
										
											2015-09-30 01:13:53 +02:00
										 |  |  |         removepy(ns.args) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-24 12:03:00 +02:00
										 |  |  |         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 | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def find_tests(self, tests): | 
					
						
							|  |  |  |         self.tests = tests | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if self.ns.single: | 
					
						
							| 
									
										
										
										
											2019-05-14 15:49:16 +02:00
										 |  |  |             self.next_single_filename = os.path.join(self.tmp_dir, 'pynexttest') | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |             try: | 
					
						
							|  |  |  |                 with open(self.next_single_filename, 'r') as fp: | 
					
						
							|  |  |  |                     next_test = fp.read().strip() | 
					
						
							|  |  |  |                     self.tests = [next_test] | 
					
						
							|  |  |  |             except OSError: | 
					
						
							|  |  |  |                 pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if self.ns.fromfile: | 
					
						
							|  |  |  |             self.tests = [] | 
					
						
							| 
									
										
										
										
											2016-03-24 09:43:00 +01:00
										 |  |  |             # regex to match 'test_builtin' in line: | 
					
						
							|  |  |  |             # '0:00:00 [  4/400] test_builtin -- test_dict took 1 sec' | 
					
						
							| 
									
										
										
										
											2017-01-03 01:38:58 +01:00
										 |  |  |             regex = re.compile(r'\btest_[a-zA-Z0-9_]+\b') | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |             with open(os.path.join(support.SAVEDCWD, self.ns.fromfile)) as fp: | 
					
						
							|  |  |  |                 for line in fp: | 
					
						
							| 
									
										
										
										
											2016-12-09 16:05:51 +01:00
										 |  |  |                     line = line.split('#', 1)[0] | 
					
						
							| 
									
										
										
										
											2016-03-24 09:43:00 +01:00
										 |  |  |                     line = line.strip() | 
					
						
							| 
									
										
										
										
											2016-12-09 16:05:51 +01:00
										 |  |  |                     match = regex.search(line) | 
					
						
							|  |  |  |                     if match is not None: | 
					
						
							| 
									
										
										
										
											2017-01-03 01:38:58 +01:00
										 |  |  |                         self.tests.append(match.group()) | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         removepy(self.tests) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         stdtests = STDTESTS[:] | 
					
						
							|  |  |  |         nottests = NOTTESTS.copy() | 
					
						
							|  |  |  |         if self.ns.exclude: | 
					
						
							|  |  |  |             for arg in self.ns.args: | 
					
						
							|  |  |  |                 if arg in stdtests: | 
					
						
							|  |  |  |                     stdtests.remove(arg) | 
					
						
							|  |  |  |                 nottests.add(arg) | 
					
						
							|  |  |  |             self.ns.args = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # if testdir is set, then we are not running the python tests suite, so | 
					
						
							|  |  |  |         # don't add default tests to be executed or skipped (pass empty values) | 
					
						
							|  |  |  |         if self.ns.testdir: | 
					
						
							|  |  |  |             alltests = findtests(self.ns.testdir, list(), set()) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             alltests = findtests(self.ns.testdir, stdtests, nottests) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-24 09:43:00 +01:00
										 |  |  |         if not self.ns.fromfile: | 
					
						
							|  |  |  |             self.selected = self.tests or self.ns.args or alltests | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             self.selected = self.tests | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |         if self.ns.single: | 
					
						
							|  |  |  |             self.selected = self.selected[:1] | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 pos = alltests.index(self.selected[0]) | 
					
						
							|  |  |  |                 self.next_single_test = alltests[pos + 1] | 
					
						
							|  |  |  |             except IndexError: | 
					
						
							|  |  |  |                 pass | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-30 00:59:35 +02:00
										 |  |  |         # Remove all the selected tests that precede start if it's set. | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |         if self.ns.start: | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 del self.selected[:self.selected.index(self.ns.start)] | 
					
						
							|  |  |  |             except ValueError: | 
					
						
							| 
									
										
										
										
											2015-09-29 23:43:33 +02:00
										 |  |  |                 print("Couldn't find starting test (%s), using all tests" | 
					
						
							| 
									
										
										
										
											2015-10-03 00:21:12 +02:00
										 |  |  |                       % self.ns.start, file=sys.stderr) | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if self.ns.randomize: | 
					
						
							|  |  |  |             if self.ns.random_seed is None: | 
					
						
							|  |  |  |                 self.ns.random_seed = random.randrange(10000000) | 
					
						
							|  |  |  |             random.seed(self.ns.random_seed) | 
					
						
							|  |  |  |             random.shuffle(self.selected) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-03 00:21:12 +02:00
										 |  |  |     def list_tests(self): | 
					
						
							|  |  |  |         for name in self.selected: | 
					
						
							|  |  |  |             print(name) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-16 17:36:19 +08:00
										 |  |  |     def _list_cases(self, suite): | 
					
						
							|  |  |  |         for test in suite: | 
					
						
							|  |  |  |             if isinstance(test, unittest.loader._FailedTest): | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |             if isinstance(test, unittest.TestSuite): | 
					
						
							|  |  |  |                 self._list_cases(test) | 
					
						
							|  |  |  |             elif isinstance(test, unittest.TestCase): | 
					
						
							| 
									
										
										
										
											2017-11-21 15:34:02 -08:00
										 |  |  |                 if support.match_test(test): | 
					
						
							| 
									
										
										
										
											2017-06-26 14:18:51 +02:00
										 |  |  |                     print(test.id()) | 
					
						
							| 
									
										
										
										
											2017-06-16 17:36:19 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def list_cases(self): | 
					
						
							| 
									
										
										
										
											2017-06-26 14:18:51 +02:00
										 |  |  |         support.verbose = False | 
					
						
							| 
									
										
										
										
											2017-11-21 15:34:02 -08:00
										 |  |  |         support.set_match_tests(self.ns.match_tests) | 
					
						
							| 
									
										
										
										
											2017-06-26 14:18:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 04:08:53 +02:00
										 |  |  |         for test_name in self.selected: | 
					
						
							|  |  |  |             abstest = get_abs_module(self.ns, test_name) | 
					
						
							| 
									
										
										
										
											2017-06-16 17:36:19 +08:00
										 |  |  |             try: | 
					
						
							|  |  |  |                 suite = unittest.defaultTestLoader.loadTestsFromName(abstest) | 
					
						
							|  |  |  |                 self._list_cases(suite) | 
					
						
							|  |  |  |             except unittest.SkipTest: | 
					
						
							| 
									
										
										
										
											2019-04-26 04:08:53 +02:00
										 |  |  |                 self.skipped.append(test_name) | 
					
						
							| 
									
										
										
										
											2017-06-16 17:36:19 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if self.skipped: | 
					
						
							|  |  |  |             print(file=sys.stderr) | 
					
						
							|  |  |  |             print(count(len(self.skipped), "test"), "skipped:", file=sys.stderr) | 
					
						
							|  |  |  |             printlist(self.skipped, file=sys.stderr) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-30 02:32:11 +02:00
										 |  |  |     def rerun_failed_tests(self): | 
					
						
							|  |  |  |         self.ns.verbose = True | 
					
						
							|  |  |  |         self.ns.failfast = False | 
					
						
							|  |  |  |         self.ns.verbose3 = False | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-08 09:53:51 +02:00
										 |  |  |         self.first_result = self.get_tests_result() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-28 21:03:43 +02:00
										 |  |  |         print() | 
					
						
							| 
									
										
										
										
											2015-09-30 02:32:11 +02:00
										 |  |  |         print("Re-running failed tests in verbose mode") | 
					
						
							| 
									
										
										
										
											2018-05-28 21:03:43 +02:00
										 |  |  |         self.rerun = self.bad[:] | 
					
						
							| 
									
										
										
										
											2019-04-26 04:08:53 +02:00
										 |  |  |         for test_name in self.rerun: | 
					
						
							| 
									
										
										
										
											2019-04-26 09:28:53 +02:00
										 |  |  |             print(f"Re-running {test_name} in verbose mode", flush=True) | 
					
						
							| 
									
										
										
										
											2019-04-26 04:08:53 +02:00
										 |  |  |             self.ns.verbose = True | 
					
						
							| 
									
										
										
										
											2019-04-26 09:56:37 +02:00
										 |  |  |             result = runtest(self.ns, test_name) | 
					
						
							| 
									
										
										
										
											2019-04-26 04:08:53 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 09:56:37 +02:00
										 |  |  |             self.accumulate_result(result, rerun=True) | 
					
						
							| 
									
										
										
										
											2019-04-26 04:08:53 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 09:56:37 +02:00
										 |  |  |             if result.result == INTERRUPTED: | 
					
						
							| 
									
										
										
										
											2015-09-30 02:32:11 +02:00
										 |  |  |                 break | 
					
						
							| 
									
										
										
										
											2019-04-26 09:28:53 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if self.bad: | 
					
						
							|  |  |  |             print(count(len(self.bad), 'test'), "failed again:") | 
					
						
							|  |  |  |             printlist(self.bad) | 
					
						
							| 
									
										
										
										
											2015-09-30 02:32:11 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-28 21:03:43 +02:00
										 |  |  |         self.display_result() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |     def display_result(self): | 
					
						
							| 
									
										
										
										
											2018-05-28 21:03:43 +02:00
										 |  |  |         # If running the test suite for PGO then no one cares about results. | 
					
						
							|  |  |  |         if self.ns.pgo: | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         print() | 
					
						
							| 
									
										
										
										
											2018-06-01 00:48:57 +02:00
										 |  |  |         print("== Tests result: %s ==" % self.get_tests_result()) | 
					
						
							| 
									
										
										
										
											2018-05-28 21:03:43 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |         if self.interrupted: | 
					
						
							|  |  |  |             print("Test suite interrupted by signal SIGINT.") | 
					
						
							| 
									
										
										
										
											2019-04-26 08:40:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         omitted = set(self.selected) - self.get_executed() | 
					
						
							|  |  |  |         if omitted: | 
					
						
							|  |  |  |             print() | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |             print(count(len(omitted), "test"), "omitted:") | 
					
						
							|  |  |  |             printlist(omitted) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if self.good and not self.ns.quiet: | 
					
						
							| 
									
										
										
										
											2018-05-28 21:03:43 +02:00
										 |  |  |             print() | 
					
						
							| 
									
										
										
										
											2015-09-29 23:43:33 +02:00
										 |  |  |             if (not self.bad | 
					
						
							|  |  |  |                 and not self.skipped | 
					
						
							|  |  |  |                 and not self.interrupted | 
					
						
							|  |  |  |                 and len(self.good) > 1): | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |                 print("All", end=' ') | 
					
						
							|  |  |  |             print(count(len(self.good), "test"), "OK.") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if self.ns.print_slow: | 
					
						
							|  |  |  |             self.test_times.sort(reverse=True) | 
					
						
							| 
									
										
										
										
											2016-08-17 12:22:52 +02:00
										 |  |  |             print() | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |             print("10 slowest tests:") | 
					
						
							| 
									
										
										
										
											2019-04-26 04:08:53 +02:00
										 |  |  |             for test_time, test in self.test_times[:10]: | 
					
						
							|  |  |  |                 print("- %s: %s" % (test, format_duration(test_time))) | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if self.bad: | 
					
						
							| 
									
										
										
										
											2016-08-17 15:42:21 +02:00
										 |  |  |             print() | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |             print(count(len(self.bad), "test"), "failed:") | 
					
						
							|  |  |  |             printlist(self.bad) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if self.environment_changed: | 
					
						
							| 
									
										
										
										
											2016-08-17 15:42:21 +02:00
										 |  |  |             print() | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |             print("{} altered the execution environment:".format( | 
					
						
							|  |  |  |                      count(len(self.environment_changed), "test"))) | 
					
						
							|  |  |  |             printlist(self.environment_changed) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if self.skipped and not self.ns.quiet: | 
					
						
							| 
									
										
										
										
											2016-08-17 15:42:21 +02:00
										 |  |  |             print() | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |             print(count(len(self.skipped), "test"), "skipped:") | 
					
						
							|  |  |  |             printlist(self.skipped) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-01 00:48:57 +02:00
										 |  |  |         if self.rerun: | 
					
						
							|  |  |  |             print() | 
					
						
							|  |  |  |             print("%s:" % count(len(self.rerun), "re-run test")) | 
					
						
							|  |  |  |             printlist(self.rerun) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-29 17:17:44 +00:00
										 |  |  |         if self.run_no_tests: | 
					
						
							|  |  |  |             print() | 
					
						
							|  |  |  |             print(count(len(self.run_no_tests), "test"), "run no tests:") | 
					
						
							|  |  |  |             printlist(self.run_no_tests) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-29 23:36:27 +02:00
										 |  |  |     def run_tests_sequential(self): | 
					
						
							| 
									
										
										
										
											2015-09-30 00:59:35 +02:00
										 |  |  |         if self.ns.trace: | 
					
						
							|  |  |  |             import trace | 
					
						
							| 
									
										
										
										
											2015-10-01 00:53:09 +02:00
										 |  |  |             self.tracer = trace.Trace(trace=False, count=True) | 
					
						
							| 
									
										
										
										
											2015-09-30 00:59:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |         save_modules = sys.modules.keys() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-24 11:55:29 +01:00
										 |  |  |         print("Run tests sequentially") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-23 12:14:10 +01:00
										 |  |  |         previous_test = None | 
					
						
							| 
									
										
										
										
											2019-04-26 04:08:53 +02:00
										 |  |  |         for test_index, test_name in enumerate(self.tests, 1): | 
					
						
							| 
									
										
										
										
											2016-03-23 12:14:10 +01:00
										 |  |  |             start_time = time.monotonic() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 04:08:53 +02:00
										 |  |  |             text = test_name | 
					
						
							| 
									
										
										
										
											2016-03-23 12:14:10 +01:00
										 |  |  |             if previous_test: | 
					
						
							|  |  |  |                 text = '%s -- %s' % (text, previous_test) | 
					
						
							|  |  |  |             self.display_progress(test_index, text) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-30 00:59:35 +02:00
										 |  |  |             if self.tracer: | 
					
						
							| 
									
										
										
										
											2015-09-26 10:38:01 +02:00
										 |  |  |                 # If we're tracing code coverage, then we don't exit with status | 
					
						
							|  |  |  |                 # if on a false return value from main. | 
					
						
							| 
									
										
										
										
											2019-04-26 04:08:53 +02:00
										 |  |  |                 cmd = ('result = runtest(self.ns, test_name); ' | 
					
						
							|  |  |  |                        'self.accumulate_result(result)') | 
					
						
							| 
									
										
										
										
											2016-05-20 13:37:40 +02:00
										 |  |  |                 ns = dict(locals()) | 
					
						
							|  |  |  |                 self.tracer.runctx(cmd, globals=globals(), locals=ns) | 
					
						
							|  |  |  |                 result = ns['result'] | 
					
						
							| 
									
										
										
										
											2015-09-26 10:38:01 +02:00
										 |  |  |             else: | 
					
						
							| 
									
										
										
										
											2019-04-26 04:08:53 +02:00
										 |  |  |                 result = runtest(self.ns, test_name) | 
					
						
							|  |  |  |                 self.accumulate_result(result) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if result.result == INTERRUPTED: | 
					
						
							|  |  |  |                 break | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             previous_test = format_test_result(result) | 
					
						
							| 
									
										
										
										
											2016-03-23 12:14:10 +01:00
										 |  |  |             test_time = time.monotonic() - start_time | 
					
						
							|  |  |  |             if test_time >= PROGRESS_MIN_TIME: | 
					
						
							| 
									
										
										
										
											2016-08-17 12:22:52 +02:00
										 |  |  |                 previous_test = "%s in %s" % (previous_test, format_duration(test_time)) | 
					
						
							| 
									
										
										
										
											2019-05-13 19:17:54 +02:00
										 |  |  |             elif result.result == PASSED: | 
					
						
							| 
									
										
										
										
											2016-05-20 13:37:40 +02:00
										 |  |  |                 # be quiet: say nothing if the test passed shortly | 
					
						
							| 
									
										
										
										
											2016-03-23 12:14:10 +01:00
										 |  |  |                 previous_test = None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-26 10:38:01 +02:00
										 |  |  |             # Unload the newly imported modules (best effort finalization) | 
					
						
							|  |  |  |             for module in sys.modules.keys(): | 
					
						
							|  |  |  |                 if module not in save_modules and module.startswith("test."): | 
					
						
							|  |  |  |                     support.unload(module) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-13 19:17:54 +02:00
										 |  |  |             if self.ns.failfast and is_failed(result, self.ns): | 
					
						
							|  |  |  |                 break | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-23 12:14:10 +01:00
										 |  |  |         if previous_test: | 
					
						
							|  |  |  |             print(previous_test) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-30 02:39:22 +02:00
										 |  |  |     def _test_forever(self, tests): | 
					
						
							|  |  |  |         while True: | 
					
						
							| 
									
										
										
										
											2019-04-26 04:08:53 +02:00
										 |  |  |             for test_name in tests: | 
					
						
							|  |  |  |                 yield test_name | 
					
						
							| 
									
										
										
										
											2015-09-30 02:39:22 +02:00
										 |  |  |                 if self.bad: | 
					
						
							|  |  |  |                     return | 
					
						
							| 
									
										
										
										
											2017-07-03 11:15:58 +02:00
										 |  |  |                 if self.ns.fail_env_changed and self.environment_changed: | 
					
						
							|  |  |  |                     return | 
					
						
							| 
									
										
										
										
											2015-09-26 10:38:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-04 15:21:12 +02:00
										 |  |  |     def display_header(self): | 
					
						
							|  |  |  |         # Print basic platform information | 
					
						
							|  |  |  |         print("==", platform.python_implementation(), *sys.version.split()) | 
					
						
							|  |  |  |         print("==", platform.platform(aliased=True), | 
					
						
							|  |  |  |                       "%s-endian" % sys.byteorder) | 
					
						
							|  |  |  |         print("== cwd:", os.getcwd()) | 
					
						
							|  |  |  |         cpu_count = os.cpu_count() | 
					
						
							|  |  |  |         if cpu_count: | 
					
						
							|  |  |  |             print("== CPU count:", cpu_count) | 
					
						
							|  |  |  |         print("== encodings: locale=%s, FS=%s" | 
					
						
							|  |  |  |               % (locale.getpreferredencoding(False), | 
					
						
							|  |  |  |                  sys.getfilesystemencoding())) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-01 00:48:57 +02:00
										 |  |  |     def get_tests_result(self): | 
					
						
							|  |  |  |         result = [] | 
					
						
							|  |  |  |         if self.bad: | 
					
						
							|  |  |  |             result.append("FAILURE") | 
					
						
							|  |  |  |         elif self.ns.fail_env_changed and self.environment_changed: | 
					
						
							|  |  |  |             result.append("ENV CHANGED") | 
					
						
							| 
									
										
										
										
											2018-11-29 17:17:44 +00:00
										 |  |  |         elif not any((self.good, self.bad, self.skipped, self.interrupted, | 
					
						
							|  |  |  |             self.environment_changed)): | 
					
						
							|  |  |  |             result.append("NO TEST RUN") | 
					
						
							| 
									
										
										
										
											2018-06-01 00:48:57 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if self.interrupted: | 
					
						
							|  |  |  |             result.append("INTERRUPTED") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if not result: | 
					
						
							|  |  |  |             result.append("SUCCESS") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-08 09:53:51 +02:00
										 |  |  |         result = ', '.join(result) | 
					
						
							|  |  |  |         if self.first_result: | 
					
						
							|  |  |  |             result = '%s then %s' % (self.first_result, result) | 
					
						
							|  |  |  |         return result | 
					
						
							| 
									
										
										
										
											2018-06-01 00:48:57 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-30 02:39:22 +02:00
										 |  |  |     def run_tests(self): | 
					
						
							| 
									
										
										
										
											2015-10-03 00:21:12 +02:00
										 |  |  |         # For a partial run, we do not need to clutter the output. | 
					
						
							| 
									
										
										
										
											2017-05-04 15:21:12 +02:00
										 |  |  |         if (self.ns.header | 
					
						
							|  |  |  |             or not(self.ns.pgo or self.ns.quiet or self.ns.single | 
					
						
							|  |  |  |                    or self.tests or self.ns.args)): | 
					
						
							|  |  |  |             self.display_header() | 
					
						
							| 
									
										
										
										
											2015-10-03 00:21:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-16 01:20:56 +01:00
										 |  |  |         if self.ns.huntrleaks: | 
					
						
							|  |  |  |             warmup, repetitions, _ = self.ns.huntrleaks | 
					
						
							|  |  |  |             if warmup < 3: | 
					
						
							|  |  |  |                 msg = ("WARNING: Running tests with --huntrleaks/-R and less than " | 
					
						
							|  |  |  |                         "3 warmup repetitions can give false positives!") | 
					
						
							|  |  |  |                 print(msg, file=sys.stdout, flush=True) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-03 00:21:12 +02:00
										 |  |  |         if self.ns.randomize: | 
					
						
							|  |  |  |             print("Using random seed", self.ns.random_seed) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |         if self.ns.forever: | 
					
						
							| 
									
										
										
										
											2015-09-30 13:51:17 +02:00
										 |  |  |             self.tests = self._test_forever(list(self.selected)) | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |             self.test_count = '' | 
					
						
							|  |  |  |             self.test_count_width = 3 | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             self.tests = iter(self.selected) | 
					
						
							|  |  |  |             self.test_count = '/{}'.format(len(self.selected)) | 
					
						
							|  |  |  |             self.test_count_width = len(self.test_count) - 1 | 
					
						
							| 
									
										
										
										
											2015-09-26 10:38:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |         if self.ns.use_mp: | 
					
						
							| 
									
										
										
										
											2015-09-29 23:15:38 +02:00
										 |  |  |             from test.libregrtest.runtest_mp import run_tests_multiprocess | 
					
						
							|  |  |  |             run_tests_multiprocess(self) | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2015-09-29 23:36:27 +02:00
										 |  |  |             self.run_tests_sequential() | 
					
						
							| 
									
										
										
										
											2015-09-26 10:38:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |     def finalize(self): | 
					
						
							| 
									
										
										
										
											2019-04-26 11:12:26 +02:00
										 |  |  |         if self.win_load_tracker is not None: | 
					
						
							|  |  |  |             self.win_load_tracker.close() | 
					
						
							|  |  |  |             self.win_load_tracker = None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |         if self.next_single_filename: | 
					
						
							|  |  |  |             if self.next_single_test: | 
					
						
							|  |  |  |                 with open(self.next_single_filename, 'w') as fp: | 
					
						
							|  |  |  |                     fp.write(self.next_single_test + '\n') | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 os.unlink(self.next_single_filename) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-30 00:59:35 +02:00
										 |  |  |         if self.tracer: | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |             r = self.tracer.results() | 
					
						
							|  |  |  |             r.write_results(show_missing=True, summary=True, | 
					
						
							|  |  |  |                             coverdir=self.ns.coverdir) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-17 12:22:52 +02:00
										 |  |  |         print() | 
					
						
							|  |  |  |         duration = time.monotonic() - self.start_time | 
					
						
							|  |  |  |         print("Total duration: %s" % format_duration(duration)) | 
					
						
							| 
									
										
										
										
											2018-06-01 00:48:57 +02:00
										 |  |  |         print("Tests result: %s" % self.get_tests_result()) | 
					
						
							| 
									
										
										
										
											2016-08-17 16:12:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |         if self.ns.runleaks: | 
					
						
							|  |  |  |             os.system("leaks %d" % os.getpid()) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-18 09:10:26 -07:00
										 |  |  |     def save_xml_result(self): | 
					
						
							|  |  |  |         if not self.ns.xmlpath and not self.testsuite_xml: | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         import xml.etree.ElementTree as ET | 
					
						
							|  |  |  |         root = ET.Element("testsuites") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Manually count the totals for the overall summary | 
					
						
							|  |  |  |         totals = {'tests': 0, 'errors': 0, 'failures': 0} | 
					
						
							|  |  |  |         for suite in self.testsuite_xml: | 
					
						
							|  |  |  |             root.append(suite) | 
					
						
							|  |  |  |             for k in totals: | 
					
						
							|  |  |  |                 try: | 
					
						
							|  |  |  |                     totals[k] += int(suite.get(k, 0)) | 
					
						
							|  |  |  |                 except ValueError: | 
					
						
							|  |  |  |                     pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for k, v in totals.items(): | 
					
						
							|  |  |  |             root.set(k, str(v)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         xmlpath = os.path.join(support.SAVEDCWD, self.ns.xmlpath) | 
					
						
							|  |  |  |         with open(xmlpath, 'wb') as f: | 
					
						
							|  |  |  |             for s in ET.tostringlist(root): | 
					
						
							|  |  |  |                 f.write(s) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-24 12:03:00 +02:00
										 |  |  |     def set_temp_dir(self): | 
					
						
							| 
									
										
										
										
											2018-11-17 04:14:36 -08:00
										 |  |  |         if self.ns.tempdir: | 
					
						
							| 
									
										
										
										
											2019-05-14 15:49:16 +02:00
										 |  |  |             self.tmp_dir = self.ns.tempdir | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if not self.tmp_dir: | 
					
						
							|  |  |  |             # When tests are run from the Python build directory, it is best practice | 
					
						
							|  |  |  |             # to keep the test files in a subfolder.  This eases the cleanup of leftover | 
					
						
							|  |  |  |             # files using the "make distclean" command. | 
					
						
							|  |  |  |             if sysconfig.is_python_build(): | 
					
						
							|  |  |  |                 self.tmp_dir = sysconfig.get_config_var('abs_builddir') | 
					
						
							|  |  |  |                 if self.tmp_dir is None: | 
					
						
							|  |  |  |                     # bpo-30284: On Windows, only srcdir is available. Using | 
					
						
							|  |  |  |                     # abs_builddir mostly matters on UNIX when building Python | 
					
						
							|  |  |  |                     # out of the source tree, especially when the source tree | 
					
						
							|  |  |  |                     # is read only. | 
					
						
							|  |  |  |                     self.tmp_dir = sysconfig.get_config_var('srcdir') | 
					
						
							|  |  |  |                 self.tmp_dir = os.path.join(self.tmp_dir, 'build') | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 self.tmp_dir = tempfile.gettempdir() | 
					
						
							| 
									
										
										
										
											2018-11-17 04:14:36 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-14 15:49:16 +02:00
										 |  |  |         self.tmp_dir = os.path.abspath(self.tmp_dir) | 
					
						
							| 
									
										
										
										
											2019-06-24 12:03:00 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def create_temp_dir(self): | 
					
						
							| 
									
										
										
										
											2019-05-14 15:49:16 +02:00
										 |  |  |         os.makedirs(self.tmp_dir, exist_ok=True) | 
					
						
							| 
									
										
										
										
											2016-03-24 17:53:20 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # Define a writable temp dir that will be used as cwd while running | 
					
						
							|  |  |  |         # the tests. The name of the dir includes the pid to allow parallel | 
					
						
							|  |  |  |         # testing (see the -j option). | 
					
						
							| 
									
										
										
										
											2019-05-14 15:49:16 +02:00
										 |  |  |         pid = os.getpid() | 
					
						
							|  |  |  |         if self.worker_test_name is not None: | 
					
						
							| 
									
										
										
										
											2019-06-24 12:03:00 +02:00
										 |  |  |             test_cwd = 'test_python_worker_{}'.format(pid) | 
					
						
							| 
									
										
										
										
											2019-05-14 15:49:16 +02:00
										 |  |  |         else: | 
					
						
							|  |  |  |             test_cwd = 'test_python_{}'.format(pid) | 
					
						
							|  |  |  |         test_cwd = os.path.join(self.tmp_dir, test_cwd) | 
					
						
							|  |  |  |         return test_cwd | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-24 12:03:00 +02:00
										 |  |  |     def cleanup(self): | 
					
						
							|  |  |  |         import glob | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         path = os.path.join(self.tmp_dir, 'test_python_*') | 
					
						
							|  |  |  |         print("Cleanup %s directory" % self.tmp_dir) | 
					
						
							|  |  |  |         for name in glob.glob(path): | 
					
						
							|  |  |  |             if os.path.isdir(name): | 
					
						
							| 
									
										
										
										
											2019-06-24 13:19:48 +02:00
										 |  |  |                 print("Remove directory: %s" % name) | 
					
						
							| 
									
										
										
										
											2019-06-24 12:03:00 +02:00
										 |  |  |                 support.rmtree(name) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 print("Remove file: %s" % name) | 
					
						
							|  |  |  |                 support.unlink(name) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-14 15:49:16 +02:00
										 |  |  |     def main(self, tests=None, **kwargs): | 
					
						
							| 
									
										
										
										
											2019-06-24 12:03:00 +02:00
										 |  |  |         self.parse_args(kwargs) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.set_temp_dir() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if self.ns.cleanup: | 
					
						
							|  |  |  |             self.cleanup() | 
					
						
							|  |  |  |             sys.exit(0) | 
					
						
							| 
									
										
										
										
											2019-05-14 15:49:16 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         test_cwd = self.create_temp_dir() | 
					
						
							| 
									
										
										
										
											2016-03-24 17:53:20 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-14 15:49:16 +02:00
										 |  |  |         # Run the tests in a context manager that temporarily changes the CWD | 
					
						
							|  |  |  |         # to a temporary and writable directory. If it's not possible to | 
					
						
							|  |  |  |         # create or change the CWD, the original CWD will be used. | 
					
						
							|  |  |  |         # The original CWD is available from support.SAVEDCWD. | 
					
						
							| 
									
										
										
										
											2016-03-24 17:53:20 +01:00
										 |  |  |         with support.temp_cwd(test_cwd, quiet=True): | 
					
						
							| 
									
										
										
										
											2019-05-14 15:49:16 +02:00
										 |  |  |             # When using multiprocessing, worker processes will use test_cwd | 
					
						
							|  |  |  |             # as their parent temporary directory. So when the main process | 
					
						
							|  |  |  |             # exit, it removes also subdirectories of worker processes. | 
					
						
							|  |  |  |             self.ns.tempdir = test_cwd | 
					
						
							| 
									
										
										
										
											2016-03-24 17:53:20 +01:00
										 |  |  |             self._main(tests, kwargs) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 11:12:26 +02:00
										 |  |  |     def getloadavg(self): | 
					
						
							|  |  |  |         if self.win_load_tracker is not None: | 
					
						
							|  |  |  |             return self.win_load_tracker.getloadavg() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if hasattr(os, 'getloadavg'): | 
					
						
							|  |  |  |             return os.getloadavg()[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-24 17:53:20 +01:00
										 |  |  |     def _main(self, tests, kwargs): | 
					
						
							| 
									
										
										
										
											2019-05-14 15:49:16 +02:00
										 |  |  |         if self.worker_test_name is not None: | 
					
						
							| 
									
										
										
										
											2018-09-07 17:20:42 +02:00
										 |  |  |             from test.libregrtest.runtest_mp import run_tests_worker | 
					
						
							| 
									
										
										
										
											2019-05-14 15:49:16 +02:00
										 |  |  |             run_tests_worker(self.ns, self.worker_test_name) | 
					
						
							| 
									
										
										
										
											2015-09-30 01:39:28 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-30 00:59:35 +02:00
										 |  |  |         if self.ns.wait: | 
					
						
							|  |  |  |             input("Press any key to continue...") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-06 19:38:15 -07:00
										 |  |  |         support.PGO = self.ns.pgo | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-30 02:17:28 +02:00
										 |  |  |         setup_tests(self.ns) | 
					
						
							| 
									
										
										
										
											2015-09-30 01:39:28 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |         self.find_tests(tests) | 
					
						
							| 
									
										
										
										
											2015-09-30 00:59:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-03 00:21:12 +02:00
										 |  |  |         if self.ns.list_tests: | 
					
						
							|  |  |  |             self.list_tests() | 
					
						
							|  |  |  |             sys.exit(0) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-16 17:36:19 +08:00
										 |  |  |         if self.ns.list_cases: | 
					
						
							|  |  |  |             self.list_cases() | 
					
						
							|  |  |  |             sys.exit(0) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-09 08:20:41 -04:00
										 |  |  |         # If we're on windows and this is the parent runner (not a worker), | 
					
						
							| 
									
										
										
										
											2019-04-26 11:12:26 +02:00
										 |  |  |         # track the load average. | 
					
						
							| 
									
										
										
										
											2019-05-14 15:49:16 +02:00
										 |  |  |         if sys.platform == 'win32' and self.worker_test_name is None: | 
					
						
							| 
									
										
										
										
											2019-04-09 08:20:41 -04:00
										 |  |  |             from test.libregrtest.win_utils import WindowsLoadTracker | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-17 18:06:06 -07:00
										 |  |  |             try: | 
					
						
							| 
									
										
										
										
											2019-04-26 11:12:26 +02:00
										 |  |  |                 self.win_load_tracker = WindowsLoadTracker() | 
					
						
							| 
									
										
										
										
											2019-04-17 18:06:06 -07:00
										 |  |  |             except FileNotFoundError as error: | 
					
						
							|  |  |  |                 # Windows IoT Core and Windows Nano Server do not provide | 
					
						
							|  |  |  |                 # typeperf.exe for x64, x86 or ARM | 
					
						
							| 
									
										
										
										
											2019-04-26 11:12:26 +02:00
										 |  |  |                 print(f'Failed to create WindowsLoadTracker: {error}') | 
					
						
							| 
									
										
										
										
											2019-04-09 08:20:41 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-03 00:21:12 +02:00
										 |  |  |         self.run_tests() | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |         self.display_result() | 
					
						
							| 
									
										
										
										
											2015-09-30 02:32:11 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if self.ns.verbose2 and self.bad: | 
					
						
							|  |  |  |             self.rerun_failed_tests() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |         self.finalize() | 
					
						
							| 
									
										
										
										
											2018-09-18 09:10:26 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         self.save_xml_result() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-26 18:33:19 +02:00
										 |  |  |         if self.bad: | 
					
						
							|  |  |  |             sys.exit(2) | 
					
						
							|  |  |  |         if self.interrupted: | 
					
						
							|  |  |  |             sys.exit(130) | 
					
						
							|  |  |  |         if self.ns.fail_env_changed and self.environment_changed: | 
					
						
							|  |  |  |             sys.exit(3) | 
					
						
							|  |  |  |         sys.exit(0) | 
					
						
							| 
									
										
										
										
											2015-09-26 10:38:01 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  | def main(tests=None, **kwargs): | 
					
						
							| 
									
										
										
										
											2016-03-24 17:53:20 +01:00
										 |  |  |     """Run the Python suite.""" | 
					
						
							| 
									
										
										
										
											2015-09-29 22:48:52 +02:00
										 |  |  |     Regrtest().main(tests=tests, **kwargs) |