blob: 57e37b576b959afc73ecfe9e4f65f7585c84375f [file] [log] [blame]
import argparse
import os
from typing import cast, List, Optional, Tuple
from ..util.setting import (
CompilerType,
JSON_FOLDER_BASE_DIR,
LOG_DIR,
Option,
Test,
TestList,
TestType,
)
from ..util.utils import (
clean_up,
create_folder,
print_log,
raise_no_test_found_exception,
remove_file,
remove_folder,
)
from ..util.utils_init import add_arguments_utils, create_folders, get_options
from .utils import (
clean_up_gcda,
detect_compiler_type,
get_llvm_tool_path,
get_oss_binary_folder,
get_pytorch_folder,
)
BLOCKED_PYTHON_TESTS = {
"run_test.py",
"test_dataloader.py",
"test_multiprocessing.py",
"test_multiprocessing_spawn.py",
"test_utils.py",
}
def initialization() -> Tuple[Option, TestList, List[str]]:
# create folder if not exists
create_folders()
# add arguments
parser = argparse.ArgumentParser()
parser = add_arguments_utils(parser)
parser = add_arguments_oss(parser)
# parse arguments
(options, args_interested_folder, args_run_only, arg_clean) = parse_arguments(
parser
)
# clean up
if arg_clean:
clean_up_gcda()
clean_up()
# get test lists
test_list = get_test_list(args_run_only)
# get interested folder -- final report will only over these folders
interested_folders = empty_list_if_none(args_interested_folder)
# print initialization information
print_init_info()
# remove last time's log
remove_file(os.path.join(LOG_DIR, "log.txt"))
return (options, test_list, interested_folders)
def add_arguments_oss(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:
parser.add_argument(
"--run-only",
help="only run certain test(s), for example: atest test_nn.py.",
nargs="*",
default=None,
)
return parser
def parse_arguments(
parser: argparse.ArgumentParser,
) -> Tuple[Option, Optional[List[str]], Optional[List[str]], Optional[bool]]:
# parse args
args = parser.parse_args()
# get option
options = get_options(args)
return (options, args.interest_only, args.run_only, args.clean)
def get_test_list_by_type(
run_only: Optional[List[str]], test_type: TestType
) -> TestList:
test_list: TestList = []
binary_folder = get_oss_binary_folder(test_type)
g = os.walk(binary_folder)
for _, _, file_list in g:
for file_name in file_list:
if run_only is not None and file_name not in run_only:
continue
# target pattern in oss is used in printing report -- which tests we have run
test: Test = Test(
name=file_name,
target_pattern=file_name,
test_set="",
test_type=test_type,
)
test_list.append(test)
return test_list
def get_test_list(run_only: Optional[List[str]]) -> TestList:
test_list: TestList = []
# add c++ test list
test_list.extend(get_test_list_by_type(run_only, TestType.CPP))
# add python test list
py_run_only = get_python_run_only(run_only)
test_list.extend(get_test_list_by_type(py_run_only, TestType.PY))
# not find any test to run
if not test_list:
raise_no_test_found_exception(
get_oss_binary_folder(TestType.CPP), get_oss_binary_folder(TestType.PY)
)
return test_list
def empty_list_if_none(arg_interested_folder: Optional[List[str]]) -> List[str]:
if arg_interested_folder is None:
return []
# if this argument is specified, just return itself
return arg_interested_folder
def gcc_export_init() -> None:
remove_folder(JSON_FOLDER_BASE_DIR)
create_folder(JSON_FOLDER_BASE_DIR)
def get_python_run_only(args_run_only: Optional[List[str]]) -> List[str]:
# if user specifies run-only option
if args_run_only:
return args_run_only
# if not specified, use default setting, different for gcc and clang
if detect_compiler_type() == CompilerType.GCC:
return ["run_test.py"]
else:
# for clang, some tests will result in too large intermidiate files that can't be merged by llvm, we need to skip them
run_only: List[str] = []
binary_folder = get_oss_binary_folder(TestType.PY)
g = os.walk(binary_folder)
for _, _, file_list in g:
for file_name in file_list:
if file_name in BLOCKED_PYTHON_TESTS or not file_name.endswith(".py"):
continue
run_only.append(file_name)
# only run tests in the first-level folder in test/
break
return run_only
def print_init_info() -> None:
print_log("pytorch folder: ", get_pytorch_folder())
print_log("cpp test binaries folder: ", get_oss_binary_folder(TestType.CPP))
print_log("python test scripts folder: ", get_oss_binary_folder(TestType.PY))
print_log("compiler type: ", cast(CompilerType, detect_compiler_type()).value)
print_log(
"llvm tool folder (only for clang, if you are using gcov please ignore it): ",
get_llvm_tool_path(),
)