summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2023-09-11 01:46:26 (GMT)
committerGitHub <noreply@github.com>2023-09-11 01:46:26 (GMT)
commit0b6b05391bcc5893d2b71032cb704995696ecd0b (patch)
tree4a5905a5832f3f2bbbc779d2538f087d36cadf7a
parent1ec45378e97a2d3812ed8bc18e1bd1eb8ddcc9a0 (diff)
downloadcpython-0b6b05391bcc5893d2b71032cb704995696ecd0b.zip
cpython-0b6b05391bcc5893d2b71032cb704995696ecd0b.tar.gz
cpython-0b6b05391bcc5893d2b71032cb704995696ecd0b.tar.bz2
gh-109162: libregrtest: fix Logger (#109246)
* Pass results, quiet and pgo to Logger constructor. * Move display_progress() method from Regrtest to Logger. * No longer pass Regrtest to RunWorkers, but logger and results.
-rw-r--r--Lib/test/libregrtest/logger.py18
-rw-r--r--Lib/test/libregrtest/main.py39
-rw-r--r--Lib/test/libregrtest/runtest_mp.py11
3 files changed, 38 insertions, 30 deletions
diff --git a/Lib/test/libregrtest/logger.py b/Lib/test/libregrtest/logger.py
index 05b9307..6195b5d 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 @@ if MS_WINDOWS:
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 @@ class Logger:
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 0227a2d..0864cbb 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 @@ class Regrtest:
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 @@ class Regrtest:
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 @@ class Regrtest:
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 @@ class Regrtest:
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 @@ class Regrtest:
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 f576d49..96b2ac5 100644
--- a/Lib/test/libregrtest/runtest_mp.py
+++ b/Lib/test/libregrtest/runtest_mp.py
@@ -14,6 +14,7 @@ from typing import Literal, TextIO
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)