Skip to content

Commit a5f8b95

Browse files
committed
running regrtest
Signed-off-by: Ashwin Naren <arihant2math@gmail.com>
1 parent 2b5ee22 commit a5f8b95

File tree

10 files changed

+109
-161
lines changed

10 files changed

+109
-161
lines changed

Lib/inspect.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3096,6 +3096,24 @@ def signature(obj, *, follow_wrapped=True):
30963096
return Signature.from_callable(obj, follow_wrapped=follow_wrapped)
30973097

30983098

3099+
@functools.lru_cache()
3100+
def _shadowed_dict_from_weakref_mro_tuple(*weakref_mro):
3101+
for weakref_entry in weakref_mro:
3102+
# Normally we'd have to check whether the result of weakref_entry()
3103+
# is None here, in case the object the weakref is pointing to has died.
3104+
# In this specific case, however, we know that the only caller of this
3105+
# function is `_shadowed_dict()`, and that therefore this weakref is
3106+
# guaranteed to point to an object that is still alive.
3107+
entry = weakref_entry()
3108+
dunder_dict = _get_dunder_dict_of_class(entry)
3109+
if '__dict__' in dunder_dict:
3110+
class_dict = dunder_dict['__dict__']
3111+
if not (type(class_dict) is types.GetSetDescriptorType and
3112+
class_dict.__name__ == "__dict__" and
3113+
class_dict.__objclass__ is entry):
3114+
return class_dict
3115+
return _sentinel
3116+
30993117
def _main():
31003118
""" Logic for inspecting an object given at command line """
31013119
import argparse

Lib/test/__main__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
from test.libregrtest import main
2-
main()
2+
main.main()

Lib/test/libregrtest/logger.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ def start_load_tracker(self) -> None:
7676
return
7777

7878
try:
79-
self.win_load_tracker = WindowsLoadTracker()
79+
self.win_load_tracker = None
8080
except PermissionError as error:
8181
# Standard accounts may not have access to the performance
8282
# counters.

Lib/test/libregrtest/result.py

Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -125,34 +125,33 @@ def _format_failed(self):
125125
return f"{self.test_name} failed"
126126

127127
def __str__(self) -> str:
128-
match self.state:
129-
case State.PASSED:
130-
return f"{self.test_name} passed"
131-
case State.FAILED:
132-
return self._format_failed()
133-
case State.SKIPPED:
134-
return f"{self.test_name} skipped"
135-
case State.UNCAUGHT_EXC:
136-
return f"{self.test_name} failed (uncaught exception)"
137-
case State.REFLEAK:
138-
return f"{self.test_name} failed (reference leak)"
139-
case State.ENV_CHANGED:
140-
return f"{self.test_name} failed (env changed)"
141-
case State.RESOURCE_DENIED:
142-
return f"{self.test_name} skipped (resource denied)"
143-
case State.INTERRUPTED:
144-
return f"{self.test_name} interrupted"
145-
case State.WORKER_FAILED:
146-
return f"{self.test_name} worker non-zero exit code"
147-
case State.WORKER_BUG:
148-
return f"{self.test_name} worker bug"
149-
case State.DID_NOT_RUN:
150-
return f"{self.test_name} ran no tests"
151-
case State.TIMEOUT:
152-
assert self.duration is not None, "self.duration is None"
153-
return f"{self.test_name} timed out ({format_duration(self.duration)})"
154-
case _:
155-
raise ValueError("unknown result state: {state!r}")
128+
if self.state == State.PASSED:
129+
return f"{self.test_name} passed"
130+
elif self.state == State.FAILED:
131+
return self._format_failed()
132+
elif self.state == State.SKIPPED:
133+
return f"{self.test_name} skipped"
134+
elif self.state == State.UNCAUGHT_EXC:
135+
return f"{self.test_name} failed (uncaught exception)"
136+
elif self.state == State.REFLEAK:
137+
return f"{self.test_name} failed (reference leak)"
138+
elif self.state == State.ENV_CHANGED:
139+
return f"{self.test_name} failed (env changed)"
140+
elif self.state == State.RESOURCE_DENIED:
141+
return f"{self.test_name} skipped (resource denied)"
142+
elif self.state == State.INTERRUPTED:
143+
return f"{self.test_name} interrupted"
144+
elif self.state == State.WORKER_FAILED:
145+
return f"{self.test_name} worker non-zero exit code"
146+
elif self.state == State.WORKER_BUG:
147+
return f"{self.test_name} worker bug"
148+
elif self.state == State.DID_NOT_RUN:
149+
return f"{self.test_name} ran no tests"
150+
elif self.state == State.TIMEOUT:
151+
assert self.duration is not None, "self.duration is None"
152+
return f"{self.test_name} timed out ({format_duration(self.duration)})"
153+
else:
154+
raise ValueError(f"unknown result state: {self.state!r}")
156155

