diff --git a/src/utils/checkpointing/ReadOStream.cpp b/src/utils/checkpointing/ReadOStream.cpp index d1c597064a60b9af67db0ae5a49e839914089598..d8f0aa5304a74703e4dbeefcc95c11501d260948 100644 --- a/src/utils/checkpointing/ReadOStream.cpp +++ b/src/utils/checkpointing/ReadOStream.cpp @@ -25,9 +25,11 @@ readOStream(const std::string& symbol_name, const HighFive::Group& symbol_table_ p_ostream = std::make_shared<OFStream>(filename, true); break; } + // LCOV_EXCL_START case OStream::Type::std_ostream: { throw NotImplementedError("std::ostream resume"); } + // LCOV_EXCL_STOP } return {std::make_shared<DataHandler<const OStream>>(p_ostream)}; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 258fcbde8361820449fe5079560206b67d7f577c..dd4d0803e09aeefe5f9442acf3540258b2092546 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -161,6 +161,7 @@ set(checkpointing_TESTS) if(PUGS_HAS_HDF5) list(APPEND checkpointing_TESTS test_checkpointing_HFTypes.cpp + test_checkpointing_OStream.cpp test_checkpointing_IBoundaryDescriptor.cpp test_checkpointing_IBoundaryConditionDescriptor.cpp test_checkpointing_IQuadratureDescriptor.cpp diff --git a/tests/test_checkpointing_OStream.cpp b/tests/test_checkpointing_OStream.cpp new file mode 100644 index 0000000000000000000000000000000000000000..2dedc1e5e68e3038c70c890ccf4e9ce1803280ef --- /dev/null +++ b/tests/test_checkpointing_OStream.cpp @@ -0,0 +1,74 @@ +#include <catch2/catch_test_macros.hpp> +#include <catch2/matchers/catch_matchers_all.hpp> + +#include <utils/Messenger.hpp> + +#include <language/utils/DataHandler.hpp> +#include <language/utils/EmbeddedData.hpp> +#include <language/utils/OFStream.hpp> +#include <utils/checkpointing/ReadOStream.hpp> +#include <utils/checkpointing/WriteOStream.hpp> + +#include <filesystem> + +// clazy:excludeall=non-pod-global-static + +TEST_CASE("checkpointing_OStream", "[utils/checkpointing]") +{ + 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); + + SECTION("OStream") + { + HighFive::Group symbol_table_group = file.createGroup("symbol_table"); + HighFive::Group useless_group; + + auto p_ofstream = std::make_shared<OFStream>("output_name"); + checkpointing::writeOStream("ofstream", EmbeddedData{std::make_shared<DataHandler<const OStream>>(p_ofstream)}, + file, useless_group, symbol_table_group); + + auto p_ostream = std::make_shared<OStream>(std::cout); + REQUIRE_THROWS_WITH(checkpointing::writeOStream("ostream", + EmbeddedData{ + std::make_shared<DataHandler<const OStream>>(p_ostream)}, + file, useless_group, symbol_table_group), + "not implemented yet: std::ostream checkpoint"); + + file.flush(); + + EmbeddedData read_ofstream = checkpointing::readOStream("ofstream", symbol_table_group); + + auto get_value = [](const EmbeddedData& embedded_data) -> const OStream& { + return *dynamic_cast<const DataHandler<const OStream>&>(embedded_data.get()).data_ptr(); + }; + + REQUIRE_NOTHROW(get_value(read_ofstream)); + + REQUIRE_NOTHROW(dynamic_cast<const OFStream&>(get_value(read_ofstream))); + + REQUIRE(get_value(read_ofstream).type() == OStream::Type::std_ofstream); + REQUIRE(dynamic_cast<const OFStream&>(get_value(read_ofstream)).filename() == "output_name"); + } + } + + parallel::barrier(); + if (parallel::rank() == 0) { + std::filesystem::remove_all(std::filesystem::path{tmp_dirname}); + } +}