| 
									
										
										
										
											2023-09-11 02:07:18 +02:00
										 |  |  | import os | 
					
						
							| 
									
										
										
										
											2023-09-11 10:52:03 +02:00
										 |  |  | import sys | 
					
						
							|  |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2024-11-04 13:15:57 +03:00
										 |  |  | from collections.abc import Container | 
					
						
							| 
									
										
										
										
											2023-09-11 02:07:18 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-11 10:52:03 +02:00
										 |  |  | from test import support | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-25 12:41:21 +03:00
										 |  |  | from .filter import match_test, set_match_tests | 
					
						
							| 
									
										
										
										
											2023-09-11 10:52:03 +02:00
										 |  |  | from .utils import ( | 
					
						
							| 
									
										
										
										
											2023-10-21 17:44:46 +03:00
										 |  |  |     StrPath, TestName, TestTuple, TestList, TestFilter, | 
					
						
							| 
									
										
										
										
											2023-09-11 10:52:03 +02:00
										 |  |  |     abs_module_name, count, printlist) | 
					
						
							| 
									
										
										
										
											2023-09-11 02:07:18 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # If these test directories are encountered recurse into them and treat each | 
					
						
							|  |  |  | # "test_*.py" file or each sub-directory as a separate test module. This can | 
					
						
							|  |  |  | # increase parallelism. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Beware this can't generally be done for any directory with sub-tests as the | 
					
						
							|  |  |  | # __init__.py may do things which alter what tests are to be run. | 
					
						
							|  |  |  | SPLITTESTDIRS: set[TestName] = { | 
					
						
							|  |  |  |     "test_asyncio", | 
					
						
							|  |  |  |     "test_concurrent_futures", | 
					
						
							| 
									
										
										
										
											2024-01-18 18:58:11 +03:00
										 |  |  |     "test_doctests", | 
					
						
							| 
									
										
										
										
											2023-09-15 10:52:24 +03:00
										 |  |  |     "test_future_stmt", | 
					
						
							| 
									
										
										
										
											2023-09-28 13:24:15 +02:00
										 |  |  |     "test_gdb", | 
					
						
							| 
									
										
										
										
											2023-10-10 23:15:11 +03:00
										 |  |  |     "test_inspect", | 
					
						
							| 
									
										
										
										
											2024-02-13 13:40:40 +03:00
										 |  |  |     "test_pydoc", | 
					
						
							| 
									
										
										
										
											2023-09-11 02:07:18 +02:00
										 |  |  |     "test_multiprocessing_fork", | 
					
						
							|  |  |  |     "test_multiprocessing_forkserver", | 
					
						
							|  |  |  |     "test_multiprocessing_spawn", | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-14 19:33:18 +01:00
										 |  |  | def findtestdir(path: StrPath | None = None) -> StrPath: | 
					
						
							| 
									
										
										
										
											2023-09-11 02:07:18 +02:00
										 |  |  |     return path or os.path.dirname(os.path.dirname(__file__)) or os.curdir | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-04 13:15:57 +03:00
										 |  |  | def findtests(*, testdir: StrPath | None = None, exclude: Container[str] = (), | 
					
						
							| 
									
										
										
										
											2023-09-11 02:07:18 +02:00
										 |  |  |               split_test_dirs: set[TestName] = SPLITTESTDIRS, | 
					
						
							|  |  |  |               base_mod: str = "") -> TestList: | 
					
						
							|  |  |  |     """Return a list of all applicable test modules.""" | 
					
						
							|  |  |  |     testdir = findtestdir(testdir) | 
					
						
							|  |  |  |     tests = [] | 
					
						
							|  |  |  |     for name in os.listdir(testdir): | 
					
						
							|  |  |  |         mod, ext = os.path.splitext(name) | 
					
						
							|  |  |  |         if (not mod.startswith("test_")) or (mod in exclude): | 
					
						
							|  |  |  |             continue | 
					
						
							| 
									
										
										
										
											2023-09-14 15:15:42 +02:00
										 |  |  |         if base_mod: | 
					
						
							|  |  |  |             fullname = f"{base_mod}.{mod}" | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             fullname = mod | 
					
						
							|  |  |  |         if fullname in split_test_dirs: | 
					
						
							| 
									
										
										
										
											2023-09-11 02:07:18 +02:00
										 |  |  |             subdir = os.path.join(testdir, mod) | 
					
						
							| 
									
										
										
										
											2023-09-14 15:15:42 +02:00
										 |  |  |             if not base_mod: | 
					
						
							|  |  |  |                 fullname = f"test.{mod}" | 
					
						
							| 
									
										
										
										
											2023-09-11 02:07:18 +02:00
										 |  |  |             tests.extend(findtests(testdir=subdir, exclude=exclude, | 
					
						
							|  |  |  |                                    split_test_dirs=split_test_dirs, | 
					
						
							| 
									
										
										
										
											2023-09-14 15:15:42 +02:00
										 |  |  |                                    base_mod=fullname)) | 
					
						
							| 
									
										
										
										
											2023-09-11 02:07:18 +02:00
										 |  |  |         elif ext in (".py", ""): | 
					
						
							| 
									
										
										
										
											2023-09-14 15:15:42 +02:00
										 |  |  |             tests.append(fullname) | 
					
						
							| 
									
										
										
										
											2023-09-11 02:07:18 +02:00
										 |  |  |     return sorted(tests) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-04 13:15:57 +03:00
										 |  |  | def split_test_packages(tests, *, testdir: StrPath | None = None, | 
					
						
							|  |  |  |                         exclude: Container[str] = (), | 
					
						
							|  |  |  |                         split_test_dirs=SPLITTESTDIRS) -> list[TestName]: | 
					
						
							| 
									
										
										
										
											2023-09-11 02:07:18 +02:00
										 |  |  |     testdir = findtestdir(testdir) | 
					
						
							|  |  |  |     splitted = [] | 
					
						
							|  |  |  |     for name in tests: | 
					
						
							|  |  |  |         if name in split_test_dirs: | 
					
						
							|  |  |  |             subdir = os.path.join(testdir, name) | 
					
						
							|  |  |  |             splitted.extend(findtests(testdir=subdir, exclude=exclude, | 
					
						
							|  |  |  |                                       split_test_dirs=split_test_dirs, | 
					
						
							|  |  |  |                                       base_mod=name)) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             splitted.append(name) | 
					
						
							|  |  |  |     return splitted | 
					
						
							| 
									
										
										
										
											2023-09-11 10:52:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-04 13:15:57 +03:00
										 |  |  | def _list_cases(suite: unittest.TestSuite) -> None: | 
					
						
							| 
									
										
										
										
											2023-09-11 10:52:03 +02:00
										 |  |  |     for test in suite: | 
					
						
							| 
									
										
										
										
											2024-11-04 13:15:57 +03:00
										 |  |  |         if isinstance(test, unittest.loader._FailedTest):  # type: ignore[attr-defined] | 
					
						
							| 
									
										
										
										
											2023-09-11 10:52:03 +02:00
										 |  |  |             continue | 
					
						
							|  |  |  |         if isinstance(test, unittest.TestSuite): | 
					
						
							|  |  |  |             _list_cases(test) | 
					
						
							|  |  |  |         elif isinstance(test, unittest.TestCase): | 
					
						
							| 
									
										
										
										
											2023-10-25 12:41:21 +03:00
										 |  |  |             if match_test(test): | 
					
						
							| 
									
										
										
										
											2023-09-11 10:52:03 +02:00
										 |  |  |                 print(test.id()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def list_cases(tests: TestTuple, *, | 
					
						
							| 
									
										
										
										
											2023-10-21 17:44:46 +03:00
										 |  |  |                match_tests: TestFilter | None = None, | 
					
						
							| 
									
										
										
										
											2024-11-04 13:15:57 +03:00
										 |  |  |                test_dir: StrPath | None = None) -> None: | 
					
						
							| 
									
										
										
										
											2023-09-11 10:52:03 +02:00
										 |  |  |     support.verbose = False | 
					
						
							| 
									
										
										
										
											2023-10-25 12:41:21 +03:00
										 |  |  |     set_match_tests(match_tests) | 
					
						
							| 
									
										
										
										
											2023-09-11 10:52:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     skipped = [] | 
					
						
							|  |  |  |     for test_name in tests: | 
					
						
							|  |  |  |         module_name = abs_module_name(test_name, test_dir) | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             suite = unittest.defaultTestLoader.loadTestsFromName(module_name) | 
					
						
							|  |  |  |             _list_cases(suite) | 
					
						
							|  |  |  |         except unittest.SkipTest: | 
					
						
							|  |  |  |             skipped.append(test_name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if skipped: | 
					
						
							|  |  |  |         sys.stdout.flush() | 
					
						
							|  |  |  |         stderr = sys.stderr | 
					
						
							|  |  |  |         print(file=stderr) | 
					
						
							|  |  |  |         print(count(len(skipped), "test"), "skipped:", file=stderr) | 
					
						
							|  |  |  |         printlist(skipped, file=stderr) |