diff --git a/catch/unit/graph/CMakeLists.txt b/catch/unit/graph/CMakeLists.txt index 2991263331..6974cb81ae 100644 --- a/catch/unit/graph/CMakeLists.txt +++ b/catch/unit/graph/CMakeLists.txt @@ -83,6 +83,9 @@ set(TEST_SRC hipUserObjectCreate.cc hipGraphDebugDotPrint.cc hipGraphCloneComplx.cc + hipGraphCreate.cc + hipGraphDestroy.cc + hipGraphExecDestroy.cc ) hip_add_exe_to_target(NAME GraphsTest diff --git a/catch/unit/graph/hipGraphCreate.cc b/catch/unit/graph/hipGraphCreate.cc new file mode 100644 index 0000000000..befcc69c7e --- /dev/null +++ b/catch/unit/graph/hipGraphCreate.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 + +/** +Negative Testcase Scenarios : +1) Creating HipGraph with nullptr. +2) Creating hipGraph with non-zero mode. +*/ + +TEST_CASE("Unit_hipGraphCreate_Negative") { + hipError_t ret; + SECTION("Creating HipGraph with nullptr") { + ret = hipGraphCreate(nullptr, 0); + REQUIRE(hipErrorInvalidValue == ret); + } + + SECTION("Creating hipGraph with non-zero mode") { + hipGraph_t graph{}; + ret = hipGraphCreate(&graph, -1); + REQUIRE(hipErrorInvalidValue == ret); + + ret = hipGraphCreate(nullptr, -1); + REQUIRE(hipErrorInvalidValue == ret); + } +} + diff --git a/catch/unit/graph/hipGraphDestroy.cc b/catch/unit/graph/hipGraphDestroy.cc new file mode 100644 index 0000000000..15b8263f13 --- /dev/null +++ b/catch/unit/graph/hipGraphDestroy.cc @@ -0,0 +1,81 @@ +/* +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 + +/** +Negative Testcase Scenarios : +1) Pass graph as nullptr and verify. +2) Destroy already destroyed graph and check api returns error code. +3) Destroy graph when is in use and make sure api handles it gracefully. +*/ + +TEST_CASE("Unit_hipGraphDestroy_Negative") { + hipError_t ret; + SECTION("Deleting HipGraph with nullptr") { + ret = hipGraphDestroy(nullptr); + REQUIRE(hipErrorInvalidValue == ret); + } +#if HT_AMD + SECTION("Destroy already destroyed graph and check api returns error code") { + hipGraph_t graph; + HIP_CHECK(hipGraphCreate(&graph, 0)); + HIP_CHECK(hipGraphDestroy(graph)); + + ret = hipGraphDestroy(graph); + REQUIRE(hipErrorIllegalState == ret); + } +#endif + SECTION("Destroy graph when is in use and make sure api handles" + " it gracefully.") { + hipGraph_t graph; + hipGraphExec_t graphExec; + hipStream_t streamForGraph; + hipGraphNode_t memsetNode; + + HIP_CHECK(hipGraphCreate(&graph, 0)); + HIP_CHECK(hipStreamCreate(&streamForGraph)); + + char *devData; + HIP_CHECK(hipMalloc(&devData, 1024)); + hipMemsetParams memsetParams{}; + memset(&memsetParams, 0, sizeof(memsetParams)); + memsetParams.dst = reinterpret_cast(devData); + memsetParams.value = 0; + memsetParams.pitch = 0; + memsetParams.elementSize = sizeof(char); + memsetParams.width = 1024; + memsetParams.height = 1; + HIP_CHECK(hipGraphAddMemsetNode(&memsetNode, graph, nullptr, 0, + &memsetParams)); + + HIP_CHECK(hipGraphInstantiate(&graphExec, graph, nullptr, nullptr, 0)); + REQUIRE(graphExec != nullptr); + + HIP_CHECK(hipGraphDestroy(graph)); + + HIP_CHECK(hipGraphLaunch(graphExec, streamForGraph)); + HIP_CHECK(hipStreamSynchronize(streamForGraph)); + + HIP_CHECK(hipFree(devData)); + HIP_CHECK(hipGraphExecDestroy(graphExec)); + HIP_CHECK(hipStreamDestroy(streamForGraph)); + } +} + diff --git a/catch/unit/graph/hipGraphExecDestroy.cc b/catch/unit/graph/hipGraphExecDestroy.cc new file mode 100644 index 0000000000..7ed2e0d718 --- /dev/null +++ b/catch/unit/graph/hipGraphExecDestroy.cc @@ -0,0 +1,73 @@ +/* +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 + +/** +Negative Testcase Scenarios : +1) Pass hipGraphExecDestroy with nullptr. +2) Pass hipGraphExecDestroy with un-initilze structure. +3) Destroy graph before exec-graph destroyed and verify no crash occurs. +*/ + +TEST_CASE("Unit_hipGraphExecDestroy_Negative") { + hipError_t ret; + SECTION("Pass hipGraphExecDestroy with nullptr") { + ret = hipGraphExecDestroy(nullptr); + REQUIRE(hipErrorInvalidValue == ret); + } + SECTION("Pass hipGraphExecDestroy with un-initilze structure") { + hipGraphExec_t graphExec{}; + ret = hipGraphExecDestroy(graphExec); + REQUIRE(hipErrorInvalidValue == ret); + } +} + +TEST_CASE("Unit_hipGraphExecDestroy_Sequence") { + hipGraph_t graph; + hipGraphExec_t graphExec; + hipStream_t streamForGraph; + hipGraphNode_t memsetNode; + + HIP_CHECK(hipGraphCreate(&graph, 0)); + HIP_CHECK(hipStreamCreate(&streamForGraph)); + + char *devData; + HIP_CHECK(hipMalloc(&devData, 1024)); + hipMemsetParams memsetParams{}; + memset(&memsetParams, 0, sizeof(memsetParams)); + memsetParams.dst = reinterpret_cast(devData); + memsetParams.value = 0; + memsetParams.pitch = 0; + memsetParams.elementSize = sizeof(char); + memsetParams.width = 1024; + memsetParams.height = 1; + HIP_CHECK(hipGraphAddMemsetNode(&memsetNode, graph, nullptr, 0, + &memsetParams)); + + HIP_CHECK(hipGraphInstantiate(&graphExec, graph, nullptr, nullptr, 0)); + REQUIRE(graphExec != nullptr); + HIP_CHECK(hipGraphLaunch(graphExec, streamForGraph)); + HIP_CHECK(hipStreamSynchronize(streamForGraph)); + + HIP_CHECK(hipGraphDestroy(graph)); + HIP_CHECK(hipGraphExecDestroy(graphExec)); + HIP_CHECK(hipStreamDestroy(streamForGraph)); +} +