From d30405f1c26a584abc9119bb23d501fb430e435c Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Fri, 20 Aug 2021 12:08:59 +0200
Subject: [PATCH] Add failure tests for OStream and OFStream

---
 src/language/utils/OFStream.cpp | 9 +++++++--
 src/language/utils/OStream.hpp  | 2 +-
 tests/test_OFStream.cpp         | 9 +++++++++
 tests/test_OStream.cpp          | 8 ++++++++
 4 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/src/language/utils/OFStream.cpp b/src/language/utils/OFStream.cpp
index 3bc5e2991..39b7cc8ec 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 6abbcf668..d9410e25e 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 6170ad55f..32b4ff21b 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 9e01e5016..417db374e 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
 }
-- 
GitLab