157156
def has_meaningful_duration(self):
158157
return State.has_meaningful_duration(self.state)

Lib/test/libregrtest/results.py

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -96,26 +96,27 @@ def accumulate_result(self, result: TestResult, runtests: RunTests) -> None:
9696
rerun = runtests.rerun
9797
fail_env_changed = runtests.fail_env_changed
9898

99-
match result.state:
100-
case State.PASSED:
101-
self.good.append(test_name)
102-
case State.ENV_CHANGED:
103-
self.env_changed.append(test_name)
99+
if result.state == State.PASSED:
100+
self.good.append(test_name)
101+
elif result.state == State.ENV_CHANGED:
102+
self.env_changed.append(test_name)
103+
self.rerun_results.append(result)
104+
elif result.state == State.SKIPPED:
105+
self.skipped.append(test_name)
106+
elif result.state == State.RESOURCE_DENIED:
107+
self.resource_denied.append(test_name)
108+
elif result.state == State.INTERRUPTED:
109+
self.interrupted = True
110+
elif result.state == State.DID_NOT_RUN:
111+
self.run_no_tests.append(test_name)
112+
elif result.state == State.WORKER_BUG:
113+
self.worker_bug = True
114+
else:
115+
if result.is_failed(fail_env_changed):
116+
self.bad.append(test_name)
104117
self.rerun_results.append(result)
105-
case State.SKIPPED:
106-
self.skipped.append(test_name)
107-
case State.RESOURCE_DENIED:
108-
self.resource_denied.append(test_name)
109-
case State.INTERRUPTED:
110-
self.interrupted = True
111-
case State.DID_NOT_RUN:
112-
self.run_no_tests.append(test_name)
113-
case _:
114-
if result.is_failed(fail_env_changed):
115-
self.bad.append(test_name)
116-
self.rerun_results.append(result)
117-
else:
118-
raise ValueError(f"invalid test state: {result.state!r}")
118+
else:
119+
raise ValueError(f"invalid test state: {result.state!r}")
119120

120121
if result.state == State.WORKER_BUG:
121122
self.worker_bug = True

Lib/test/libregrtest/runtests.py

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,15 @@ class JsonFile:
2929
file_type: str
3030

3131
def configure_subprocess(self, popen_kwargs: dict[str, Any]) -> None:
32-
match self.file_type:
33-
case JsonFileType.UNIX_FD:
34-
# Unix file descriptor
35-
popen_kwargs['pass_fds'] = [self.file]
36-
case JsonFileType.WINDOWS_HANDLE:
37-
# Windows handle
38-
# We run mypy with `--platform=linux` so it complains about this:
39-
startupinfo = subprocess.STARTUPINFO() # type: ignore[attr-defined]
40-
startupinfo.lpAttributeList = {"handle_list": [self.file]}
41-
popen_kwargs['startupinfo'] = startupinfo
32+
if self.file_type == JsonFileType.UNIX_FD:
33+
# Unix file descriptor
34+
popen_kwargs['pass_fds'] = [self.file]
35+
elif self.file_type == JsonFileType.WINDOWS_HANDLE:
36+
# Windows handle
37+
# We run mypy with `--platform=linux` so it complains about this:
38+
startupinfo = subprocess.STARTUPINFO() # type: ignore[attr-defined]
39+
startupinfo.lpAttributeList = {"handle_list": [self.file]}
40+
popen_kwargs['startupinfo'] = startupinfo
4241

