From d590297a0b14e2cac95e964f8cdf6c510883b361 Mon Sep 17 00:00:00 2001 From: Stephane Del Pino <stephane.delpino44@gmail.com> Date: Tue, 22 Oct 2024 09:23:22 +0200 Subject: [PATCH] Add tests for ResumingManager --- tests/CMakeLists.txt | 1 + tests/test_checkpointing_PrintScriptFrom.cpp | 2 +- tests/test_checkpointing_ResumingManager.cpp | 95 ++++++++++++++++++++ tests/test_checkpointing_ResumingUtils.cpp | 2 +- tests/test_checkpointing_SetResumeFrom.cpp | 2 +- 5 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 tests/test_checkpointing_ResumingManager.cpp diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index e38fbdd12..56b47f967 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 64e9d9fff..089612406 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 000000000..1d5da9508 --- /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 585d7d8a3..23c8e7e99 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 eb945250f..bead60938 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 -- GitLab