From df86695047443ed9bc089597038902610bb2173b Mon Sep 17 00:00:00 2001 From: Andrej Babic Date: Wed, 18 Jul 2018 11:56:31 +0200 Subject: [PATCH] Add a dummy writter for writing to /dev/null --- lib/src/H5Writer.cpp | 33 ++++++++++++++++++++++++++++++++- lib/src/H5Writer.hpp | 14 ++++++++++++++ lib/src/ProcessManager.cpp | 24 ++++++++++++------------ lib/test/test_H5Writer.cpp | 12 ++++++++++++ lib/test/test_ZmqReceiver.cpp | 1 - lib/test/test_main.cpp | 1 + 6 files changed, 71 insertions(+), 14 deletions(-) create mode 100644 lib/test/test_H5Writer.cpp diff --git a/lib/src/H5Writer.cpp b/lib/src/H5Writer.cpp index eb60c41..9899802 100644 --- a/lib/src/H5Writer.cpp +++ b/lib/src/H5Writer.cpp @@ -12,6 +12,16 @@ extern "C" using namespace std; +std::unique_ptr get_h5_writer(const string& filename, hsize_t frames_per_file, + hsize_t initial_dataset_size, hsize_t dataset_increase_step) +{ + if (filename == "/dev/null") { + return unique_ptr(new DummyH5Writer()); + } else { + return unique_ptr(new H5Writer(filename, frames_per_file, initial_dataset_size, dataset_increase_step)); + } +} + H5Writer::H5Writer(const std::string& filename, hsize_t frames_per_file, hsize_t initial_dataset_size, hsize_t dataset_increase_step) : filename(filename), frames_per_file(frames_per_file), initial_dataset_size(initial_dataset_size), dataset_increase_step(dataset_increase_step) @@ -272,4 +282,25 @@ hsize_t H5Writer::prepare_storage_for_data(const string& dataset_name, const siz H5::H5File& H5Writer::get_h5_file() { return file; -} \ No newline at end of file +} + +DummyH5Writer::DummyH5Writer() : H5Writer("/dev/null", 0, 0, 0){} + +void DummyH5Writer::close_file(){} + +void DummyH5Writer::write_data(const string& dataset_name, const size_t data_index, const char* data, const std::vector& data_shape, + const size_t data_bytes_size, const string& data_type, const string& endianness){}; + +bool DummyH5Writer::is_file_open() const +{ + return false; +} + +H5::H5File& DummyH5Writer::get_h5_file(){ + stringstream error_message; + using namespace date; + error_message << "[" << std::chrono::system_clock::now() << "]"; + error_message << "Cannot get the H5 file with the dummy writer." << endl; + + throw runtime_error(error_message.str()); +}; \ No newline at end of file diff --git a/lib/src/H5Writer.hpp b/lib/src/H5Writer.hpp index 3ae1fbb..b75ed28 100644 --- a/lib/src/H5Writer.hpp +++ b/lib/src/H5Writer.hpp @@ -35,6 +35,17 @@ class H5Writer public: H5Writer(const std::string& filename, hsize_t frames_per_file=0, hsize_t initial_dataset_size=1000, hsize_t dataset_increase_step=1000); virtual ~H5Writer(); + virtual bool is_file_open() const; + virtual void close_file(); + virtual void write_data(const std::string& dataset_name, const size_t data_index, const char* data, const std::vector& data_shape, + const size_t data_bytes_size, const std::string& data_type, const std::string& endianness); + virtual H5::H5File& get_h5_file(); +}; + +class DummyH5Writer : public H5Writer +{ + public: + DummyH5Writer(); bool is_file_open() const; void close_file(); void write_data(const std::string& dataset_name, const size_t data_index, const char* data, const std::vector& data_shape, @@ -42,4 +53,7 @@ class H5Writer H5::H5File& get_h5_file(); }; +std::unique_ptr get_h5_writer(const std::string& filename, hsize_t frames_per_file=0, + hsize_t initial_dataset_size=1000, hsize_t dataset_increase_step=1000); + #endif \ No newline at end of file diff --git a/lib/src/ProcessManager.cpp b/lib/src/ProcessManager.cpp index bb7e8e4..0e30e33 100644 --- a/lib/src/ProcessManager.cpp +++ b/lib/src/ProcessManager.cpp @@ -148,7 +148,7 @@ void ProcessManager::receive_zmq(WriterManager& manager, RingBuffer& ring_buffer void ProcessManager::write_h5(WriterManager& manager, const H5Format& format, RingBuffer& ring_buffer, const shared_ptr> header_values_type, const string& bsread_rest_address) { - H5Writer writer(manager.get_output_file(), 0, config::initial_dataset_size, config::dataset_increase_step); + auto writer = get_h5_writer(manager.get_output_file(), 0, config::initial_dataset_size, config::dataset_increase_step); auto raw_frames_dataset_name = config::raw_image_dataset_name; uint64_t last_pulse_id = 0; @@ -174,13 +174,13 @@ void ProcessManager::write_h5(WriterManager& manager, const H5Format& format, Ri #endif // Write image data. - writer.write_data(raw_frames_dataset_name, - received_data.first->frame_index, - received_data.second, - received_data.first->frame_shape, - received_data.first->frame_bytes_size, - received_data.first->type, - received_data.first->endianness); + writer->write_data(raw_frames_dataset_name, + received_data.first->frame_index, + received_data.second, + received_data.first->frame_shape, + received_data.first->frame_bytes_size, + received_data.first->type, + received_data.first->endianness); #ifdef PERF_OUTPUT using namespace date; @@ -224,7 +224,7 @@ void ProcessManager::write_h5(WriterManager& manager, const H5Format& format, Ri // Header data are fixed to scalars in little endian. vector value_shape = {header_data_type.value_shape}; - writer.write_data(name, + writer->write_data(name, received_data.first->frame_index, value.get(), value_shape, @@ -254,7 +254,7 @@ void ProcessManager::write_h5(WriterManager& manager, const H5Format& format, Ri notify_last_pulse_id(bsread_rest_address, last_pulse_id); } - if (writer.is_file_open()) { + if (writer->is_file_open()) { #ifdef DEBUG_OUTPUT using namespace date; cout << "[" << std::chrono::system_clock::now() << "]"; @@ -272,7 +272,7 @@ void ProcessManager::write_h5(WriterManager& manager, const H5Format& format, Ri // Even if we can't write the format, lets try to preserve the data. try { - H5FormatUtils::write_format(writer.get_h5_file(), format, parameters); + H5FormatUtils::write_format(writer->get_h5_file(), format, parameters); } catch (const runtime_error& ex) { using namespace date; std::cout << "[" << std::chrono::system_clock::now() << "]"; @@ -287,7 +287,7 @@ void ProcessManager::write_h5(WriterManager& manager, const H5Format& format, Ri cout << "[ProcessManager::write] Closing file " << manager.get_output_file() << endl; #endif - writer.close_file(); + writer->close_file(); #ifdef DEBUG_OUTPUT using namespace date; diff --git a/lib/test/test_H5Writer.cpp b/lib/test/test_H5Writer.cpp new file mode 100644 index 0000000..c2f187c --- /dev/null +++ b/lib/test/test_H5Writer.cpp @@ -0,0 +1,12 @@ + +#include "../src/H5Writer.hpp" +using namespace std; + +TEST(H5Writer, get_h5_writer) +{ + auto dummy_writer = get_h5_writer("/dev/null"); + EXPECT_TRUE(dynamic_cast(dummy_writer.get())); + + auto real_writer = get_h5_writer("real_file.h5"); + EXPECT_FALSE(dynamic_cast(real_writer.get())); +} \ No newline at end of file diff --git a/lib/test/test_ZmqReceiver.cpp b/lib/test/test_ZmqReceiver.cpp index 85bbd65..cae0b5e 100644 --- a/lib/test/test_ZmqReceiver.cpp +++ b/lib/test/test_ZmqReceiver.cpp @@ -1,5 +1,4 @@ #include "../src/ZmqReceiver.hpp" -#include "../src/ZmqReceiver.hpp" using namespace std; namespace pt = boost::property_tree; diff --git a/lib/test/test_main.cpp b/lib/test/test_main.cpp index bb3f5ef..20b340e 100644 --- a/lib/test/test_main.cpp +++ b/lib/test/test_main.cpp @@ -1,5 +1,6 @@ #include "gtest/gtest.h" #include "test_ZmqReceiver.cpp" +#include "test_H5Writer.cpp" using namespace std;