diff --git a/src/language/utils/OFStream.cpp b/src/language/utils/OFStream.cpp index 3bc5e29911abb17840429bb6025232c1cb5f4711..39b7cc8ecedee3ff76e3d6d54790d25f90d01569 100644 --- a/src/language/utils/OFStream.cpp +++ b/src/language/utils/OFStream.cpp @@ -6,7 +6,12 @@ OFStream::OFStream(const std::string& filename) { if (parallel::rank() == 0) { m_fstream.open(filename); - Assert(m_ostream == nullptr, "ostream was already defined"); - m_ostream = &m_fstream; + if (m_fstream.is_open()) { + m_ostream = &m_fstream; + } else { + std::stringstream error_msg; + error_msg << "cannot create file " << rang::fgB::yellow << filename << rang::style::reset; + throw NormalError(error_msg.str()); + } } } diff --git a/src/language/utils/OStream.hpp b/src/language/utils/OStream.hpp index 6abbcf668c2e56ed668898d619004d0434cd0cb3..d9410e25e35d2a3e9d5ac147911f6464d3b71eb7 100644 --- a/src/language/utils/OStream.hpp +++ b/src/language/utils/OStream.hpp @@ -16,7 +16,7 @@ class OStream friend std::shared_ptr<const OStream> operator<<(const std::shared_ptr<const OStream>& os, const DataT& t) { - Assert(os.use_count() > 0); + Assert(os.use_count() > 0, "non allocated stream"); if (os->m_ostream != nullptr) { *os->m_ostream << t; } diff --git a/tests/test_OFStream.cpp b/tests/test_OFStream.cpp index 6170ad55f58b169748c1f7a663018845daa3f91b..32b4ff21b8e725dcaff822b586f9810d617d3a4d 100644 --- a/tests/test_OFStream.cpp +++ b/tests/test_OFStream.cpp @@ -46,4 +46,13 @@ TEST_CASE("OFStream", "[language]") REQUIRE(not std::filesystem::exists(filename)); } + + SECTION("invalid filename") + { + if (parallel::rank() == 0) { + const std::string filename = "badpath/invalidpath/ofstream"; + + REQUIRE_THROWS_WITH(std::make_shared<OFStream>(filename), "error: cannot create file " + filename); + } + } } diff --git a/tests/test_OStream.cpp b/tests/test_OStream.cpp index 9e01e5016246d9187f0f44f4b0d434d0e5570200..417db374ee366531623af397e2d62e78d1c83475 100644 --- a/tests/test_OStream.cpp +++ b/tests/test_OStream.cpp @@ -25,4 +25,12 @@ TEST_CASE("OStream", "[language]") REQUIRE(sstr.str() == "foo3 bar"); } + +#ifndef NDEBUG + SECTION("non allocated stream") + { + std::shared_ptr<OStream> bad_os; + REQUIRE_THROWS_WITH((bad_os << 2), "non allocated stream"); + } +#endif // NDEBUG }