4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 // Stefan Bund <g0dil@berlios.de>
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 // GNU General Public License for more details.
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 \brief Packet.test unit tests */
26 //#include "Packet.test.hh"
27 //#include "Packet.test.ih"
33 #include "../Utils/auto_unit_test.hh"
34 #include <boost/test/test_tools.hpp>
37 ///////////////////////////////cc.p////////////////////////////////////////
42 typedef unsigned key_t;
46 : public senf::PacketTypeBase,
47 public senf::PacketTypeMixin<FooPacketType>
49 using senf::PacketTypeMixin<FooPacketType>::nextPacketRange;
50 using senf::PacketTypeMixin<FooPacketType>::initSize;
51 using senf::PacketTypeMixin<FooPacketType>::init;
52 static size_type initSize()
55 // We need to implement initHeadSize() to force the mixin to switch into 'fixed-size'
56 // mode. Otherwise, mixin::nextPacketRange() would query the parser for it's size to find
57 // the header size. Since the parser is VoidPacketParser, the header size would therefore be
59 static size_type initHeadSize()
60 { return initSize(); }
62 typedef senf::ConcretePacket<FooPacketType> FooPacket;
64 struct BarPacketParser : public senf::PacketParserBase
66 # include SENF_FIXED_PARSER()
68 SENF_PARSER_FIELD( type, senf::UInt16Parser );
69 SENF_PARSER_FIELD( length, senf::Int32Parser );
70 SENF_PARSER_FIELD( reserved, senf::UInt16Parser );
73 reserved() << 0xA0A0u;
76 SENF_PARSER_FINALIZE(BarPacketParser);
80 : public senf::PacketTypeBase,
81 public senf::PacketTypeMixin<BarPacketType,RegTag>
83 typedef senf::PacketTypeMixin<BarPacketType,RegTag> mixin;
84 typedef senf::ConcretePacket<BarPacketType> packet;
85 typedef BarPacketParser parser;
86 using mixin::nextPacketRange;
87 using mixin::nextPacketType;
88 using mixin::initSize;
90 static void dump(packet p, std::ostream & os) {
92 << "type: " << p->type() << "\n"
93 << "length: " << p->length() << "\n";
95 static void finalize(packet p) {
96 if (p.next(senf::nothrow))
97 p->type() = senf::PacketRegistry<RegTag>::key(p.next());
101 static key_t nextPacketKey(packet p) {
105 typedef BarPacketType::packet BarPacket;
108 senf::PacketRegistry<RegTag>::RegistrationProxy<FooPacket> registerFoo(1u);
109 senf::PacketRegistry<RegTag>::RegistrationProxy<BarPacket> registerBar(2u);
114 BOOST_AUTO_UNIT_TEST(packet)
116 senf::Packet packet (FooPacket::create());
117 BarPacket::createAfter(packet);
119 BOOST_REQUIRE( packet );
120 BOOST_CHECK( packet.next() );
121 BOOST_CHECK( ! packet.next().next(senf::nothrow) );
122 BOOST_CHECK( ! packet.prev(senf::nothrow) );
123 BOOST_CHECK( packet.next().prev() == packet );
124 BOOST_CHECK( packet.next() != packet );
125 BOOST_CHECK_EQUAL( std::distance(packet.data().begin(), packet.next().data().begin()), 4 );
126 BOOST_CHECK_EQUAL( std::distance(packet.data().begin(), packet.data().end()), 12 );
127 BOOST_CHECK_EQUAL( std::distance(packet.next().data().begin(), packet.next().data().end()), 8 );
128 BOOST_CHECK( packet.data().end() == packet.next().data().end() );
129 BOOST_CHECK_EQUAL( packet.size(), 12u );
130 BOOST_CHECK_EQUAL( packet.next().size(), 8u );
131 BOOST_CHECK( packet.is<FooPacket>() );
132 BOOST_CHECK( packet.next().is<BarPacket>() );
133 BOOST_CHECK( packet.first() == packet );
134 BOOST_CHECK( packet.last() == packet.next() );
136 senf::Packet p2 (packet.next());
138 packet.parseNextAs<FooPacket>();
139 BOOST_CHECK_EQUAL( packet.size(), 12u );
140 BOOST_CHECK_EQUAL( packet.next().size(), 8u );
141 BOOST_CHECK( packet.next().is<FooPacket>() );
143 BOOST_CHECK( packet.next().as<FooPacket>() );
145 p2 = packet.next().clone();
147 packet.next().append( p2 );
148 BOOST_REQUIRE( packet.next().next() );
149 BOOST_CHECK( packet.next().next().next() );
150 BOOST_CHECK( packet.next().next().next().is<senf::DataPacket>() );
151 BOOST_CHECK_EQUAL( packet.size(), 16u );
153 // This calls and checks typeId()
154 BOOST_CHECK_EQUAL( senf::PacketRegistry<RegTag>::key(packet), 1u );
155 packet.next().parseNextAs( senf::PacketRegistry<RegTag>::lookup(2u).factory() );
156 BOOST_CHECK( packet.next().next().is<BarPacket>() );
160 BOOST_CHECK_EQUAL( s.str(), "BarPacket:\ntype: 0\nlength: 0\n" );
163 BOOST_CHECK_EQUAL( packet.last().as<BarPacket>()->type(),
164 BarPacket::type::parser::type_t::value_type(-1) );
165 packet.last().append(FooPacket::create());
167 BOOST_CHECK_EQUAL( packet.find<BarPacket>()->type(), 1u );
169 BOOST_CHECK( packet.factory() == FooPacket::factory() );
171 senf::PacketData::byte data[] = { 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
174 BarPacket::createAfter(packet,data);
175 BOOST_REQUIRE( packet.next() );
176 BOOST_REQUIRE( packet.next().is<BarPacket>() );
177 BOOST_CHECK( packet.last().is<FooPacket>() );
178 BOOST_CHECK_EQUAL( packet.last().rfind<BarPacket>()->type(), 1u );
179 BOOST_CHECK_EQUAL( packet.next().size(), 11u );
180 BOOST_REQUIRE( packet.next().next() );
181 BOOST_CHECK( packet.next().next().is<FooPacket>() );
182 BOOST_CHECK( ! packet.next().next().next(senf::nothrow) );
183 BOOST_CHECK_EQUAL( packet.next().next().data()[0], 0x81u );
185 BOOST_CHECK( packet.first().find<FooPacket>() == packet );
186 BOOST_CHECK( packet.last().rfind<BarPacket>() == packet.last().prev() );
187 BOOST_CHECK( packet.find<FooPacket>() == packet );
188 BOOST_CHECK( packet.last().rfind<FooPacket>() == packet.last() );
189 BOOST_CHECK( packet.next<BarPacket>() == packet.next() );
190 BOOST_CHECK( packet.last().prev().prev<FooPacket>() == packet );
193 BOOST_AUTO_UNIT_TEST(concretePacket)
195 senf::PacketData::byte data[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
197 BOOST_CHECK_EQUAL( FooPacket::create().size(), 4u );
198 BOOST_CHECK_EQUAL( FooPacket::create(senf::noinit).size(), 0u );
199 BOOST_CHECK_THROW( FooPacket::create(2u), senf::TruncatedPacketException );
200 // No 'u' suffix here to check, that the disable_if works ...
201 BOOST_CHECK_EQUAL( FooPacket::create(10).size(), 10u );
202 BOOST_CHECK_EQUAL( FooPacket::create(2u,senf::noinit).size(), 2u );
203 BOOST_CHECK_EQUAL( FooPacket::create(data).size(), 6u );
205 senf::Packet packet (FooPacket::create());
207 BOOST_CHECK_EQUAL( FooPacket::createAfter(packet).size(), 4u );
208 BOOST_CHECK_EQUAL( packet.size(), 8u );
210 BOOST_CHECK_EQUAL( FooPacket::createAfter(packet,senf::noinit).size(), 0u );
211 BOOST_CHECK_EQUAL( packet.size(), 4u );
213 BOOST_CHECK_THROW( FooPacket::createAfter(packet,2u), senf::TruncatedPacketException );
214 // No 'u' suffix here to check, that the disable_if works ...
215 BOOST_CHECK_EQUAL( FooPacket::createAfter(packet,10).size(), 10u );
216 BOOST_CHECK_EQUAL( packet.size(), 14u );
218 BOOST_CHECK_EQUAL( FooPacket::createAfter(packet,2u,senf::noinit).size(), 2u );
219 BOOST_CHECK_EQUAL( packet.size(), 6u );
221 BOOST_CHECK_EQUAL( FooPacket::createAfter(packet,data).size(), 6u );
222 BOOST_CHECK_EQUAL( packet.size(), 10u );
224 BOOST_CHECK_EQUAL( FooPacket::createBefore(packet).size(), 14u );
225 BOOST_CHECK_EQUAL( packet.size(), 10u );
227 BOOST_CHECK_EQUAL( FooPacket::createBefore(packet,senf::noinit).size(), 10u );
228 BOOST_CHECK_EQUAL( packet.size(), 10u );
230 BOOST_CHECK( packet.clone() != packet );
231 BOOST_CHECK_EQUAL( BarPacket::create()->reserved(), 0xA0A0u );
234 ///////////////////////////////cc.e////////////////////////////////////////
241 // c-file-style: "senf"
242 // indent-tabs-mode: nil
243 // ispell-local-dictionary: "american"
244 // compile-command: "scons -u test"
245 // comment-column: 40