From 5fb57a0dde80d9c19d66aa3cbe1f362f1b8c8202 Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Thu, 7 Mar 2024 15:55:57 +0100 Subject: [PATCH 1/2] [3.11] gh-115421: List all test subdirs in Makefile, and test them (GH-115813) (GH-116462) * gh-115421: Test that our Makefile has all needed test folders (GH-115813) * Update the list of installed test subdirectories --------- Co-authored-by: Nikita Sobolev --- Lib/test/test_tools/test_makefile.py | 64 ++++++++++++++++++++++++++++ Makefile.pre.in | 6 ++- 2 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 Lib/test/test_tools/test_makefile.py diff --git a/Lib/test/test_tools/test_makefile.py b/Lib/test/test_tools/test_makefile.py new file mode 100644 index 00000000000000..7222a054dcd61c --- /dev/null +++ b/Lib/test/test_tools/test_makefile.py @@ -0,0 +1,64 @@ +""" +Tests for `Makefile`. +""" + +import os +import unittest +from test import support +import sysconfig + +MAKEFILE = sysconfig.get_makefile_filename() + +if not support.check_impl_detail(cpython=True): + raise unittest.SkipTest('cpython only') +if not os.path.exists(MAKEFILE) or not os.path.isfile(MAKEFILE): + raise unittest.SkipTest('Makefile could not be found') + + +class TestMakefile(unittest.TestCase): + def list_test_dirs(self): + result = [] + found_testsubdirs = False + with open(MAKEFILE, 'r', encoding='utf-8') as f: + for line in f: + if line.startswith('TESTSUBDIRS='): + found_testsubdirs = True + result.append( + line.removeprefix('TESTSUBDIRS=').replace( + '\\', '', + ).strip(), + ) + continue + if found_testsubdirs: + if '\t' not in line: + break + result.append(line.replace('\\', '').strip()) + return result + + def test_makefile_test_folders(self): + test_dirs = self.list_test_dirs() + idle_test = 'idlelib/idle_test' + self.assertIn(idle_test, test_dirs) + + used = [idle_test] + for dirpath, _, _ in os.walk(support.TEST_HOME_DIR): + dirname = os.path.basename(dirpath) + if dirname == '__pycache__': + continue + + relpath = os.path.relpath(dirpath, support.STDLIB_DIR) + with self.subTest(relpath=relpath): + self.assertIn( + relpath, + test_dirs, + msg=( + f"{relpath!r} is not included in the Makefile's list " + "of test directories to install" + ) + ) + used.append(relpath) + + # Check that there are no extra entries: + unique_test_dirs = set(test_dirs) + self.assertSetEqual(unique_test_dirs, set(used)) + self.assertEqual(len(test_dirs), len(unique_test_dirs)) diff --git a/Makefile.pre.in b/Makefile.pre.in index 783479d0df2720..81d4d50f82f008 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -2065,7 +2065,11 @@ TESTSUBDIRS= ctypes/test \ tkinter/test/test_tkinter \ tkinter/test/test_ttk \ unittest/test \ - unittest/test/testmock + unittest/test/testmock \ + test/test_concurrent_futures \ + test/test_multiprocessing_fork \ + test/test_multiprocessing_forkserver \ + test/test_multiprocessing_spawn TEST_MODULES=@TEST_MODULES@ libinstall: all $(srcdir)/Modules/xxmodule.c From d40ed64657faeac250ef485787ca6f0bb45a9613 Mon Sep 17 00:00:00 2001 From: Petr Viktorin Date: Fri, 8 Mar 2024 13:16:38 +0100 Subject: [PATCH 2/2] Ignore TESTSUBDIRS outside tests/ --- Lib/test/test_tools/test_makefile.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_tools/test_makefile.py b/Lib/test/test_tools/test_makefile.py index 7222a054dcd61c..aed8420bd05f37 100644 --- a/Lib/test/test_tools/test_makefile.py +++ b/Lib/test/test_tools/test_makefile.py @@ -33,14 +33,17 @@ def list_test_dirs(self): if '\t' not in line: break result.append(line.replace('\\', '').strip()) + + # In Python 3.11 (and lower), many test modules are not in + # the tests/ directory. This check ignores them. + result = [d for d in result if d.startswith('test/') or d == 'test'] + return result def test_makefile_test_folders(self): test_dirs = self.list_test_dirs() - idle_test = 'idlelib/idle_test' - self.assertIn(idle_test, test_dirs) - used = [idle_test] + used = [] for dirpath, _, _ in os.walk(support.TEST_HOME_DIR): dirname = os.path.basename(dirpath) if dirname == '__pycache__':