diff --git a/catch/unit/CMakeLists.txt b/catch/unit/CMakeLists.txt index b1874c23eb..6e97f24663 100644 --- a/catch/unit/CMakeLists.txt +++ b/catch/unit/CMakeLists.txt @@ -32,6 +32,7 @@ add_subdirectory(streamperthread) add_subdirectory(kernel) add_subdirectory(multiThread) add_subdirectory(compiler) +add_subdirectory(errorHandling) if(HIP_PLATFORM STREQUAL "amd") add_subdirectory(clock) endif() diff --git a/catch/unit/errorHandling/CMakeLists.txt b/catch/unit/errorHandling/CMakeLists.txt new file mode 100644 index 0000000000..78933fd3f8 --- /dev/null +++ b/catch/unit/errorHandling/CMakeLists.txt @@ -0,0 +1,12 @@ +# Common Tests - Test independent of all platforms +set(TEST_SRC + hipGetErrorName.cc + hipGetErrorString.cc + hipGetLastError.cc + hipPeekAtLastError.cc +) + +hip_add_exe_to_target(NAME ErrorHandlingTest + TEST_SRC ${TEST_SRC} + TEST_TARGET_NAME build_tests + COMPILE_OPTIONS -std=c++14) \ No newline at end of file diff --git a/catch/unit/errorHandling/errorEnumerators.h b/catch/unit/errorHandling/errorEnumerators.h new file mode 100644 index 0000000000..a379a47a06 --- /dev/null +++ b/catch/unit/errorHandling/errorEnumerators.h @@ -0,0 +1,99 @@ +/* +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. +*/ + +#pragma once + +#include + +constexpr hipError_t kErrorEnumerators[] = {hipSuccess, + hipErrorInvalidValue, + hipErrorOutOfMemory, + hipErrorNotInitialized, + hipErrorDeinitialized, + hipErrorProfilerDisabled, + hipErrorProfilerNotInitialized, + hipErrorProfilerAlreadyStarted, + hipErrorProfilerAlreadyStopped, + hipErrorInvalidConfiguration, + hipErrorInvalidPitchValue, + hipErrorInvalidSymbol, + hipErrorInvalidDevicePointer, + hipErrorInvalidMemcpyDirection, + hipErrorInsufficientDriver, + hipErrorMissingConfiguration, + hipErrorPriorLaunchFailure, + hipErrorInvalidDeviceFunction, + hipErrorNoDevice, + hipErrorInvalidDevice, + hipErrorInvalidImage, + hipErrorInvalidContext, + hipErrorContextAlreadyCurrent, + hipErrorMapFailed, + hipErrorUnmapFailed, + hipErrorArrayIsMapped, + hipErrorAlreadyMapped, + hipErrorNoBinaryForGpu, + hipErrorAlreadyAcquired, + hipErrorNotMapped, + hipErrorNotMappedAsArray, + hipErrorNotMappedAsPointer, + hipErrorECCNotCorrectable, + hipErrorUnsupportedLimit, + hipErrorContextAlreadyInUse, + hipErrorPeerAccessUnsupported, + hipErrorInvalidKernelFile, + hipErrorInvalidGraphicsContext, + hipErrorInvalidSource, + hipErrorFileNotFound, + hipErrorSharedObjectSymbolNotFound, + hipErrorSharedObjectInitFailed, + hipErrorOperatingSystem, + hipErrorInvalidHandle, + hipErrorIllegalState, + hipErrorNotFound, + hipErrorNotReady, + hipErrorIllegalAddress, + hipErrorLaunchOutOfResources, + hipErrorLaunchTimeOut, + hipErrorPeerAccessAlreadyEnabled, + hipErrorPeerAccessNotEnabled, + hipErrorSetOnActiveProcess, + hipErrorContextIsDestroyed, + hipErrorAssert, + hipErrorHostMemoryAlreadyRegistered, + hipErrorHostMemoryNotRegistered, + hipErrorLaunchFailure, + hipErrorCooperativeLaunchTooLarge, + hipErrorNotSupported, + hipErrorStreamCaptureUnsupported, + hipErrorStreamCaptureInvalidated, + hipErrorStreamCaptureMerge, + hipErrorStreamCaptureUnmatched, + hipErrorStreamCaptureUnjoined, + hipErrorStreamCaptureIsolation, + hipErrorStreamCaptureImplicit, + hipErrorCapturedEvent, + hipErrorStreamCaptureWrongThread, + hipErrorGraphExecUpdateFailure, + hipErrorUnknown, + hipErrorRuntimeMemory, + hipErrorRuntimeOther}; \ No newline at end of file diff --git a/catch/unit/errorHandling/hipGetErrorName.cc b/catch/unit/errorHandling/hipGetErrorName.cc new file mode 100644 index 0000000000..f8c7f624be --- /dev/null +++ b/catch/unit/errorHandling/hipGetErrorName.cc @@ -0,0 +1,47 @@ +/* +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 "errorEnumerators.h" +#include +#include + +TEST_CASE("Unit_hipGetErrorName_Positive_Basic") { + const char* error_string = nullptr; + const auto enumerator = + GENERATE(from_range(std::begin(kErrorEnumerators), std::end(kErrorEnumerators))); + + error_string = hipGetErrorName(enumerator); + + REQUIRE(error_string != nullptr); + REQUIRE(strlen(error_string) > 0); +} + +TEST_CASE("Unit_hipGetErrorName_Negative_Parameters") { + const char* error_string = hipGetErrorName(static_cast(-1)); + REQUIRE(error_string != nullptr); +#if HT_NVIDIA + REQUIRE_THAT(error_string, Catch::Equals("cudaErrorUnknown")); +#elif HT_AMD + REQUIRE_THAT(error_string, Catch::Equals("hipErrorUnknown")); +#endif +} \ No newline at end of file diff --git a/catch/unit/errorHandling/hipGetErrorString.cc b/catch/unit/errorHandling/hipGetErrorString.cc new file mode 100644 index 0000000000..fe3f5523c2 --- /dev/null +++ b/catch/unit/errorHandling/hipGetErrorString.cc @@ -0,0 +1,41 @@ +/* +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 "errorEnumerators.h" +#include +#include + +TEST_CASE("Unit_hipGetErrorString_Positive_Basic") { + const char* error_string = nullptr; + const auto enumerator = + GENERATE(from_range(std::begin(kErrorEnumerators), std::end(kErrorEnumerators))); + + error_string = hipGetErrorString(enumerator); + + REQUIRE(error_string != nullptr); + REQUIRE(strlen(error_string) > 0); +} + +TEST_CASE("Unit_hipGetErrorString_Negative_Parameters") { + const char* error_string = hipGetErrorString(static_cast(-1)); + REQUIRE(error_string != nullptr); +} \ No newline at end of file diff --git a/catch/unit/errorHandling/hipGetLastError.cc b/catch/unit/errorHandling/hipGetLastError.cc new file mode 100644 index 0000000000..f2b8f1cfd3 --- /dev/null +++ b/catch/unit/errorHandling/hipGetLastError.cc @@ -0,0 +1,44 @@ +/* +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 +#include + +TEST_CASE("Unit_hipGetLastError_Positive_Basic") { + HIP_CHECK(hipGetLastError()); + HIP_CHECK_ERROR(hipMalloc(nullptr, 1), hipErrorInvalidValue); + HIP_CHECK_ERROR(hipGetLastError(), hipErrorInvalidValue); + HIP_CHECK(hipGetLastError()); +} + +TEST_CASE("Unit_hipGetLastError_Positive_Threaded") { + class HipGetLastErrorThreadedTest : public ThreadedZigZagTest { + public: + void TestPart2() { REQUIRE_THREAD(hipMalloc(nullptr, 1) == hipErrorInvalidValue); } + void TestPart3() { HIP_CHECK(hipGetLastError()); } + void TestPart4() { REQUIRE_THREAD(hipGetLastError() == hipErrorInvalidValue); } + }; + + HipGetLastErrorThreadedTest test; + test.run(); +} diff --git a/catch/unit/errorHandling/hipPeekAtLastError.cc b/catch/unit/errorHandling/hipPeekAtLastError.cc new file mode 100644 index 0000000000..ce7c605719 --- /dev/null +++ b/catch/unit/errorHandling/hipPeekAtLastError.cc @@ -0,0 +1,48 @@ +/* +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 +#include + +TEST_CASE("Unit_hipPeekAtLastError_Positive_Basic") { + HIP_CHECK(hipPeekAtLastError()); + HIP_CHECK_ERROR(hipMalloc(nullptr, 1), hipErrorInvalidValue); + HIP_CHECK_ERROR(hipPeekAtLastError(), hipErrorInvalidValue); + HIP_CHECK_ERROR(hipGetLastError(), hipErrorInvalidValue); + HIP_CHECK(hipPeekAtLastError()); +} + +TEST_CASE("Unit_hipPeekAtLastError_Positive_Threaded") { + class HipPeekAtLastErrorTest : public ThreadedZigZagTest { + public: + void TestPart2() { REQUIRE_THREAD(hipMalloc(nullptr, 1) == hipErrorInvalidValue); } + void TestPart3() { + HIP_CHECK(hipPeekAtLastError()); + HIP_CHECK(hipGetLastError()); + } + void TestPart4() { REQUIRE_THREAD(hipPeekAtLastError() == hipErrorInvalidValue); } + }; + + HipPeekAtLastErrorTest test; + test.run(); +}