4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
6 // The contents of this file are subject to the Fraunhofer FOKUS Public License
7 // Version 1.0 (the "License"); you may not use this file except in compliance
8 // with the License. You may obtain a copy of the License at
9 // http://senf.berlios.de/license.html
11 // The Fraunhofer FOKUS Public License Version 1.0 is based on,
12 // but modifies the Mozilla Public License Version 1.1.
13 // See the full license text for the amendments.
15 // Software distributed under the License is distributed on an "AS IS" basis,
16 // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
17 // for the specific language governing rights and limitations under the License.
19 // The Original Code is Fraunhofer FOKUS code.
21 // The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V.
22 // (registered association), Hansastraße 27 c, 80686 Munich, Germany.
23 // All Rights Reserved.
26 // Stefan Bund <g0dil@berlios.de>
29 \brief PacketRegistry unit tests */
31 //#include "PacketRegistry.test.hh"
32 //#include "PacketRegistry.test.ih"
39 #include <senf/Utils/auto_unit_test.hh>
40 #include <boost/test/test_tools.hpp>
43 //-/////////////////////////////////////////////////////////////////////////////////////////////////
50 typedef unsigned key_t;
54 typedef std::string key_t;
57 struct FooPacketType : public PacketTypeBase {};
58 typedef senf::ConcretePacket<FooPacketType> FooPacket;
59 struct BarPacketType : public PacketTypeBase {};
60 typedef senf::ConcretePacket<BarPacketType> BarPacket;
61 struct OtherPacketType : public PacketTypeBase {};
62 typedef senf::ConcretePacket<OtherPacketType> OtherPacket;
64 bool contains(std::string a, std::string b)
65 { return a.find(b) != std::string::npos; }
67 bool contains_not(std::string a, std::string b)
68 { return a.find(b) == std::string::npos; }
72 SENF_PACKET_REGISTRY_REGISTER(StringTag, "foo", OtherPacket);
73 SENF_PACKET_REGISTRY_REGISTER_PRIORITY(StringTag, "foo", 1, FooPacket);
75 SENF_AUTO_UNIT_TEST(packetRegistry_test)
78 PacketRegistry<StringTag>::registerPacket<BarPacket>("bar");
79 PacketRegistry<BaseTag>::registerPacket<FooPacket>(1u);
80 senf::PacketRegistry<BaseTag>::ScopedRegistrationProxy<BarPacket> registerBarInBase (2u);
82 BOOST_CHECK_EQUAL( PacketRegistry<BaseTag>::key<FooPacket>(), 1u );
83 BOOST_CHECK_EQUAL( PacketRegistry<BaseTag>::key<BarPacket>(), 2u );
84 BOOST_CHECK_THROW( PacketRegistry<BaseTag>::key<OtherPacket>(),
85 PacketTypeNotRegisteredException );
87 BOOST_CHECK_EQUAL( PacketRegistry<StringTag>::key<FooPacket>(), "foo" );
88 BOOST_CHECK( PacketRegistry<StringTag>::lookup("foo").type() == typeid(FooPacket) );
89 BOOST_CHECK( ! PacketRegistry<StringTag>::lookup("blub", senf::nothrow) );
90 BOOST_CHECK( PacketRegistry<BaseTag>::lookup(1u, senf::nothrow) );
92 unsigned elts1[] = { 1u, 2u };
93 BOOST_CHECK_EQUAL_COLLECTIONS(
94 boost::make_transform_iterator(
95 PacketRegistry<BaseTag>::begin(),
96 boost::multi_index::member<senf::PacketRegistry<BaseTag>::Entry, unsigned,
97 &senf::PacketRegistry<BaseTag>::Entry::key>()),
98 boost::make_transform_iterator(
99 PacketRegistry<BaseTag>::end(),
100 boost::multi_index::member<senf::PacketRegistry<BaseTag>::Entry, unsigned,
101 &senf::PacketRegistry<BaseTag>::Entry::key>()),
102 elts1+0, elts1+sizeof(elts1)/sizeof(elts1[0]) );
104 std::string elts2[] = { "bar", "foo", "foo" };
105 BOOST_CHECK_EQUAL_COLLECTIONS(
106 boost::make_transform_iterator(
107 PacketRegistry<StringTag>::begin(),
108 boost::multi_index::member<senf::PacketRegistry<StringTag>::Entry, std::string,
109 &senf::PacketRegistry<StringTag>::Entry::key>()),
110 boost::make_transform_iterator(
111 PacketRegistry<StringTag>::end(),
112 boost::multi_index::member<senf::PacketRegistry<StringTag>::Entry, std::string,
113 &senf::PacketRegistry<StringTag>::Entry::key>()),
114 elts2+0, elts2+sizeof(elts2)/sizeof(elts2[0]) );
117 senf::dumpPacketRegistries(s);
118 BOOST_CHECK_PREDICATE(
121 ("(anonymous namespace)::BaseTag:\n"
122 " 0x00000001 ( 1) (....) 0 (anonymous namespace)::FooPacketType\n"
123 " 0x00000002 ( 2) (....) 0 (anonymous namespace)::BarPacketType\n"
125 BOOST_CHECK_PREDICATE(
128 ("(anonymous namespace)::StringTag:\n"
129 " bar 0 (anonymous namespace)::BarPacketType\n"
130 " foo 1 (anonymous namespace)::FooPacketType\n"
131 " foo 0 (anonymous namespace)::OtherPacketType\n"
137 senf::dumpPacketRegistries(s);
138 BOOST_CHECK_PREDICATE(
141 ("(anonymous namespace)::BaseTag:\n"
142 " 0x00000001 ( 1) (....) 0 (anonymous namespace)::FooPacketType\n"
144 BOOST_CHECK_PREDICATE(
147 ("(anonymous namespace)::StringTag:\n"
148 " bar 0 (anonymous namespace)::BarPacketType\n"
149 " foo 1 (anonymous namespace)::FooPacketType\n"
150 " foo 0 (anonymous namespace)::OtherPacketType\n"
153 SENF_CHECK_NO_THROW( PacketRegistry<BaseTag>::unregisterPacket(1u) );
154 SENF_CHECK_NO_THROW( PacketRegistry<StringTag>::unregisterPacket<BarPacket>() );
157 senf::dumpPacketRegistries(s);
158 BOOST_CHECK_PREDICATE(
161 ("(anonymous namespace)::BaseTag:\n"));
162 BOOST_CHECK_PREDICATE(
165 ("(anonymous namespace)::StringTag:\n"
166 " foo 1 (anonymous namespace)::FooPacketType\n"
167 " foo 0 (anonymous namespace)::OtherPacketType\n"
172 //-/////////////////////////////////////////////////////////////////////////////////////////////////
179 // c-file-style: "senf"
180 // indent-tabs-mode: nil
181 // ispell-local-dictionary: "american"
182 // compile-command: "scons -u test"
183 // comment-column: 40