diff --git a/build_tools/github_actions/fetch_test_configurations.py b/build_tools/github_actions/fetch_test_configurations.py index 919527f18ba..6362efec537 100644 --- a/build_tools/github_actions/fetch_test_configurations.py +++ b/build_tools/github_actions/fetch_test_configurations.py @@ -447,6 +447,28 @@ def _get_script_path(script_name: str) -> str: "windows": 1, }, }, + # rocdecode + "rocdecode": { + "job_name": "rocdecode", + "fetch_artifact_args": "--rocdecode --tests", + "timeout_minutes": 10, + "test_script": f"python {_get_script_path('test_rocdecode.py')}", + "platform": ["linux"], + "total_shards_dict": { + "linux": 1, + }, + }, + # rocjpeg + "rocjpeg": { + "job_name": "rocjpeg", + "fetch_artifact_args": "--rocjpeg --tests", + "timeout_minutes": 10, + "test_script": f"python {_get_script_path('test_rocjpeg.py')}", + "platform": ["linux"], + "total_shards_dict": { + "linux": 1, + }, + }, # aqlprofile tests "aqlprofile": { "job_name": "aqlprofile", diff --git a/build_tools/github_actions/test_executable_scripts/test_rocdecode.py b/build_tools/github_actions/test_executable_scripts/test_rocdecode.py new file mode 100644 index 00000000000..db9d8b7cc97 --- /dev/null +++ b/build_tools/github_actions/test_executable_scripts/test_rocdecode.py @@ -0,0 +1,123 @@ +import logging +import os +import re +import shlex +import subprocess +from pathlib import Path +import sys +import platform + +logging.basicConfig(level=logging.INFO) +THEROCK_BIN_DIR_STR = os.getenv("THEROCK_BIN_DIR") +if THEROCK_BIN_DIR_STR is None: + logging.info( + "++ Error: env(THEROCK_BIN_DIR) is not set. Please set it before executing tests." + ) + sys.exit(1) +THEROCK_BIN_DIR = Path(THEROCK_BIN_DIR_STR) +SCRIPT_DIR = Path(__file__).resolve().parent +THEROCK_DIR = SCRIPT_DIR.parent.parent.parent +THEROCK_TEST_DIR = Path(THEROCK_DIR) / "build" + +ROCDECODE_TEST_PATH = str( + Path(THEROCK_BIN_DIR).resolve().parent / "share" / "rocdecode" / "test" +) +if not os.path.isdir(ROCDECODE_TEST_PATH): + logging.info(f"++ Error: rocdecode tests not found in {ROCDECODE_TEST_PATH}") + sys.exit(1) +else: + logging.info(f"++ INFO: rocdecode tests found in {ROCDECODE_TEST_PATH}") +env = os.environ.copy() + + +# set env variables required for tests +def setup_env(env): + ROCM_PATH = Path(THEROCK_BIN_DIR).resolve().parent + env["ROCM_PATH"] = str(ROCM_PATH) + logging.info(f"++ rocdecode setting ROCM_PATH={ROCM_PATH}") + if platform.system() == "Linux": + HIP_LIB_PATH = Path(THEROCK_BIN_DIR).resolve().parent / "lib" + logging.info(f"++ rocdecode setting LD_LIBRARY_PATH={HIP_LIB_PATH}") + if "LD_LIBRARY_PATH" in env: + env["LD_LIBRARY_PATH"] = f"{HIP_LIB_PATH}:{env['LD_LIBRARY_PATH']}" + else: + env["LD_LIBRARY_PATH"] = str(HIP_LIB_PATH) + else: + logging.info(f"++ rocdecode tests only supported on Linux") + sys.exit(0) + + +def execute_tests(env): + ROCDECODE_TEST_DIR = Path(THEROCK_TEST_DIR) / "rocdecode-test" + ROCM_LIB_PATH = Path(THEROCK_BIN_DIR).resolve().parent / "lib" + ROCDECODE_LIB = ROCM_LIB_PATH / "librocdecode.so" + ROCM_SYSDEPS_PATH = ROCM_LIB_PATH / "rocm_sysdeps" / "lib" + RADEON_SI_LIB = ROCM_SYSDEPS_PATH / "radeonsi_drv_video.so" + + ROCDECODE_TEST_DIR.mkdir(parents=True, exist_ok=True) + + # Diagnostic: verify shared library dependencies are resolvable + cmd = [ + "ldd", + str(ROCDECODE_LIB), + ] + logging.info(f"++ Exec [{ROCDECODE_TEST_DIR}]$ {shlex.join(cmd)}") + subprocess.run(cmd, cwd=ROCDECODE_TEST_DIR, check=True, env=env) + + cmd = [ + "ldd", + str(RADEON_SI_LIB), + ] + logging.info(f"++ Exec [{ROCDECODE_TEST_DIR}]$ {shlex.join(cmd)}") + subprocess.run(cmd, cwd=ROCDECODE_TEST_DIR, check=True, env=env) + + cmd = [ + "ls", + "-xl", + str(ROCM_SYSDEPS_PATH), + ] + logging.info(f"++ Exec [{ROCDECODE_TEST_DIR}]$ {shlex.join(cmd)}") + subprocess.run(cmd, cwd=ROCDECODE_TEST_DIR, check=True, env=env) + + cmd = [ + "cmake", + "-GNinja", + ROCDECODE_TEST_PATH, + ] + logging.info(f"++ Exec [{ROCDECODE_TEST_DIR}]$ {shlex.join(cmd)}") + subprocess.run(cmd, cwd=ROCDECODE_TEST_DIR, check=True, env=env) + + cmd = [ + "ctest", + "-N", + ] + logging.info(f"++ Exec [{ROCDECODE_TEST_DIR}]$ {shlex.join(cmd)}") + ctest_list = subprocess.run( + cmd, + cwd=ROCDECODE_TEST_DIR, + check=True, + env=env, + capture_output=True, + text=True, + ) + logging.info(ctest_list.stdout) + match = re.search(r"Total Tests:\s*(\d+)", ctest_list.stdout) + if match is None: + raise RuntimeError( + "Failed to determine CTest test count from `ctest -N` output" + ) + if int(match.group(1)) == 0: + raise RuntimeError("CTest discovered zero rocdecode tests") + + cmd = [ + "ctest", + "-VV", + "--output-on-failure", + ] + logging.info(f"++ Exec [{ROCDECODE_TEST_DIR}]$ {shlex.join(cmd)}") + subprocess.run(cmd, cwd=ROCDECODE_TEST_DIR, check=True, env=env) + + +if __name__ == "__main__": + setup_env(env) + execute_tests(env) diff --git a/build_tools/github_actions/test_executable_scripts/test_rocjpeg.py b/build_tools/github_actions/test_executable_scripts/test_rocjpeg.py new file mode 100644 index 00000000000..15a1c7b2571 --- /dev/null +++ b/build_tools/github_actions/test_executable_scripts/test_rocjpeg.py @@ -0,0 +1,95 @@ +import logging +import os +import re +import shlex +import subprocess +from pathlib import Path +import sys +import platform + +logging.basicConfig(level=logging.INFO) +THEROCK_BIN_DIR_STR = os.getenv("THEROCK_BIN_DIR") +if THEROCK_BIN_DIR_STR is None: + logging.info( + "++ Error: env(THEROCK_BIN_DIR) is not set. Please set it before executing tests." + ) + sys.exit(1) +THEROCK_BIN_DIR = Path(THEROCK_BIN_DIR_STR) +SCRIPT_DIR = Path(__file__).resolve().parent +THEROCK_DIR = SCRIPT_DIR.parent.parent.parent +THEROCK_TEST_DIR = Path(THEROCK_DIR) / "build" + +ROCJPEG_TEST_PATH = str( + Path(THEROCK_BIN_DIR).resolve().parent / "share" / "rocjpeg" / "test" +) +if not os.path.isdir(ROCJPEG_TEST_PATH): + logging.info(f"++ Error: rocjpeg tests not found in {ROCJPEG_TEST_PATH}") + sys.exit(1) +else: + logging.info(f"++ INFO: rocjpeg tests found in {ROCJPEG_TEST_PATH}") +env = os.environ.copy() + + +# set env variables required for tests +def setup_env(env): + ROCM_PATH = Path(THEROCK_BIN_DIR).resolve().parent + env["ROCM_PATH"] = str(ROCM_PATH) + logging.info(f"++ rocjpeg setting ROCM_PATH={ROCM_PATH}") + if platform.system() == "Linux": + HIP_LIB_PATH = Path(THEROCK_BIN_DIR).resolve().parent / "lib" + logging.info(f"++ rocjpeg setting LD_LIBRARY_PATH={HIP_LIB_PATH}") + if "LD_LIBRARY_PATH" in env: + env["LD_LIBRARY_PATH"] = f"{HIP_LIB_PATH}:{env['LD_LIBRARY_PATH']}" + else: + env["LD_LIBRARY_PATH"] = str(HIP_LIB_PATH) + else: + logging.info(f"++ rocjpeg tests only supported on Linux") + sys.exit(0) + + +def execute_tests(env): + ROCJPEG_TEST_DIR = Path(THEROCK_TEST_DIR) / "rocjpeg-test" + ROCJPEG_TEST_DIR.mkdir(parents=True, exist_ok=True) + + cmd = [ + "cmake", + "-GNinja", + ROCJPEG_TEST_PATH, + ] + logging.info(f"++ Exec [{ROCJPEG_TEST_DIR}]$ {shlex.join(cmd)}") + subprocess.run(cmd, cwd=ROCJPEG_TEST_DIR, check=True, env=env) + + cmd = [ + "ctest", + "-N", + ] + logging.info(f"++ Exec [{ROCJPEG_TEST_DIR}]$ {shlex.join(cmd)}") + ctest_list = subprocess.run( + cmd, + cwd=ROCJPEG_TEST_DIR, + check=True, + env=env, + capture_output=True, + text=True, + ) + logging.info(ctest_list.stdout) + match = re.search(r"Total Tests:\s*(\d+)", ctest_list.stdout) + if match is None: + raise RuntimeError( + "Failed to determine CTest test count from `ctest -N` output" + ) + if int(match.group(1)) == 0: + raise RuntimeError("CTest discovered zero rocjpeg tests") + + cmd = [ + "ctest", + "-VV", + "--output-on-failure", + ] + logging.info(f"++ Exec [{ROCJPEG_TEST_DIR}]$ {shlex.join(cmd)}") + subprocess.run(cmd, cwd=ROCJPEG_TEST_DIR, check=True, env=env) + + +if __name__ == "__main__": + setup_env(env) + execute_tests(env)