summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/CMakeLists.txt1
-rw-r--r--lib/serialize_meta.cpp74
-rw-r--r--tests/CMakeLists.txt3
-rw-r--r--tests/serialize_tags_test.cpp76
4 files changed, 153 insertions, 1 deletions
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
index ba7e76e..7f33397 100644
--- a/lib/CMakeLists.txt
+++ b/lib/CMakeLists.txt
@@ -64,6 +64,7 @@ list(APPEND GRAS_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/register_messages.cpp
${CMAKE_CURRENT_SOURCE_DIR}/theron_allocator.cpp
${CMAKE_CURRENT_SOURCE_DIR}/weak_container.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/serialize_meta.cpp
)
########################################################################
diff --git a/lib/serialize_meta.cpp b/lib/serialize_meta.cpp
new file mode 100644
index 0000000..33db43c
--- /dev/null
+++ b/lib/serialize_meta.cpp
@@ -0,0 +1,74 @@
+// Copyright (C) by Josh Blum. See LICENSE.txt for licensing information.
+
+#include <gras/sbuffer.hpp>
+#include <gras/tags.hpp>
+#include <PMC/Serialize.hpp>
+#include <boost/serialization/split_free.hpp>
+#include <boost/serialization/string.hpp>
+
+/***********************************************************************
+ * support for sbuffer
+ **********************************************************************/
+namespace boost { namespace serialization {
+template<class Archive>
+void save(Archive & ar, const gras::SBuffer & b, unsigned int version)
+{
+ bool null = not b;
+ ar & null;
+ if (null) return;
+
+ //TODO lazyness string
+ std::string s((const char *)b.get(), b.length);
+ ar & s;
+}
+template<class Archive>
+void load(Archive & ar, gras::SBuffer & b, unsigned int version)
+{
+ bool null = false;
+ ar & null;
+ if (null) b.reset();
+ if (null) return;
+
+ //TODO lazyness string
+ std::string s;
+ ar & s;
+ gras::SBufferConfig config;
+ config.length = s.length();
+ b = gras::SBuffer(config);
+ b.length = s.length();
+ std::memcpy(b.get(), s.c_str(), b.length);
+}
+}}
+
+BOOST_SERIALIZATION_SPLIT_FREE(gras::SBuffer)
+PMC_SERIALIZE_EXPORT(gras::SBuffer, "PMC<gras::SBuffer>")
+
+
+/***********************************************************************
+ * support for special packet msg type
+ **********************************************************************/
+namespace boost { namespace serialization {
+template <class Archive>
+void serialize(Archive &ar, gras::PacketMsg &t, const unsigned int)
+{
+ ar & t.info;
+ ar & t.buff;
+}
+}}
+
+PMC_SERIALIZE_EXPORT(gras::PacketMsg, "PMC<gras::PacketMsg>")
+
+/***********************************************************************
+ * support for special stream tag type
+ **********************************************************************/
+namespace boost { namespace serialization {
+template <class Archive>
+void serialize(Archive &ar, gras::StreamTag &t, const unsigned int)
+{
+ ar & t.key;
+ ar & t.val;
+ ar & t.src;
+}
+}}
+
+PMC_SERIALIZE_EXPORT(gras::StreamTag, "PMC<gras::StreamTag>")
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 7626eb0..797f858 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -7,7 +7,7 @@ include(GrTest)
########################################################################
# unit test suite
########################################################################
-find_package(Boost COMPONENTS unit_test_framework)
+find_package(Boost COMPONENTS unit_test_framework serialization)
if (NOT Boost_FOUND)
return()
@@ -15,6 +15,7 @@ endif()
set(test_sources
block_props_test.cpp
+ serialize_tags_test.cpp
)
include_directories(${GRAS_INCLUDE_DIRS})
diff --git a/tests/serialize_tags_test.cpp b/tests/serialize_tags_test.cpp
new file mode 100644
index 0000000..2a07e2b
--- /dev/null
+++ b/tests/serialize_tags_test.cpp
@@ -0,0 +1,76 @@
+// Copyright (C) by Josh Blum. See LICENSE.txt for licensing information.
+
+#include <boost/test/unit_test.hpp>
+#include <algorithm>
+#include <iostream>
+
+#include <PMC/PMC.hpp>
+#include <PMC/Serialize.hpp>
+#include <gras/tags.hpp>
+
+// include headers that implement a archive in simple text format
+#include <boost/archive/polymorphic_text_oarchive.hpp>
+#include <boost/archive/polymorphic_text_iarchive.hpp>
+#include <sstream>
+#include <cstdlib>
+
+static PMCC loopback_test(PMCC p0)
+{
+ std::cout << "\ndoing loopback test on " << p0 << std::endl;
+ std::stringstream ss;
+ boost::archive::polymorphic_text_oarchive oa(ss);
+
+ oa << p0;
+ //std::cout << "stringstream holds " << ss.str() << std::endl;
+
+ boost::archive::polymorphic_text_iarchive ia(ss);
+ PMCC p1;
+ ia >> p1;
+
+ return p1;
+}
+
+static gras::SBuffer get_random_sbuff(void)
+{
+ gras::SBufferConfig config;
+ config.length = 100;
+ gras::SBuffer buff(config);
+ for (size_t i = 0; i < buff.length/sizeof(long); i++)
+ {
+ reinterpret_cast<long *>(buff.get())[i] = std::rand();
+ }
+ return buff;
+}
+
+BOOST_AUTO_TEST_CASE(test_sbuffer_type)
+{
+ gras::SBuffer src_buff = get_random_sbuff();
+ PMCC result = loopback_test(PMC_M(src_buff));
+ const gras::SBuffer &result_buff = result.as<gras::SBuffer>();
+
+ BOOST_CHECK_EQUAL(src_buff.length, result_buff.length);
+ BOOST_CHECK(std::memcmp(src_buff.get(), result_buff.get(), src_buff.length) == 0);
+}
+
+BOOST_AUTO_TEST_CASE(test_null_sbuffer_type)
+{
+ gras::SBuffer src_buff;
+ PMCC result = loopback_test(PMC_M(src_buff));
+ const gras::SBuffer &result_buff = result.as<gras::SBuffer>();
+ BOOST_CHECK(not src_buff);
+ BOOST_CHECK(not result_buff);
+}
+
+BOOST_AUTO_TEST_CASE(test_pkt_msg_type)
+{
+ gras::PacketMsg pkt_msg;
+ pkt_msg.buff = get_random_sbuff();
+ pkt_msg.info = PMC_M(long(42));
+
+ PMCC result = loopback_test(PMC_M(pkt_msg));
+ const gras::PacketMsg &result_msg = result.as<gras::PacketMsg>();
+
+ BOOST_CHECK_EQUAL(pkt_msg.info.type().name(), result_msg.info.type().name());
+ BOOST_CHECK(pkt_msg.info.eq(result_msg.info));
+ BOOST_CHECK(std::memcmp(pkt_msg.buff.get(), result_msg.buff.get(), pkt_msg.buff.length) == 0);
+}