diff options
-rw-r--r-- | lib/CMakeLists.txt | 1 | ||||
-rw-r--r-- | lib/serialize_meta.cpp | 74 | ||||
-rw-r--r-- | tests/CMakeLists.txt | 3 | ||||
-rw-r--r-- | tests/serialize_tags_test.cpp | 76 |
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); +} |