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