4342
@contextlib.contextmanager
4443
def inherit_subprocess(self) -> Iterator[None]:

Lib/test/libregrtest/single.py

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -96,23 +96,22 @@ def regrtest_runner(result: TestResult, test_func, runtests: RunTests) -> None:
9696

9797
stats: TestStats | None
9898

99-
match test_result:
100-
case TestStats():
101-
stats = test_result
102-
case unittest.TestResult():
103-
stats = TestStats.from_unittest(test_result)
104-
case None:
105-
print_warning(f"{result.test_name} test runner returned None: {test_func}")
99+
if isinstance(test_result, TestStats):
100+
stats = test_result
101+
elif isinstance(test_result, unittest.TestResult):
102+
stats = TestStats.from_unittest(test_result)
103+
elif test_result is None:
104+
print_warning(f"{result.test_name} test runner returned None: {test_func}")
105+
stats = None
106+
else:
107+
# Don't import doctest at top level since only few tests return
108+
# a doctest.TestResult instance.
109+
import doctest
110+
if isinstance(test_result, doctest.TestResults):
111+
stats = TestStats.from_doctest(test_result)
112+
else:
113+
print_warning(f"Unknown test result type: {type(test_result)}")
106114
stats = None
107-
case _:
108-
# Don't import doctest at top level since only few tests return
109-
# a doctest.TestResult instance.
110-
import doctest
111-
if isinstance(test_result, doctest.TestResults):
112-
stats = TestStats.from_doctest(test_result)
113-
else:
114-
print_warning(f"Unknown test result type: {type(test_result)}")
115-
stats = None
116115

117116
result.stats = stats
118117

@@ -145,15 +144,16 @@ def test_func():
145144

146145
remove_testfn(test_name, runtests.verbose)
147146

148-
if gc.garbage:
149-
support.environment_altered = True
150-
print_warning(f"{test_name} created {len(gc.garbage)} "
151-
f"uncollectable object(s)")
152-
153-
# move the uncollectable objects somewhere,
154-
# so we don't see them again
155-
GC_GARBAGE.extend(gc.garbage)
156-
gc.garbage.clear()
147+
# TODO: RUSTPYTHON
148+
# if gc.garbage:
149+
# support.environment_altered = True
150+
# print_warning(f"{test_name} created {len(gc.garbage)} "
151+
# f"uncollectable object(s)")
152+
#
153+
# # move the uncollectable objects somewhere,
154+
# # so we don't see them again
155+
# GC_GARBAGE.extend(gc.garbage)
156+
# gc.garbage.clear()
157157

158158
support.reap_children()
159159

Lib/test/libregrtest/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -668,7 +668,7 @@ def display_header(use_resources: tuple[str, ...],
668668
cpu_count: object = os.cpu_count()
669669
if cpu_count:
670670
# The function is new in Python 3.13; mypy doesn't know about it yet:
671-
process_cpu_count = os.process_cpu_count() # type: ignore[attr-defined]
671+
process_cpu_count = os.cpu_count() # type: ignore[attr-defined]
672672
if process_cpu_count and process_cpu_count != cpu_count:
673673
cpu_count = f"{process_cpu_count} (process) / {cpu_count} (system)"
674674
print("== CPU count:", cpu_count)

Lib/test/libregrtest/win_utils.py

Lines changed: 6 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -33,96 +33,27 @@ def __init__(self):
3333
winreg.QueryInfoKey(winreg.HKEY_PERFORMANCE_DATA)
3434

3535
self._values = []
36-
self._load = None
37-
self._running = _overlapped.CreateEvent(None, True, False, None)
38-
self._stopped = _overlapped.CreateEvent(None, True, False, None)
3936

4037
_thread.start_new_thread(self._update_load, (), {})
4138

4239
def _update_load(self,
4340
# localize module access to prevent shutdown errors
44-
_wait=_winapi.WaitForSingleObject,
45-
_signal=_overlapped.SetEvent):
46-
# run until signaled to stop
47-
while _wait(self._running, 1000):
48-
self._calculate_load()
49-
# notify stopped
50-
_signal(self._stopped)
41+
_wait, _signal):
42+
pass
5143

