]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-109162: libregrtest: fix Logger (#109246)
authorVictor Stinner <vstinner@python.org>
Mon, 11 Sep 2023 01:46:26 +0000 (03:46 +0200)
committerGitHub <noreply@github.com>
Mon, 11 Sep 2023 01:46:26 +0000 (01:46 +0000)
* 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.

Lib/test/libregrtest/logger.py
Lib/test/libregrtest/main.py
Lib/test/libregrtest/runtest_mp.py

index 05b9307c97ded11f07b349032a219e61133b8cd1..6195b5ddd4ebc03098323c572c4e03cd85640898 100644 (file)
@@ -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 = ''
index 0227a2d1fc612e9b1e11b3fc83773b0bfc485cf0..0864cbb3276d2b19b1d825dfca04809ad934a07a 100644 (file)
@@ -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:
index f576d49e85db93ded577b04a3c2377caf7e6333b..96b2ac521b9d82ebaffe6bb5b556da9593f71370 100644 (file)
@@ -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)