2 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
3 // Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
4 // Stefan Bund <g0dil@berlios.de>
6 // This program is free software; you can redistribute it and/or modify
7 // it under the terms of the GNU General Public License as published by
8 // the Free Software Foundation; either version 2 of the License, or
9 // (at your option) any later version.
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License
17 // along with this program; if not, write to the
18 // Free Software Foundation, Inc.,
19 // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 \brief Packet.test unit tests */
24 //#include "Packet.test.hh"
25 //#include "Packet.test.ih"
31 #include <boost/test/auto_unit_test.hpp>
32 #include <boost/test/test_tools.hpp>
35 ///////////////////////////////cc.p////////////////////////////////////////
40 typedef unsigned key_t;
44 : public senf::PacketTypeBase,
45 public senf::PacketTypeMixin<FooPacketType>
47 using senf::PacketTypeMixin<FooPacketType>::nextPacketRange;
48 using senf::PacketTypeMixin<FooPacketType>::initSize;
49 using senf::PacketTypeMixin<FooPacketType>::init;
50 typedef senf::PacketInterpreter<FooPacketType> interpreter;
51 static interpreter::size_type initSize()
54 typedef senf::ConcretePacket<FooPacketType> FooPacket;
56 struct BarPacketParser : public senf::PacketParserBase
58 SENF_PACKET_PARSER_INIT(BarPacketParser);
60 typedef senf::Parse_UInt16 Parse_Type;
61 typedef senf::Parse_Int32 Parse_Length;
62 typedef senf::Parse_UInt16 Parse_Reserved;
64 Parse_Type type() const { return parse<Parse_Type> (i()); }
65 Parse_Length length() const { return parse<Parse_Length> (i()+2); }
66 Parse_Reserved reserved() const { return parse<Parse_Reserved> (i()+6); }
70 : public senf::PacketTypeBase,
71 public senf::PacketTypeMixin<BarPacketType,RegTag>
73 typedef senf::PacketTypeMixin<BarPacketType,RegTag> mixin;
74 typedef senf::ConcretePacket<BarPacketType> packet;
75 typedef BarPacketParser parser;
76 using mixin::nextPacketRange;
77 using mixin::nextPacketType;
78 using mixin::initSize;
80 static size_type initSize()
82 static void init(packet p) {
83 p->reserved() = 0xA0A0u;
85 static void dump(packet p, std::ostream & os) {
87 << "type: " << p->type() << "\n"
88 << "length: " << p->length() << "\n";
90 static void finalize(packet p) {
92 p->type() = senf::PacketRegistry<RegTag>::key(p.next());
96 static registry_key_t nextPacketKey(packet p) {
100 typedef BarPacketType::packet BarPacket;
103 senf::PacketRegistry<RegTag>::RegistrationProxy<FooPacket> registerFoo(1u);
104 senf::PacketRegistry<RegTag>::RegistrationProxy<BarPacket> registerBar(2u);
109 BOOST_AUTO_UNIT_TEST(packet)
111 senf::Packet packet (FooPacket::create());
112 BarPacket::createAfter(packet);
114 BOOST_REQUIRE( packet );
115 BOOST_CHECK( packet.next() );
116 BOOST_CHECK( ! packet.next().next() );
117 BOOST_CHECK( ! packet.prev() );
118 BOOST_CHECK( packet.next().prev() == packet );
119 BOOST_CHECK( packet.next() != packet );
120 BOOST_CHECK_EQUAL( packet.size(), 12u );
121 BOOST_CHECK_EQUAL( packet.next().size(), 8u );
122 BOOST_CHECK( packet.is<FooPacket>() );
123 BOOST_CHECK( packet.next().is<BarPacket>() );
124 BOOST_CHECK( packet.first() == packet );
125 BOOST_CHECK( packet.last() == packet.next() );
127 senf::Packet p2 (packet.next());
129 packet.parseNextAs<FooPacket>();
130 BOOST_CHECK_EQUAL( packet.size(), 12u );
131 BOOST_CHECK_EQUAL( packet.next().size(), 8u );
132 BOOST_CHECK( packet.next().is<FooPacket>() );
134 BOOST_CHECK( packet.next().as<FooPacket>() );
136 p2 = packet.next().clone();
138 packet.next().append( p2 );
139 BOOST_REQUIRE( packet.next().next() );
140 BOOST_CHECK( packet.next().next().next() );
141 BOOST_CHECK( packet.next().next().next().is<senf::DataPacket>() );
142 BOOST_CHECK_EQUAL( packet.size(), 16u );
144 // This calls and checks typeId()
145 BOOST_CHECK_EQUAL( senf::PacketRegistry<RegTag>::key(packet), 1u );
146 packet.next().parseNextAs( senf::PacketRegistry<RegTag>::lookup(2u).factory() );
147 BOOST_CHECK( packet.next().next().is<BarPacket>() );
151 BOOST_CHECK_EQUAL( s.str(), "BarPacket:\ntype: 0\nlength: 0\n" );
154 BOOST_CHECK_EQUAL( packet.last().as<BarPacket>()->type(),
155 BarPacket::type::parser::Parse_Type::value_type(-1) );
156 packet.last().append(FooPacket::create());
158 BOOST_CHECK_EQUAL( packet.next<BarPacket>()->type(), 1u );
160 BOOST_CHECK( packet.factory() == FooPacket::factory() );
162 senf::PacketData::byte data[] = { 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
165 BarPacket::createAfter(packet,data);
166 BOOST_REQUIRE( packet.next() );
167 BOOST_REQUIRE( packet.next().is<BarPacket>() );
168 BOOST_CHECK( packet.last().is<FooPacket>() );
169 BOOST_CHECK_EQUAL( packet.last<BarPacket>()->type(), 1u );
170 BOOST_CHECK_EQUAL( packet.next().size(), 11u );
171 BOOST_REQUIRE( packet.next().next() );
172 BOOST_CHECK( packet.next().next().is<FooPacket>() );
173 BOOST_CHECK( ! packet.next().next().next() );
174 BOOST_CHECK_EQUAL( packet.next().next().data()[0], 0x81u );
176 BOOST_CHECK( packet.first<FooPacket>() == packet );
177 BOOST_CHECK( packet.first<FooPacket>(senf::nothrow) == packet );
178 BOOST_CHECK( packet.last<BarPacket>() == packet.last().prev() );
179 BOOST_CHECK( packet.last<BarPacket>(senf::nothrow) == packet.last().prev() );
180 BOOST_CHECK( packet.findNext<FooPacket>() == packet );
181 BOOST_CHECK( packet.findNext<FooPacket>(senf::nothrow) == packet );
182 BOOST_CHECK( packet.last().findPrev<FooPacket>() == packet.last() );
183 BOOST_CHECK( packet.last().findPrev<FooPacket>(senf::nothrow) == packet.last() );
184 BOOST_CHECK( packet.next<BarPacket>() == packet.next() );
185 BOOST_CHECK( packet.next<BarPacket>(senf::nothrow) == packet.next() );
186 BOOST_CHECK( packet.last().prev<FooPacket>() == packet );
187 BOOST_CHECK( packet.last().prev<FooPacket>(senf::nothrow) == packet );
190 BOOST_AUTO_UNIT_TEST(concretePacket)
192 senf::PacketData::byte data[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
194 BOOST_CHECK_EQUAL( FooPacket::create().size(), 4u );
195 BOOST_CHECK_EQUAL( FooPacket::create(FooPacket::noinit).size(), 0u );
196 BOOST_CHECK_THROW( FooPacket::create(2u), senf::TruncatedPacketException );
197 BOOST_CHECK_EQUAL( FooPacket::create(10u).size(), 10u );
198 BOOST_CHECK_EQUAL( FooPacket::create(2u,FooPacket::noinit).size(), 2u );
199 BOOST_CHECK_EQUAL( FooPacket::create(data).size(), 6u );
201 senf::Packet packet (FooPacket::create());
203 BOOST_CHECK_EQUAL( FooPacket::createAfter(packet).size(), 4u );
204 BOOST_CHECK_EQUAL( packet.size(), 8u );
206 BOOST_CHECK_EQUAL( FooPacket::createAfter(packet,FooPacket::noinit).size(), 0u );
207 BOOST_CHECK_EQUAL( packet.size(), 4u );
209 BOOST_CHECK_THROW( FooPacket::createAfter(packet,2u), senf::TruncatedPacketException );
210 BOOST_CHECK_EQUAL( FooPacket::createAfter(packet,10u).size(), 10u );
211 BOOST_CHECK_EQUAL( packet.size(), 14u );
213 BOOST_CHECK_EQUAL( FooPacket::createAfter(packet,2u,FooPacket::noinit).size(), 2u );
214 BOOST_CHECK_EQUAL( packet.size(), 6u );
216 BOOST_CHECK_EQUAL( FooPacket::createAfter(packet,data).size(), 6u );
217 BOOST_CHECK_EQUAL( packet.size(), 10u );
219 BOOST_CHECK_EQUAL( FooPacket::createBefore(packet).size(), 14u );
220 BOOST_CHECK_EQUAL( packet.size(), 10u );
222 BOOST_CHECK_EQUAL( FooPacket::createBefore(packet,FooPacket::noinit).size(), 10u );
223 BOOST_CHECK_EQUAL( packet.size(), 10u );
225 BOOST_CHECK( packet.clone() != packet );
226 BOOST_CHECK_EQUAL( BarPacket::create()->reserved(), 0xA0A0u );
229 ///////////////////////////////cc.e////////////////////////////////////////
236 // c-file-style: "senf"
237 // indent-tabs-mode: nil
238 // ispell-local-dictionary: "american"
239 // compile-command: "scons -u test"
240 // comment-column: 40