diff --git a/projects/hip-tests/catch/README.md b/projects/hip-tests/catch/README.md index 7d1ff6265b..a0c3c3adc2 100644 --- a/projects/hip-tests/catch/README.md +++ b/projects/hip-tests/catch/README.md @@ -144,7 +144,7 @@ If there arises a condition where certain flag is disabled and due to which a te ```cpp TEST_CASE("TestOnlyOnXnack") { if(!XNACKEnabled) { - HIP_SKIP_TEST("Test only runs on system with XNACK enabled"); + HipTest::HIP_SKIP_TEST("Test only runs on system with XNACK enabled"); return; } // Rest of test functionality @@ -162,11 +162,11 @@ These macros are to be called in multi process tests, inside a process which get There is a special interface available for process isolation. ```hip::SpawnProc``` in ```hip_test_process.hh```. Using this interface test can spawn a process and place passing conditions on its return value or its output to stdout. This can be useful for testing printf output. Sample Usage: ```cpp -hip::SpawnProc proc(, ); +hip::SpawnProc proc(, ); REQUIRE(0 == proc.run()); // Test of return value of the proc REQUIRE(exepctedOutput == proc.getOutput()); // Test on expected output of the process ``` -The process can be a standalone exe (see tests/catch/unit/printfExe for more information). +The process must be a standalone exe inside the same folder as other tests. ## Enabling New Tests Initially, the new tests can be enabled via using ```-DHIP_CATCH_TEST=1```. After porting existing tests, this will be turned on by default. diff --git a/projects/hip-tests/catch/include/hip_test_process.hh b/projects/hip-tests/catch/include/hip_test_process.hh index 665f5d6b97..335e6c7bba 100644 --- a/projects/hip-tests/catch/include/hip_test_process.hh +++ b/projects/hip-tests/catch/include/hip_test_process.hh @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. +Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -21,7 +21,9 @@ THE SOFTWARE. */ #pragma once + #include "hip_test_common.hh" +#include "hip_test_filesystem.hh" #include #include @@ -29,9 +31,17 @@ THE SOFTWARE. #include #include #include -#include "hip_test_filesystem.hh" namespace hip { +/* +Class to spawn a process in isolation and test its standard output and return status +Good for printf tests and environment variable tests + +How to use: +Have the stand alone exe in the same folder +Init a class using hip::SpawnProc proc("ExeName", yes_or_no_to_capture_output); +proc.run("Optional command line args"); +*/ class SpawnProc { std::string exeName; std::string resultStr; @@ -53,18 +63,31 @@ class SpawnProc { public: SpawnProc(std::string exeName_, bool captureOutput_ = false) : exeName(exeName_), captureOutput(captureOutput_) { - auto dir = fs::path(TestContext::get().currentPath()).parent_path(); + auto dir = fs::path(TestContext::get().currentPath()); dir /= exeName; exeName = dir.string(); + + INFO("Testing that exe exists: " << exeName); + REQUIRE(fs::exists(exeName)); + if (captureOutput) { auto path = fs::temp_directory_path(); path /= getRandomString(); tmpFileName = path.string(); + INFO("Testing that capture file does not exist already: " << tmpFileName); + REQUIRE(!fs::exists(tmpFileName)); } } - int run() { + int run(std::string commandLineArgs = "") { std::string execCmd = exeName; + + // Append command line args + if (commandLineArgs.size() > 0) { + execCmd += " "; // Add space for command line args + execCmd += commandLineArgs; + } + if (captureOutput) { execCmd += " > "; execCmd += tmpFileName; @@ -77,7 +100,11 @@ class SpawnProc { resultStr = std::string((std::istreambuf_iterator(t)), std::istreambuf_iterator()); } +#if HT_LINUX + return WEXITSTATUS(res); +#else return res; +#endif } std::string getOutput() { return resultStr; } diff --git a/projects/hip-tests/catch/unit/CMakeLists.txt b/projects/hip-tests/catch/unit/CMakeLists.txt index 9ebff9b9de..28c6fcb6aa 100644 --- a/projects/hip-tests/catch/unit/CMakeLists.txt +++ b/projects/hip-tests/catch/unit/CMakeLists.txt @@ -27,7 +27,6 @@ add_subdirectory(event) add_subdirectory(occupancy) add_subdirectory(device) add_subdirectory(printf) -add_subdirectory(printfExe) add_subdirectory(texture) add_subdirectory(streamperthread) add_subdirectory(kernel) diff --git a/projects/hip-tests/catch/unit/device/CMakeLists.txt b/projects/hip-tests/catch/unit/device/CMakeLists.txt index bebee8af71..247867bf5c 100644 --- a/projects/hip-tests/catch/unit/device/CMakeLists.txt +++ b/projects/hip-tests/catch/unit/device/CMakeLists.txt @@ -18,7 +18,13 @@ set(TEST_SRC hipDeviceGetUuid.cc ) +set_source_files_properties(hipGetDeviceCount.cc PROPERTIES COMPILE_FLAGS -std=c++17) + +add_executable(getDeviceCount EXCLUDE_FROM_ALL getDeviceCount_exe.cc) + hip_add_exe_to_target(NAME DeviceTest TEST_SRC ${TEST_SRC} TEST_TARGET_NAME build_tests COMPILE_OPTIONS -std=c++14) + +add_dependencies(DeviceTest getDeviceCount) diff --git a/projects/hip-tests/catch/unit/device/getDeviceCount_exe.cc b/projects/hip-tests/catch/unit/device/getDeviceCount_exe.cc new file mode 100644 index 0000000000..1da5f7c3a9 --- /dev/null +++ b/projects/hip-tests/catch/unit/device/getDeviceCount_exe.cc @@ -0,0 +1,68 @@ +/* +Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +#include +#include + +// Expects 1 command line arg, which is the Device Visible String +int main(int argc, char** argv) { + if (argc != 2) { + std::cerr << "Invalid number of args passed.\n" + << "argc : " << argc << std::endl; + for (int i = 0; i < argc; i++) { + std::cerr << " argv[" << i << "] : " << argv[0] << std::endl; + } + std::cerr << "The program expects device visibility string i.e. 0,1,2" << std::endl; + return -1; + } + + // disable visible_devices env from shell +#ifdef __HIP_PLATFORM_NVCC__ + unsetenv("CUDA_VISIBLE_DEVICES"); + setenv("CUDA_VISIBLE_DEVICES", argv[1], 1); + auto init_res = hipInit(0); + if (hipSuccess != init_res) { + std::cerr << "CUDA INIT API returned : " << hipGetErrorString(init_res) << std::endl; + return -1; + } +#else + unsetenv("ROCR_VISIBLE_DEVICES"); + unsetenv("HIP_VISIBLE_DEVICES"); + setenv("ROCR_VISIBLE_DEVICES", argv[1], 1); + setenv("HIP_VISIBLE_DEVICES", argv[1], 1); +#endif + + int count = 0; + auto res = hipGetDeviceCount(&count); + if (hipSuccess != res) { + std::cerr << "HIP API returned : " << hipGetErrorString(res) << std::endl; + return -1; + } + +#ifdef __HIP_PLATFORM_NVCC__ + unsetenv("CUDA_VISIBLE_DEVICES"); +#else + unsetenv("ROCR_VISIBLE_DEVICES"); + unsetenv("HIP_VISIBLE_DEVICES"); +#endif + return count; +} \ No newline at end of file diff --git a/projects/hip-tests/catch/unit/device/hipGetDeviceCount.cc b/projects/hip-tests/catch/unit/device/hipGetDeviceCount.cc index 2179bdad05..2facbf9515 100644 --- a/projects/hip-tests/catch/unit/device/hipGetDeviceCount.cc +++ b/projects/hip-tests/catch/unit/device/hipGetDeviceCount.cc @@ -23,6 +23,7 @@ THE SOFTWARE. */ #include +#include /** * hipGetDeviceCount tests @@ -32,3 +33,25 @@ TEST_CASE("Unit_hipGetDeviceCount_NegTst") { // Scenario1 REQUIRE_FALSE(hipGetDeviceCount(nullptr) == hipSuccess); } + +TEST_CASE("Unit_hipGetDeviceCount_HideDevices") { + int deviceCount = HipTest::getDeviceCount(); + if (deviceCount < 2) { + HipTest::HIP_SKIP_TEST("This test requires more than 2 GPUs. Skipping."); + return; + } + + for (int i = deviceCount; i >= 1; i--) { + std::string visibleStr; + for (int j = 0; j < i; j++) { // Generate a string which has first i devices + visibleStr += std::to_string(j); + if (j != (i - 1)) { + visibleStr += ","; + } + } + + hip::SpawnProc proc("getDeviceCount", true); + INFO("Output from process : " << proc.getOutput()); + REQUIRE(proc.run(visibleStr) == i); + } +} diff --git a/projects/hip-tests/catch/unit/printf/CMakeLists.txt b/projects/hip-tests/catch/unit/printf/CMakeLists.txt index b911796d66..d2a9d6eced 100644 --- a/projects/hip-tests/catch/unit/printf/CMakeLists.txt +++ b/projects/hip-tests/catch/unit/printf/CMakeLists.txt @@ -16,3 +16,10 @@ elseif (HIP_PLATFORM MATCHES "nvidia") TEST_TARGET_NAME build_tests COMPILE_OPTIONS -std=c++17) endif() + +# Standalone exes +add_executable(printfFlags EXCLUDE_FROM_ALL printfFlags_exe.cc) +add_executable(printfSpecifiers EXCLUDE_FROM_ALL printfSpecifiers_exe.cc) + +add_dependencies(printfTests printfFlags) +add_dependencies(printfTests printfSpecifiers) diff --git a/projects/hip-tests/catch/unit/printf/printfFlags.cc b/projects/hip-tests/catch/unit/printf/printfFlags.cc index 8a9aa75a3f..b9955b0b60 100644 --- a/projects/hip-tests/catch/unit/printf/printfFlags.cc +++ b/projects/hip-tests/catch/unit/printf/printfFlags.cc @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. +Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -23,20 +23,6 @@ THE SOFTWARE. #include #include -__global__ void test_kernel() { - printf("%08d\n", 42); - printf("%08i\n", -42); - printf("%08u\n", 42); - printf("%08g\n", 123.456); - printf("%0+8d\n", 42); - printf("%+d\n", -42); - printf("%+08d\n", 42); - printf("%-8s\n", "xyzzy"); - printf("% i\n", -42); - printf("%-16.8d\n", 42); - printf("%16.8d\n", 42); -} - TEST_CASE("Unit_printf_flags") { std::string reference(R"here(00000042 -0000042 @@ -51,7 +37,7 @@ xyzzy 00000042 )here"); - hip::SpawnProc proc("printfExe/printfFlags", true); + hip::SpawnProc proc("printfFlags", true); REQUIRE(proc.run() == 0); REQUIRE(proc.getOutput() == reference); } diff --git a/projects/hip-tests/catch/unit/printfExe/printfFlags.cc b/projects/hip-tests/catch/unit/printf/printfFlags_exe.cc similarity index 95% rename from projects/hip-tests/catch/unit/printfExe/printfFlags.cc rename to projects/hip-tests/catch/unit/printf/printfFlags_exe.cc index a96c099340..6ce9691b17 100644 --- a/projects/hip-tests/catch/unit/printfExe/printfFlags.cc +++ b/projects/hip-tests/catch/unit/printf/printfFlags_exe.cc @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. +Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/projects/hip-tests/catch/unit/printf/printfSpecifiers.cc b/projects/hip-tests/catch/unit/printf/printfSpecifiers.cc index 37e8584943..223a3c338b 100644 --- a/projects/hip-tests/catch/unit/printf/printfSpecifiers.cc +++ b/projects/hip-tests/catch/unit/printf/printfSpecifiers.cc @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. +Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -89,7 +89,7 @@ x )here"); #endif - hip::SpawnProc proc("printfExe/printfSepcifiers", true); + hip::SpawnProc proc("printfSpecifiers", true); REQUIRE(0 == proc.run()); REQUIRE(proc.getOutput() == reference); } diff --git a/projects/hip-tests/catch/unit/printfExe/printfSepcifiers.cc b/projects/hip-tests/catch/unit/printf/printfSpecifiers_exe.cc similarity index 97% rename from projects/hip-tests/catch/unit/printfExe/printfSepcifiers.cc rename to projects/hip-tests/catch/unit/printf/printfSpecifiers_exe.cc index 364376fb0a..5dcabdc4d4 100644 --- a/projects/hip-tests/catch/unit/printfExe/printfSepcifiers.cc +++ b/projects/hip-tests/catch/unit/printf/printfSpecifiers_exe.cc @@ -1,5 +1,5 @@ /* -Copyright (c) 2021 Advanced Micro Devices, Inc. All rights reserved. +Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/projects/hip-tests/catch/unit/printfExe/CMakeLists.txt b/projects/hip-tests/catch/unit/printfExe/CMakeLists.txt deleted file mode 100644 index 3b73810b35..0000000000 --- a/projects/hip-tests/catch/unit/printfExe/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -add_executable(printfFlags EXCLUDE_FROM_ALL printfFlags.cc) -add_executable(printfSepcifiers EXCLUDE_FROM_ALL printfSepcifiers.cc) - -add_dependencies(build_tests printfFlags) -add_dependencies(build_tests printfSepcifiers)