Fixed whitespace in all files (no tabs)
[senf.git] / Packets / Packet.test.cc
1 // $Id$
2 //
3 // Copyright (C) 2006
4 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
5 // Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
6 //     Stefan Bund <stefan.bund@fokus.fraunhofer.de>
7 //
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.
12 //
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.
17 //
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.
22
23 // Unit tests
24
25 //#include "Packet.test.hh"
26 //#include "Packet.test.ih"
27
28 // Custom includes
29 #include "Packet.hh"
30 #include "DataPacket.hh"
31 #include "GenericPacket.hh"
32
33 #include <boost/test/auto_unit_test.hpp>
34 #include <boost/test/test_tools.hpp>
35
36 #define prefix_
37 ///////////////////////////////cc.p////////////////////////////////////////
38
39 using namespace senf;
40
41 // Since Packet is abstract, we can only test the Packet interface using
42 // a simple implementation: DataPacket and GenericPacket.
43
44 namespace {
45
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 };
48
49     bool compare(Packet::iterator b, Packet::iterator e, unsigned o=0)
50     {
51         unsigned i (o);
52         for (; b!=e; ++b, ++i)
53             if (i>=sizeof(data) || *b != data[i])
54                 return false;
55         return true;
56     }
57
58 }
59
60 BOOST_AUTO_UNIT_TEST(Packet_DataPacket)
61 {
62     Packet::ptr p (Packet::create<DataPacket>(data, data+sizeof(data)));
63
64     BOOST_REQUIRE( p );
65     BOOST_CHECK_EQUAL( p->size(), sizeof(data) );
66     BOOST_CHECK( compare(p->begin(), p->end()) );
67
68     *p->begin() = 20;
69     BOOST_CHECK( !compare(p->begin(), p->end()) );
70     BOOST_CHECK_EQUAL( *p->begin(), 20 );
71
72     BOOST_CHECK( !p->next() );
73     BOOST_CHECK( !p->prev() );
74     BOOST_CHECK_EQUAL( p->head(), p );
75     BOOST_CHECK_EQUAL( p->last(), p );
76
77     BOOST_CHECK( p->is<DataPacket>() );
78     BOOST_CHECK( p->as<DataPacket>() );
79 }
80
81 BOOST_AUTO_UNIT_TEST(Packet_GenericPacket)
82 {
83     GenericPacket<4,6>::ptr p (Packet::create< GenericPacket<4,6> >(data, data+sizeof(data)));
84
85     // check, that the packet was constructed corretly
86     BOOST_REQUIRE( p );
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) );
93
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>() );
102
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> >() ));
107
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) );
111
112     // validate, that the two interpreters share the same data
113     // container
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 );
119
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() );
124 }
125
126 BOOST_AUTO_UNIT_TEST(Packet_Reinterpret)
127 {
128     Packet::ptr p (Packet::create< GenericPacket<4,4> >(data, data+sizeof(data)));
129
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() );
136
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) );
140
141     p = p->reinterpret< GenericPacket<8,2> >();
142     BOOST_REQUIRE( p->next() );
143     BOOST_CHECK( p->next()->is<DataPacket>() );
144
145     BOOST_CHECK_EQUAL( p->next()->size(), sizeof(data)-10 );
146     BOOST_CHECK( compare(p->next()->begin(), p->next()->end(), 8) );
147 }
148
149 BOOST_AUTO_UNIT_TEST(Packet_InsertErase)
150 {
151     Packet::ptr p (Packet::create< GenericPacket<7,3> >(data, data+sizeof(data)));
152     p->next()->reinterpret< GenericPacket<4> >();
153
154     BOOST_CHECK_EQUAL( p->size(), 20u );
155     BOOST_CHECK_EQUAL( p->next()->size(), 10u );
156     BOOST_CHECK_EQUAL( p->next()->next()->size(), 6u );
157
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 );
162
163     p->next()->insert(p->next()->begin()+2, data, data+6);
164
165     BOOST_CHECK_EQUAL( p->size(), 26u );
166     BOOST_CHECK_EQUAL( p->next()->size(), 16u );
167     BOOST_CHECK_EQUAL( p->next()->next()->size(), 6u );
168
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) );
176
177     p->next()->erase( p->next()->begin()+2, p->next()->begin()+8 );
178
179     BOOST_CHECK_EQUAL( p->size(), 20u );
180     BOOST_CHECK_EQUAL( p->next()->size(), 10u );
181     BOOST_CHECK_EQUAL( p->next()->next()->size(), 6u );
182
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) );
186
187     p->next()->insert(p->next()->begin()+4, data, data+2);
188
189     BOOST_CHECK_EQUAL( p->size(), 22u );
190     BOOST_CHECK_EQUAL( p->next()->size(), 12u );
191     BOOST_CHECK_EQUAL( p->next()->next()->size(), 6u );
192
193     BOOST_CHECK( compare(p->next()->next()->begin(), p->next()->next()->end(), 11) );
194
195     p->next()->erase(p->next()->begin()+4, p->next()->begin()+6);
196
197     BOOST_CHECK_EQUAL( p->size(), 20u );
198     BOOST_CHECK_EQUAL( p->next()->size(), 10u );
199     BOOST_CHECK_EQUAL( p->next()->next()->size(), 6u );
200
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) );
204
205     p->next()->next()->insert(p->next()->begin()+5, data, data+4);
206
207     BOOST_CHECK_EQUAL( p->size(), 24u );
208     BOOST_CHECK_EQUAL( p->next()->size(), 14u );
209     BOOST_CHECK_EQUAL( p->next()->next()->size(), 10u );
210
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) );
214
215     p->next()->erase(p->next()->begin()+3, p->next()->begin()+9);
216
217     BOOST_CHECK_EQUAL( p->size(), 18u );
218     BOOST_CHECK_EQUAL( p->next()->size(), 8u );
219     BOOST_CHECK_EQUAL( p->next()->next()->size(), 5u );
220
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) );
224
225     p->erase(p->begin()+5, p->end());
226
227     BOOST_CHECK_EQUAL( p->size(), 5u );
228     BOOST_CHECK_EQUAL( p->next()->size(), 0u );
229     BOOST_CHECK_EQUAL( p->next()->next()->size(), 0u );
230 }
231
232 BOOST_AUTO_UNIT_TEST(Packet_new)
233 {
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);
238 }
239
240 ///////////////////////////////cc.e////////////////////////////////////////
241 #undef prefix_
242
243 \f
244 // Local Variables:
245 // mode: c++
246 // fill-column: 100
247 // c-file-style: "senf"
248 // indent-tabs-mode: nil
249 // ispell-local-dictionary: "american"
250 // End: