diff --git a/Lib/test/libregrtest/logger.py b/Lib/test/libregrtest/logger.py index 05b9307c97ded1..6195b5ddd4ebc0 100644 --- a/Lib/test/libregrtest/logger.py +++ b/Lib/test/libregrtest/logger.py @@ -1,6 +1,7 @@ import os import time +from test.libregrtest.results import TestResults from test.libregrtest.runtests import RunTests from test.libregrtest.utils import print_warning, MS_WINDOWS @@ -9,11 +10,14 @@ class Logger: - def __init__(self): + def __init__(self, results: TestResults, quiet: bool, pgo: bool): self.start_time = time.perf_counter() self.test_count_text = '' self.test_count_width = 3 self.win_load_tracker = None + self._results: TestResults = results + self._quiet: bool = quiet + self._pgo: bool = pgo def log(self, line: str = '') -> None: empty = not line @@ -43,6 +47,18 @@ def get_load_avg(self) -> float | None: return self.win_load_tracker.getloadavg() return None + def display_progress(self, test_index: int, text: str) -> None: + if self._quiet: + return + results = self._results + + # "[ 51/405/1] test_tcl passed" + line = f"{test_index:{self.test_count_width}}{self.test_count_text}" + fails = len(results.bad) + len(results.env_changed) + if fails and not self._pgo: + line = f"{line}/{fails}" + self.log(f"[{line}] {text}") + def set_tests(self, runtests: RunTests) -> None: if runtests.forever: self.test_count_text = '' diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index 0227a2d1fc612e..0864cbb3276d2b 100644 --- a/Lib/test/libregrtest/main.py +++ b/Lib/test/libregrtest/main.py @@ -50,7 +50,18 @@ class Regrtest: on the command line. """ def __init__(self, ns: Namespace): - self.logger = Logger() + # Log verbosity + self.verbose: bool = ns.verbose + self.quiet: bool = ns.quiet + self.pgo: bool = ns.pgo + self.pgo_extended: bool = ns.pgo_extended + + # Test results + self.results: TestResults = TestResults() + self.first_state: str | None = None + + # Logger + self.logger = Logger(self.results, self.quiet, self.pgo) # Actions self.want_header: bool = ns.header @@ -92,12 +103,8 @@ def __init__(self, ns: Namespace): self.forever: bool = ns.forever self.randomize: bool = ns.randomize self.random_seed: int | None = ns.random_seed - self.pgo: bool = ns.pgo - self.pgo_extended: bool = ns.pgo_extended self.output_on_failure: bool = ns.verbose3 self.timeout: float | None = ns.timeout - self.verbose: bool = ns.verbose - self.quiet: bool = ns.quiet if ns.huntrleaks: warmups, runs, filename = ns.huntrleaks filename = os.path.abspath(filename) @@ -119,18 +126,11 @@ def __init__(self, ns: Namespace): self.selected: TestList = [] self.first_runtests: RunTests | None = None - # test results - self.results: TestResults = TestResults() - - self.first_state: str | None = None - # used by --slowest self.print_slowest: bool = ns.print_slow # used to display the progress bar "[ 3/100]" self.start_time = time.perf_counter() - self.test_count_text = '' - self.test_count_width = 1 # used by --single self.single_test_run: bool = ns.single @@ -140,17 +140,6 @@ def __init__(self, ns: Namespace): def log(self, line=''): self.logger.log(line) - def display_progress(self, test_index, text): - if self.quiet: - return - - # "[ 51/405/1] test_tcl passed" - line = f"{test_index:{self.test_count_width}}{self.test_count_text}" - fails = len(self.results.bad) + len(self.results.env_changed) - if fails and not self.pgo: - line = f"{line}/{fails}" - self.log(f"[{line}] {text}") - def find_tests(self): if self.single_test_run: self.next_single_filename = os.path.join(self.tmp_dir, 'pynexttest') @@ -344,7 +333,7 @@ def run_tests_sequentially(self, runtests): text = test_name if previous_test: text = '%s -- %s' % (text, previous_test) - self.display_progress(test_index, text) + self.logger.display_progress(test_index, text) result = self.run_test(test_name, runtests, tracer) @@ -416,7 +405,7 @@ def get_state(self): def _run_tests_mp(self, runtests: RunTests, num_workers: int) -> None: from test.libregrtest.runtest_mp import RunWorkers - RunWorkers(self, runtests, num_workers).run() + RunWorkers(num_workers, runtests, self.logger, self.results).run() def finalize_tests(self, tracer): if self.next_single_filename: diff --git a/Lib/test/libregrtest/runtest_mp.py b/Lib/test/libregrtest/runtest_mp.py index f576d49e85db93..96b2ac521b9d82 100644 --- a/Lib/test/libregrtest/runtest_mp.py +++ b/Lib/test/libregrtest/runtest_mp.py @@ -14,6 +14,7 @@ from test import support from test.support import os_helper +from test.libregrtest.logger import Logger from test.libregrtest.main import Regrtest from test.libregrtest.result import TestResult, State from test.libregrtest.results import TestResults @@ -360,12 +361,14 @@ def get_running(workers: list[WorkerThread]) -> list[str]: class RunWorkers: - def __init__(self, regrtest: Regrtest, runtests: RunTests, num_workers: int) -> None: - self.results: TestResults = regrtest.results - self.log = regrtest.logger.log - self.display_progress = regrtest.display_progress + def __init__(self, num_workers: int, runtests: RunTests, + logger: Logger, results: TestResult) -> None: self.num_workers = num_workers self.runtests = runtests + self.log = logger.log + self.display_progress = logger.display_progress + self.results: TestResults = results + self.output: queue.Queue[QueueOutput] = queue.Queue() tests_iter = runtests.iter_tests() self.pending = MultiprocessIterator(tests_iter)