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"
29 #include "PacketType.hh"
30 #include "PacketRegistry.hh"
32 #include "ParseInt.hh"
33 #include "PacketParser.hh"
34 #include "DataPacket.hh"
36 #include <boost/test/auto_unit_test.hpp>
37 #include <boost/test/test_tools.hpp>
40 ///////////////////////////////cc.p////////////////////////////////////////
45 typedef unsigned key_t;
49 : public senf::PacketTypeBase,
50 public senf::PacketTypeMixin<FooPacketType>
52 using senf::PacketTypeMixin<FooPacketType>::nextPacketRange;
53 using senf::PacketTypeMixin<FooPacketType>::initSize;
54 using senf::PacketTypeMixin<FooPacketType>::init;
55 typedef senf::PacketInterpreter<FooPacketType> interpreter;
56 static interpreter::size_type initSize()
59 typedef senf::ConcretePacket<FooPacketType> FooPacket;
61 struct BarPacketParser : public senf::PacketParserBase
63 SENF_PACKET_PARSER_INIT(BarPacketParser);
65 typedef senf::Parse_UInt16 Parse_Type;
66 typedef senf::Parse_Int32 Parse_Length;
67 typedef senf::Parse_UInt16 Parse_Reserved;
69 Parse_Type type() const { return parse<Parse_Type> (i()); }
70 Parse_Length length() const { return parse<Parse_Length> (i()+2); }
71 Parse_Reserved reserved() const { return parse<Parse_Reserved> (i()+6); }
75 : public senf::PacketTypeBase,
76 public senf::PacketTypeMixin<BarPacketType,RegTag>
78 typedef senf::PacketTypeMixin<BarPacketType,RegTag> mixin;
79 typedef senf::ConcretePacket<BarPacketType> packet;
80 typedef BarPacketParser parser;
81 using mixin::nextPacketRange;
82 using mixin::nextPacketType;
83 using mixin::initSize;
85 static size_type initSize()
87 static void init(packet p) {
88 p->reserved() = 0xA0A0u;
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) {
97 p->type() = senf::PacketRegistry<RegTag>::key(p.next());
101 static registry_key_t nextPacketKey(packet p) {
105 typedef BarPacketType::packet BarPacket;
108 senf::PacketRegistry<RegTag>::RegistrationProxy<FooPacketType> registerFoo(1u);
109 senf::PacketRegistry<RegTag>::RegistrationProxy<BarPacketType> 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() );
122 BOOST_CHECK( ! packet.prev() );
123 BOOST_CHECK( packet.next().prev() == packet );
124 BOOST_CHECK( packet.next() != packet );
125 BOOST_CHECK_EQUAL( packet.size(), 12u );
126 BOOST_CHECK_EQUAL( packet.next().size(), 8u );
127 BOOST_CHECK( packet.is<FooPacket>() );
128 BOOST_CHECK( packet.next().is<BarPacket>() );
129 BOOST_CHECK( packet.first() == packet );
130 BOOST_CHECK( packet.last() == packet.next() );
132 senf::Packet p2 (packet.next());
134 packet.parseNextAs<FooPacket>();
135 BOOST_CHECK_EQUAL( packet.size(), 12u );
136 BOOST_CHECK_EQUAL( packet.next().size(), 8u );
137 BOOST_CHECK( packet.next().is<FooPacket>() );
139 BOOST_CHECK( packet.next().as<FooPacket>() );
141 p2 = packet.next().clone();
143 packet.next().append( p2 );
144 BOOST_REQUIRE( packet.next().next() );
145 BOOST_CHECK( packet.next().next().next() );
146 BOOST_CHECK( packet.next().next().next().is<senf::DataPacket>() );
147 BOOST_CHECK_EQUAL( packet.size(), 16u );
149 // This calls and checks typeId()
150 BOOST_CHECK_EQUAL( senf::PacketRegistry<RegTag>::key(packet), 1u );
151 packet.next().parseNextAs( senf::PacketRegistry<RegTag>::lookup(2u).factory() );
152 BOOST_CHECK( packet.next().next().is<BarPacket>() );
156 BOOST_CHECK_EQUAL( s.str(), "BarPacket:\ntype: 0\nlength: 0\n" );
159 BOOST_CHECK_EQUAL( packet.last().as<BarPacket>()->type(),
160 BarPacket::type::parser::Parse_Type::value_type(-1) );
161 packet.last().append(FooPacket::create());
163 BOOST_CHECK_EQUAL( packet.next<BarPacket>()->type(), 1u );
165 BOOST_CHECK( packet.factory() == FooPacket::factory() );
167 senf::Packet::byte data[] = { 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
170 BarPacket::createAfter(packet,data);
171 BOOST_REQUIRE( packet.next() );
172 BOOST_REQUIRE( packet.next().is<BarPacket>() );
173 BOOST_CHECK( packet.last().is<FooPacket>() );
174 BOOST_CHECK_EQUAL( packet.last<BarPacket>()->type(), 1u );
175 BOOST_CHECK_EQUAL( packet.next().size(), 11u );
176 BOOST_REQUIRE( packet.next().next() );
177 BOOST_CHECK( packet.next().next().is<FooPacket>() );
178 BOOST_CHECK( ! packet.next().next().next() );
179 BOOST_CHECK_EQUAL( packet.next().next().data()[0], 0x81u );
181 BOOST_CHECK( packet.first<FooPacket>() == packet );
182 BOOST_CHECK( packet.first<FooPacket>(senf::nothrow) == packet );
183 BOOST_CHECK( packet.last<BarPacket>() == packet.last().prev() );
184 BOOST_CHECK( packet.last<BarPacket>(senf::nothrow) == packet.last().prev() );
185 BOOST_CHECK( packet.findNext<FooPacket>() == packet );
186 BOOST_CHECK( packet.findNext<FooPacket>(senf::nothrow) == packet );
187 BOOST_CHECK( packet.last().findPrev<FooPacket>() == packet.last() );
188 BOOST_CHECK( packet.last().findPrev<FooPacket>(senf::nothrow) == packet.last() );
189 BOOST_CHECK( packet.next<BarPacket>() == packet.next() );
190 BOOST_CHECK( packet.next<BarPacket>(senf::nothrow) == packet.next() );
191 BOOST_CHECK( packet.last().prev<FooPacket>() == packet );
192 BOOST_CHECK( packet.last().prev<FooPacket>(senf::nothrow) == packet );
195 BOOST_AUTO_UNIT_TEST(concretePacket)
197 FooPacket::byte data[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
199 BOOST_CHECK_EQUAL( FooPacket::create().size(), 4u );
200 BOOST_CHECK_EQUAL( FooPacket::create(FooPacket::noinit).size(), 0u );
201 BOOST_CHECK_THROW( FooPacket::create(2u), senf::TruncatedPacketException );
202 BOOST_CHECK_EQUAL( FooPacket::create(10u).size(), 10u );
203 BOOST_CHECK_EQUAL( FooPacket::create(2u,FooPacket::noinit).size(), 2u );
204 BOOST_CHECK_EQUAL( FooPacket::create(data).size(), 6u );
206 senf::Packet packet (FooPacket::create());
208 BOOST_CHECK_EQUAL( FooPacket::createAfter(packet).size(), 4u );
209 BOOST_CHECK_EQUAL( packet.size(), 8u );
211 BOOST_CHECK_EQUAL( FooPacket::createAfter(packet,FooPacket::noinit).size(), 0u );
212 BOOST_CHECK_EQUAL( packet.size(), 4u );
214 BOOST_CHECK_THROW( FooPacket::createAfter(packet,2u), senf::TruncatedPacketException );
215 BOOST_CHECK_EQUAL( FooPacket::createAfter(packet,10u).size(), 10u );
216 BOOST_CHECK_EQUAL( packet.size(), 14u );
218 BOOST_CHECK_EQUAL( FooPacket::createAfter(packet,2u,FooPacket::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,FooPacket::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"