summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/libregrtest/mypy.ini4
-rw-r--r--Lib/test/libregrtest/run_workers.py20
2 files changed, 13 insertions, 11 deletions
diff --git a/Lib/test/libregrtest/mypy.ini b/Lib/test/libregrtest/mypy.ini
index da75a27..905341c 100644
--- a/Lib/test/libregrtest/mypy.ini
+++ b/Lib/test/libregrtest/mypy.ini
@@ -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
diff --git a/Lib/test/libregrtest/run_workers.py b/Lib/test/libregrtest/run_workers.py
index dcc817a..0ca86a9 100644
--- a/Lib/test/libregrtest/run_workers.py
+++ b/Lib/test/libregrtest/run_workers.py
@@ -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)