| import os |
| import shutil |
| import sys |
| import time |
| from typing import Any, NoReturn, Optional |
| |
| from .setting import ( |
| CompilerType, |
| LOG_DIR, |
| PROFILE_DIR, |
| TestList, |
| TestPlatform, |
| TestType, |
| ) |
| |
| |
| def convert_time(seconds: float) -> str: |
| seconds = int(round(seconds)) |
| seconds = seconds % (24 * 3600) |
| hour = seconds // 3600 |
| seconds %= 3600 |
| minutes = seconds // 60 |
| seconds %= 60 |
| |
| return "%d:%02d:%02d" % (hour, minutes, seconds) |
| |
| |
| def print_time(message: str, start_time: float, summary_time: bool = False) -> None: |
| with open(os.path.join(LOG_DIR, "log.txt"), "a+") as log_file: |
| end_time = time.time() |
| print(message, convert_time(end_time - start_time), file=log_file) |
| if summary_time: |
| print("\n", file=log_file) |
| |
| |
| def print_log(*args: Any) -> None: |
| with open(os.path.join(LOG_DIR, "log.txt"), "a+") as log_file: |
| print(f"[LOG] {' '.join(args)}", file=log_file) |
| |
| |
| def print_error(*args: Any) -> None: |
| with open(os.path.join(LOG_DIR, "log.txt"), "a+") as log_file: |
| print(f"[ERROR] {' '.join(args)}", file=log_file) |
| |
| |
| def remove_file(path: str) -> None: |
| if os.path.exists(path): |
| os.remove(path) |
| |
| |
| def remove_folder(path: str) -> None: |
| shutil.rmtree(path) |
| |
| |
| def create_folder(*paths: Any) -> None: |
| for path in paths: |
| os.makedirs(path, exist_ok=True) |
| |
| |
| # clean up all the files generated by coverage tool |
| def clean_up() -> None: |
| # remove profile folder |
| remove_folder(PROFILE_DIR) |
| sys.exit("Clean Up Successfully!") |
| |
| |
| def convert_to_relative_path(whole_path: str, base_path: str) -> str: |
| # ("profile/raw", "profile") -> "raw" |
| if base_path not in whole_path: |
| raise RuntimeError(base_path + " is not in " + whole_path) |
| return whole_path[len(base_path) + 1 :] |
| |
| |
| def replace_extension(filename: str, ext: str) -> str: |
| return filename[: filename.rfind(".")] + ext |
| |
| |
| # a file is related if it's in one of the test_list folder |
| def related_to_test_list(file_name: str, test_list: TestList) -> bool: |
| for test in test_list: |
| if test.name in file_name: |
| return True |
| return False |
| |
| |
| def get_raw_profiles_folder() -> str: |
| return os.environ.get("RAW_PROFILES_FOLDER", os.path.join(PROFILE_DIR, "raw")) |
| |
| |
| def detect_compiler_type(platform: TestPlatform) -> CompilerType: |
| if platform == TestPlatform.OSS: |
| from package.oss.utils import detect_compiler_type # type: ignore[misc] |
| |
| cov_type = detect_compiler_type() # type: ignore[call-arg] |
| else: |
| from caffe2.fb.code_coverage.tool.package.fbcode.utils import ( # type: ignore[import] |
| detect_compiler_type, |
| ) |
| |
| cov_type = detect_compiler_type() |
| |
| check_compiler_type(cov_type) |
| return cov_type |
| |
| |
| def get_test_name_from_whole_path(path: str) -> str: |
| # code_coverage_tool/profile/merged/haha.merged -> haha |
| start = path.rfind("/") |
| end = path.rfind(".") |
| assert start >= 0 and end >= 0 |
| return path[start + 1 : end] |
| |
| |
| def check_compiler_type(cov_type: Optional[CompilerType]) -> None: |
| if cov_type is not None and cov_type in [CompilerType.GCC, CompilerType.CLANG]: |
| return |
| raise Exception( |
| f"Can't parse compiler type: {cov_type}.", |
| " Please set environment variable COMPILER_TYPE as CLANG or GCC", |
| ) |
| |
| |
| def check_platform_type(platform_type: TestPlatform) -> None: |
| if platform_type in [TestPlatform.OSS, TestPlatform.FBCODE]: |
| return |
| raise Exception( |
| f"Can't parse platform type: {platform_type}.", |
| " Please set environment variable COMPILER_TYPE as OSS or FBCODE", |
| ) |
| |
| |
| def check_test_type(test_type: str, target: str) -> None: |
| if test_type in [TestType.CPP.value, TestType.PY.value]: |
| return |
| raise Exception( |
| f"Can't parse test type: {test_type}.", |
| f" Please check the type of buck target: {target}", |
| ) |
| |
| |
| def raise_no_test_found_exception( |
| cpp_binary_folder: str, python_binary_folder: str |
| ) -> NoReturn: |
| raise RuntimeError( |
| f"No cpp and python tests found in folder **{cpp_binary_folder} and **{python_binary_folder}**" |
| ) |