From 68f2ade434cec9e49b03d1fe9b89e844203a7e85 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 4 Oct 2023 08:37:22 +0200 Subject: [PATCH 1/2] gh-109276: regrtest: shorter list of resources --- Lib/test/libregrtest/cmdline.py | 14 +--------- Lib/test/libregrtest/utils.py | 47 ++++++++++++++++++++++++++++++--- Lib/test/test_regrtest.py | 20 ++++++++++++++ 3 files changed, 64 insertions(+), 17 deletions(-) diff --git a/Lib/test/libregrtest/cmdline.py b/Lib/test/libregrtest/cmdline.py index 7cfe904cb5a535..dd4cd335bef7e3 100644 --- a/Lib/test/libregrtest/cmdline.py +++ b/Lib/test/libregrtest/cmdline.py @@ -3,6 +3,7 @@ import shlex import sys from test.support import os_helper +from .utils import ALL_RESOURCES, RESOURCE_NAMES USAGE = """\ @@ -132,19 +133,6 @@ """ -ALL_RESOURCES = ('audio', 'curses', 'largefile', 'network', - 'decimal', 'cpu', 'subprocess', 'urlfetch', 'gui', 'walltime') - -# Other resources excluded from --use=all: -# -# - extralagefile (ex: test_zipfile64): really too slow to be enabled -# "by default" -# - tzdata: while needed to validate fully test_datetime, it makes -# test_datetime too slow (15-20 min on some buildbots) and so is disabled by -# default (see bpo-30822). -RESOURCE_NAMES = ALL_RESOURCES + ('extralargefile', 'tzdata') - - class Namespace(argparse.Namespace): def __init__(self, **kwargs) -> None: self.ci = False diff --git a/Lib/test/libregrtest/utils.py b/Lib/test/libregrtest/utils.py index 86fb820a23f535..057965ee22396f 100644 --- a/Lib/test/libregrtest/utils.py +++ b/Lib/test/libregrtest/utils.py @@ -33,6 +33,19 @@ EXIT_TIMEOUT = 120.0 +ALL_RESOURCES = ('audio', 'curses', 'largefile', 'network', + 'decimal', 'cpu', 'subprocess', 'urlfetch', 'gui', 'walltime') + +# Other resources excluded from --use=all: +# +# - extralagefile (ex: test_zipfile64): really too slow to be enabled +# "by default" +# - tzdata: while needed to validate fully test_datetime, it makes +# test_datetime too slow (15-20 min on some buildbots) and so is disabled by +# default (see bpo-30822). +RESOURCE_NAMES = ALL_RESOURCES + ('extralargefile', 'tzdata') + + # Types for types hints StrPath = str TestName = str @@ -535,6 +548,31 @@ def is_cross_compiled(): return ('_PYTHON_HOST_PLATFORM' in os.environ) +def format_resources(use_resources: tuple[str, ...]): + # set preserves insertion order + use_resources = set(use_resources) + all_resources = set(ALL_RESOURCES) + + # Express resources relative to "all" + relative_all = ['all'] + for name in all_resources - use_resources: + relative_all.append(f'-{name}') + for name in use_resources - all_resources: + relative_all.append(f'+{name}') + all_text = ', '.join(relative_all) + all_text = f"resources: {all_text}" + + # List of enabled resources + text = ', '.join(sorted(use_resources)) + text = f"resources ({len(use_resources)}): {text}" + + # Pick the shortest string (prefer relative to all if lengths are equal) + if len(all_text) <= len(text): + return all_text + else: + return text + + def display_header(use_resources: tuple[str, ...], python_cmd: tuple[str, ...] | None): # Print basic platform information @@ -550,14 +588,15 @@ def display_header(use_resources: tuple[str, ...], if process_cpu_count and process_cpu_count != cpu_count: cpu_count = f"{process_cpu_count} (process) / {cpu_count} (system)" print("== CPU count:", cpu_count) - print("== encodings: locale=%s, FS=%s" + print("== encodings: locale=%s FS=%s" % (locale.getencoding(), sys.getfilesystemencoding())) if use_resources: - print(f"== resources ({len(use_resources)}): " - f"{', '.join(sorted(use_resources))}") + text = format_resources(use_resources) + print(f"== {text}") else: - print("== resources: (all disabled, use -u option)") + print("== resources: all test resources are disabled, " + "use -u option to unskip tests") cross_compile = is_cross_compiled() if cross_compile: diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index ba23b3666924c4..d0e2079471bdeb 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -2080,6 +2080,26 @@ def test_get_signal_name(self): ): self.assertEqual(utils.get_signal_name(exitcode), expected, exitcode) + def test_format_resources(self): + format_resources = utils.format_resources + ALL_RESOURCES = utils.ALL_RESOURCES + self.assertEqual( + format_resources(("network",)), + 'resources (1): network') + self.assertEqual( + format_resources(("audio", "decimal", "network")), + 'resources (3): audio, decimal, network') + self.assertEqual( + format_resources(ALL_RESOURCES), + 'resources: all') + self.assertEqual( + format_resources(tuple(name for name in ALL_RESOURCES + if name != "cpu")), + 'resources: all, -cpu') + self.assertEqual( + format_resources((*ALL_RESOURCES, "tzdata")), + 'resources: all, +tzdata') + if __name__ == '__main__': unittest.main() From 63e0afec8045248b76da1658a8f294d3c8f56c7e Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 4 Oct 2023 11:06:17 +0200 Subject: [PATCH 2/2] Address Serhiy's review --- Lib/test/libregrtest/utils.py | 11 +++++------ Lib/test/test_regrtest.py | 6 +++--- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/Lib/test/libregrtest/utils.py b/Lib/test/libregrtest/utils.py index 057965ee22396f..ea2086cd71b173 100644 --- a/Lib/test/libregrtest/utils.py +++ b/Lib/test/libregrtest/utils.py @@ -549,21 +549,20 @@ def is_cross_compiled(): def format_resources(use_resources: tuple[str, ...]): - # set preserves insertion order use_resources = set(use_resources) all_resources = set(ALL_RESOURCES) # Express resources relative to "all" relative_all = ['all'] - for name in all_resources - use_resources: + for name in sorted(all_resources - use_resources): relative_all.append(f'-{name}') - for name in use_resources - all_resources: - relative_all.append(f'+{name}') - all_text = ', '.join(relative_all) + for name in sorted(use_resources - all_resources): + relative_all.append(f'{name}') + all_text = ','.join(relative_all) all_text = f"resources: {all_text}" # List of enabled resources - text = ', '.join(sorted(use_resources)) + text = ','.join(sorted(use_resources)) text = f"resources ({len(use_resources)}): {text}" # Pick the shortest string (prefer relative to all if lengths are equal) diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py index d0e2079471bdeb..f24d23e5c2f731 100644 --- a/Lib/test/test_regrtest.py +++ b/Lib/test/test_regrtest.py @@ -2088,17 +2088,17 @@ def test_format_resources(self): 'resources (1): network') self.assertEqual( format_resources(("audio", "decimal", "network")), - 'resources (3): audio, decimal, network') + 'resources (3): audio,decimal,network') self.assertEqual( format_resources(ALL_RESOURCES), 'resources: all') self.assertEqual( format_resources(tuple(name for name in ALL_RESOURCES if name != "cpu")), - 'resources: all, -cpu') + 'resources: all,-cpu') self.assertEqual( format_resources((*ALL_RESOURCES, "tzdata")), - 'resources: all, +tzdata') + 'resources: all,tzdata') if __name__ == '__main__':