8000 [3.12] gh-119050: Add XML support to libregrtest refleak checker (#11… · python/cpython@ec5743b · GitHub
[go: up one dir, main page]

Skip to content

Commit ec5743b

Browse files
authored
[3.12] gh-119050: Add XML support to libregrtest refleak checker (#119148) (#119272)
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. (cherry picked from commit 9257731)
1 parent cdccafb commit ec5743b

File tree

5 files changed

+39
-25
lines changed

5 files changed

+39
-25
lines changed

Lib/test/libregrtest/cmdline.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -513,15 +513,6 @@ def _parse_args(args, **kwargs):
513513
"--huntrleaks without -jN option",
514514
file=sys.stderr)
515515

516-
if ns.huntrleaks and ns.xmlpath:
517-
# The XML data is written into a file outside runtest_refleak(), so
518-
# it looks like a leak but it's not. Simply disable XML output when
519-
# hunting for reference leaks (gh-83434).
520-
ns.xmlpath = None
521-
print("WARNING: Disable --junit-xml because it's incompatible "
522-
"with --huntrleaks",
523-
file=sys.stderr)
524-
525516
if ns.forever:
526517
# --forever implies --failfast
527518
ns.failfast = True

Lib/test/libregrtest/refleak.py

Lines 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
@@ -22,6 +23,30 @@ def _get_dump(cls):
2223
cls._abc_negative_cache, cls._abc_negative_cache_version)
2324

2425

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

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

101127
for i in rep_range:
102-
results = test_func()
128+
result = test_func()
103129

130+
save_support_xml(xml_filename)
104131
dash_R_cleanup(fs, ps, pic, zdc, abcs)
105132
support.gc_collect()
106133

@@ -139,6 +166,8 @@ def get_pooled_int(value):
139166
fd_before = fd_after
140167
interned_before = interned_after
141168

169+
restore_support_xml(xml_filename)
170+
142171
if not quiet:
143172
print(file=sys.stderr)
144173

@@ -183,7 +212,7 @@ def check_fd_deltas(deltas):
183212
failed = True
184213
else:
185214
print(' (this is fine)', file=sys.stderr, flush=True)
186-
return (failed, results)
215+
return (failed, result)
187216

188217

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

Lib/test/libregrtest/single.py

Lines 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< 9E12 div class="diff-text-inner">
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

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -464,15 +464,6 @@ def test_verbose3_huntrleaks(self):
464464
self.assertEqual(regrtest.hunt_refleak.runs, 10)
465465
self.assertFalse(regrtest.output_on_failure)
466466

467-
def test_xml_huntrleaks(self):
468-
args = ['-R', '3:12', '--junit-xml', 'output.xml']
469-
with support.captured_stderr():
470-
regrtest = self.create_regrtest(args)
471-
self.assertIsNotNone(regrtest.hunt_refleak)
472-
self.assertEqual(regrtest.hunt_refleak.warmups, 3)
473-
self.assertEqual(regrtest.hunt_refleak.runs, 12)
474-
self.assertIsNone(regrtest.junit_filename)
475-
476467

477468
@dataclasses.dataclass(slots=True)
478469
class Rerun:
Lines 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