5244
def _calculate_load(self,
5345
# localize module access to prevent shutdown errors
5446
_query=winreg.QueryValueEx,
5547
_hkey=winreg.HKEY_PERFORMANCE_DATA,
5648
_unpack=struct.unpack_from):
57-
# get the 'System' object
58-
data, _ = _query(_hkey, '2')
59-
# PERF_DATA_BLOCK {
60-
# WCHAR Signature[4] 8 +
61-
# DWOWD LittleEndian 4 +
62-
# DWORD Version 4 +
63-
# DWORD Revision 4 +
64-
# DWORD TotalByteLength 4 +
65-
# DWORD HeaderLength = 24 byte offset
66-
# ...
67-
# }
68-
obj_start, = _unpack('L', data, 24)
69-
# PERF_OBJECT_TYPE {
70-
# DWORD TotalByteLength
71-
# DWORD DefinitionLength
72-
# DWORD HeaderLength
73-
# ...
74-
# }
75-
data_start, defn_start = _unpack('4xLL', data, obj_start)
76-
data_base = obj_start + data_start
77-
defn_base = obj_start + defn_start
78-
# find the 'Processor Queue Length' counter (index=44)
79-
while defn_base < data_base:
80-
# PERF_COUNTER_DEFINITION {
81-
# DWORD ByteLength
82-
# DWORD CounterNameTitleIndex
83-
# ... [7 DWORDs/28 bytes]
84-
# DWORD CounterOffset
85-
# }
86-
size, idx, offset = _unpack('LL28xL', data, defn_base)
87-
defn_base += size
88-
if idx == 44:
89-
counter_offset = data_base + offset
90-
# the counter is known to be PERF_COUNTER_RAWCOUNT (DWORD)
91-
processor_queue_length, = _unpack('L', data, counter_offset)
92-
break
93-
else:
94-
return
95-
96-
# We use an exponentially weighted moving average, imitating the
97-
# load calculation on Unix systems.
98-
# https://en.wikipedia.org/wiki/Load_(computing)#Unix-style_load_calculation
99-
# https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average
100-
if self._load is not None:
101-
self._load = (self._load * LOAD_FACTOR_1
102-
+ processor_queue_length * (1.0 - LOAD_FACTOR_1))
103-
elif len(self._values) < NVALUE:
104-
self._values.append(processor_queue_length)
105-
else:
106-
self._load = sum(self._values) / len(self._values)
49+
pass
10750

10851
def close(self, kill=True):
10952
self.__del__()
11053
return
11154

112-
def __del__(self,
113-
# localize module access to prevent shutdown errors
114-
_wait=_winapi.WaitForSingleObject,
115-
_close=_winapi.CloseHandle,
116-
_signal=_overlapped.SetEvent):
117-
if self._running is not None:
118-
# tell the update thread to quit
119-
_signal(self._running)
120-
# wait for the update thread to signal done
121-
_wait(self._stopped, -1)
122-
# cleanup events
123-
_close(self._running)
124-
_close(self._stopped)
125-
self._running = self._stopped = None
55+
def __del__(self, _wait, _close, _signal):
56+
pass
12657

12758
def getloadavg(self):
128-
return self._load
59+
return None

Lib/trace.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ def update(self, other):
201201
for key in other_callers:
202202
callers[key] = 1
203203

204-
def write_results(self, show_missing=True, summary=False, coverdir=None):
204+
def write_results(self, show_missing=True, summary=False, coverdir=None, ignore_missing_files=False):
205205
"""
206206
Write the coverage results.
207207

0 commit comments

Comments
 (0)