X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2FPacketRegistry.test.cc;h=8dd410d5243c0c489276491afd8a3c9e17002df0;hb=78a6e233083efa63a9cd0684a92abc64202a9ee7;hp=872f490ede0d46e23c3363f9c657d409a716195a;hpb=eb83d096ce313989c3588c1cb6663caa513fb370;p=senf.git diff --git a/senf/Packets/PacketRegistry.test.cc b/senf/Packets/PacketRegistry.test.cc index 872f490..8dd410d 100644 --- a/senf/Packets/PacketRegistry.test.cc +++ b/senf/Packets/PacketRegistry.test.cc @@ -56,48 +56,112 @@ namespace { struct OtherPacketType : public PacketTypeBase {}; typedef senf::ConcretePacket OtherPacket; + bool contains(std::string a, std::string b) + { return a.find(b) != std::string::npos; } + + bool contains_not(std::string a, std::string b) + { return a.find(b) == std::string::npos; } + } -SENF_PACKET_REGISTRY_REGISTER(StringTag, "foo", FooPacket); -SENF_PACKET_REGISTRY_REGISTER(StringTag, "bar", BarPacket); +SENF_PACKET_REGISTRY_REGISTER(StringTag, "foo", OtherPacket); +SENF_PACKET_REGISTRY_REGISTER_PRIORITY(StringTag, "foo", 1, FooPacket); -BOOST_AUTO_UNIT_TEST(packetRegistry_test) +SENF_AUTO_UNIT_TEST(packetRegistry_test) { - PacketRegistry::registerPacket(1u); - PacketRegistry::registerPacket(2u); - - BOOST_CHECK_EQUAL( PacketRegistry::key(), 1u ); - BOOST_CHECK_EQUAL( PacketRegistry::key(), 2u ); - BOOST_CHECK_THROW( PacketRegistry::key(), - PacketTypeNotRegisteredException ); - - BOOST_CHECK_EQUAL( PacketRegistry::key(), "foo" ); - BOOST_CHECK( ! PacketRegistry::lookup("blub", senf::nothrow) ); - BOOST_CHECK( PacketRegistry::lookup(1u, senf::nothrow) ); - - unsigned elts1[] = { 1u, 2u }; - BOOST_CHECK_EQUAL_COLLECTIONS( PacketRegistry::begin(), PacketRegistry::end(), - elts1+0, elts1+sizeof(elts1)/sizeof(elts1[0]) ); - - std::string elts2[] = { "bar", "foo" }; - BOOST_CHECK_EQUAL_COLLECTIONS( PacketRegistry::begin(), PacketRegistry::end(), - elts2+0, elts2+sizeof(elts2)/sizeof(elts2[0]) ); - - std::stringstream s; - senf::dumpPacketRegistries(s); - BOOST_CHECK_EQUAL( s.str(), - "(anonymous namespace)::BaseTag:\n" - " 0x00000001 ( 1) (....) (anonymous namespace)::FooPacketType\n" - " 0x00000002 ( 2) (....) (anonymous namespace)::BarPacketType\n" - "\n" - "(anonymous namespace)::RegTag:\n" - " 0x00000001 ( 1) (....) (anonymous namespace)::FooPacketType\n" - " 0x00000002 ( 2) (....) (anonymous namespace)::BarPacketType\n" - "\n" - "(anonymous namespace)::StringTag:\n" - " bar (anonymous namespace)::BarPacketType\n" - " foo (anonymous namespace)::FooPacketType\n" - "\n" ); + { + PacketRegistry::registerPacket("bar"); + PacketRegistry::registerPacket(1u); + senf::PacketRegistry::ScopedRegistrationProxy registerBarInBase (2u); + + BOOST_CHECK_EQUAL( PacketRegistry::key(), 1u ); + BOOST_CHECK_EQUAL( PacketRegistry::key(), 2u ); + BOOST_CHECK_THROW( PacketRegistry::key(), + PacketTypeNotRegisteredException ); + + BOOST_CHECK_EQUAL( PacketRegistry::key(), "foo" ); + BOOST_CHECK( PacketRegistry::lookup("foo").type() == typeid(FooPacket) ); + BOOST_CHECK( ! PacketRegistry::lookup("blub", senf::nothrow) ); + BOOST_CHECK( PacketRegistry::lookup(1u, senf::nothrow) ); + + unsigned elts1[] = { 1u, 2u }; + BOOST_CHECK_EQUAL_COLLECTIONS( + boost::make_transform_iterator( + PacketRegistry::begin(), + boost::multi_index::member::Entry, unsigned, + &senf::PacketRegistry::Entry::key>()), + boost::make_transform_iterator( + PacketRegistry::end(), + boost::multi_index::member::Entry, unsigned, + &senf::PacketRegistry::Entry::key>()), + elts1+0, elts1+sizeof(elts1)/sizeof(elts1[0]) ); + + std::string elts2[] = { "bar", "foo", "foo" }; + BOOST_CHECK_EQUAL_COLLECTIONS( + boost::make_transform_iterator( + PacketRegistry::begin(), + boost::multi_index::member::Entry, std::string, + &senf::PacketRegistry::Entry::key>()), + boost::make_transform_iterator( + PacketRegistry::end(), + boost::multi_index::member::Entry, std::string, + &senf::PacketRegistry::Entry::key>()), + elts2+0, elts2+sizeof(elts2)/sizeof(elts2[0]) ); + + std::stringstream s; + senf::dumpPacketRegistries(s); + BOOST_CHECK_PREDICATE( + contains, + (s.str()) + ("(anonymous namespace)::BaseTag:\n" + " 0x00000001 ( 1) (....) 0 (anonymous namespace)::FooPacketType\n" + " 0x00000002 ( 2) (....) 0 (anonymous namespace)::BarPacketType\n" + "\n")); + BOOST_CHECK_PREDICATE( + contains, + (s.str()) + ("(anonymous namespace)::StringTag:\n" + " bar 0 (anonymous namespace)::BarPacketType\n" + " foo 1 (anonymous namespace)::FooPacketType\n" + " foo 0 (anonymous namespace)::OtherPacketType\n" + "\n" )); + } + + { + std::stringstream s; + senf::dumpPacketRegistries(s); + BOOST_CHECK_PREDICATE( + contains, + (s.str()) + ("(anonymous namespace)::BaseTag:\n" + " 0x00000001 ( 1) (....) 0 (anonymous namespace)::FooPacketType\n" + "\n")); + BOOST_CHECK_PREDICATE( + contains, + (s.str()) + ("(anonymous namespace)::StringTag:\n" + " bar 0 (anonymous namespace)::BarPacketType\n" + " foo 1 (anonymous namespace)::FooPacketType\n" + " foo 0 (anonymous namespace)::OtherPacketType\n" + "\n" )); + + SENF_CHECK_NO_THROW( PacketRegistry::unregisterPacket(1u) ); + SENF_CHECK_NO_THROW( PacketRegistry::unregisterPacket() ); + + s.str(""); + senf::dumpPacketRegistries(s); + BOOST_CHECK_PREDICATE( + contains_not, + (s.str()) + ("(anonymous namespace)::BaseTag:\n")); + BOOST_CHECK_PREDICATE( + contains, + (s.str()) + ("(anonymous namespace)::StringTag:\n" + " foo 1 (anonymous namespace)::FooPacketType\n" + " foo 0 (anonymous namespace)::OtherPacketType\n" + "\n" )); + } } ///////////////////////////////cc.e////////////////////////////////////////