From d8600f0a31db3ab82fa26418d6937be533b2bcf7 Mon Sep 17 00:00:00 2001 From: Jordan Patterson Date: Wed, 29 Oct 2025 12:40:48 -0400 Subject: [PATCH 1/6] hipFile: Move and organize system tests. --- hipfile/test/CMakeLists.txt | 4 +- hipfile/test/main.cpp | 815 -------------------------------- hipfile/test/system/buffer.cpp | 4 + hipfile/test/system/config.cpp | 386 +++++++++++++++ hipfile/test/system/driver.cpp | 606 ++++++++++++++++++++++++ hipfile/test/system/system.cpp | 188 -------- hipfile/test/system/version.cpp | 43 ++ 7 files changed, 1042 insertions(+), 1004 deletions(-) create mode 100644 hipfile/test/system/config.cpp create mode 100644 hipfile/test/system/driver.cpp delete mode 100644 hipfile/test/system/system.cpp create mode 100644 hipfile/test/system/version.cpp diff --git a/hipfile/test/CMakeLists.txt b/hipfile/test/CMakeLists.txt index b742694f..4c28f5ab 100644 --- a/hipfile/test/CMakeLists.txt +++ b/hipfile/test/CMakeLists.txt @@ -23,8 +23,10 @@ set(UNIT_TEST_SOURCE_FILES # They will not pass if a HIP capable GPU is not present # and configured on the system. set(SYSTEM_TEST_SOURCE_FILES - system/system.cpp system/buffer.cpp + system/config.cpp + system/driver.cpp + system/version.cpp ) set(TEST_SYSINCLS diff --git a/hipfile/test/main.cpp b/hipfile/test/main.cpp index fc60d0c9..9b646b6e 100644 --- a/hipfile/test/main.cpp +++ b/hipfile/test/main.cpp @@ -3,9 +3,7 @@ * SPDX-License-Identifier: MIT */ -#include "hipfile.h" #include "test-common.h" -#include "test-shared-fixtures.h" #include "hipfile-warnings.h" #include "invalid-enum.h" @@ -14,9 +12,6 @@ #include #include -#include -#include -#include using namespace std; @@ -36,814 +31,4 @@ TEST(Helpers, invalidEnum) ASSERT_EQ(invalidEnum(b + 1), 13); } -TEST(HipFileVersioning, Get) -{ - unsigned major = UINT_MAX; - unsigned minor = UINT_MAX; - unsigned patch = UINT_MAX; - - // Check for correct values - ASSERT_EQ(hipFileGetVersion(&major, &minor, &patch), HIPFILE_SUCCESS); - ASSERT_EQ(major, HIPFILE_VERSION_MAJOR); - ASSERT_EQ(minor, HIPFILE_VERSION_MINOR); - ASSERT_EQ(patch, HIPFILE_VERSION_PATCH); - - // NULL pointers should NOT produce errors - ASSERT_EQ(hipFileGetVersion(nullptr, nullptr, nullptr), HIPFILE_SUCCESS); - - // hipFileGetBackendVersion() succeeds and returns a value >= 0 - // - // We can't reliably predict what the version number will be for - // an arbitrary library, but it probably won't be negative and - // checking for >= 0 ensures the -1 initialization value is - // overwritten. - int backend_version = -1; - ASSERT_EQ(hipFileGetBackendVersion(&backend_version), HIPFILE_SUCCESS); - ASSERT_GE(backend_version, 0); - - // NULL pointer returns correct error - ASSERT_EQ(hipFileGetBackendVersion(nullptr), HipFileOpError(hipFileInvalidValue)); -} - -// Test hipFile APIs that set/get configuration values -struct HipFileConfig : public ::testing::Test { - - void SetUp() override - { - ASSERT_EQ(hipFileUseCount(), 0); - } - - // Ensure the driver is deinitialized/closed after the test - void TearDown() override - { - // Ensure driver is opened so staged values are applied then cleared - ASSERT_EQ(hipFileDriverOpen(), HIPFILE_SUCCESS); - - // Ensure driver is closed to clear applied values - while (hipFileUseCount()) { - ASSERT_EQ(hipFileDriverClose(), HIPFILE_SUCCESS); - } - } -}; - -TEST_F(HipFileConfig, SizeTParameterCantSetIfDriverOpen) -{ - ASSERT_EQ(hipFileDriverOpen(), HIPFILE_SUCCESS); - auto set_after_open = hipFileSetParameterSizeT(hipFileParamExecutionMaxIOThreads, 10); - -#if defined(__HIP_PLATFORM_AMD__) - ASSERT_EQ(set_after_open, HipFileOpError(hipFileInternalError)); -#else - ASSERT_EQ(set_after_open, HipFileOpError(hipFileDriverAlreadyOpen)); -#endif -} - -TEST_F(HipFileConfig, SizeTParameterGetDefault) -{ - size_t default_; - auto get_default = hipFileGetParameterSizeT(hipFileParamExecutionMaxIOThreads, &default_); - -#if defined(__HIP_PLATFORM_AMD__) - ASSERT_EQ(get_default, HipFileOpError(hipFileInternalError)); -#else - ASSERT_EQ(get_default, HIPFILE_SUCCESS); - ASSERT_EQ(default_, 0); -#endif -} - -TEST_F(HipFileConfig, SizeTParameterSetStagesValue) -{ - size_t default_; - auto get_default = hipFileGetParameterSizeT(hipFileParamExecutionMaxIOThreads, &default_); - - size_t target{10}; - auto stage_target = hipFileSetParameterSizeT(hipFileParamExecutionMaxIOThreads, target); - - size_t staged; - auto get_staged = hipFileGetParameterSizeT(hipFileParamExecutionMaxIOThreads, &staged); - -#if defined(__HIP_PLATFORM_AMD__) - ASSERT_EQ(get_default, HipFileOpError(hipFileInternalError)); - ASSERT_EQ(stage_target, HipFileOpError(hipFileInternalError)); - ASSERT_EQ(get_staged, HipFileOpError(hipFileInternalError)); -#else - ASSERT_EQ(get_default, HIPFILE_SUCCESS); - ASSERT_NE(default_, target); - ASSERT_EQ(stage_target, HIPFILE_SUCCESS); - ASSERT_EQ(get_staged, HIPFILE_SUCCESS); - ASSERT_EQ(target, staged); -#endif -} - -TEST_F(HipFileConfig, SizeTParameterOpenAppliesValue) -{ - size_t default_; - auto get_default = hipFileGetParameterSizeT(hipFileParamExecutionMaxIOThreads, &default_); - - size_t target{10}; - auto stage_target = hipFileSetParameterSizeT(hipFileParamExecutionMaxIOThreads, target); - - auto driver_open = hipFileDriverOpen(); - - size_t applied; - auto get_applied = hipFileGetParameterSizeT(hipFileParamExecutionMaxIOThreads, &applied); - -#if defined(__HIP_PLATFORM_AMD__) - ASSERT_EQ(get_default, HipFileOpError(hipFileInternalError)); - ASSERT_EQ(stage_target, HipFileOpError(hipFileInternalError)); - ASSERT_EQ(driver_open, HIPFILE_SUCCESS); - ASSERT_EQ(get_applied, HipFileOpError(hipFileInternalError)); -#else - ASSERT_EQ(get_default, HIPFILE_SUCCESS); - ASSERT_NE(default_, target); - ASSERT_EQ(stage_target, HIPFILE_SUCCESS); - ASSERT_EQ(driver_open, HIPFILE_SUCCESS); - ASSERT_EQ(get_applied, HIPFILE_SUCCESS); - ASSERT_EQ(target, applied); -#endif -} - -TEST_F(HipFileConfig, SizeTParameterCloseClearsAppliedValue) -{ - size_t default_; - auto get_default = hipFileGetParameterSizeT(hipFileParamExecutionMaxIOThreads, &default_); - - size_t target{10}; - auto stage_target = hipFileSetParameterSizeT(hipFileParamExecutionMaxIOThreads, target); - - // Open applies staged value and clears staged - auto driver_open = hipFileDriverOpen(); - - // Close clears applied value - auto driver_close = hipFileDriverClose(); - - size_t cleared; - auto get_cleared = hipFileGetParameterSizeT(hipFileParamExecutionMaxIOThreads, &cleared); - -#if defined(__HIP_PLATFORM_AMD__) - ASSERT_EQ(get_default, HipFileOpError(hipFileInternalError)); - ASSERT_EQ(stage_target, HipFileOpError(hipFileInternalError)); - ASSERT_EQ(driver_open, HIPFILE_SUCCESS); - ASSERT_EQ(driver_close, HIPFILE_SUCCESS); - ASSERT_EQ(get_cleared, HipFileOpError(hipFileInternalError)); -#else - ASSERT_EQ(get_default, HIPFILE_SUCCESS); - ASSERT_NE(default_, target); - ASSERT_EQ(stage_target, HIPFILE_SUCCESS); - ASSERT_EQ(driver_open, HIPFILE_SUCCESS); - ASSERT_EQ(driver_close, HIPFILE_SUCCESS); - ASSERT_EQ(get_cleared, HIPFILE_SUCCESS); - ASSERT_EQ(default_, cleared); -#endif -} - -TEST_F(HipFileConfig, BoolParameterCantSetIfDriverOpen) -{ - ASSERT_EQ(hipFileDriverOpen(), HIPFILE_SUCCESS); - auto set_after_open = hipFileSetParameterBool(hipFileParamUsePcip2pdma, true); -#if defined(__HIP_PLATFORM_AMD__) - ASSERT_EQ(set_after_open, HipFileOpError(hipFileInternalError)); -#else - ASSERT_EQ(set_after_open, HipFileOpError(hipFileDriverAlreadyOpen)); -#endif -} - -TEST_F(HipFileConfig, BoolParameterGetDefault) -{ - bool default_; - auto get_default = hipFileGetParameterBool(hipFileParamUsePcip2pdma, &default_); -#if defined(__HIP_PLATFORM_AMD__) - ASSERT_EQ(get_default, HipFileOpError(hipFileInternalError)); -#else - ASSERT_EQ(get_default, HIPFILE_SUCCESS); - ASSERT_EQ(default_, false); -#endif -} - -TEST_F(HipFileConfig, BoolParameterSetStagesValue) -{ - bool default_; - auto get_default = hipFileGetParameterBool(hipFileParamUsePcip2pdma, &default_); - - constexpr bool target{true}; - auto stage_target = hipFileSetParameterBool(hipFileParamUsePcip2pdma, target); - - bool staged; - auto get_staged = hipFileGetParameterBool(hipFileParamUsePcip2pdma, &staged); - -#if defined(__HIP_PLATFORM_AMD__) - ASSERT_EQ(get_default, HipFileOpError(hipFileInternalError)); - ASSERT_EQ(stage_target, HipFileOpError(hipFileInternalError)); - ASSERT_EQ(get_staged, HipFileOpError(hipFileInternalError)); -#else - ASSERT_EQ(get_default, HIPFILE_SUCCESS); - ASSERT_NE(default_, target); - ASSERT_EQ(stage_target, HIPFILE_SUCCESS); - ASSERT_EQ(get_staged, HIPFILE_SUCCESS); - ASSERT_EQ(target, staged); -#endif -} - -TEST_F(HipFileConfig, BoolParameterOpenAppliesValue) -{ - bool default_; - auto get_default = hipFileGetParameterBool(hipFileParamUsePcip2pdma, &default_); - - constexpr bool target{true}; - auto stage_target = hipFileSetParameterBool(hipFileParamUsePcip2pdma, target); - - auto driver_open = hipFileDriverOpen(); - - bool applied; - auto get_applied = hipFileGetParameterBool(hipFileParamUsePcip2pdma, &applied); - -#if defined(__HIP_PLATFORM_AMD__) - ASSERT_EQ(get_default, HipFileOpError(hipFileInternalError)); - ASSERT_EQ(stage_target, HipFileOpError(hipFileInternalError)); - ASSERT_EQ(driver_open, HIPFILE_SUCCESS); - ASSERT_EQ(get_applied, HipFileOpError(hipFileInternalError)); -#else - ASSERT_EQ(get_default, HIPFILE_SUCCESS); - ASSERT_NE(default_, target); - ASSERT_EQ(stage_target, HIPFILE_SUCCESS); - ASSERT_EQ(driver_open, HIPFILE_SUCCESS); - ASSERT_EQ(get_applied, HIPFILE_SUCCESS); - ASSERT_EQ(target, applied); -#endif -} - -TEST_F(HipFileConfig, BoolParameterCloseClearsAppliedValue) -{ - bool default_; - auto get_default = hipFileGetParameterBool(hipFileParamUsePcip2pdma, &default_); - - constexpr bool target{true}; - auto stage_target = hipFileSetParameterBool(hipFileParamUsePcip2pdma, target); - - // Open applies staged value and clears staged - auto driver_open = hipFileDriverOpen(); - - // Close clears applied value - auto driver_close = hipFileDriverClose(); - - bool cleared; - auto get_cleared = hipFileGetParameterBool(hipFileParamUsePcip2pdma, &cleared); - -#if defined(__HIP_PLATFORM_AMD__) - ASSERT_EQ(get_default, HipFileOpError(hipFileInternalError)); - ASSERT_EQ(stage_target, HipFileOpError(hipFileInternalError)); - ASSERT_EQ(driver_open, HIPFILE_SUCCESS); - ASSERT_EQ(driver_close, HIPFILE_SUCCESS); - ASSERT_EQ(get_cleared, HipFileOpError(hipFileInternalError)); -#else - ASSERT_EQ(get_default, HIPFILE_SUCCESS); - ASSERT_NE(default_, target); - ASSERT_EQ(stage_target, HIPFILE_SUCCESS); - ASSERT_EQ(driver_open, HIPFILE_SUCCESS); - ASSERT_EQ(driver_close, HIPFILE_SUCCESS); - ASSERT_EQ(get_cleared, HIPFILE_SUCCESS); - ASSERT_EQ(default_, cleared); -#endif -} - -TEST_F(HipFileConfig, StringParameterCantSetIfDriverOpen) -{ - ASSERT_EQ(hipFileDriverOpen(), HIPFILE_SUCCESS); - auto set_after_open = hipFileSetParameterString(hipFileParamLogDir, "/foo/bar"); -#if defined(__HIP_PLATFORM_AMD__) - ASSERT_EQ(set_after_open, HipFileOpError(hipFileInternalError)); -#else - ASSERT_EQ(set_after_open, HipFileOpError(hipFileDriverAlreadyOpen)); -#endif -} - -TEST_F(HipFileConfig, StringParameterGetDefault) -{ - vector buffer(64); - - auto get_default = - hipFileGetParameterString(hipFileParamLogDir, buffer.data(), static_cast(buffer.size())); - string default_{buffer.data()}; - -#if defined(__HIP_PLATFORM_AMD__) - ASSERT_EQ(get_default, HipFileOpError(hipFileInternalError)); -#else - ASSERT_EQ(get_default, HIPFILE_SUCCESS); - ASSERT_EQ(default_, ""); -#endif -} - -TEST_F(HipFileConfig, StringParameterSetStagesValue) -{ - vector buffer(64); - - auto get_default = - hipFileGetParameterString(hipFileParamLogDir, buffer.data(), static_cast(buffer.size())); - string default_{buffer.data()}; - - const string target{"/tmp"}; - auto stage_target = hipFileSetParameterString(hipFileParamLogDir, target.c_str()); - - auto get_staged = - hipFileGetParameterString(hipFileParamLogDir, buffer.data(), static_cast(buffer.size())); - string staged{buffer.data()}; - -#if defined(__HIP_PLATFORM_AMD__) - ASSERT_EQ(get_default, HipFileOpError(hipFileInternalError)); - ASSERT_EQ(stage_target, HipFileOpError(hipFileInternalError)); - ASSERT_EQ(get_staged, HipFileOpError(hipFileInternalError)); -#else - ASSERT_EQ(get_default, HIPFILE_SUCCESS); - ASSERT_NE(default_, target); - ASSERT_EQ(stage_target, HIPFILE_SUCCESS); - ASSERT_EQ(get_staged, HIPFILE_SUCCESS); - ASSERT_EQ(target, staged); -#endif -} - -TEST_F(HipFileConfig, StringParameterOpenAppliesValue) -{ - vector buffer(64); - - auto get_default = - hipFileGetParameterString(hipFileParamLogDir, buffer.data(), static_cast(buffer.size())); - string default_{buffer.data()}; - - // The target value must specify a directory that exists otherwise it will not be applied when the driver - // is opened. - const string target{"/tmp"}; - auto stage_target = hipFileSetParameterString(hipFileParamLogDir, target.c_str()); - - auto driver_open = hipFileDriverOpen(); - - auto get_applied = - hipFileGetParameterString(hipFileParamLogDir, buffer.data(), static_cast(buffer.size())); - string applied{buffer.data()}; - -#if defined(__HIP_PLATFORM_AMD__) - ASSERT_EQ(get_default, HipFileOpError(hipFileInternalError)); - ASSERT_EQ(stage_target, HipFileOpError(hipFileInternalError)); - ASSERT_EQ(driver_open, HIPFILE_SUCCESS); - ASSERT_EQ(get_applied, HipFileOpError(hipFileInternalError)); -#else - ASSERT_EQ(get_default, HIPFILE_SUCCESS); - ASSERT_NE(default_, target); - ASSERT_EQ(stage_target, HIPFILE_SUCCESS); - ASSERT_EQ(driver_open, HIPFILE_SUCCESS); - ASSERT_EQ(get_applied, HIPFILE_SUCCESS); - ASSERT_EQ(target, applied); -#endif -} - -TEST_F(HipFileConfig, StringParameterCloseClearsAppliedValue) -{ - vector buffer(64); - - auto get_default = - hipFileGetParameterString(hipFileParamLogDir, buffer.data(), static_cast(buffer.size())); - string default_{buffer.data()}; - - // The target value must specify a directory that exists otherwise it will not be applied when the driver - // is opened. - const string target{"/tmp"}; - auto stage_target = hipFileSetParameterString(hipFileParamLogDir, target.c_str()); - - auto driver_open = hipFileDriverOpen(); - auto driver_close = hipFileDriverClose(); - - auto get_cleared = - hipFileGetParameterString(hipFileParamLogDir, buffer.data(), static_cast(buffer.size())); - string cleared{buffer.data()}; - -#if defined(__HIP_PLATFORM_AMD__) - ASSERT_EQ(get_default, HipFileOpError(hipFileInternalError)); - ASSERT_EQ(stage_target, HipFileOpError(hipFileInternalError)); - ASSERT_EQ(driver_open, HIPFILE_SUCCESS); - ASSERT_EQ(driver_close, HIPFILE_SUCCESS); - ASSERT_EQ(get_cleared, HipFileOpError(hipFileInternalError)); -#else - ASSERT_EQ(get_default, HIPFILE_SUCCESS); - ASSERT_NE(default_, target); - ASSERT_EQ(stage_target, HIPFILE_SUCCESS); - ASSERT_EQ(driver_open, HIPFILE_SUCCESS); - ASSERT_EQ(driver_close, HIPFILE_SUCCESS); - ASSERT_EQ(get_cleared, HIPFILE_SUCCESS); - ASSERT_EQ(default_, cleared); -#endif -} - -// hipFile APIs that trigger driver init/deinit. - -TEST_F(DriverInit, driverOpenIncrementsUseCount) -{ - for (auto i{0}; i < 10; i++) { - ASSERT_EQ(hipFileDriverOpen(), HIPFILE_SUCCESS); - ASSERT_EQ(hipFileUseCount(), i + 1); - } -} - -TEST_F(DriverInit, driverCloseDecrementsUseCount) -{ - auto count{10}; - for (auto i{0}; i < count; i++) { - ASSERT_EQ(hipFileDriverOpen(), HIPFILE_SUCCESS); - ASSERT_EQ(hipFileUseCount(), i + 1); - } - for (auto i{count}; 0 < i; i--) { - ASSERT_EQ(hipFileDriverClose(), HIPFILE_SUCCESS); - ASSERT_EQ(hipFileUseCount(), i - 1); - } -} - -TEST_F(DriverInit, hipFileHandleRegisterNullDescr) -{ - hipFileHandle_t handle; - ASSERT_EQ(hipFileHandleRegister(&handle, nullptr), HipFileOpError(hipFileInvalidValue)); - - // NVIDIA inits the driver, even when the parameters are garbage. We do not. - // We could mimic this, but it's probably a waste of time given that it's an - // edge case. -#if defined(__HIP_PLATFORM_AMD__) - ASSERT_EQ(hipFileUseCount(), 0); -#else - ASSERT_EQ(hipFileUseCount(), 1); -#endif -} - -TEST_F(DriverInit, hipFileHandleRegisterNullHandle) -{ - Tmpfile tmpfile; - - hipFileDescr_t descr{}; - descr.type = hipFileHandleTypeOpaqueFD; - descr.handle.fd = tmpfile.fd; - - ASSERT_EQ(hipFileHandleRegister(nullptr, &descr), HipFileOpError(hipFileInvalidValue)); - - // NVIDIA inits the driver, even when the parameters are garbage. We do not. - // We could mimic this, but it's probably a waste of time given that it's an - // edge case. -#if defined(__HIP_PLATFORM_AMD__) - ASSERT_EQ(hipFileUseCount(), 0); -#else - ASSERT_EQ(hipFileUseCount(), 1); -#endif -} - -TEST_F(DriverInit, hipFileHandleRegisterInitsDriver) -{ - Tmpfile tmpfile; - - hipFileDescr_t descr{}; - descr.type = hipFileHandleTypeOpaqueFD; - descr.handle.fd = tmpfile.fd; - - hipFileHandle_t handle; - ASSERT_EQ(hipFileHandleRegister(&handle, &descr), HIPFILE_SUCCESS); - ASSERT_EQ(hipFileUseCount(), 1); -} - -TEST_F(DriverInit, hipFileDriverOpenAfterHandleRegisterIncrementsUseCount) -{ - Tmpfile tmpfile; - - hipFileDescr_t descr{}; - descr.type = hipFileHandleTypeOpaqueFD; - descr.handle.fd = tmpfile.fd; - - hipFileHandle_t handle; - ASSERT_EQ(hipFileHandleRegister(&handle, &descr), HIPFILE_SUCCESS); - ASSERT_EQ(hipFileUseCount(), 1); - - ASSERT_EQ(hipFileDriverOpen(), HIPFILE_SUCCESS); - ASSERT_EQ(hipFileUseCount(), 2); -} - -TEST_F(DriverInit, hipFileHandleRegisterThreadedInitsDriverOnce) -{ - constexpr size_t count{64}; - std::vector tmpfiles(count); - std::vector threads; - std::vector descrs(count); - std::vector handles(count); - - for (size_t i{0}; i < count; i++) { - descrs[i].type = hipFileHandleTypeOpaqueFD; - descrs[i].handle.fd = tmpfiles[i].fd; - } - - for (size_t i{0}; i < count; i++) { - threads.emplace_back([i, &handles, &descrs] { - EXPECT_EQ(hipFileHandleRegister(&handles[i], &descrs[i]), HIPFILE_SUCCESS); - }); - } - - for (auto &t : threads) { - t.join(); - } - - ASSERT_EQ(hipFileUseCount(), 1); - - for (size_t i{0}; i < count; i++) { - hipFileHandleDeregister(handles[i]); - } -} - -TEST_F(DriverInit, hipFileDriverCloseDeregisteresHandle) -{ - Tmpfile tmpfile; - hipFileHandle_t handle{}; - hipFileDescr_t descr{}; - - descr.type = hipFileHandleTypeOpaqueFD; - descr.handle.fd = tmpfile.fd; - - ASSERT_EQ(hipFileHandleRegister(&handle, &descr), HIPFILE_SUCCESS); - ASSERT_EQ(hipFileHandleRegister(&handle, &descr), HipFileOpError(hipFileHandleAlreadyRegistered)); - ASSERT_EQ(hipFileDriverClose(), HIPFILE_SUCCESS); - ASSERT_EQ(hipFileHandleRegister(&handle, &descr), HIPFILE_SUCCESS); -} - -TEST_F(DriverInit, hipFileReadAsync) -{ - ASSERT_EQ(hipFileReadAsync(nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr), - HipFileOpError(hipFileInvalidValue)); - ASSERT_EQ(hipFileUseCount(), 1); -} - -TEST_F(DriverInit, hipFileWriteAsync) -{ - ASSERT_EQ(hipFileWriteAsync(nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr), - HipFileOpError(hipFileInvalidValue)); - ASSERT_EQ(hipFileUseCount(), 1); -} - -// hipFile APIs that do not trigger driver init/deinit - -TEST_F(DriverNoInit, hipFileDriverCloseReturnsNotInitIfDriverNotOpened) -{ - ASSERT_EQ(hipFileDriverClose(), HipFileOpError(hipFileDriverNotInitialized)); -} - -TEST_F(DriverNoInit, hipFileBatchIOSetUp) -{ - hipFileBatchHandle_t handle; -#ifdef __HIP_PLATFORM_AMD__ - ASSERT_EQ(hipFileBatchIOSetUp(&handle, 1), HipFileOpError(hipFileSuccess)); -#else - // CU_FILE_INTERNAL_ERROR returned if this API is called prior to the driver being opened. - ASSERT_EQ(hipFileBatchIOSetUp(&handle, 1), HipFileOpError(hipFileInternalError)); -#endif -} - -TEST_F(DriverNoInit, hipFileBatchIOSubmitNullArgs) -{ -#ifdef __HIP_PLATFORM_AMD__ - ASSERT_EQ(hipFileBatchIOSubmit(nullptr, 0, nullptr, 0), HipFileOpError(hipFileInvalidValue)); -#else - ASSERT_EQ(hipFileBatchIOSubmit(nullptr, 0, nullptr, 0), HipFileOpError(hipFileInternalError)); -#endif -} - -TEST_F(DriverNoInit, hipFileBatchIOSubmit) -{ - hipFileBatchHandle_t handle{}; - hipFileIOParams_t param{}; - - ASSERT_EQ(hipFileBatchIOSubmit(handle, 1, ¶m, 0), HipFileOpError(hipFileInternalError)); -} - -TEST_F(DriverNoInit, hipFileBatchIOGetStatusNullArgs) -{ - ASSERT_EQ(hipFileBatchIOGetStatus(nullptr, 0, nullptr, nullptr, nullptr), - HipFileOpError(hipFileInternalError)); -} - -TEST_F(DriverNoInit, hipFileBatchIOGetStatus) -{ - hipFileBatchHandle_t handle{}; - hipFileIOEvents_t event{}; - unsigned nr{1}; - struct timespec ts { - 0, 0 - }; - - ASSERT_EQ(hipFileBatchIOGetStatus(handle, 0, &nr, &event, &ts), HipFileOpError(hipFileInternalError)); -} - -TEST_F(DriverNoInit, hipFileBatchIOCancelNullArgs) -{ -#ifdef __HIP_PLATFORM_AMD__ // Not implemented on AMD - ASSERT_EQ(hipFileBatchIOCancel(nullptr), HipFileOpError(hipFileInternalError)); -#else - ASSERT_EQ(hipFileBatchIOCancel(nullptr), HIPFILE_SUCCESS); -#endif -} - -TEST_F(DriverNoInit, hipFileBatchIOCancel) -{ - hipFileBatchHandle_t handle{}; - -#ifdef __HIP_PLATFORM_AMD__ // Not implemented on AMD - ASSERT_EQ(hipFileBatchIOCancel(handle), HipFileOpError(hipFileInternalError)); -#else - ASSERT_EQ(hipFileBatchIOCancel(handle), HIPFILE_SUCCESS); // Weird -#endif -} - -TEST_F(DriverNoInit, hipFileBatchIODestroy) -{ - hipFileBatchHandle_t handle{}; - - hipFileBatchIODestroy(handle); -} - -TEST_F(DriverNoInit, hipFileGetVersion) -{ - unsigned major = UINT_MAX; - unsigned minor = UINT_MAX; - unsigned patch = UINT_MAX; - ASSERT_EQ(hipFileGetVersion(&major, &minor, &patch), HIPFILE_SUCCESS); - - int version = -1; - ASSERT_EQ(hipFileGetBackendVersion(&version), HIPFILE_SUCCESS); -} - -TEST_F(DriverNoInit, hipFileGetParameterSizeT) -{ - size_t value; -#ifdef __HIP_PLATFORM_AMD__ // Not implemented on AMD - ASSERT_EQ(hipFileGetParameterSizeT(hipFileParamProfileStats, &value), - HipFileOpError(hipFileInternalError)); -#else - ASSERT_EQ(hipFileGetParameterSizeT(hipFileParamProfileStats, &value), HIPFILE_SUCCESS); -#endif -} - -TEST_F(DriverNoInit, hipFileGetParameterBool) -{ - bool value; -#ifdef __HIP_PLATFORM_AMD__ // Not implemented on AMD - ASSERT_EQ(hipFileGetParameterBool(hipFileParamUsePcip2pdma, &value), - HipFileOpError(hipFileInternalError)); -#else - ASSERT_EQ(hipFileGetParameterBool(hipFileParamUsePcip2pdma, &value), HIPFILE_SUCCESS); -#endif -} - -TEST_F(DriverNoInit, hipFileGetParameterString) -{ - vector buffer(64); -#ifdef __HIP_PLATFORM_AMD__ // Not implemented on AMD - ASSERT_EQ(hipFileGetParameterString(hipFileParamLogDir, buffer.data(), static_cast(buffer.size())), - HipFileOpError(hipFileInternalError)); -#else - ASSERT_EQ(hipFileGetParameterString(hipFileParamLogDir, buffer.data(), static_cast(buffer.size())), - HIPFILE_SUCCESS); -#endif -} - -TEST_F(DriverNoInit, hipFileSetParameterSizeT) -{ -#ifdef __HIP_PLATFORM_AMD__ // Not implemented on AMD - ASSERT_EQ(hipFileSetParameterSizeT(hipFileParamProfileStats, 1), HipFileOpError(hipFileInternalError)); -#else - ASSERT_EQ(hipFileSetParameterSizeT(hipFileParamProfileStats, 1), HIPFILE_SUCCESS); -#endif -} - -TEST_F(DriverNoInit, hipFileSetParameterBool) -{ -#ifdef __HIP_PLATFORM_AMD__ // Not implemented on AMD - ASSERT_EQ(hipFileSetParameterBool(hipFileParamUsePcip2pdma, false), HipFileOpError(hipFileInternalError)); -#else - ASSERT_EQ(hipFileSetParameterBool(hipFileParamUsePcip2pdma, false), HIPFILE_SUCCESS); -#endif -} - -TEST_F(DriverNoInit, hipFileSetParameterString) -{ -#ifdef __HIP_PLATFORM_AMD__ // Not implemented on AMD - ASSERT_EQ(hipFileSetParameterString(hipFileParamLogDir, "/tmp"), HipFileOpError(hipFileInternalError)); -#else - ASSERT_EQ(hipFileSetParameterString(hipFileParamLogDir, "/tmp"), HIPFILE_SUCCESS); -#endif -} - -TEST_F(DriverNoInit, hipFileBufDeregister) -{ - EXPECT_EQ(hipFileBufDeregister(reinterpret_cast(0x1)), HipFileOpError(hipFileDriverClosing)); -} - -TEST_F(DriverNoInit, hipFileHandleDeregister) -{ - hipFileHandleDeregister(reinterpret_cast(0x1)); -} - -TEST_F(DriverNoInit, hipFileRead) -{ - vector buffer(64); - hipFileHandle_t handle{reinterpret_cast(0xCAFEBABE)}; - - errno = 0; - ASSERT_EQ(hipFileRead(handle, buffer.data(), buffer.size(), 0, 0), -1); - ASSERT_EQ(errno, EINVAL); -} - -TEST_F(DriverNoInit, hipFileWrite) -{ - vector buffer(64); - hipFileHandle_t handle{reinterpret_cast(0xCAFEBABE)}; - - errno = 0; - ASSERT_EQ(hipFileWrite(handle, buffer.data(), buffer.size(), 0, 0), -1); - ASSERT_EQ(errno, EINVAL); -} - -// DriverNotReallyNoInit tests API functions that are not supposed to -// initialize the driver but they have some side effect (in cuFile) that makes -// hipFileSetParameterSizeT/hipFileSetParameterBool/hipFileSetParameterString -// return hipFileDriverAlreadyOpen. They are split out from DriverNoInit tests -// because the driver needs to be cycled to clear out driver state. Cycling the -// driver is time consuming. -struct DriverNotReallyNoInit : public DriverNoInit { - - void SetUp() override - { - ASSERT_EQ(hipFileUseCount(), 0); - ASSERT_EQ(hipFileDriverClose(), HipFileOpError(hipFileDriverNotInitialized)); - } - - void TearDown() override - { - ASSERT_EQ(hipFileUseCount(), 0); - ASSERT_EQ(hipFileDriverClose(), HipFileOpError(hipFileDriverNotInitialized)); - -#ifdef __HIP_PLATFORM_NVIDIA__ - // Workaround: Open and close the driver to clear the state that these API functions set - ASSERT_EQ(hipFileDriverOpen(), HIPFILE_SUCCESS); - ASSERT_EQ(hipFileDriverClose(), HIPFILE_SUCCESS); -#endif - - ASSERT_EQ(hipFileUseCount(), 0); - ASSERT_EQ(hipFileDriverClose(), HipFileOpError(hipFileDriverNotInitialized)); - } -}; - -TEST_F(DriverNotReallyNoInit, hipFileDriverGetPropertiesNullArgs) -{ -#ifdef __HIP_PLATFORM_AMD__ // Not implemented - ASSERT_EQ(hipFileDriverGetProperties(nullptr), HipFileOpError(hipFileInternalError)); -#else - ASSERT_EQ(hipFileDriverGetProperties(nullptr), HipFileOpError(hipFileInvalidValue)); -#endif -} - -TEST_F(DriverNotReallyNoInit, hipFileDriverGetProperties) -{ - hipFileDriverProps_t props; - -#ifdef __HIP_PLATFORM_AMD__ // Not implemented - ASSERT_EQ(hipFileDriverGetProperties(&props), HipFileOpError(hipFileInternalError)); -#else - ASSERT_EQ(hipFileDriverGetProperties(&props), HIPFILE_SUCCESS); -#endif -} - -TEST_F(DriverNotReallyNoInit, hipFileDriverSetPollMode) -{ -#ifdef __HIP_PLATFORM_AMD__ // Not implemented - ASSERT_EQ(hipFileDriverSetPollMode(true, 4096), HipFileOpError(hipFileInternalError)); -#else - ASSERT_EQ(hipFileDriverSetPollMode(true, 4096), HIPFILE_SUCCESS); -#endif -} - -TEST_F(DriverNotReallyNoInit, hipFileDriverSetMaxDirectIOSize) -{ -#ifdef __HIP_PLATFORM_AMD__ // Not implemented - ASSERT_EQ(hipFileDriverSetMaxDirectIOSize(16 * 1024), HipFileOpError(hipFileInternalError)); -#else - ASSERT_EQ(hipFileDriverSetMaxDirectIOSize(16 * 1024), HIPFILE_SUCCESS); -#endif -} - -TEST_F(DriverNotReallyNoInit, hipFileDriverSetMaxCacheSize) -{ -#ifdef __HIP_PLATFORM_AMD__ // Not implemented - ASSERT_EQ(hipFileDriverSetMaxCacheSize(16 * 1024), HipFileOpError(hipFileInternalError)); -#else - ASSERT_EQ(hipFileDriverSetMaxCacheSize(16 * 1024), HIPFILE_SUCCESS); -#endif -} - -TEST_F(DriverNotReallyNoInit, hipFileDriverSetMaxPinnedMemSize) -{ -#ifdef __HIP_PLATFORM_AMD__ // Not implemented - ASSERT_EQ(hipFileDriverSetMaxPinnedMemSize(32 * 1024), HipFileOpError(hipFileInternalError)); -#else - ASSERT_EQ(hipFileDriverSetMaxPinnedMemSize(32 * 1024), HIPFILE_SUCCESS); -#endif -} - HIPFILE_WARN_NO_GLOBAL_CTOR_ON diff --git a/hipfile/test/system/buffer.cpp b/hipfile/test/system/buffer.cpp index 8d7c8772..e41504b4 100644 --- a/hipfile/test/system/buffer.cpp +++ b/hipfile/test/system/buffer.cpp @@ -8,6 +8,10 @@ #include "test-common.h" #include "test-shared-fixtures.h" +#include +#include +#include + HIPFILE_WARN_NO_GLOBAL_CTOR_OFF class HipBuffer : public DriverInit {}; diff --git a/hipfile/test/system/config.cpp b/hipfile/test/system/config.cpp new file mode 100644 index 00000000..e7612f79 --- /dev/null +++ b/hipfile/test/system/config.cpp @@ -0,0 +1,386 @@ +/* Copyright (c) Advanced Micro Devices, Inc. All rights reserved. + * + * SPDX-License-Identifier: MIT + */ + +#include "hipfile-warnings.h" +#include "hipfile.h" +#include "test-common.h" + +#include +#include +#include +#include + +using namespace std; + +HIPFILE_WARN_NO_GLOBAL_CTOR_OFF + +// Test hipFile APIs that set/get configuration values +struct HipFileConfig : public ::testing::Test { + + void SetUp() override + { + ASSERT_EQ(hipFileUseCount(), 0); + } + + // Ensure the driver is deinitialized/closed after the test + void TearDown() override + { + // Ensure driver is opened so staged values are applied then cleared + ASSERT_EQ(hipFileDriverOpen(), HIPFILE_SUCCESS); + + // Ensure driver is closed to clear applied values + while (hipFileUseCount()) { + ASSERT_EQ(hipFileDriverClose(), HIPFILE_SUCCESS); + } + } +}; + +TEST_F(HipFileConfig, SizeTParameterCantSetIfDriverOpen) +{ + ASSERT_EQ(hipFileDriverOpen(), HIPFILE_SUCCESS); + auto set_after_open = hipFileSetParameterSizeT(hipFileParamExecutionMaxIOThreads, 10); + +#if defined(__HIP_PLATFORM_AMD__) + ASSERT_EQ(set_after_open, HipFileOpError(hipFileInternalError)); +#else + ASSERT_EQ(set_after_open, HipFileOpError(hipFileDriverAlreadyOpen)); +#endif +} + +TEST_F(HipFileConfig, SizeTParameterGetDefault) +{ + size_t default_; + auto get_default = hipFileGetParameterSizeT(hipFileParamExecutionMaxIOThreads, &default_); + +#if defined(__HIP_PLATFORM_AMD__) + ASSERT_EQ(get_default, HipFileOpError(hipFileInternalError)); +#else + ASSERT_EQ(get_default, HIPFILE_SUCCESS); + ASSERT_EQ(default_, 0); +#endif +} + +TEST_F(HipFileConfig, SizeTParameterSetStagesValue) +{ + size_t default_; + auto get_default = hipFileGetParameterSizeT(hipFileParamExecutionMaxIOThreads, &default_); + + size_t target{10}; + auto stage_target = hipFileSetParameterSizeT(hipFileParamExecutionMaxIOThreads, target); + + size_t staged; + auto get_staged = hipFileGetParameterSizeT(hipFileParamExecutionMaxIOThreads, &staged); + +#if defined(__HIP_PLATFORM_AMD__) + ASSERT_EQ(get_default, HipFileOpError(hipFileInternalError)); + ASSERT_EQ(stage_target, HipFileOpError(hipFileInternalError)); + ASSERT_EQ(get_staged, HipFileOpError(hipFileInternalError)); +#else + ASSERT_EQ(get_default, HIPFILE_SUCCESS); + ASSERT_NE(default_, target); + ASSERT_EQ(stage_target, HIPFILE_SUCCESS); + ASSERT_EQ(get_staged, HIPFILE_SUCCESS); + ASSERT_EQ(target, staged); +#endif +} + +TEST_F(HipFileConfig, SizeTParameterOpenAppliesValue) +{ + size_t default_; + auto get_default = hipFileGetParameterSizeT(hipFileParamExecutionMaxIOThreads, &default_); + + size_t target{10}; + auto stage_target = hipFileSetParameterSizeT(hipFileParamExecutionMaxIOThreads, target); + + auto driver_open = hipFileDriverOpen(); + + size_t applied; + auto get_applied = hipFileGetParameterSizeT(hipFileParamExecutionMaxIOThreads, &applied); + +#if defined(__HIP_PLATFORM_AMD__) + ASSERT_EQ(get_default, HipFileOpError(hipFileInternalError)); + ASSERT_EQ(stage_target, HipFileOpError(hipFileInternalError)); + ASSERT_EQ(driver_open, HIPFILE_SUCCESS); + ASSERT_EQ(get_applied, HipFileOpError(hipFileInternalError)); +#else + ASSERT_EQ(get_default, HIPFILE_SUCCESS); + ASSERT_NE(default_, target); + ASSERT_EQ(stage_target, HIPFILE_SUCCESS); + ASSERT_EQ(driver_open, HIPFILE_SUCCESS); + ASSERT_EQ(get_applied, HIPFILE_SUCCESS); + ASSERT_EQ(target, applied); +#endif +} + +TEST_F(HipFileConfig, SizeTParameterCloseClearsAppliedValue) +{ + size_t default_; + auto get_default = hipFileGetParameterSizeT(hipFileParamExecutionMaxIOThreads, &default_); + + size_t target{10}; + auto stage_target = hipFileSetParameterSizeT(hipFileParamExecutionMaxIOThreads, target); + + // Open applies staged value and clears staged + auto driver_open = hipFileDriverOpen(); + + // Close clears applied value + auto driver_close = hipFileDriverClose(); + + size_t cleared; + auto get_cleared = hipFileGetParameterSizeT(hipFileParamExecutionMaxIOThreads, &cleared); + +#if defined(__HIP_PLATFORM_AMD__) + ASSERT_EQ(get_default, HipFileOpError(hipFileInternalError)); + ASSERT_EQ(stage_target, HipFileOpError(hipFileInternalError)); + ASSERT_EQ(driver_open, HIPFILE_SUCCESS); + ASSERT_EQ(driver_close, HIPFILE_SUCCESS); + ASSERT_EQ(get_cleared, HipFileOpError(hipFileInternalError)); +#else + ASSERT_EQ(get_default, HIPFILE_SUCCESS); + ASSERT_NE(default_, target); + ASSERT_EQ(stage_target, HIPFILE_SUCCESS); + ASSERT_EQ(driver_open, HIPFILE_SUCCESS); + ASSERT_EQ(driver_close, HIPFILE_SUCCESS); + ASSERT_EQ(get_cleared, HIPFILE_SUCCESS); + ASSERT_EQ(default_, cleared); +#endif +} + +TEST_F(HipFileConfig, BoolParameterCantSetIfDriverOpen) +{ + ASSERT_EQ(hipFileDriverOpen(), HIPFILE_SUCCESS); + auto set_after_open = hipFileSetParameterBool(hipFileParamUsePcip2pdma, true); +#if defined(__HIP_PLATFORM_AMD__) + ASSERT_EQ(set_after_open, HipFileOpError(hipFileInternalError)); +#else + ASSERT_EQ(set_after_open, HipFileOpError(hipFileDriverAlreadyOpen)); +#endif +} + +TEST_F(HipFileConfig, BoolParameterGetDefault) +{ + bool default_; + auto get_default = hipFileGetParameterBool(hipFileParamUsePcip2pdma, &default_); +#if defined(__HIP_PLATFORM_AMD__) + ASSERT_EQ(get_default, HipFileOpError(hipFileInternalError)); +#else + ASSERT_EQ(get_default, HIPFILE_SUCCESS); + ASSERT_EQ(default_, false); +#endif +} + +TEST_F(HipFileConfig, BoolParameterSetStagesValue) +{ + bool default_; + auto get_default = hipFileGetParameterBool(hipFileParamUsePcip2pdma, &default_); + + constexpr bool target{true}; + auto stage_target = hipFileSetParameterBool(hipFileParamUsePcip2pdma, target); + + bool staged; + auto get_staged = hipFileGetParameterBool(hipFileParamUsePcip2pdma, &staged); + +#if defined(__HIP_PLATFORM_AMD__) + ASSERT_EQ(get_default, HipFileOpError(hipFileInternalError)); + ASSERT_EQ(stage_target, HipFileOpError(hipFileInternalError)); + ASSERT_EQ(get_staged, HipFileOpError(hipFileInternalError)); +#else + ASSERT_EQ(get_default, HIPFILE_SUCCESS); + ASSERT_NE(default_, target); + ASSERT_EQ(stage_target, HIPFILE_SUCCESS); + ASSERT_EQ(get_staged, HIPFILE_SUCCESS); + ASSERT_EQ(target, staged); +#endif +} + +TEST_F(HipFileConfig, BoolParameterOpenAppliesValue) +{ + bool default_; + auto get_default = hipFileGetParameterBool(hipFileParamUsePcip2pdma, &default_); + + constexpr bool target{true}; + auto stage_target = hipFileSetParameterBool(hipFileParamUsePcip2pdma, target); + + auto driver_open = hipFileDriverOpen(); + + bool applied; + auto get_applied = hipFileGetParameterBool(hipFileParamUsePcip2pdma, &applied); + +#if defined(__HIP_PLATFORM_AMD__) + ASSERT_EQ(get_default, HipFileOpError(hipFileInternalError)); + ASSERT_EQ(stage_target, HipFileOpError(hipFileInternalError)); + ASSERT_EQ(driver_open, HIPFILE_SUCCESS); + ASSERT_EQ(get_applied, HipFileOpError(hipFileInternalError)); +#else + ASSERT_EQ(get_default, HIPFILE_SUCCESS); + ASSERT_NE(default_, target); + ASSERT_EQ(stage_target, HIPFILE_SUCCESS); + ASSERT_EQ(driver_open, HIPFILE_SUCCESS); + ASSERT_EQ(get_applied, HIPFILE_SUCCESS); + ASSERT_EQ(target, applied); +#endif +} + +TEST_F(HipFileConfig, BoolParameterCloseClearsAppliedValue) +{ + bool default_; + auto get_default = hipFileGetParameterBool(hipFileParamUsePcip2pdma, &default_); + + constexpr bool target{true}; + auto stage_target = hipFileSetParameterBool(hipFileParamUsePcip2pdma, target); + + // Open applies staged value and clears staged + auto driver_open = hipFileDriverOpen(); + + // Close clears applied value + auto driver_close = hipFileDriverClose(); + + bool cleared; + auto get_cleared = hipFileGetParameterBool(hipFileParamUsePcip2pdma, &cleared); + +#if defined(__HIP_PLATFORM_AMD__) + ASSERT_EQ(get_default, HipFileOpError(hipFileInternalError)); + ASSERT_EQ(stage_target, HipFileOpError(hipFileInternalError)); + ASSERT_EQ(driver_open, HIPFILE_SUCCESS); + ASSERT_EQ(driver_close, HIPFILE_SUCCESS); + ASSERT_EQ(get_cleared, HipFileOpError(hipFileInternalError)); +#else + ASSERT_EQ(get_default, HIPFILE_SUCCESS); + ASSERT_NE(default_, target); + ASSERT_EQ(stage_target, HIPFILE_SUCCESS); + ASSERT_EQ(driver_open, HIPFILE_SUCCESS); + ASSERT_EQ(driver_close, HIPFILE_SUCCESS); + ASSERT_EQ(get_cleared, HIPFILE_SUCCESS); + ASSERT_EQ(default_, cleared); +#endif +} + +TEST_F(HipFileConfig, StringParameterCantSetIfDriverOpen) +{ + ASSERT_EQ(hipFileDriverOpen(), HIPFILE_SUCCESS); + auto set_after_open = hipFileSetParameterString(hipFileParamLogDir, "/foo/bar"); +#if defined(__HIP_PLATFORM_AMD__) + ASSERT_EQ(set_after_open, HipFileOpError(hipFileInternalError)); +#else + ASSERT_EQ(set_after_open, HipFileOpError(hipFileDriverAlreadyOpen)); +#endif +} + +TEST_F(HipFileConfig, StringParameterGetDefault) +{ + vector buffer(64); + + auto get_default = + hipFileGetParameterString(hipFileParamLogDir, buffer.data(), static_cast(buffer.size())); + string default_{buffer.data()}; + +#if defined(__HIP_PLATFORM_AMD__) + ASSERT_EQ(get_default, HipFileOpError(hipFileInternalError)); +#else + ASSERT_EQ(get_default, HIPFILE_SUCCESS); + ASSERT_EQ(default_, ""); +#endif +} + +TEST_F(HipFileConfig, StringParameterSetStagesValue) +{ + vector buffer(64); + + auto get_default = + hipFileGetParameterString(hipFileParamLogDir, buffer.data(), static_cast(buffer.size())); + string default_{buffer.data()}; + + const string target{"/tmp"}; + auto stage_target = hipFileSetParameterString(hipFileParamLogDir, target.c_str()); + + auto get_staged = + hipFileGetParameterString(hipFileParamLogDir, buffer.data(), static_cast(buffer.size())); + string staged{buffer.data()}; + +#if defined(__HIP_PLATFORM_AMD__) + ASSERT_EQ(get_default, HipFileOpError(hipFileInternalError)); + ASSERT_EQ(stage_target, HipFileOpError(hipFileInternalError)); + ASSERT_EQ(get_staged, HipFileOpError(hipFileInternalError)); +#else + ASSERT_EQ(get_default, HIPFILE_SUCCESS); + ASSERT_NE(default_, target); + ASSERT_EQ(stage_target, HIPFILE_SUCCESS); + ASSERT_EQ(get_staged, HIPFILE_SUCCESS); + ASSERT_EQ(target, staged); +#endif +} + +TEST_F(HipFileConfig, StringParameterOpenAppliesValue) +{ + vector buffer(64); + + auto get_default = + hipFileGetParameterString(hipFileParamLogDir, buffer.data(), static_cast(buffer.size())); + string default_{buffer.data()}; + + // The target value must specify a directory that exists otherwise it will not be applied when the driver + // is opened. + const string target{"/tmp"}; + auto stage_target = hipFileSetParameterString(hipFileParamLogDir, target.c_str()); + + auto driver_open = hipFileDriverOpen(); + + auto get_applied = + hipFileGetParameterString(hipFileParamLogDir, buffer.data(), static_cast(buffer.size())); + string applied{buffer.data()}; + +#if defined(__HIP_PLATFORM_AMD__) + ASSERT_EQ(get_default, HipFileOpError(hipFileInternalError)); + ASSERT_EQ(stage_target, HipFileOpError(hipFileInternalError)); + ASSERT_EQ(driver_open, HIPFILE_SUCCESS); + ASSERT_EQ(get_applied, HipFileOpError(hipFileInternalError)); +#else + ASSERT_EQ(get_default, HIPFILE_SUCCESS); + ASSERT_NE(default_, target); + ASSERT_EQ(stage_target, HIPFILE_SUCCESS); + ASSERT_EQ(driver_open, HIPFILE_SUCCESS); + ASSERT_EQ(get_applied, HIPFILE_SUCCESS); + ASSERT_EQ(target, applied); +#endif +} + +TEST_F(HipFileConfig, StringParameterCloseClearsAppliedValue) +{ + vector buffer(64); + + auto get_default = + hipFileGetParameterString(hipFileParamLogDir, buffer.data(), static_cast(buffer.size())); + string default_{buffer.data()}; + + // The target value must specify a directory that exists otherwise it will not be applied when the driver + // is opened. + const string target{"/tmp"}; + auto stage_target = hipFileSetParameterString(hipFileParamLogDir, target.c_str()); + + auto driver_open = hipFileDriverOpen(); + auto driver_close = hipFileDriverClose(); + + auto get_cleared = + hipFileGetParameterString(hipFileParamLogDir, buffer.data(), static_cast(buffer.size())); + string cleared{buffer.data()}; + +#if defined(__HIP_PLATFORM_AMD__) + ASSERT_EQ(get_default, HipFileOpError(hipFileInternalError)); + ASSERT_EQ(stage_target, HipFileOpError(hipFileInternalError)); + ASSERT_EQ(driver_open, HIPFILE_SUCCESS); + ASSERT_EQ(driver_close, HIPFILE_SUCCESS); + ASSERT_EQ(get_cleared, HipFileOpError(hipFileInternalError)); +#else + ASSERT_EQ(get_default, HIPFILE_SUCCESS); + ASSERT_NE(default_, target); + ASSERT_EQ(stage_target, HIPFILE_SUCCESS); + ASSERT_EQ(driver_open, HIPFILE_SUCCESS); + ASSERT_EQ(driver_close, HIPFILE_SUCCESS); + ASSERT_EQ(get_cleared, HIPFILE_SUCCESS); + ASSERT_EQ(default_, cleared); +#endif +} + +HIPFILE_WARN_NO_GLOBAL_CTOR_ON diff --git a/hipfile/test/system/driver.cpp b/hipfile/test/system/driver.cpp new file mode 100644 index 00000000..e87364dc --- /dev/null +++ b/hipfile/test/system/driver.cpp @@ -0,0 +1,606 @@ +/* Copyright (c) Advanced Micro Devices, Inc. All rights reserved. + * + * SPDX-License-Identifier: MIT + */ + +#include "hipfile-warnings.h" +#include "hipfile.h" +#include "test-common.h" +#include "test-shared-fixtures.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +HIPFILE_WARN_NO_GLOBAL_CTOR_OFF + +// hipFile APIs that trigger driver init/deinit. + +TEST_F(DriverInit, driverOpenIncrementsUseCount) +{ + for (auto i{0}; i < 10; i++) { + ASSERT_EQ(hipFileDriverOpen(), HIPFILE_SUCCESS); + ASSERT_EQ(hipFileUseCount(), i + 1); + } +} + +TEST_F(DriverInit, driverCloseDecrementsUseCount) +{ + auto count{10}; + for (auto i{0}; i < count; i++) { + ASSERT_EQ(hipFileDriverOpen(), HIPFILE_SUCCESS); + ASSERT_EQ(hipFileUseCount(), i + 1); + } + for (auto i{count}; 0 < i; i--) { + ASSERT_EQ(hipFileDriverClose(), HIPFILE_SUCCESS); + ASSERT_EQ(hipFileUseCount(), i - 1); + } +} + +TEST_F(DriverInit, hipFileHandleRegisterNullDescr) +{ + hipFileHandle_t handle; + ASSERT_EQ(hipFileHandleRegister(&handle, nullptr), HipFileOpError(hipFileInvalidValue)); + + // NVIDIA inits the driver, even when the parameters are garbage. We do not. + // We could mimic this, but it's probably a waste of time given that it's an + // edge case. +#if defined(__HIP_PLATFORM_AMD__) + ASSERT_EQ(hipFileUseCount(), 0); +#else + ASSERT_EQ(hipFileUseCount(), 1); +#endif +} + +TEST_F(DriverInit, hipFileHandleRegisterNullHandle) +{ + Tmpfile tmpfile; + + hipFileDescr_t descr{}; + descr.type = hipFileHandleTypeOpaqueFD; + descr.handle.fd = tmpfile.fd; + + ASSERT_EQ(hipFileHandleRegister(nullptr, &descr), HipFileOpError(hipFileInvalidValue)); + + // NVIDIA inits the driver, even when the parameters are garbage. We do not. + // We could mimic this, but it's probably a waste of time given that it's an + // edge case. +#if defined(__HIP_PLATFORM_AMD__) + ASSERT_EQ(hipFileUseCount(), 0); +#else + ASSERT_EQ(hipFileUseCount(), 1); +#endif +} + +TEST_F(DriverInit, hipFileHandleRegisterInitsDriver) +{ + Tmpfile tmpfile; + + hipFileDescr_t descr{}; + descr.type = hipFileHandleTypeOpaqueFD; + descr.handle.fd = tmpfile.fd; + + hipFileHandle_t handle; + ASSERT_EQ(hipFileHandleRegister(&handle, &descr), HIPFILE_SUCCESS); + ASSERT_EQ(hipFileUseCount(), 1); +} + +TEST_F(DriverInit, hipFileDriverOpenAfterHandleRegisterIncrementsUseCount) +{ + Tmpfile tmpfile; + + hipFileDescr_t descr{}; + descr.type = hipFileHandleTypeOpaqueFD; + descr.handle.fd = tmpfile.fd; + + hipFileHandle_t handle; + ASSERT_EQ(hipFileHandleRegister(&handle, &descr), HIPFILE_SUCCESS); + ASSERT_EQ(hipFileUseCount(), 1); + + ASSERT_EQ(hipFileDriverOpen(), HIPFILE_SUCCESS); + ASSERT_EQ(hipFileUseCount(), 2); +} + +TEST_F(DriverInit, hipFileHandleRegisterThreadedInitsDriverOnce) +{ + constexpr size_t count{64}; + std::vector tmpfiles(count); + std::vector threads; + std::vector descrs(count); + std::vector handles(count); + + for (size_t i{0}; i < count; i++) { + descrs[i].type = hipFileHandleTypeOpaqueFD; + descrs[i].handle.fd = tmpfiles[i].fd; + } + + for (size_t i{0}; i < count; i++) { + threads.emplace_back([i, &handles, &descrs] { + EXPECT_EQ(hipFileHandleRegister(&handles[i], &descrs[i]), HIPFILE_SUCCESS); + }); + } + + for (auto &t : threads) { + t.join(); + } + + ASSERT_EQ(hipFileUseCount(), 1); + + for (size_t i{0}; i < count; i++) { + hipFileHandleDeregister(handles[i]); + } +} + +TEST_F(DriverInit, hipFileDriverCloseDeregisteresHandle) +{ + Tmpfile tmpfile; + hipFileHandle_t handle{}; + hipFileDescr_t descr{}; + + descr.type = hipFileHandleTypeOpaqueFD; + descr.handle.fd = tmpfile.fd; + + ASSERT_EQ(hipFileHandleRegister(&handle, &descr), HIPFILE_SUCCESS); + ASSERT_EQ(hipFileHandleRegister(&handle, &descr), HipFileOpError(hipFileHandleAlreadyRegistered)); + ASSERT_EQ(hipFileDriverClose(), HIPFILE_SUCCESS); + ASSERT_EQ(hipFileHandleRegister(&handle, &descr), HIPFILE_SUCCESS); +} + +TEST_F(DriverInit, hipFileReadAsync) +{ + ASSERT_EQ(hipFileReadAsync(nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr), + HipFileOpError(hipFileInvalidValue)); + ASSERT_EQ(hipFileUseCount(), 1); +} + +TEST_F(DriverInit, hipFileWriteAsync) +{ + ASSERT_EQ(hipFileWriteAsync(nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr), + HipFileOpError(hipFileInvalidValue)); + ASSERT_EQ(hipFileUseCount(), 1); +} + +// hipFile APIs that do not trigger driver init/deinit + +TEST_F(DriverNoInit, hipFileDriverCloseReturnsNotInitIfDriverNotOpened) +{ + ASSERT_EQ(hipFileDriverClose(), HipFileOpError(hipFileDriverNotInitialized)); +} + +TEST_F(DriverNoInit, hipFileBatchIOSetUp) +{ + hipFileBatchHandle_t handle; +#ifdef __HIP_PLATFORM_AMD__ + ASSERT_EQ(hipFileBatchIOSetUp(&handle, 1), HipFileOpError(hipFileSuccess)); +#else + // CU_FILE_INTERNAL_ERROR returned if this API is called prior to the driver being opened. + ASSERT_EQ(hipFileBatchIOSetUp(&handle, 1), HipFileOpError(hipFileInternalError)); +#endif +} + +TEST_F(DriverNoInit, hipFileBatchIOSubmitNullArgs) +{ +#ifdef __HIP_PLATFORM_AMD__ + ASSERT_EQ(hipFileBatchIOSubmit(nullptr, 0, nullptr, 0), HipFileOpError(hipFileInvalidValue)); +#else + ASSERT_EQ(hipFileBatchIOSubmit(nullptr, 0, nullptr, 0), HipFileOpError(hipFileInternalError)); +#endif +} + +TEST_F(DriverNoInit, hipFileBatchIOSubmit) +{ + hipFileBatchHandle_t handle{}; + hipFileIOParams_t param{}; + + ASSERT_EQ(hipFileBatchIOSubmit(handle, 1, ¶m, 0), HipFileOpError(hipFileInternalError)); +} + +TEST_F(DriverNoInit, hipFileBatchIOGetStatusNullArgs) +{ + ASSERT_EQ(hipFileBatchIOGetStatus(nullptr, 0, nullptr, nullptr, nullptr), + HipFileOpError(hipFileInternalError)); +} + +TEST_F(DriverNoInit, hipFileBatchIOGetStatus) +{ + hipFileBatchHandle_t handle{}; + hipFileIOEvents_t event{}; + unsigned nr{1}; + struct timespec ts { + 0, 0 + }; + + ASSERT_EQ(hipFileBatchIOGetStatus(handle, 0, &nr, &event, &ts), HipFileOpError(hipFileInternalError)); +} + +TEST_F(DriverNoInit, hipFileBatchIOCancelNullArgs) +{ +#ifdef __HIP_PLATFORM_AMD__ // Not implemented on AMD + ASSERT_EQ(hipFileBatchIOCancel(nullptr), HipFileOpError(hipFileInternalError)); +#else + ASSERT_EQ(hipFileBatchIOCancel(nullptr), HIPFILE_SUCCESS); +#endif +} + +TEST_F(DriverNoInit, hipFileBatchIOCancel) +{ + hipFileBatchHandle_t handle{}; + +#ifdef __HIP_PLATFORM_AMD__ // Not implemented on AMD + ASSERT_EQ(hipFileBatchIOCancel(handle), HipFileOpError(hipFileInternalError)); +#else + ASSERT_EQ(hipFileBatchIOCancel(handle), HIPFILE_SUCCESS); // Weird +#endif +} + +TEST_F(DriverNoInit, hipFileBatchIODestroy) +{ + hipFileBatchHandle_t handle{}; + + hipFileBatchIODestroy(handle); +} + +TEST_F(DriverNoInit, hipFileGetVersion) +{ + unsigned major = UINT_MAX; + unsigned minor = UINT_MAX; + unsigned patch = UINT_MAX; + ASSERT_EQ(hipFileGetVersion(&major, &minor, &patch), HIPFILE_SUCCESS); + + int version = -1; + ASSERT_EQ(hipFileGetBackendVersion(&version), HIPFILE_SUCCESS); +} + +TEST_F(DriverNoInit, hipFileGetParameterSizeT) +{ + size_t value; +#ifdef __HIP_PLATFORM_AMD__ // Not implemented on AMD + ASSERT_EQ(hipFileGetParameterSizeT(hipFileParamProfileStats, &value), + HipFileOpError(hipFileInternalError)); +#else + ASSERT_EQ(hipFileGetParameterSizeT(hipFileParamProfileStats, &value), HIPFILE_SUCCESS); +#endif +} + +TEST_F(DriverNoInit, hipFileGetParameterBool) +{ + bool value; +#ifdef __HIP_PLATFORM_AMD__ // Not implemented on AMD + ASSERT_EQ(hipFileGetParameterBool(hipFileParamUsePcip2pdma, &value), + HipFileOpError(hipFileInternalError)); +#else + ASSERT_EQ(hipFileGetParameterBool(hipFileParamUsePcip2pdma, &value), HIPFILE_SUCCESS); +#endif +} + +TEST_F(DriverNoInit, hipFileGetParameterString) +{ + vector buffer(64); +#ifdef __HIP_PLATFORM_AMD__ // Not implemented on AMD + ASSERT_EQ(hipFileGetParameterString(hipFileParamLogDir, buffer.data(), static_cast(buffer.size())), + HipFileOpError(hipFileInternalError)); +#else + ASSERT_EQ(hipFileGetParameterString(hipFileParamLogDir, buffer.data(), static_cast(buffer.size())), + HIPFILE_SUCCESS); +#endif +} + +TEST_F(DriverNoInit, hipFileSetParameterSizeT) +{ +#ifdef __HIP_PLATFORM_AMD__ // Not implemented on AMD + ASSERT_EQ(hipFileSetParameterSizeT(hipFileParamProfileStats, 1), HipFileOpError(hipFileInternalError)); +#else + ASSERT_EQ(hipFileSetParameterSizeT(hipFileParamProfileStats, 1), HIPFILE_SUCCESS); +#endif +} + +TEST_F(DriverNoInit, hipFileSetParameterBool) +{ +#ifdef __HIP_PLATFORM_AMD__ // Not implemented on AMD + ASSERT_EQ(hipFileSetParameterBool(hipFileParamUsePcip2pdma, false), HipFileOpError(hipFileInternalError)); +#else + ASSERT_EQ(hipFileSetParameterBool(hipFileParamUsePcip2pdma, false), HIPFILE_SUCCESS); +#endif +} + +TEST_F(DriverNoInit, hipFileSetParameterString) +{ +#ifdef __HIP_PLATFORM_AMD__ // Not implemented on AMD + ASSERT_EQ(hipFileSetParameterString(hipFileParamLogDir, "/tmp"), HipFileOpError(hipFileInternalError)); +#else + ASSERT_EQ(hipFileSetParameterString(hipFileParamLogDir, "/tmp"), HIPFILE_SUCCESS); +#endif +} + +TEST_F(DriverNoInit, hipFileBufDeregister) +{ + EXPECT_EQ(hipFileBufDeregister(reinterpret_cast(0x1)), HipFileOpError(hipFileDriverClosing)); +} + +TEST_F(DriverNoInit, hipFileHandleDeregister) +{ + hipFileHandleDeregister(reinterpret_cast(0x1)); +} + +TEST_F(DriverNoInit, hipFileRead) +{ + vector buffer(64); + hipFileHandle_t handle{reinterpret_cast(0xCAFEBABE)}; + + errno = 0; + ASSERT_EQ(hipFileRead(handle, buffer.data(), buffer.size(), 0, 0), -1); + ASSERT_EQ(errno, EINVAL); +} + +TEST_F(DriverNoInit, hipFileWrite) +{ + vector buffer(64); + hipFileHandle_t handle{reinterpret_cast(0xCAFEBABE)}; + + errno = 0; + ASSERT_EQ(hipFileWrite(handle, buffer.data(), buffer.size(), 0, 0), -1); + ASSERT_EQ(errno, EINVAL); +} + +// DriverNotReallyNoInit tests API functions that are not supposed to +// initialize the driver but they have some side effect (in cuFile) that makes +// hipFileSetParameterSizeT/hipFileSetParameterBool/hipFileSetParameterString +// return hipFileDriverAlreadyOpen. They are split out from DriverNoInit tests +// because the driver needs to be cycled to clear out driver state. Cycling the +// driver is time consuming. +struct DriverNotReallyNoInit : public DriverNoInit { + + void SetUp() override + { + ASSERT_EQ(hipFileUseCount(), 0); + ASSERT_EQ(hipFileDriverClose(), HipFileOpError(hipFileDriverNotInitialized)); + } + + void TearDown() override + { + ASSERT_EQ(hipFileUseCount(), 0); + ASSERT_EQ(hipFileDriverClose(), HipFileOpError(hipFileDriverNotInitialized)); + +#ifdef __HIP_PLATFORM_NVIDIA__ + // Workaround: Open and close the driver to clear the state that these API functions set + ASSERT_EQ(hipFileDriverOpen(), HIPFILE_SUCCESS); + ASSERT_EQ(hipFileDriverClose(), HIPFILE_SUCCESS); +#endif + + ASSERT_EQ(hipFileUseCount(), 0); + ASSERT_EQ(hipFileDriverClose(), HipFileOpError(hipFileDriverNotInitialized)); + } +}; + +TEST_F(DriverNotReallyNoInit, hipFileDriverGetPropertiesNullArgs) +{ +#ifdef __HIP_PLATFORM_AMD__ // Not implemented + ASSERT_EQ(hipFileDriverGetProperties(nullptr), HipFileOpError(hipFileInternalError)); +#else + ASSERT_EQ(hipFileDriverGetProperties(nullptr), HipFileOpError(hipFileInvalidValue)); +#endif +} + +TEST_F(DriverNotReallyNoInit, hipFileDriverGetProperties) +{ + hipFileDriverProps_t props; + +#ifdef __HIP_PLATFORM_AMD__ // Not implemented + ASSERT_EQ(hipFileDriverGetProperties(&props), HipFileOpError(hipFileInternalError)); +#else + ASSERT_EQ(hipFileDriverGetProperties(&props), HIPFILE_SUCCESS); +#endif +} + +TEST_F(DriverNotReallyNoInit, hipFileDriverSetPollMode) +{ +#ifdef __HIP_PLATFORM_AMD__ // Not implemented + ASSERT_EQ(hipFileDriverSetPollMode(true, 4096), HipFileOpError(hipFileInternalError)); +#else + ASSERT_EQ(hipFileDriverSetPollMode(true, 4096), HIPFILE_SUCCESS); +#endif +} + +TEST_F(DriverNotReallyNoInit, hipFileDriverSetMaxDirectIOSize) +{ +#ifdef __HIP_PLATFORM_AMD__ // Not implemented + ASSERT_EQ(hipFileDriverSetMaxDirectIOSize(16 * 1024), HipFileOpError(hipFileInternalError)); +#else + ASSERT_EQ(hipFileDriverSetMaxDirectIOSize(16 * 1024), HIPFILE_SUCCESS); +#endif +} + +TEST_F(DriverNotReallyNoInit, hipFileDriverSetMaxCacheSize) +{ +#ifdef __HIP_PLATFORM_AMD__ // Not implemented + ASSERT_EQ(hipFileDriverSetMaxCacheSize(16 * 1024), HipFileOpError(hipFileInternalError)); +#else + ASSERT_EQ(hipFileDriverSetMaxCacheSize(16 * 1024), HIPFILE_SUCCESS); +#endif +} + +TEST_F(DriverNotReallyNoInit, hipFileDriverSetMaxPinnedMemSize) +{ +#ifdef __HIP_PLATFORM_AMD__ // Not implemented + ASSERT_EQ(hipFileDriverSetMaxPinnedMemSize(32 * 1024), HipFileOpError(hipFileInternalError)); +#else + ASSERT_EQ(hipFileDriverSetMaxPinnedMemSize(32 * 1024), HIPFILE_SUCCESS); +#endif +} + +// hipFile APIs that trigger driver init/deinit. +// These call into the HIP driver. +TEST_F(DriverInit, hipFileBufRegisterNullptrInitsDriver) +{ + ASSERT_EQ(hipFileBufRegister(nullptr, 4096, 0), HipFileOpError(hipFileInvalidValue)); + ASSERT_EQ(hipFileUseCount(), 1); +} + +TEST_F(DriverInit, hipFileBufRegisterInitsDriver) +{ + size_t bufsz{4096}; + void *buf{nullptr}; + + ASSERT_EQ(hipMalloc(&buf, bufsz), hipSuccess); + ASSERT_EQ(hipFileBufRegister(buf, bufsz, 0), HIPFILE_SUCCESS); + ASSERT_EQ(hipFileUseCount(), 1); + ASSERT_EQ(hipFileBufDeregister(buf), HIPFILE_SUCCESS); + ASSERT_EQ(hipFree(buf), hipSuccess); +} + +TEST_F(DriverInit, hipFileDriverOpenAfterBufRegisterIncrementsUseCount) +{ + size_t bufsz{4096}; + void *buf{nullptr}; + + ASSERT_EQ(hipMalloc(&buf, bufsz), hipSuccess); + EXPECT_EQ(hipFileBufRegister(buf, bufsz, 0), HIPFILE_SUCCESS); + EXPECT_EQ(hipFileUseCount(), 1); + + ASSERT_EQ(hipFileDriverOpen(), HIPFILE_SUCCESS); + EXPECT_EQ(hipFileUseCount(), 2); + + ASSERT_EQ(hipFileBufDeregister(buf), HIPFILE_SUCCESS); + ASSERT_EQ(hipFree(buf), hipSuccess); +} + +TEST_F(DriverInit, hipFileBufRegisterThreadedInitsDriverOnce) +{ + constexpr size_t count{64}; + constexpr size_t bufsz{4096}; + std::vector threads; + std::vector buffers(count); + + for (size_t i{0}; i < count; i++) { + threads.emplace_back([i, &buffers] { + // Need to allocate in the same thread that we register in + // otherwise hipFileBufRegister returns CUDA_ERROR_INVALID_CONTEXT + // on NVIDIA + ASSERT_EQ(hipMalloc(&buffers[i], bufsz), hipSuccess); + EXPECT_EQ(hipFileBufRegister(buffers[i], bufsz, 0), HIPFILE_SUCCESS); + }); + } + + for (auto &t : threads) { + t.join(); + } + + ASSERT_EQ(hipFileUseCount(), 1); + + for (size_t i{0}; i < count; i++) { + EXPECT_EQ(hipFileBufDeregister(buffers[i]), HIPFILE_SUCCESS); + ASSERT_EQ(hipFree(buffers[i]), hipSuccess); + } +} + +TEST_F(DriverInit, hipFileDriverCloseDeregistersBuffer) +{ + size_t bufsz{4096}; + void *buf{nullptr}; + + ASSERT_EQ(hipMalloc(&buf, bufsz), hipSuccess); + ASSERT_EQ(hipFileBufRegister(buf, bufsz, 0), HIPFILE_SUCCESS); + ASSERT_EQ(hipFileBufRegister(buf, bufsz, 0), HipFileOpError(hipFileMemoryAlreadyRegistered)); + ASSERT_EQ(hipFileDriverClose(), HIPFILE_SUCCESS); + ASSERT_EQ(hipFileBufRegister(buf, bufsz, 0), HIPFILE_SUCCESS); + ASSERT_EQ(hipFree(buf), hipSuccess); +} + +TEST_F(DriverInit, hipFileStream_register_correct_flags_returns_success) +{ + hipStream_t hip_stream; + ASSERT_EQ(hipStreamCreate(&hip_stream), hipSuccess); + ASSERT_EQ(hipFileStreamRegister(hip_stream, HIPFILE_STREAM_FLAGS_MASK), HIPFILE_SUCCESS); +} + +TEST_F(DriverInit, hipFileStream_register_then_deregister_returns_success) +{ + hipStream_t hip_stream; + ASSERT_EQ(hipStreamCreate(&hip_stream), hipSuccess); + ASSERT_EQ(hipFileStreamRegister(hip_stream, HIPFILE_STREAM_FLAGS_MASK), HIPFILE_SUCCESS); + ASSERT_EQ(hipFileStreamDeregister(hip_stream), HIPFILE_SUCCESS); +} + +TEST_F(DriverInit, hipFileStream_register_incorrect_flags_returns_error) +{ + hipStream_t hip_stream; + + ASSERT_EQ(hipStreamCreate(&hip_stream), hipSuccess); +#ifdef __HIP_PLATFORM_AMD__ + ASSERT_EQ(hipFileStreamRegister(hip_stream, HIPFILE_STREAM_FLAGS_MASK + 1), + HipFileOpError(hipFileInvalidValue)); +#else + ASSERT_EQ(hipFileStreamRegister(hip_stream, HIPFILE_STREAM_FLAGS_MASK + 1), HIPFILE_SUCCESS); +#endif +} + +TEST_F(DriverInit, hipFileStream_register_twice_returns_error) +{ + hipStream_t hip_stream; + ASSERT_EQ(hipStreamCreate(&hip_stream), hipSuccess); + ASSERT_EQ(hipFileStreamRegister(hip_stream, HIPFILE_STREAM_FLAGS_MASK), HIPFILE_SUCCESS); + ASSERT_EQ(hipFileStreamRegister(hip_stream, HIPFILE_STREAM_FLAGS_MASK), + HipFileOpError(hipFileInvalidValue)); +} + +TEST_F(DriverInit, hipFileStream_deregister_twice_returns_error) +{ + hipStream_t hip_stream; + ASSERT_EQ(hipStreamCreate(&hip_stream), hipSuccess); + ASSERT_EQ(hipFileStreamRegister(hip_stream, HIPFILE_STREAM_FLAGS_MASK), HIPFILE_SUCCESS); + ASSERT_EQ(hipFileStreamDeregister(hip_stream), HIPFILE_SUCCESS); + ASSERT_EQ(hipFileStreamDeregister(hip_stream), HipFileOpError(hipFileInvalidValue)); +} + +TEST_F(DriverInit, hipFileStream_deregister_invalid_stream_returns_error) +{ + hipStream_t hip_stream = reinterpret_cast(1); + ASSERT_EQ(hipFileStreamDeregister(hip_stream), HipFileOpError(hipFileInvalidValue)); +} + +// hipFile APIs that do not trigger driver init/deinit +// These call into the HIP driver. +TEST_F(DriverNoInit, hipFileStreamRegister) +{ + hipStream_t stream; + + ASSERT_EQ(hipStreamCreate(&stream), hipSuccess); + ASSERT_EQ(hipFileStreamRegister(stream, 0), HIPFILE_SUCCESS); + + ASSERT_EQ(hipFileUseCount(), 0); + + // Cleanup + ASSERT_EQ(hipFileStreamDeregister(stream), HIPFILE_SUCCESS); + ASSERT_EQ(hipStreamDestroy(stream), hipSuccess); +} + +TEST_F(DriverNoInit, hipFileStreamRegister_register_and_deregister_default_stream_works) +{ + ASSERT_EQ(hipFileStreamRegister(nullptr, 0), HIPFILE_SUCCESS); + ASSERT_EQ(hipFileStreamDeregister(nullptr), HIPFILE_SUCCESS); +} + +TEST_F(DriverNoInit, hipFileStreamDeregisterStream) +{ + hipStream_t stream; + + ASSERT_EQ(hipStreamCreate(&stream), hipSuccess); + ASSERT_EQ(hipFileStreamRegister(stream, 0), HIPFILE_SUCCESS); + + ASSERT_EQ(hipFileUseCount(), 0); + + ASSERT_EQ(hipFileStreamDeregister(stream), HIPFILE_SUCCESS); + + ASSERT_EQ(hipFileUseCount(), 0); + + ASSERT_EQ(hipStreamDestroy(stream), hipSuccess); +} + +HIPFILE_WARN_NO_GLOBAL_CTOR_ON diff --git a/hipfile/test/system/system.cpp b/hipfile/test/system/system.cpp deleted file mode 100644 index c65086a4..00000000 --- a/hipfile/test/system/system.cpp +++ /dev/null @@ -1,188 +0,0 @@ -/* Copyright (c) Advanced Micro Devices, Inc. All rights reserved. - * - * SPDX-License-Identifier: MIT - */ - -#include "hipfile.h" -#include "hipfile-warnings.h" -#include "test-common.h" -#include "test-shared-fixtures.h" - -#include -#include - -#include -#include -#include - -HIPFILE_WARN_NO_GLOBAL_CTOR_OFF - -// hipFile APIs that trigger driver init/deinit. -// These call into the HIP driver. -TEST_F(DriverInit, hipFileBufRegisterNullptrInitsDriver) -{ - ASSERT_EQ(hipFileBufRegister(nullptr, 4096, 0), HipFileOpError(hipFileInvalidValue)); - ASSERT_EQ(hipFileUseCount(), 1); -} - -TEST_F(DriverInit, hipFileBufRegisterInitsDriver) -{ - size_t bufsz{4096}; - void *buf{nullptr}; - - ASSERT_EQ(hipMalloc(&buf, bufsz), hipSuccess); - ASSERT_EQ(hipFileBufRegister(buf, bufsz, 0), HIPFILE_SUCCESS); - ASSERT_EQ(hipFileUseCount(), 1); - ASSERT_EQ(hipFileBufDeregister(buf), HIPFILE_SUCCESS); - ASSERT_EQ(hipFree(buf), hipSuccess); -} - -TEST_F(DriverInit, hipFileDriverOpenAfterBufRegisterIncrementsUseCount) -{ - size_t bufsz{4096}; - void *buf{nullptr}; - - ASSERT_EQ(hipMalloc(&buf, bufsz), hipSuccess); - EXPECT_EQ(hipFileBufRegister(buf, bufsz, 0), HIPFILE_SUCCESS); - EXPECT_EQ(hipFileUseCount(), 1); - - ASSERT_EQ(hipFileDriverOpen(), HIPFILE_SUCCESS); - EXPECT_EQ(hipFileUseCount(), 2); - - ASSERT_EQ(hipFileBufDeregister(buf), HIPFILE_SUCCESS); - ASSERT_EQ(hipFree(buf), hipSuccess); -} - -TEST_F(DriverInit, hipFileBufRegisterThreadedInitsDriverOnce) -{ - constexpr size_t count{64}; - constexpr size_t bufsz{4096}; - std::vector threads; - std::vector buffers(count); - - for (size_t i{0}; i < count; i++) { - threads.emplace_back([i, &buffers] { - // Need to allocate in the same thread that we register in - // otherwise hipFileBufRegister returns CUDA_ERROR_INVALID_CONTEXT - // on NVIDIA - ASSERT_EQ(hipMalloc(&buffers[i], bufsz), hipSuccess); - EXPECT_EQ(hipFileBufRegister(buffers[i], bufsz, 0), HIPFILE_SUCCESS); - }); - } - - for (auto &t : threads) { - t.join(); - } - - ASSERT_EQ(hipFileUseCount(), 1); - - for (size_t i{0}; i < count; i++) { - EXPECT_EQ(hipFileBufDeregister(buffers[i]), HIPFILE_SUCCESS); - ASSERT_EQ(hipFree(buffers[i]), hipSuccess); - } -} - -TEST_F(DriverInit, hipFileDriverCloseDeregistersBuffer) -{ - size_t bufsz{4096}; - void *buf{nullptr}; - - ASSERT_EQ(hipMalloc(&buf, bufsz), hipSuccess); - ASSERT_EQ(hipFileBufRegister(buf, bufsz, 0), HIPFILE_SUCCESS); - ASSERT_EQ(hipFileBufRegister(buf, bufsz, 0), HipFileOpError(hipFileMemoryAlreadyRegistered)); - ASSERT_EQ(hipFileDriverClose(), HIPFILE_SUCCESS); - ASSERT_EQ(hipFileBufRegister(buf, bufsz, 0), HIPFILE_SUCCESS); - ASSERT_EQ(hipFree(buf), hipSuccess); -} - -TEST_F(DriverInit, hipFileStream_register_correct_flags_returns_success) -{ - hipStream_t hip_stream; - ASSERT_EQ(hipStreamCreate(&hip_stream), hipSuccess); - ASSERT_EQ(hipFileStreamRegister(hip_stream, HIPFILE_STREAM_FLAGS_MASK), HIPFILE_SUCCESS); -} - -TEST_F(DriverInit, hipFileStream_register_then_deregister_returns_success) -{ - hipStream_t hip_stream; - ASSERT_EQ(hipStreamCreate(&hip_stream), hipSuccess); - ASSERT_EQ(hipFileStreamRegister(hip_stream, HIPFILE_STREAM_FLAGS_MASK), HIPFILE_SUCCESS); - ASSERT_EQ(hipFileStreamDeregister(hip_stream), HIPFILE_SUCCESS); -} - -TEST_F(DriverInit, hipFileStream_register_incorrect_flags_returns_error) -{ - hipStream_t hip_stream; - - ASSERT_EQ(hipStreamCreate(&hip_stream), hipSuccess); -#ifdef __HIP_PLATFORM_AMD__ - ASSERT_EQ(hipFileStreamRegister(hip_stream, HIPFILE_STREAM_FLAGS_MASK + 1), - HipFileOpError(hipFileInvalidValue)); -#else - ASSERT_EQ(hipFileStreamRegister(hip_stream, HIPFILE_STREAM_FLAGS_MASK + 1), HIPFILE_SUCCESS); -#endif -} - -TEST_F(DriverInit, hipFileStream_register_twice_returns_error) -{ - hipStream_t hip_stream; - ASSERT_EQ(hipStreamCreate(&hip_stream), hipSuccess); - ASSERT_EQ(hipFileStreamRegister(hip_stream, HIPFILE_STREAM_FLAGS_MASK), HIPFILE_SUCCESS); - ASSERT_EQ(hipFileStreamRegister(hip_stream, HIPFILE_STREAM_FLAGS_MASK), - HipFileOpError(hipFileInvalidValue)); -} - -TEST_F(DriverInit, hipFileStream_deregister_twice_returns_error) -{ - hipStream_t hip_stream; - ASSERT_EQ(hipStreamCreate(&hip_stream), hipSuccess); - ASSERT_EQ(hipFileStreamRegister(hip_stream, HIPFILE_STREAM_FLAGS_MASK), HIPFILE_SUCCESS); - ASSERT_EQ(hipFileStreamDeregister(hip_stream), HIPFILE_SUCCESS); - ASSERT_EQ(hipFileStreamDeregister(hip_stream), HipFileOpError(hipFileInvalidValue)); -} - -TEST_F(DriverInit, hipFileStream_deregister_invalid_stream_returns_error) -{ - hipStream_t hip_stream = reinterpret_cast(1); - ASSERT_EQ(hipFileStreamDeregister(hip_stream), HipFileOpError(hipFileInvalidValue)); -} - -// hipFile APIs that do not trigger driver init/deinit -// These call into the HIP driver. -TEST_F(DriverNoInit, hipFileStreamRegister) -{ - hipStream_t stream; - - ASSERT_EQ(hipStreamCreate(&stream), hipSuccess); - ASSERT_EQ(hipFileStreamRegister(stream, 0), HIPFILE_SUCCESS); - - ASSERT_EQ(hipFileUseCount(), 0); - - // Cleanup - ASSERT_EQ(hipFileStreamDeregister(stream), HIPFILE_SUCCESS); - ASSERT_EQ(hipStreamDestroy(stream), hipSuccess); -} - -TEST_F(DriverNoInit, hipFileStreamRegister_register_and_deregister_default_stream_works) -{ - ASSERT_EQ(hipFileStreamRegister(nullptr, 0), HIPFILE_SUCCESS); - ASSERT_EQ(hipFileStreamDeregister(nullptr), HIPFILE_SUCCESS); -} - -TEST_F(DriverNoInit, hipFileStreamDeregisterStream) -{ - hipStream_t stream; - - ASSERT_EQ(hipStreamCreate(&stream), hipSuccess); - ASSERT_EQ(hipFileStreamRegister(stream, 0), HIPFILE_SUCCESS); - - ASSERT_EQ(hipFileUseCount(), 0); - - ASSERT_EQ(hipFileStreamDeregister(stream), HIPFILE_SUCCESS); - - ASSERT_EQ(hipFileUseCount(), 0); - - ASSERT_EQ(hipStreamDestroy(stream), hipSuccess); -} - -HIPFILE_WARN_NO_GLOBAL_CTOR_OFF diff --git a/hipfile/test/system/version.cpp b/hipfile/test/system/version.cpp new file mode 100644 index 00000000..bfc6c215 --- /dev/null +++ b/hipfile/test/system/version.cpp @@ -0,0 +1,43 @@ +/* Copyright (c) Advanced Micro Devices, Inc. All rights reserved. + * + * SPDX-License-Identifier: MIT + */ + +#include "hipfile.h" +#include "hipfile-warnings.h" +#include "test-common.h" + +#include + +HIPFILE_WARN_NO_GLOBAL_CTOR_OFF + +TEST(HipFileVersioning, Get) +{ + unsigned major = UINT_MAX; + unsigned minor = UINT_MAX; + unsigned patch = UINT_MAX; + + // Check for correct values + ASSERT_EQ(hipFileGetVersion(&major, &minor, &patch), HIPFILE_SUCCESS); + ASSERT_EQ(major, HIPFILE_VERSION_MAJOR); + ASSERT_EQ(minor, HIPFILE_VERSION_MINOR); + ASSERT_EQ(patch, HIPFILE_VERSION_PATCH); + + // NULL pointers should NOT produce errors + ASSERT_EQ(hipFileGetVersion(nullptr, nullptr, nullptr), HIPFILE_SUCCESS); + + // hipFileGetBackendVersion() succeeds and returns a value >= 0 + // + // We can't reliably predict what the version number will be for + // an arbitrary library, but it probably won't be negative and + // checking for >= 0 ensures the -1 initialization value is + // overwritten. + int backend_version = -1; + ASSERT_EQ(hipFileGetBackendVersion(&backend_version), HIPFILE_SUCCESS); + ASSERT_GE(backend_version, 0); + + // NULL pointer returns correct error + ASSERT_EQ(hipFileGetBackendVersion(nullptr), HipFileOpError(hipFileInvalidValue)); +} + +HIPFILE_WARN_NO_GLOBAL_CTOR_ON From 7bf2e7607216b3a4063b84de5c17d5eb5ac6ec23 Mon Sep 17 00:00:00 2001 From: Jordan Patterson Date: Tue, 21 Oct 2025 18:14:20 -0400 Subject: [PATCH 2/6] hipFile: Depend on Boost program_options for tests. --- hipfile/test/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/hipfile/test/CMakeLists.txt b/hipfile/test/CMakeLists.txt index 4c28f5ab..0b6866d6 100644 --- a/hipfile/test/CMakeLists.txt +++ b/hipfile/test/CMakeLists.txt @@ -4,6 +4,7 @@ include(AISAddExecutable) include(AISUseGTest) +find_package(Boost COMPONENTS program_options REQUIRED) set(SHARED_SOURCE_FILES "${CMAKE_SOURCE_DIR}/shared/test/magic-word.cpp" From d44eeb856c5711c9c7f596e7b032a19e44de02ac Mon Sep 17 00:00:00 2001 From: Jordan Patterson Date: Mon, 27 Oct 2025 15:15:03 -0400 Subject: [PATCH 3/6] hipFile: Add --ais-capable-dir argument to hipfile system tests. --- hipfile/test/CMakeLists.txt | 3 ++- hipfile/test/system/driver.cpp | 16 +++++++++++----- hipfile/test/system/main.cpp | 26 ++++++++++++++++++++++++++ hipfile/test/system/main.h | 12 ++++++++++++ hipfile/test/test-common.h | 11 +++++++++++ shared/test-options.h | 27 +++++++++++++++++++++++++++ 6 files changed, 89 insertions(+), 6 deletions(-) create mode 100644 hipfile/test/system/main.cpp create mode 100644 hipfile/test/system/main.h create mode 100644 shared/test-options.h diff --git a/hipfile/test/CMakeLists.txt b/hipfile/test/CMakeLists.txt index 0b6866d6..1b06316a 100644 --- a/hipfile/test/CMakeLists.txt +++ b/hipfile/test/CMakeLists.txt @@ -27,6 +27,7 @@ set(SYSTEM_TEST_SOURCE_FILES system/buffer.cpp system/config.cpp system/driver.cpp + system/main.cpp system/version.cpp ) @@ -70,7 +71,7 @@ ais_add_executable( SYSINCLS ${TEST_SYSINCLS} ) target_link_libraries(hipfile_system_tests PRIVATE GTest::gtest) -target_link_libraries(hipfile_system_tests PRIVATE GTest::gtest_main) +target_link_libraries(hipfile_system_tests PRIVATE Boost::program_options) if(CMAKE_HIP_PLATFORM STREQUAL "amd") target_link_libraries(hipfile_system_tests PRIVATE rocfile_shared) endif() diff --git a/hipfile/test/system/driver.cpp b/hipfile/test/system/driver.cpp index e87364dc..8ef4033b 100644 --- a/hipfile/test/system/driver.cpp +++ b/hipfile/test/system/driver.cpp @@ -6,6 +6,7 @@ #include "hipfile-warnings.h" #include "hipfile.h" #include "test-common.h" +#include "test-options.h" #include "test-shared-fixtures.h" #include @@ -19,6 +20,8 @@ using namespace std; +extern SystemTestOptions test_env; + HIPFILE_WARN_NO_GLOBAL_CTOR_OFF // hipFile APIs that trigger driver init/deinit. @@ -61,7 +64,7 @@ TEST_F(DriverInit, hipFileHandleRegisterNullDescr) TEST_F(DriverInit, hipFileHandleRegisterNullHandle) { - Tmpfile tmpfile; + Tmpfile tmpfile{test_env.ais_capable_dir}; hipFileDescr_t descr{}; descr.type = hipFileHandleTypeOpaqueFD; @@ -81,7 +84,7 @@ TEST_F(DriverInit, hipFileHandleRegisterNullHandle) TEST_F(DriverInit, hipFileHandleRegisterInitsDriver) { - Tmpfile tmpfile; + Tmpfile tmpfile{test_env.ais_capable_dir}; hipFileDescr_t descr{}; descr.type = hipFileHandleTypeOpaqueFD; @@ -94,7 +97,7 @@ TEST_F(DriverInit, hipFileHandleRegisterInitsDriver) TEST_F(DriverInit, hipFileDriverOpenAfterHandleRegisterIncrementsUseCount) { - Tmpfile tmpfile; + Tmpfile tmpfile{test_env.ais_capable_dir}; hipFileDescr_t descr{}; descr.type = hipFileHandleTypeOpaqueFD; @@ -111,12 +114,15 @@ TEST_F(DriverInit, hipFileDriverOpenAfterHandleRegisterIncrementsUseCount) TEST_F(DriverInit, hipFileHandleRegisterThreadedInitsDriverOnce) { constexpr size_t count{64}; - std::vector tmpfiles(count); + std::vector tmpfiles; std::vector threads; std::vector descrs(count); std::vector handles(count); + tmpfiles.reserve(count); + for (size_t i{0}; i < count; i++) { + tmpfiles.emplace_back(test_env.ais_capable_dir); descrs[i].type = hipFileHandleTypeOpaqueFD; descrs[i].handle.fd = tmpfiles[i].fd; } @@ -140,7 +146,7 @@ TEST_F(DriverInit, hipFileHandleRegisterThreadedInitsDriverOnce) TEST_F(DriverInit, hipFileDriverCloseDeregisteresHandle) { - Tmpfile tmpfile; + Tmpfile tmpfile{test_env.ais_capable_dir}; hipFileHandle_t handle{}; hipFileDescr_t descr{}; diff --git a/hipfile/test/system/main.cpp b/hipfile/test/system/main.cpp new file mode 100644 index 00000000..bee71092 --- /dev/null +++ b/hipfile/test/system/main.cpp @@ -0,0 +1,26 @@ +/* Copyright (c) Advanced Micro Devices, Inc. All rights reserved. + * + * SPDX-License-Identifier: MIT + */ + +#include "hipfile-warnings.h" +#include "test-options.h" + +#include + +extern SystemTestOptions test_env; +HIPFILE_WARN_NO_GLOBAL_CTOR_OFF +HIPFILE_WARN_NO_EXIT_DTOR_OFF +SystemTestOptions test_env; +HIPFILE_WARN_NO_EXIT_DTOR_ON +HIPFILE_WARN_NO_GLOBAL_CTOR_ON + +int +main(int argc, char **argv) +{ + testing::InitGoogleTest(&argc, argv); + + test_env.parseTestOptions(argc, argv); + + return RUN_ALL_TESTS(); +} diff --git a/hipfile/test/system/main.h b/hipfile/test/system/main.h new file mode 100644 index 00000000..f4ee5cde --- /dev/null +++ b/hipfile/test/system/main.h @@ -0,0 +1,12 @@ +/* Copyright (c) Advanced Micro Devices, Inc. All rights reserved. + * + * SPDX-License-Identifier: MIT + */ + +#pragma once + +#include "test-options.h" + +#include + +extern SystemTestOptions test_env; diff --git a/hipfile/test/test-common.h b/hipfile/test/test-common.h index 38f8dd39..fdd3a55a 100644 --- a/hipfile/test/test-common.h +++ b/hipfile/test/test-common.h @@ -66,6 +66,17 @@ struct Tmpfile { } } + Tmpfile(std::string directory) + { + directory += "/hipFile.XXXXXX"; + if ((fd = mkstemp(directory.data())) == -1) { + throw std::runtime_error("Could not create temporary file"); + } + if (unlink(directory.c_str()) == -1) { + throw std::runtime_error("Could not unlink temporary file)"); + } + } + ~Tmpfile() { close(fd); diff --git a/shared/test-options.h b/shared/test-options.h new file mode 100644 index 00000000..c1ca66d9 --- /dev/null +++ b/shared/test-options.h @@ -0,0 +1,27 @@ +/* Copyright (c) Advanced Micro Devices, Inc. All rights reserved. + * + * SPDX-License-Identifier: MIT + */ + +#pragma once + +#include +#include +#include +#include +#include + +struct SystemTestOptions { + std::string ais_capable_dir; + void parseTestOptions(int argc, char **argv) + { + namespace po = boost::program_options; + po::options_description desc("System test options"); + desc.add_options()("ais-capable-dir", po::value()->default_value("/tmp"), + "Path to AIS capable directory"); + po::variables_map vm; + po::store(po::parse_command_line(argc, argv, desc), vm); + + ais_capable_dir = vm["ais-capable-dir"].as(); + } +}; From 625a667b5c75447a26fe85beda44e3f97abdf02f Mon Sep 17 00:00:00 2001 From: Jordan Patterson Date: Mon, 27 Oct 2025 15:21:25 -0400 Subject: [PATCH 4/6] CMake: Rename AIS_TEST_DIR to AIS_CAPABLE_DIR. --- CMakeLists.txt | 4 ++-- hipfile/test/CMakeLists.txt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f51551bb..969fd36e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -203,8 +203,8 @@ if(CMAKE_HIP_PLATFORM STREQUAL "nvidia") endif() endif() -if(NOT AIS_TEST_DIR) - set(AIS_TEST_DIR "/tmp" CACHE STRING "Directory to use for e2e tests.") +if(NOT AIS_CAPABLE_DIR) + set(AIS_CAPABLE_DIR "/tmp" CACHE STRING "Directory to use for e2e tests.") endif() #----------------------------------------------------------------------------- diff --git a/hipfile/test/CMakeLists.txt b/hipfile/test/CMakeLists.txt index 1b06316a..d192ae0a 100644 --- a/hipfile/test/CMakeLists.txt +++ b/hipfile/test/CMakeLists.txt @@ -59,7 +59,7 @@ endif() ais_gtest_discover_tests( hipfile_tests - WORKING_DIRECTORY ${AIS_TEST_DIR} + WORKING_DIRECTORY ${AIS_CAPABLE_DIR} PROPERTIES LABELS unit TEST_LIST hipfile_unit_tests ) @@ -78,7 +78,7 @@ endif() gtest_discover_tests( hipfile_system_tests - WORKING_DIRECTORY ${AIS_TEST_DIR} + WORKING_DIRECTORY ${AIS_CAPABLE_DIR} PROPERTIES LABELS system ) From 3227375636aefc061b60857bb349e40a295c3f42 Mon Sep 17 00:00:00 2001 From: Jordan Patterson Date: Thu, 30 Oct 2025 18:43:27 -0400 Subject: [PATCH 5/6] docker: Add boost to images. --- util/docker/DOCKERFILE.ais_ci_rocky | 1 + util/docker/DOCKERFILE.ais_ci_suse | 1 + util/docker/DOCKERFILE.ais_ci_ubuntu | 1 + 3 files changed, 3 insertions(+) diff --git a/util/docker/DOCKERFILE.ais_ci_rocky b/util/docker/DOCKERFILE.ais_ci_rocky index fea987fb..e3e507e5 100644 --- a/util/docker/DOCKERFILE.ais_ci_rocky +++ b/util/docker/DOCKERFILE.ais_ci_rocky @@ -59,6 +59,7 @@ EOF # Use gcc13 to match Ubuntu24. RUN dnf makecache && \ dnf install -y \ + boost-devel \ clang \ cmake \ doxygen \ diff --git a/util/docker/DOCKERFILE.ais_ci_suse b/util/docker/DOCKERFILE.ais_ci_suse index 138fdb7f..dc8a69f9 100644 --- a/util/docker/DOCKERFILE.ais_ci_suse +++ b/util/docker/DOCKERFILE.ais_ci_suse @@ -54,6 +54,7 @@ RUN zypper --gpg-auto-import-keys refresh # graphviz - Dozygen dependency # Defaults to gcc7. Use gcc13 to match Ubuntu24. RUN zypper install -y \ + libboost_program_options1_66_0-devel \ clang19 \ cmake \ doxygen \ diff --git a/util/docker/DOCKERFILE.ais_ci_ubuntu b/util/docker/DOCKERFILE.ais_ci_ubuntu index 2ffeab94..1f289ad1 100644 --- a/util/docker/DOCKERFILE.ais_ci_ubuntu +++ b/util/docker/DOCKERFILE.ais_ci_ubuntu @@ -10,6 +10,7 @@ RUN apt update && \ doxygen \ gdb \ git \ + libboost-program-options-dev \ libmount-dev \ librocthrust-dev \ libssl-dev \ From b2402e6b8c25790bb040d4e91dd5f314d1a11d5d Mon Sep 17 00:00:00 2001 From: Jordan Patterson Date: Mon, 3 Nov 2025 16:00:31 -0500 Subject: [PATCH 6/6] hipfile: Silence unused function warning for hipfile tests. It is no longer using operator<< for hipFileError_t. --- hipfile/test/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hipfile/test/CMakeLists.txt b/hipfile/test/CMakeLists.txt index d192ae0a..9c79357e 100644 --- a/hipfile/test/CMakeLists.txt +++ b/hipfile/test/CMakeLists.txt @@ -51,6 +51,9 @@ ais_add_executable( SRCS ${UNIT_TEST_SOURCE_FILES} ${SHARED_SOURCE_FILES} SYSINCLS ${TEST_SYSINCLS} ) +target_compile_options(hipfile_tests + PRIVATE -Wno-unused-function +) target_link_libraries(hipfile_tests PRIVATE GTest::gtest) target_link_libraries(hipfile_tests PRIVATE GTest::gtest_main) if(CMAKE_HIP_PLATFORM STREQUAL "amd")