4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 // Thorsten Horstmann <tho@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 MIHPacket unit tests */
26 //#include "MIHPacket.test.hh"
27 //#include "MIHPacket.test.ih"
29 #include "../../Utils/auto_unit_test.hh"
30 #include <boost/test/test_tools.hpp>
32 #include "MIHPacket.hh"
37 ///////////////////////////////cc.p////////////////////////////////////////
39 BOOST_AUTO_UNIT_TEST(MIHPacket_create_string)
41 MIHPacket mihPacket (MIHPacket::create());
43 mihPacket->fragmentNr() = 42;
44 mihPacket->transactionId() = 21;
45 mihPacket->src_mihfId().setString( "senf@berlios.de");
46 mihPacket->dst_mihfId().setString( "test");
47 mihPacket.finalizeThis();
49 unsigned char data[] = {
51 0x10, 0x54, 0x00, 0x00, 0x00, 0x15, 0x00, 0x17,
52 // source MIHF_ID TLV:
53 0x01, 0x0f, // type, length
54 0x73, 0x65, 0x6e, 0x66, 0x40, 0x62, 0x65, 0x72, 0x6c,
55 0x69, 0x6f, 0x73, 0x2e, 0x64, 0x65, // value
56 // destination MIHF_ID TLV:
57 0x02, 0x04, 0x74, 0x65, 0x73, 0x74
59 BOOST_CHECK(equal( mihPacket.data().begin(), mihPacket.data().end(), data ));
60 BOOST_CHECK_EQUAL( mihPacket->src_mihfId().asString(), "senf@berlios.de");
61 BOOST_CHECK_EQUAL( mihPacket->dst_mihfId().asString(), "test");
63 // now expand a MIHF_ID
64 mihPacket->dst_mihfId().maxLengthValue(253);
65 mihPacket->dst_mihfId().setString( std::string(200, 'x'));
66 mihPacket.finalizeThis();
68 BOOST_CHECK_EQUAL( mihPacket.size(), unsigned(8 + 17 + 203));
69 BOOST_CHECK_EQUAL( mihPacket->payloadLength(), 17 + 203);
70 BOOST_CHECK_EQUAL( mihPacket->dst_mihfId().length(), 200u);
71 BOOST_CHECK_EQUAL( senf::bytes(mihPacket->dst_mihfId()), 203u);
75 BOOST_AUTO_UNIT_TEST(MIHPacket_create_mac)
77 MIHPacket mihPacket (MIHPacket::create());
79 mihPacket->fragmentNr() = 42;
80 mihPacket->transactionId() = 21;
81 mihPacket->src_mihfId().setMACAddress( MACAddress::from_string("01:02:03:04:05:06"));
82 mihPacket->dst_mihfId().setMACAddress( MACAddress::from_string("07:08:09:0a:0b:0c"));
83 mihPacket.finalizeThis();
85 unsigned char data[] = {
87 0x10, 0x54, 0x00, 0x00, 0x00, 0x15, 0x00, 0x1c,
88 // source MIHF_ID TLV:
89 0x01, 0x0c, // type, length
90 0x5c, 0x01, 0x5c, 0x02, 0x5c, 0x03, 0x5c, 0x04, 0x5c, 0x05, 0x5c, 0x06, // value (nai-encoded)
91 // destination MIHF_ID TLV:
92 0x02, 0x0c, // type, length
93 0x5c, 0x07, 0x5c, 0x08, 0x5c, 0x09, 0x5c, 0x0a, 0x5c, 0x0b, 0x5c, 0x0c // value (nai-encoded)
95 BOOST_CHECK(equal( mihPacket.data().begin(), mihPacket.data().end(), data ));
97 mihPacket->src_mihfId().asMACAddress(),
98 MACAddress::from_string("01:02:03:04:05:06"));
100 mihPacket->dst_mihfId().asMACAddress(),
101 MACAddress::from_string("07:08:09:0a:0b:0c"));
105 BOOST_AUTO_UNIT_TEST(MIHPacket_create_inet4)
107 MIHPacket mihPacket (MIHPacket::create());
109 mihPacket->fragmentNr() = 42;
110 mihPacket->transactionId() = 21;
111 mihPacket->src_mihfId().setINet4Address( INet4Address::from_string("128.129.130.131"));
112 mihPacket->dst_mihfId().setINet4Address( INet4Address::from_string("132.133.134.135"));
113 mihPacket.finalizeThis();
115 unsigned char data[] = {
117 0x10, 0x54, 0x00, 0x00, 0x00, 0x15, 0x00, 0x14,
118 // source MIHF_ID TLV:
119 0x01, 0x08, // type, length
120 0x5c, 0x80, 0x5c, 0x81, 0x5c, 0x82, 0x5c, 0x83, // value (nai-encoded)
121 // destination MIHF_ID TLV:
122 0x02, 0x08, // type, length
123 0x5c, 0x84, 0x5c, 0x85, 0x5c, 0x86, 0x5c, 0x87 // value (nai-encoded)
125 BOOST_CHECK(equal( mihPacket.data().begin(), mihPacket.data().end(), data ));
127 mihPacket->src_mihfId().asINet4Address(),
128 INet4Address::from_string("128.129.130.131"));
130 mihPacket->dst_mihfId().asINet4Address(),
131 INet4Address::from_string("132.133.134.135"));
135 BOOST_AUTO_UNIT_TEST(MIHPacket_create_inet6)
137 MIHPacket mihPacket (MIHPacket::create());
139 mihPacket->fragmentNr() = 42;
140 mihPacket->transactionId() = 21;
141 mihPacket->src_mihfId().setINet6Address( INet6Address::from_string("::ffff:1.2.3.4"));
142 mihPacket->dst_mihfId().setINet6Address( INet6Address::from_string("::ffff:5.6.7.8"));
143 mihPacket.finalizeThis();
145 unsigned char data[] = {
147 0x10, 0x54, 0x00, 0x00, 0x00, 0x15, 0x00, 0x44,
148 // source MIHF_ID TLV:
149 0x01, 0x20, // type, length
150 // value (nai-encoded):
151 0x5c, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x5c, 0x00,
152 0x5c, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x5c, 0x00,
153 0x5c, 0x00, 0x5c, 0x00, 0x5c, 0xff, 0x5c, 0xff,
154 0x5c, 0x01, 0x5c, 0x02, 0x5c, 0x03, 0x5c, 0x04,
155 // destination MIHF_ID TLV:
156 0x02, 0x20, // type, length
157 // value (nai-encoded):
158 0x5c, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x5c, 0x00,
159 0x5c, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x5c, 0x00,
160 0x5c, 0x00, 0x5c, 0x00, 0x5c, 0xff, 0x5c, 0xff,
161 0x5c, 0x05, 0x5c, 0x06, 0x5c, 0x07, 0x5c, 0x08
163 BOOST_CHECK(equal( mihPacket.data().begin(), mihPacket.data().end(), data ));
165 mihPacket->src_mihfId().asINet6Address(),
166 INet6Address::from_string("::ffff:1.2.3.4"));
168 mihPacket->dst_mihfId().asINet6Address(),
169 INet6Address::from_string("::ffff:5.6.7.8") );
173 BOOST_AUTO_UNIT_TEST(MIHPayload_parse)
175 unsigned char data[] = {
177 0x10, 0x54, 0x00, 0x00, 0x00, 0x15,
178 // variable payload length:
180 // source MIHF_ID TLV:
181 0x01, 0x0f, // type, length
182 0x73, 0x65, 0x6e, 0x66, 0x40, 0x62, 0x65, 0x72, 0x6c,
183 0x69, 0x6f, 0x73, 0x2e, 0x64, 0x65, // value ("senf@berlios.de")
184 // destination MIHF_ID TLV:
185 0x02, 0x04, 0x74, 0x65, 0x73, 0x74, // type, length, value ("test")
186 // MIH Payload (two test tlvs)
189 0x0a, // first bit not set, length=10
190 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, // value
193 0x05, // first bit not set, length=5
194 0x1a, 0x2b, 0x3c, 0x4d, 0x5e // value
197 MIHPacket mihPacket (MIHPacket::create(data));
198 BOOST_CHECK_EQUAL( mihPacket->payloadLength(), 42u);
200 BOOST_REQUIRE( mihPacket.next().is<MIHPayloadPacket>() );
201 MIHPayloadPacket mihPayload (mihPacket.next().as<MIHPayloadPacket>());
203 BOOST_CHECK_EQUAL( mihPayload->tlv_list().size(), 2u);
204 MIHPayloadPacketParser::tlv_list_t::container tlv_list_container (mihPayload->tlv_list());
206 GenericTLVPacket::Parser tlv1 = *tlv_list_container.begin();
207 BOOST_CHECK_EQUAL( tlv1.type(), 0x42);
208 BOOST_CHECK_EQUAL( tlv1.length(), 0x0au);
209 BOOST_CHECK_EQUAL( tlv1.value().size(), 0x0a);
211 GenericTLVPacket::Parser tlv2 = *boost::next(tlv_list_container.begin());
212 BOOST_CHECK_EQUAL( tlv2.type(), 0x43);
213 BOOST_CHECK_EQUAL( tlv2.length(), 0x05u);
214 BOOST_CHECK_EQUAL( tlv2.value().size(), 0x05);
218 BOOST_AUTO_UNIT_TEST(MIHPayload_create)
220 MIHPacket mihPacket (MIHPacket::create());
221 mihPacket->fragmentNr() = 42;
222 mihPacket->transactionId() = 21;
223 mihPacket->src_mihfId().setString( "senf@berlios.de");
224 mihPacket->dst_mihfId().setString( "test");
226 MIHPayloadPacket mihPayload (MIHPayloadPacket::createAfter(mihPacket));
228 unsigned char tlv1_value[] = {
229 0x1a, 0x2b, 0x3c, 0x4d, 0x5e };
230 GenericTLVPacket tlv2 = (GenericTLVPacket::create());
232 tlv2->value( tlv1_value);
234 mihPayload->tlv_list().push_front( tlv2.parser());
236 unsigned char tlv2_value[] = {
237 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09 };
238 GenericTLVPacket tlv1 (GenericTLVPacket::create());
240 tlv1->value( tlv2_value);
242 mihPayload->tlv_list().push_front( tlv1.parser());
244 mihPacket.finalizeAll();
246 unsigned char data[] = {
248 0x10, 0x54, 0x00, 0x00, 0x00, 0x15,
249 // variable payload length:
251 // source MIHF_ID TLV:
252 0x01, 0x0f, // type, length
253 0x73, 0x65, 0x6e, 0x66, 0x40, 0x62, 0x65, 0x72, 0x6c,
254 0x69, 0x6f, 0x73, 0x2e, 0x64, 0x65, // value ("senf@berlios.de")
255 // destination MIHF_ID TLV:
256 0x02, 0x04, 0x74, 0x65, 0x73, 0x74, // type, length, value ("test")
257 // MIH Payload (two test tlvs)
260 0x0a, // first bit not set, length=10
261 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, // value
264 0x05, // first bit not set, length=5
265 0x1a, 0x2b, 0x3c, 0x4d, 0x5e // value
268 BOOST_CHECK(equal( mihPacket.data().begin(), mihPacket.data().end(), data ));
272 ///////////////////////////////cc.e////////////////////////////////////////
279 // c-file-style: "senf"
280 // indent-tabs-mode: nil
281 // ispell-local-dictionary: "american"
282 // compile-command: "scons -u test"
283 // comment-column: 40