4 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
5 // Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
6 // Stefan Bund <stefan.bund@fokus.fraunhofer.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.
25 //#include "Packet.test.hh"
26 //#include "Packet.test.ih"
30 #include "DataPacket.hh"
31 #include "GenericPacket.hh"
33 #include <boost/test/auto_unit_test.hpp>
34 #include <boost/test/test_tools.hpp>
37 ///////////////////////////////cc.p////////////////////////////////////////
41 // Since Packet is abstract, we can only test the Packet interface using
42 // a simple implementation: DataPacket and GenericPacket.
46 Packet::byte data[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
47 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 };
49 bool compare(Packet::iterator b, Packet::iterator e, unsigned o=0)
52 for (; b!=e; ++b, ++i)
53 if (i>=sizeof(data) || *b != data[i])
60 BOOST_AUTO_UNIT_TEST(Packet_DataPacket)
62 Packet::ptr p (Packet::create<DataPacket>(data, data+sizeof(data)));
65 BOOST_CHECK_EQUAL( p->size(), sizeof(data) );
66 BOOST_CHECK( compare(p->begin(), p->end()) );
69 BOOST_CHECK( !compare(p->begin(), p->end()) );
70 BOOST_CHECK_EQUAL( *p->begin(), 20 );
72 BOOST_CHECK( !p->next() );
73 BOOST_CHECK( !p->prev() );
74 BOOST_CHECK_EQUAL( p->head(), p );
75 BOOST_CHECK_EQUAL( p->last(), p );
77 BOOST_CHECK( p->is<DataPacket>() );
78 BOOST_CHECK( p->as<DataPacket>() );
81 BOOST_AUTO_UNIT_TEST(Packet_GenericPacket)
83 GenericPacket<4,6>::ptr p (Packet::create< GenericPacket<4,6> >(data, data+sizeof(data)));
85 // check, that the packet was constructed corretly
87 BOOST_CHECK_EQUAL( p->size(), sizeof(data) );
88 BOOST_CHECK( compare(p->begin(), p->end()) );
89 BOOST_CHECK_EQUAL( p->header_len(), 4u );
90 BOOST_CHECK( compare(p->begin_header(), p->end_header()) );
91 BOOST_CHECK_EQUAL( p->trailer_len(), 6u );
92 BOOST_CHECK( compare(p->begin_trailer(), p->end_trailer(), sizeof(data)-6) );
94 // check the first packet in the interpreter chain
95 BOOST_CHECK_EQUAL( p->head(), p );
96 BOOST_CHECK( !p->prev() );
97 BOOST_CHECK(( p->is< GenericPacket<4,6> >() ));
98 BOOST_CHECK( !p->is<DataPacket>() );
99 BOOST_CHECK(( !p->is< GenericPacket<4,4> >() ));
100 BOOST_CHECK(( p->as< GenericPacket<4,6> >() ));
101 BOOST_CHECK( !p->as<DataPacket>() );
103 // check the next packet in the interpreter chain
104 BOOST_REQUIRE( p->next() );
105 BOOST_CHECK( p->next()->is<DataPacket>() );
106 BOOST_CHECK(( !p->next()->is< GenericPacket<4,6> >() ));
108 // check the contents of the second interpreter
109 BOOST_CHECK_EQUAL( p->next()->size(), sizeof(data)-10 );
110 BOOST_CHECK( compare(p->next()->begin(), p->next()->end(), 4) );
112 // validate, that the two interpreters share the same data
114 *p->next()->begin() = 20;
115 BOOST_CHECK( !compare(p->next()->begin(), p->next()->end(), 4) );
116 BOOST_CHECK( *p->next()->begin() == 20 );
117 BOOST_CHECK( !compare(p->begin(), p->end()) );
118 BOOST_CHECK( *(p->begin()+4) == 20 );
120 // We need require here. If this fails, p->last() will probably
121 // run into an endless loop ...
122 BOOST_REQUIRE( !p->next()->next() );
123 BOOST_CHECK_EQUAL( p->next(), p->last() );
126 BOOST_AUTO_UNIT_TEST(Packet_Reinterpret)
128 Packet::ptr p (Packet::create< GenericPacket<4,4> >(data, data+sizeof(data)));
130 BOOST_CHECK( p->next()->is<DataPacket>() );
131 p->next()->reinterpret< GenericPacket<6> >();
132 BOOST_CHECK( p->next()->is< GenericPacket<6> >() );
133 BOOST_REQUIRE( p->next()->next() );
134 BOOST_CHECK( p->next()->next()->is<DataPacket>() );
135 BOOST_CHECK( !p->next()->next()->next() );
137 BOOST_CHECK_EQUAL( p->next()->next()->size(), sizeof(data)-14 );
138 BOOST_CHECK( compare(p->next()->next()->begin(),
139 p->next()->next()->end(), 10) );
141 p = p->reinterpret< GenericPacket<8,2> >();
142 BOOST_REQUIRE( p->next() );
143 BOOST_CHECK( p->next()->is<DataPacket>() );
145 BOOST_CHECK_EQUAL( p->next()->size(), sizeof(data)-10 );
146 BOOST_CHECK( compare(p->next()->begin(), p->next()->end(), 8) );
149 BOOST_AUTO_UNIT_TEST(Packet_InsertErase)
151 Packet::ptr p (Packet::create< GenericPacket<7,3> >(data, data+sizeof(data)));
152 p->next()->reinterpret< GenericPacket<4> >();
154 BOOST_CHECK_EQUAL( p->size(), 20u );
155 BOOST_CHECK_EQUAL( p->next()->size(), 10u );
156 BOOST_CHECK_EQUAL( p->next()->next()->size(), 6u );
158 BOOST_CHECK_EQUAL( p->next()->next()->begin()[0], 11 );
159 BOOST_CHECK_EQUAL( p->end()[-1], 19 );
160 BOOST_CHECK_EQUAL( p->next()->end()[-1], 16 );
161 BOOST_CHECK_EQUAL( p->next()->next()->end()[-1], 16 );
163 p->next()->insert(p->next()->begin()+2, data, data+6);
165 BOOST_CHECK_EQUAL( p->size(), 26u );
166 BOOST_CHECK_EQUAL( p->next()->size(), 16u );
167 BOOST_CHECK_EQUAL( p->next()->next()->size(), 6u );
169 BOOST_CHECK( compare(p->begin(), p->begin()+9) );
170 BOOST_CHECK( compare(p->begin()+9, p->begin()+15) );
171 BOOST_CHECK( compare(p->begin()+15, p->end(), 9) );
172 BOOST_CHECK( compare(p->next()->begin(), p->next()->begin()+2, 7) );
173 BOOST_CHECK( compare(p->next()->begin()+2, p->next()->begin()+8) );
174 BOOST_CHECK( compare(p->next()->begin()+8, p->next()->end(), 9) );
175 BOOST_CHECK( compare(p->next()->next()->begin(), p->next()->next()->end(), 11) );
177 p->next()->erase( p->next()->begin()+2, p->next()->begin()+8 );
179 BOOST_CHECK_EQUAL( p->size(), 20u );
180 BOOST_CHECK_EQUAL( p->next()->size(), 10u );
181 BOOST_CHECK_EQUAL( p->next()->next()->size(), 6u );
183 BOOST_CHECK( compare(p->begin(), p->end()) );
184 BOOST_CHECK( compare(p->next()->begin(), p->next()->end(), 7) );
185 BOOST_CHECK( compare(p->next()->next()->begin(), p->next()->next()->end(), 11) );
187 p->next()->insert(p->next()->begin()+4, data, data+2);
189 BOOST_CHECK_EQUAL( p->size(), 22u );
190 BOOST_CHECK_EQUAL( p->next()->size(), 12u );
191 BOOST_CHECK_EQUAL( p->next()->next()->size(), 6u );
193 BOOST_CHECK( compare(p->next()->next()->begin(), p->next()->next()->end(), 11) );
195 p->next()->erase(p->next()->begin()+4, p->next()->begin()+6);
197 BOOST_CHECK_EQUAL( p->size(), 20u );
198 BOOST_CHECK_EQUAL( p->next()->size(), 10u );
199 BOOST_CHECK_EQUAL( p->next()->next()->size(), 6u );
201 BOOST_CHECK( compare(p->begin(), p->end()) );
202 BOOST_CHECK( compare(p->next()->begin(), p->next()->end(), 7) );
203 BOOST_CHECK( compare(p->next()->next()->begin(), p->next()->next()->end(), 11) );
205 p->next()->next()->insert(p->next()->begin()+5, data, data+4);
207 BOOST_CHECK_EQUAL( p->size(), 24u );
208 BOOST_CHECK_EQUAL( p->next()->size(), 14u );
209 BOOST_CHECK_EQUAL( p->next()->next()->size(), 10u );
211 BOOST_CHECK( compare(p->next()->next()->begin(), p->next()->next()->begin()+1, 11) );
212 BOOST_CHECK( compare(p->next()->next()->begin()+1, p->next()->next()->begin()+5) );
213 BOOST_CHECK( compare(p->next()->next()->begin()+5, p->end(), 12) );
215 p->next()->erase(p->next()->begin()+3, p->next()->begin()+9);
217 BOOST_CHECK_EQUAL( p->size(), 18u );
218 BOOST_CHECK_EQUAL( p->next()->size(), 8u );
219 BOOST_CHECK_EQUAL( p->next()->next()->size(), 5u );
221 BOOST_CHECK( compare(p->next()->next()->begin(), p->next()->next()->end(), 12) );
222 BOOST_CHECK( compare(p->begin(), p->begin()+10) );
223 BOOST_CHECK( compare(p->begin()+10, p->end(), 12) );
225 p->erase(p->begin()+5, p->end());
227 BOOST_CHECK_EQUAL( p->size(), 5u );
228 BOOST_CHECK_EQUAL( p->next()->size(), 0u );
229 BOOST_CHECK_EQUAL( p->next()->next()->size(), 0u );
232 BOOST_AUTO_UNIT_TEST(Packet_new)
234 Packet::ptr p (Packet::create< GenericPacket<10,4> >());
235 BOOST_CHECK_EQUAL(p->size(), 14u);
236 Packet::ptr p2 (Packet::create< GenericPacket<2,2> >(p));
237 BOOST_CHECK_EQUAL(p2->size(),18u);
240 ///////////////////////////////cc.e////////////////////////////////////////
247 // c-file-style: "senf"
248 // indent-tabs-mode: nil
249 // ispell-local-dictionary: "american"