diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index e38fbdd1241ba64f49b95f706fbc777bd0b87b4b..56b47f9677fdc66311402c9a9cc4ecdb6552e534 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -160,6 +160,7 @@ add_executable (unit_tests set(checkpointing_TESTS test_checkpointing_PrintCheckpointInfo.cpp test_checkpointing_PrintScriptFrom.cpp + test_checkpointing_ResumingManager.cpp test_checkpointing_ResumingUtils.cpp test_checkpointing_SetResumeFrom.cpp ) diff --git a/tests/test_checkpointing_PrintScriptFrom.cpp b/tests/test_checkpointing_PrintScriptFrom.cpp index 64e9d9fffcd985d9e5841c8210d32af31c28edb7..0896124064e6aa2542f9d4f0996b961485845be2 100644 --- a/tests/test_checkpointing_PrintScriptFrom.cpp +++ b/tests/test_checkpointing_PrintScriptFrom.cpp @@ -9,7 +9,7 @@ // clazy:excludeall=non-pod-global-static -TEST_CASE("PrintScriptFrom", "[utils/checkpointing]") +TEST_CASE("checkpointing_PrintScriptFrom", "[utils/checkpointing]") { #ifdef PUGS_HAS_HDF5 diff --git a/tests/test_checkpointing_ResumingManager.cpp b/tests/test_checkpointing_ResumingManager.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1d5da95081d179894d66fe04306af877e0af676b --- /dev/null +++ b/tests/test_checkpointing_ResumingManager.cpp @@ -0,0 +1,95 @@ +#include <catch2/catch_test_macros.hpp> +#include <catch2/matchers/catch_matchers_all.hpp> + +#include <utils/HighFivePugsUtils.hpp> +#include <utils/Messenger.hpp> +#include <utils/checkpointing/ResumingManager.hpp> + +#include <filesystem> + +// clazy:excludeall=non-pod-global-static + +TEST_CASE("checkpointing_ResumingManager", "[utils/checkpointing]") +{ + // Need to destroy the instance created in the main for tests + REQUIRE_NOTHROW(ResumingManager::destroy()); + +#ifndef NDEBUG + REQUIRE_THROWS_WITH(ResumingManager::destroy(), "Resuming manager was not created"); + REQUIRE_THROWS_WITH(ResumingManager::getInstance(), "instance was not created"); +#endif // NDEBUG + + REQUIRE_NOTHROW(ResumingManager::create()); + +#ifndef NDEBUG + REQUIRE_THROWS_WITH(ResumingManager::create(), "Resuming manager was already created"); +#endif // NDEBUG + +#ifdef PUGS_HAS_HDF5 + std::string tmp_dirname; + { + { + if (parallel::rank() == 0) { + tmp_dirname = [&]() -> std::string { + std::string temp_filename = std::filesystem::temp_directory_path() / "pugs_checkpointing_XXXXXX"; + return std::string{mkdtemp(&temp_filename[0])}; + }(); + } + parallel::broadcast(tmp_dirname, 0); + } + std::filesystem::path path = tmp_dirname; + const std::string filename = path / "checkpoint.h5"; + + { + HighFive::FileAccessProps fapl; + fapl.add(HighFive::MPIOFileAccess{MPI_COMM_WORLD, MPI_INFO_NULL}); + fapl.add(HighFive::MPIOCollectiveMetadata{}); + HighFive::File file = HighFive::File(filename, HighFive::File::Truncate, fapl); + + { + HighFive::Group cp = file.createGroup("/resuming_checkpoint"); + cp.createAttribute("id", 13ul); + } + } + + parallel::barrier(); + REQUIRE_NOTHROW(ResumingManager::getInstance().setFilename(filename)); + REQUIRE(ResumingManager::getInstance().filename() == filename); + + REQUIRE(ResumingManager::getInstance().checkpointId() == 13); + } + + parallel::barrier(); + if (parallel::rank() == 0) { + std::filesystem::remove_all(std::filesystem::path{tmp_dirname}); + } + +#else // PUGS_HAS_HDF5 + + ResumingManager::getInstance().setFilename("useless"); + REQUIRE(ResumingManager::getInstance().filename() == "useless"); + REQUIRE(ResumingManager::getInstance().checkpointId() == 0); + +#endif // PUGS_HAS_HDF5 + + ResumingManager::getInstance().currentASTLevel() = 3; + ResumingManager::getInstance().checkpointNumber() = 7; + ResumingManager::getInstance().setIsResuming(false); + + REQUIRE(ResumingManager::getInstance().currentASTLevel() == 3); + REQUIRE(ResumingManager::getInstance().checkpointNumber() == 7); + REQUIRE(not ResumingManager::getInstance().isResuming()); + + ResumingManager::getInstance().currentASTLevel() = 1; + ResumingManager::getInstance().checkpointNumber() = 5; + ResumingManager::getInstance().setIsResuming(true); + + REQUIRE(ResumingManager::getInstance().currentASTLevel() == 1); + REQUIRE(ResumingManager::getInstance().checkpointNumber() == 5); + REQUIRE(ResumingManager::getInstance().isResuming()); + + REQUIRE_NOTHROW(ResumingManager::destroy()); + + // Recreate ResumingManager for remaining tests + REQUIRE_NOTHROW(ResumingManager::create()); +} diff --git a/tests/test_checkpointing_ResumingUtils.cpp b/tests/test_checkpointing_ResumingUtils.cpp index 585d7d8a3f6017ee69fae6647c5cb5a00a4280ad..23c8e7e99d36e009a2f8f6b04d53da4c28183331 100644 --- a/tests/test_checkpointing_ResumingUtils.cpp +++ b/tests/test_checkpointing_ResumingUtils.cpp @@ -9,7 +9,7 @@ // clazy:excludeall=non-pod-global-static -TEST_CASE("ResumingUtils", "[utils/checkpointing]") +TEST_CASE("checkpointing_ResumingUtils", "[utils/checkpointing]") { #ifdef PUGS_HAS_HDF5 diff --git a/tests/test_checkpointing_SetResumeFrom.cpp b/tests/test_checkpointing_SetResumeFrom.cpp index eb945250f4b242b378e199cef7e9d9721826d4a8..bead609386049914cc3a55edcab77651f67812e4 100644 --- a/tests/test_checkpointing_SetResumeFrom.cpp +++ b/tests/test_checkpointing_SetResumeFrom.cpp @@ -9,7 +9,7 @@ // clazy:excludeall=non-pod-global-static -TEST_CASE("SetResumeFrom", "[utils/checkpointing]") +TEST_CASE("checkpointing_SetResumeFrom", "[utils/checkpointing]") { #ifdef PUGS_HAS_HDF5