]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-109413: Enable `strict_optional = true` for `libregrtest/run_workers` (#126855)
authorsobolevn <mail@sobolevn.me>
Mon, 18 Nov 2024 14:23:43 +0000 (17:23 +0300)
committerGitHub <noreply@github.com>
Mon, 18 Nov 2024 14:23:43 +0000 (17:23 +0300)
Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
Lib/test/libregrtest/mypy.ini
Lib/test/libregrtest/run_workers.py

index da75a27158a600380146a48742e4e376c22ae3b4..905341cc04b8f19d8f7a2b9828bee78dd3f0646e 100644 (file)
@@ -22,10 +22,6 @@ disallow_untyped_defs = False
 check_untyped_defs = False
 warn_return_any = False
 
-# Enable --strict-optional for these ASAP:
-[mypy-Lib.test.libregrtest.run_workers.*]
-strict_optional = False
-
 # Various internal modules that typeshed deliberately doesn't have stubs for:
 [mypy-_abc.*,_opcode.*,_overlapped.*,_testcapi.*,_testinternalcapi.*,test.*]
 ignore_missing_imports = True
index dcc817ae9aceb62037d712fd56a982ec6a13946a..0ca86a986ea436acb929103a5612f43dc8d31f69 100644 (file)
@@ -102,6 +102,9 @@ class WorkerError(Exception):
         super().__init__()
 
 
+_NOT_RUNNING = "<not running>"
+
+
 class WorkerThread(threading.Thread):
     def __init__(self, worker_id: int, runner: "RunWorkers") -> None:
         super().__init__()
@@ -111,8 +114,8 @@ class WorkerThread(threading.Thread):
         self.output = runner.output
         self.timeout = runner.worker_timeout
         self.log = runner.log
-        self.test_name: TestName | None = None
-        self.start_time: float | None = None
+        self.test_name = _NOT_RUNNING
+        self.start_time = time.monotonic()
         self._popen: subprocess.Popen[str] | None = None
         self._killed = False
         self._stopped = False
@@ -129,7 +132,7 @@ class WorkerThread(threading.Thread):
         popen = self._popen
         if popen is not None:
             dt = time.monotonic() - self.start_time
-            info.extend((f'pid={self._popen.pid}',
+            info.extend((f'pid={popen.pid}',
                          f'time={format_duration(dt)}'))
         return '<%s>' % ' '.join(info)
 
@@ -401,7 +404,7 @@ class WorkerThread(threading.Thread):
                 except WorkerError as exc:
                     mp_result = exc.mp_result
                 finally:
-                    self.test_name = None
+                    self.test_name = _NOT_RUNNING
                 mp_result.result.duration = time.monotonic() - self.start_time
                 self.output.put((False, mp_result))
 
@@ -416,6 +419,9 @@ class WorkerThread(threading.Thread):
 
     def _wait_completed(self) -> None:
         popen = self._popen
+        # only needed for mypy:
+        if popen is None:
+            raise ValueError("Should never access `._popen` before calling `.run()`")
 
         try:
             popen.wait(WAIT_COMPLETED_TIMEOUT)
@@ -483,7 +489,7 @@ class RunWorkers:
             self.worker_timeout: float | None = min(self.timeout * 1.5, self.timeout + 5 * 60)
         else:
             self.worker_timeout = None
-        self.workers: list[WorkerThread] | None = None
+        self.workers: list[WorkerThread] = []
 
         jobs = self.runtests.get_jobs()
         if jobs is not None:
@@ -503,7 +509,7 @@ class RunWorkers:
         processes = plural(nworkers, "process", "processes")
         msg = (f"Run {tests} in parallel using "
                f"{nworkers} worker {processes}")
-        if self.timeout:
+        if self.timeout and self.worker_timeout is not None:
             msg += (" (timeout: %s, worker timeout: %s)"
                     % (format_duration(self.timeout),
                        format_duration(self.worker_timeout)))
@@ -555,7 +561,7 @@ class RunWorkers:
         if mp_result.err_msg:
             # WORKER_BUG
             text += ' (%s)' % mp_result.err_msg
-        elif (result.duration >= PROGRESS_MIN_TIME and not pgo):
+        elif (result.duration and result.duration >= PROGRESS_MIN_TIME and not pgo):
             text += ' (%s)' % format_duration(result.duration)
         if not pgo:
             running = get_running(self.workers)