Packets: added tests for dump methods
[senf.git] / Packets / MPEGDVBBundle / MPESection.test.cc
1 // $Id$
2 //
3 // Copyright (C) 2007
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 //     Thorsten Horstmann <tho@berlios.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 "MPESection.test.hh"
26 //#include "MPESection.test.ih"
27
28 // Custom includes
29 #include "MPESection.hh"
30
31 #include "../../Utils/auto_unit_test.hh"
32 #include "../../Packets/DefaultBundle/LlcSnapPacket.hh"
33 #include "../../Packets/DefaultBundle/EthernetPacket.hh"
34 #include "../../Packets/DefaultBundle/IPv4Packet.hh"
35 #include <boost/test/test_tools.hpp>
36
37 #define prefix_
38 ///////////////////////////////cc.p////////////////////////////////////////
39
40 using namespace senf;
41
42 BOOST_AUTO_UNIT_TEST(MPESection_parse_chain)
43 {
44     // MPE section captured with dvbsnoop
45     unsigned char data[] = {
46             // MPE Header
47             0x3e, 0xb0, 0x77, 0x00, 0x00, 0xc3, 0x00, 0x00,
48             0x04, 0xd8, 0x12, 0x0c,
49             // LLC/SNAP Header
50             0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00, 0x00, 0x62,
51             // Ethernet Header
52             0x01, 0x00, 0x5e, 0x01, 0x02, 0x03, 0x12, 0xb0,
53             0x43, 0x61, 0x5d, 0x99, 0x08, 0x00,
54             // IPv4 Header
55             0x45, 0x00, 0x00, 0x54, 0x00, 0x00, 0x40, 0x00,
56             0x01, 0x01, 0xc6, 0xfb, 0xc0, 0xa8, 0x01, 0x01,
57             0xef, 0x01, 0x02, 0x03,
58             // Payload (ICMP)
59             0x08, 0x00, 0x0e, 0xa3, 0xf2, 0x72, 0x55, 0xea,
60             0xa2, 0xae, 0x56, 0x47, 0xbb, 0x06, 0x02, 0x00,
61             0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
62             0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
63             0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
64             0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
65             0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
66             0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
67             // MPE Trailer (crc)
68             0xb5, 0x77, 0x4c, 0x3c
69     };
70
71     senf::MPESection sec (senf::MPESection::create(data));
72
73     BOOST_CHECK_EQUAL(   sec->table_id(),                0x3eu       );
74     BOOST_CHECK(         sec->section_syntax_indicator()             );
75     BOOST_CHECK(       ! sec->private_indicator()                    );
76     BOOST_CHECK_EQUAL(   sec->section_length(),          0x77u       );
77     BOOST_CHECK_EQUAL(   sec->mac_addr_6(),              0x0u        );
78     BOOST_CHECK_EQUAL(   sec->mac_addr_5(),              0x0u        );
79     BOOST_CHECK_EQUAL(   sec->payload_scrmbl_ctrl(),     0x0u        );
80     BOOST_CHECK_EQUAL(   sec->addr_scrmbl_ctrl(),        0x0u        );
81     BOOST_CHECK      (   sec->llc_snap_flag()                        );
82     BOOST_CHECK      (   sec->curr_next_indicator()                  );
83     BOOST_CHECK_EQUAL(   sec->section_num(),             0x0u        );
84     BOOST_CHECK_EQUAL(   sec->last_section_num(),        0x0u        );
85     BOOST_CHECK_EQUAL(   sec->real_time_parameters().delta_t(),        0x04du  );
86     BOOST_CHECK_EQUAL(   sec->real_time_parameters().table_boundary(), 1       );
87     BOOST_CHECK_EQUAL(   sec->real_time_parameters().frame_boundary(), 0       );
88     BOOST_CHECK_EQUAL(   sec->real_time_parameters().address(),        0x120cu );
89     BOOST_CHECK_EQUAL(   sec->crc(), 3044494396u                     );
90     BOOST_CHECK_EQUAL(   sec->crc(), sec->calcCrc()                  );
91
92     std::ostringstream oss (std::ostringstream::out);
93     SENF_CHECK_NO_THROW( sec.dump( oss));
94
95     BOOST_REQUIRE( sec.next().is<senf::LlcSnapPacket>() );
96     senf::LlcSnapPacket llcsnap (sec.next().as<senf::LlcSnapPacket>());
97
98     BOOST_CHECK_EQUAL( llcsnap->dsap(),        0xaau );
99     BOOST_CHECK_EQUAL( llcsnap->ssap(),        0xaau );
100     BOOST_CHECK_EQUAL( llcsnap->ctrl(),        0x3u  );
101     BOOST_CHECK_EQUAL( llcsnap->protocolId(),  0x0u  );
102     // in the captured section the llcsnap type/length field was set to the
103     // length of the following ethernet packet; the ethertype 0x6558 (Trans
104     // Ether Bridging [RFC1701]) would be possible as well (see next test)
105     BOOST_CHECK_EQUAL( llcsnap->type_length(), 0x62u );
106
107     BOOST_REQUIRE( llcsnap.next().is<senf::EthernetPacket>() );
108     senf::EthernetPacket eth (llcsnap.next().as<senf::EthernetPacket>());
109
110     BOOST_CHECK_EQUAL( eth->destination().value(), senf::MACAddress::from_string("01:00:5e:01:02:03") );
111     BOOST_CHECK_EQUAL( eth->source().value(),      senf::MACAddress::from_string("12:b0:43:61:5d:99") );
112     BOOST_CHECK_EQUAL( eth->type_length(),         0x800u                                             );
113
114     BOOST_REQUIRE( eth.next().is<senf::IPv4Packet>() );
115     senf::IPv4Packet ip (eth.next().as<senf::IPv4Packet>());
116
117     BOOST_CHECK_EQUAL( ip->version(),    0x4u   );
118     BOOST_CHECK_EQUAL( ip->ihl(),        0x5u   );
119     BOOST_CHECK_EQUAL( ip->tos(),        0x0u   );
120     BOOST_CHECK_EQUAL( ip->length(),     0x54u  );
121     BOOST_CHECK_EQUAL( ip->identifier(), 0x0u   );
122     BOOST_CHECK_EQUAL( ip->df(),         1      );
123     BOOST_CHECK_EQUAL( ip->mf(),         0      );
124     BOOST_CHECK_EQUAL( ip->frag(),       0x0u   );
125     BOOST_CHECK_EQUAL( ip->ttl(),        1      );
126     BOOST_CHECK_EQUAL( ip->protocol(),   1      );
127     BOOST_CHECK_EQUAL( ip->checksum(),   0xc6fb );
128     BOOST_CHECK_EQUAL( ip->source().value(),      senf::INet4Address::from_string("192.168.1.1") );
129     BOOST_CHECK_EQUAL( ip->destination().value(), senf::INet4Address::from_string("239.1.2.3")   );
130 }
131
132
133 BOOST_AUTO_UNIT_TEST(MPESection_create)
134 {
135     senf::MPESection sec (senf::MPESection::create());
136     sec->real_time_parameters().delta_t()        = 0x027u;
137     sec->real_time_parameters().table_boundary() = 1;
138     sec->real_time_parameters().frame_boundary() = 0;
139     sec->real_time_parameters().address()        = 0xfffffu;
140
141     // the type/length field will be set to the ethertype 0x6558 (Trans
142     // Ether Bridging [RFC1701]) on finalize()
143     senf::LlcSnapPacket llcsnap (senf::LlcSnapPacket::createAfter(sec));
144
145     senf::EthernetPacket eth (senf::EthernetPacket::createAfter(llcsnap));
146     eth->destination() = senf::MACAddress::from_string("01:00:5e:01:02:03");
147     eth->source()      = senf::MACAddress::from_string("92:4c:a2:1c:da:81");
148
149     senf::IPv4Packet ip (senf::IPv4Packet::createAfter(eth));
150     ip->df()          = 1;
151     ip->ttl()         = 1;
152     ip->protocol()    = 1;
153     ip->source()      = senf::INet4Address::from_string("10.1.2.2");
154     ip->destination() = senf::INet4Address::from_string("239.1.2.3");
155
156     unsigned char payload_data[] = {
157             // Payload (ICMP)
158             0x08, 0x00, 0x52, 0x73, 0x0e, 0x02, 0x00, 0x20,
159             0xa4, 0x3a, 0xb4, 0x47, 0x4f, 0xe5, 0x04, 0x00,
160             0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
161             0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
162             0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
163             0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
164             0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
165             0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37
166     };
167     senf::DataPacket payload (senf::DataPacket::createAfter(ip, payload_data));
168
169     sec.finalizeAll();
170
171     unsigned char sec_data[] = {
172             0x3e, 0xb0, 0x77, 0x00, 0x00, 0xc3, 0x00, 0x00,
173             0x02, 0x7b, 0xff, 0xff, 0xaa, 0xaa, 0x03, 0x00,
174             0x00, 0x00, 0x65, 0x58, 0x01, 0x00, 0x5e, 0x01,
175             0x02, 0x03, 0x92, 0x4c, 0xa2, 0x1c, 0xda, 0x81,
176             0x08, 0x00, 0x45, 0x00, 0x00, 0x54, 0x00, 0x00,
177             0x40, 0x00, 0x01, 0x01, 0x7c, 0xa2, 0x0a, 0x01,
178             0x02, 0x02, 0xef, 0x01, 0x02, 0x03, 0x08, 0x00,
179             0x52, 0x73, 0x0e, 0x02, 0x00, 0x20, 0xa4, 0x3a,
180             0xb4, 0x47, 0x4f, 0xe5, 0x04, 0x00, 0x08, 0x09,
181             0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11,
182             0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
183             0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21,
184             0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,
185             0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
186             0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x52, 0xdf,
187             0x6a, 0x1d
188     };
189     BOOST_CHECK( equal( sec.data().begin(), sec.data().end(), sec_data ));
190 }
191
192 ///////////////////////////////cc.e////////////////////////////////////////
193 #undef prefix_
194
195
196 // Local Variables:
197 // mode: c++
198 // fill-column: 100
199 // c-file-style: "senf"
200 // indent-tabs-mode: nil
201 // ispell-local-dictionary: "american"
202 // compile-command: "scons -u test"
203 // comment-column: 40
204 // End: