1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
from __future__ import annotations
import glob
import os
import sys
from pathlib import Path
CPP_TEST_PREFIX = "cpp"
CPP_TEST_PATH = "build/bin"
CPP_TESTS_DIR = os.path.abspath(os.getenv("CPP_TESTS_DIR", default=CPP_TEST_PATH))
REPO_ROOT = Path(__file__).resolve().parent.parent.parent
def parse_test_module(test: str) -> str:
return test.split(".")[0]
def discover_tests(
base_dir: Path = REPO_ROOT / "test",
cpp_tests_dir: str | Path | None = None,
blocklisted_patterns: list[str] | None = None,
blocklisted_tests: list[str] | None = None,
extra_tests: list[str] | None = None,
) -> list[str]:
"""
Searches for all python files starting with test_ excluding one specified by patterns.
If cpp_tests_dir is provided, also scan for all C++ tests under that directory. They
are usually found in build/bin
"""
def skip_test_p(name: str) -> bool:
rc = False
if blocklisted_patterns is not None:
rc |= any(name.startswith(pattern) for pattern in blocklisted_patterns)
if blocklisted_tests is not None:
rc |= name in blocklisted_tests
return rc
# This supports symlinks, so we can link domain library tests to PyTorch test directory
all_py_files = [
Path(p) for p in glob.glob(f"{base_dir}/**/test_*.py", recursive=True)
]
cpp_tests_dir = (
f"{base_dir.parent}/{CPP_TEST_PATH}" if cpp_tests_dir is None else cpp_tests_dir
)
# CPP test files are located under pytorch/build/bin. Unlike Python test, C++ tests
# are just binaries and could have any name, i.e. basic or atest
all_cpp_files = [
Path(p) for p in glob.glob(f"{cpp_tests_dir}/**/*", recursive=True)
]
rc = [str(fname.relative_to(base_dir))[:-3] for fname in all_py_files]
# Add the cpp prefix for C++ tests so that we can tell them apart
rc.extend(
[
parse_test_module(f"{CPP_TEST_PREFIX}/{fname.relative_to(cpp_tests_dir)}")
for fname in all_cpp_files
]
)
# Invert slashes on Windows
if sys.platform == "win32":
rc = [name.replace("\\", "/") for name in rc]
rc = [test for test in rc if not skip_test_p(test)]
if extra_tests is not None:
rc += extra_tests
return sorted(rc)
TESTS = discover_tests(
cpp_tests_dir=CPP_TESTS_DIR,
blocklisted_patterns=[
"ao",
"bottleneck_test",
"custom_backend",
"custom_operator",
"fx", # executed by test_fx.py
"jit", # executed by test_jit.py
"mobile",
"onnx_caffe2",
"package", # executed by test_package.py
"quantization", # executed by test_quantization.py
"autograd", # executed by test_autograd.py
],
blocklisted_tests=[
"test_bundled_images",
"test_cpp_extensions_aot",
"test_determination",
"test_jit_fuser",
"test_jit_simple",
"test_jit_string",
"test_kernel_launch_checks",
"test_nnapi",
"test_static_runtime",
"test_throughput_benchmark",
"distributed/bin/test_script",
"distributed/elastic/multiprocessing/bin/test_script",
"distributed/launcher/bin/test_script",
"distributed/launcher/bin/test_script_init_method",
"distributed/launcher/bin/test_script_is_torchelastic_launched",
"distributed/launcher/bin/test_script_local_rank",
"distributed/test_c10d_spawn",
"distributions/test_transforms",
"distributions/test_utils",
"test/inductor/test_aot_inductor_utils",
"onnx/test_pytorch_onnx_onnxruntime_cuda",
"onnx/test_models",
# These are not C++ tests
f"{CPP_TEST_PREFIX}/CMakeFiles",
f"{CPP_TEST_PREFIX}/CTestTestfile.cmake",
f"{CPP_TEST_PREFIX}/Makefile",
f"{CPP_TEST_PREFIX}/cmake_install.cmake",
f"{CPP_TEST_PREFIX}/c10_intrusive_ptr_benchmark",
f"{CPP_TEST_PREFIX}/example_allreduce",
f"{CPP_TEST_PREFIX}/parallel_benchmark",
f"{CPP_TEST_PREFIX}/protoc",
f"{CPP_TEST_PREFIX}/protoc-3.13.0.0",
f"{CPP_TEST_PREFIX}/torch_shm_manager",
f"{CPP_TEST_PREFIX}/tutorial_tensorexpr",
],
extra_tests=[
"test_cpp_extensions_aot_ninja",
"test_cpp_extensions_aot_no_ninja",
"distributed/elastic/timer/api_test",
"distributed/elastic/timer/local_timer_example",
"distributed/elastic/timer/local_timer_test",
"distributed/elastic/events/lib_test",
"distributed/elastic/metrics/api_test",
"distributed/elastic/utils/logging_test",
"distributed/elastic/utils/util_test",
"distributed/elastic/utils/distributed_test",
"distributed/elastic/multiprocessing/api_test",
"doctests",
"test_autoload_enable",
"test_autoload_disable",
],
)
if __name__ == "__main__":
print(TESTS)
|