29a882ef7e68e41ead7978fad208bedd39095004
[senf.git] / Packets / RTPPacket.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 "RTPPacket.test.hh"
26 //#include "RTPPacket.test.ih"
27
28 // Custom includes
29 #include "RTPPacket.hh"
30
31 #include "EthernetPacket.hh"
32 #include "IpV4Packet.hh"
33 #include "UDPPacket.hh"
34
35 #include <boost/test/auto_unit_test.hpp>
36 #include <boost/test/test_tools.hpp>
37
38 #define prefix_
39 ///////////////////////////////cc.p////////////////////////////////////////
40
41 using namespace senf;
42
43 BOOST_AUTO_UNIT_TEST(rtpPacket_parser)
44 {
45     unsigned char data[] = { 0x13, 0x02, 0x03, 0x04, 
46                              0x05, 0x06, 0x07, 0x08, 
47                              0x09, 0x0A, 0x0B, 0x0C,
48
49                              0x11, 0x12, 0x13, 0x14, // CSRC 1
50                              0x15, 0x16, 0x17, 0x18, // CSRC 2
51                              0x19, 0x1A, 0x1B, 0x1C // CSRC 3 
52                              
53                            };                       
54
55     typedef unsigned char * iterator;
56     Parse_RTP<iterator> p(data);
57
58     BOOST_CHECK_EQUAL( p.version(),            0x00u       );
59     BOOST_CHECK_EQUAL( p.padding(),            0           );
60     BOOST_CHECK_EQUAL( p.extension(),          1           );
61     BOOST_CHECK_EQUAL( p.csrcCount(),          0x03u       );    
62     BOOST_CHECK_EQUAL( p.marker(),             0           );
63     BOOST_CHECK_EQUAL( p.payloadType(),        0x02u       );
64     // the static_cast is to silence gcc-3.3
65     BOOST_CHECK_EQUAL( static_cast<unsigned>(p.seqNumber()), 0x0304u );
66     BOOST_CHECK_EQUAL( p.timestamp(),          0x05060708u );
67     BOOST_CHECK_EQUAL( p.ssrc(),               0x090A0B0Cu );
68  
69     BOOST_CHECK_EQUAL( p.csrcList()[0],        0x11121314u ); 
70     BOOST_CHECK_EQUAL( p.csrcList()[1],        0x15161718u );
71     BOOST_CHECK_EQUAL( p.csrcList()[2],        0x191A1B1Cu );
72
73
74 }
75
76                       
77 BOOST_AUTO_UNIT_TEST(rtpPacket_packet)
78 {
79     unsigned char data[] = { 0x33, 0x02, 0x03, 0x04, 
80                              0x05, 0x06, 0x07, 0x08, 
81                              0x09, 0x0A, 0x0B, 0x0C,
82
83                              0x11, 0x12, 0x13, 0x14, // CSRC 1
84                              0x15, 0x16, 0x17, 0x18, // CSRC 2
85                              0x19, 0x1A, 0x1B, 0x1C, // CSRC 3 
86                              
87                              0x20, 0x21, 0x00, 0x04, // ex
88                              0x24, 0x25, 0x26, 0x27, // ex
89                              
90                              0x20, 0x21, 0x08, 0x23, // paylaod
91                              0x20, 0x00, 0x00, 0x03  // payload
92                              
93                            };  
94
95     RTPPacket::ptr p (Packet::create<RTPPacket>(data, data+sizeof(data)));
96
97     BOOST_CHECK_EQUAL( p->version(),            0x00u       );
98     BOOST_CHECK_EQUAL( p->padding(),            1           );
99     BOOST_CHECK_EQUAL( p->extension(),          1           );
100     BOOST_CHECK_EQUAL( p->csrcCount(),          0x03u       );    
101     BOOST_CHECK_EQUAL( p->marker(),             0           );
102     BOOST_CHECK_EQUAL( p->payloadType(),        0x02u       );
103     // the static_cast is to silence gcc-3.3
104     BOOST_CHECK_EQUAL( static_cast<unsigned>(p->seqNumber()), 0x0304u );
105     BOOST_CHECK_EQUAL( p->timestamp(),          0x05060708u );
106     BOOST_CHECK_EQUAL( p->ssrc(),               0x090A0B0Cu );
107
108     BOOST_CHECK_EQUAL( p->paddingOctet(),       3           );
109
110     BOOST_CHECK_EQUAL( p->csrcList()[0],        0x11121314u ); 
111     BOOST_CHECK_EQUAL( p->csrcList()[1],        0x15161718u );
112     BOOST_CHECK_EQUAL( p->csrcList()[2],        0x191A1B1Cu );
113     
114     BOOST_REQUIRE( p->next() );
115     BOOST_CHECK( p->next()->is<RTPUnknownExtensionPacket>() );
116
117     RTPUnknownExtensionPacket::ptr v (p->next()->as<RTPUnknownExtensionPacket>());
118     BOOST_CHECK_EQUAL( static_cast<unsigned>(v->proDef()), 0x2021u );
119     BOOST_CHECK_EQUAL( static_cast<unsigned>(v->length()), 0x04u   );
120     BOOST_CHECK_EQUAL( static_cast<unsigned>(v->ext()[0]), 0x24u   );
121     BOOST_CHECK_EQUAL( static_cast<unsigned>(v->ext()[2]), 0x26u   );
122     
123     BOOST_REQUIRE( v->next() );
124     DataPacket::ptr d (v->next()->as<DataPacket>());
125     
126     BOOST_CHECK_EQUAL( d->size(),               5u           );
127    
128 }
129
130
131
132 BOOST_AUTO_UNIT_TEST(eth_rtpPacket_packet)
133 {
134     unsigned char data[] = { 
135
136                              // Ethernet
137                              0x01, 0x02, 0x03, 0x04, 0x05, 0x06,  // destination MAC
138                              0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C,  // source MAC
139                              0x08, 0x00,                          // EtherType: IPv4 0x08
140
141                              // IPv4
142                              0x01, 0x02, 0x03, 0x04, 
143                              0x05, 0x06, 0x07, 0x08, 
144                              0x09, 0x11, 0x0B, 0x0C,              // EtherType: UDP 0x11  
145                              0x11, 0x12, 0x13, 0x14, 
146                              0x15, 0x16, 0x17, 0x18,
147
148                              // UDP 
149                              0x01, 0x02, 0x03, 0x04,
150                              0x05, 0x06, 0x07, 0x08,
151
152                              // RTP
153                              0x33, 0x02, 0x03, 0x04, 
154                              0x05, 0x06, 0x07, 0x08, 
155                              0x09, 0x0A, 0x0B, 0x0C,
156
157                              0x11, 0x12, 0x13, 0x14, // CSRC 1
158                              0x15, 0x16, 0x17, 0x18, // CSRC 2
159                              0x19, 0x1A, 0x1B, 0x1C, // CSRC 3 
160                              
161                              0x20, 0x21, 0x00, 0x04, // ex
162                              0x24, 0x25, 0x26, 0x27, // ex
163                              
164                              0x20, 0x21, 0x08, 0x23, // paylaod
165                              0x20, 0x00, 0x00, 0x03  // payload
166                              
167                            };  
168
169     // Ethernet
170     EthernetPacket::ptr p (Packet::create<EthernetPacket>(data, data+sizeof(data)));
171
172     BOOST_CHECK_EQUAL( p->destination()[3], 0x04 );
173     BOOST_CHECK_EQUAL( p->source()[0], 0x07 );
174     BOOST_CHECK_EQUAL( p->type(), 0x0800 );
175
176     // IP
177     BOOST_REQUIRE( p->next() );
178     BOOST_CHECK( p->next()->is<IpV4Packet>() );
179
180     IpV4Packet::ptr ip (p->next()->as<IpV4Packet>());
181
182     BOOST_CHECK_EQUAL( static_cast<unsigned>(ip->protocol()), 0x11u );
183
184     // UDP
185     BOOST_REQUIRE( ip->next() );
186     BOOST_CHECK( ip->next()->is<UDPPacket>() );
187
188     UDPPacket::ptr udp (ip->next()->as<UDPPacket>());
189
190     BOOST_CHECK_EQUAL( udp->source(),            0x0102       );
191     BOOST_CHECK_EQUAL( udp->destination(),       0x0304       );
192     BOOST_CHECK_EQUAL( udp->length(),            0x0506       );
193     BOOST_CHECK_EQUAL( udp->crc(),               0x0708       ); 
194
195
196     // RTP
197     BOOST_REQUIRE( udp->next() );
198     BOOST_CHECK( udp->next()->is<DataPacket>() );
199
200     RTPPacket::ptr rtp (udp->next()->reinterpret<RTPPacket>());
201
202     BOOST_CHECK_EQUAL( rtp->version(),            0x00u       );
203     BOOST_CHECK_EQUAL( rtp->padding(),            1           );
204     BOOST_CHECK_EQUAL( rtp->extension(),          1           );
205     BOOST_CHECK_EQUAL( rtp->csrcCount(),          0x03u       );    
206     BOOST_CHECK_EQUAL( rtp->marker(),             0           );
207     BOOST_CHECK_EQUAL( rtp->payloadType(),        0x02u       );
208     // the static_cast is to silence gcc-3.3
209     BOOST_CHECK_EQUAL( static_cast<unsigned>(rtp->seqNumber()), 0x0304u );
210     BOOST_CHECK_EQUAL( rtp->timestamp(),          0x05060708u );
211     BOOST_CHECK_EQUAL( rtp->ssrc(),               0x090A0B0Cu );
212
213     BOOST_CHECK_EQUAL( rtp->paddingOctet(),       3           );
214
215     BOOST_CHECK_EQUAL( rtp->csrcList()[0],        0x11121314u ); 
216     BOOST_CHECK_EQUAL( rtp->csrcList()[1],        0x15161718u );
217     BOOST_CHECK_EQUAL( rtp->csrcList()[2],        0x191A1B1Cu );
218     
219     BOOST_REQUIRE( rtp->next() );
220     BOOST_CHECK( rtp->next()->is<RTPUnknownExtensionPacket>() );
221
222     RTPUnknownExtensionPacket::ptr ex (rtp->next()->as<RTPUnknownExtensionPacket>());
223     BOOST_CHECK_EQUAL( static_cast<unsigned>(ex->proDef()), 0x2021u );
224     BOOST_CHECK_EQUAL( static_cast<unsigned>(ex->length()), 0x04u   );
225     BOOST_CHECK_EQUAL( static_cast<unsigned>(ex->ext()[0]), 0x24u   );
226     BOOST_CHECK_EQUAL( static_cast<unsigned>(ex->ext()[2]), 0x26u   );
227     
228     BOOST_REQUIRE( ex->next() );
229     DataPacket::ptr pay (ex->next()->as<DataPacket>());
230     
231     BOOST_CHECK_EQUAL( pay->size(),               5u          );
232    
233 }
234
235
236
237
238
239 ///////////////////////////////cc.e////////////////////////////////////////
240 #undef prefix_
241
242 \f
243 // Local Variables:
244 // mode: c++
245 // c-file-style: "senf"
246 // End: