Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 9257731

Browse filesBrowse files
authored
gh-119050: Add XML support to libregrtest refleak checker (#119148)
regrtest test runner: Add XML support to the refleak checker (-R option). * run_unittest() now stores XML elements as string, rather than objects, in support.junit_xml_list. * runtest_refleak() now saves/restores XML strings before/after checking for reference leaks. Save XML into a temporary file.
1 parent bf17986 commit 9257731
Copy full SHA for 9257731

File tree

5 files changed

+39
-25
lines changed
Filter options

5 files changed

+39
-25
lines changed

‎Lib/test/libregrtest/cmdline.py

Copy file name to clipboardExpand all lines: Lib/test/libregrtest/cmdline.py
-9Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -520,15 +520,6 @@ def _parse_args(args, **kwargs):
520520
"--huntrleaks without -jN option",
521521
file=sys.stderr)
522522

523-
if ns.huntrleaks and ns.xmlpath:
524-
# The XML data is written into a file outside runtest_refleak(), so
525-
# it looks like a leak but it's not. Simply disable XML output when
526-
# hunting for reference leaks (gh-83434).
527-
ns.xmlpath = None
528-
print("WARNING: Disable --junit-xml because it's incompatible "
529-
"with --huntrleaks",
530-
file=sys.stderr)
531-
532523
if ns.forever:
533524
# --forever implies --failfast
534525
ns.failfast = True

‎Lib/test/libregrtest/refleak.py

Copy file name to clipboardExpand all lines: Lib/test/libregrtest/refleak.py
+32-3Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import os
12
import sys
23
import warnings
34
from inspect import isabstract
@@ -23,6 +24,30 @@ def _get_dump(cls):
2324
cls._abc_negative_cache, cls._abc_negative_cache_version)
2425

2526

27+
def save_support_xml(filename):
28+
if support.junit_xml_list is None:
29+
return
30+
31+
import pickle
32+
with open(filename, 'xb') as fp:
33+
pickle.dump(support.junit_xml_list, fp)
34+
support.junit_xml_list = None
35+
36+
37+
def restore_support_xml(filename):
38+
try:
39+
fp = open(filename, 'rb')
40+
except FileNotFoundError:
41+
return
42+
43+
import pickle
44+
with fp:
45+
xml_list = pickle.load(fp)
46+
os.unlink(filename)
47+
48+
support.junit_xml_list = xml_list
49+
50+
2651
def runtest_refleak(test_name, test_func,
2752
hunt_refleak: HuntRefleak,
2853
quiet: bool):
@@ -95,18 +120,20 @@ def get_pooled_int(value):
95120
numbers = numbers[:warmups] + ':' + numbers[warmups:]
96121
print(numbers, file=sys.stderr, flush=True)
97122

98-
results = None
123+
xml_filename = 'refleak-xml.tmp'
124+
result = None
99125
dash_R_cleanup(fs, ps, pic, zdc, abcs)
100126
support.gc_collect()
101127

102128
for i in rep_range:
103129
current = refleak_helper._hunting_for_refleaks
104130
refleak_helper._hunting_for_refleaks = True
105131
try:
106-
results = test_func()
132+
result = test_func()
107133
finally:
108134
refleak_helper._hunting_for_refleaks = current
109135

136+
save_support_xml(xml_filename)
110137
dash_R_cleanup(fs, ps, pic, zdc, abcs)
111138
support.gc_collect()
112139

@@ -145,6 +172,8 @@ def get_pooled_int(value):
145172
fd_before = fd_after
146173
interned_before = interned_after
147174

175+
restore_support_xml(xml_filename)
176+
148177
if not quiet:
149178
print(file=sys.stderr)
150179

@@ -189,7 +218,7 @@ def check_fd_deltas(deltas):
189218
failed = True
190219
else:
191220
print(' (this is fine)', file=sys.stderr, flush=True)
192-
return (failed, results)
221+
return (failed, result)
193222

194223

195224
def dash_R_cleanup(fs, ps, pic, zdc, abcs):

‎Lib/test/libregrtest/single.py

Copy file name to clipboardExpand all lines: Lib/test/libregrtest/single.py
+5-4Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,10 @@ def _run_suite(suite):
5757
result = runner.run(suite)
5858

5959
if support.junit_xml_list is not None:
60-
support.junit_xml_list.append(result.get_xml_element())
60+
import xml.etree.ElementTree as ET
61+
xml_elem = result.get_xml_element()
62+
xml_str = ET.tostring(xml_elem).decode('ascii')
63+
support.junit_xml_list.append(xml_str)
6164

6265
if not result.testsRun and not result.skipped and not result.errors:
6366
raise support.TestDidNotRun
@@ -280,9 +283,7 @@ def _runtest(result: TestResult, runtests: RunTests) -> None:
280283

281284
xml_list = support.junit_xml_list
282285
if xml_list:
283-
import xml.etree.ElementTree as ET
284-
result.xml_data = [ET.tostring(x).decode('us-ascii')
285-
for x in xml_list]
286+
result.xml_data = xml_list
286287
finally:
287288
if use_timeout:
288289
faulthandler.cancel_dump_traceback_later()

‎Lib/test/test_regrtest.py

Copy file name to clipboardExpand all lines: Lib/test/test_regrtest.py
-9Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -473,15 +473,6 @@ def test_verbose3_huntrleaks(self):
473473
self.assertEqual(regrtest.hunt_refleak.runs, 10)
474474
self.assertFalse(regrtest.output_on_failure)
475475

476-
def test_xml_huntrleaks(self):
477-
args = ['-R', '3:12', '--junit-xml', 'output.xml']
478-
with support.captured_stderr():
479-
regrtest = self.create_regrtest(args)
480-
self.assertIsNotNone(regrtest.hunt_refleak)
481-
self.assertEqual(regrtest.hunt_refleak.warmups, 3)
482-
self.assertEqual(regrtest.hunt_refleak.runs, 12)
483-
self.assertIsNone(regrtest.junit_filename)
484-
485476

486477
@dataclasses.dataclass(slots=True)
487478
class Rerun:
+2Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
regrtest test runner: Add XML support to the refleak checker (-R option).
2+
Patch by Victor Stinner.

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.