Fixed whitespace in all files (no tabs)
[senf.git] / Packets / RTCPPacket.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 "RTCPPacket.test.hh"
26 //#include "RTCPPacket.test.ih"
27
28 // Custom includes
29 #include "RTCPPacket.hh"
30
31 #include <boost/test/auto_unit_test.hpp>
32 #include <boost/test/test_tools.hpp>
33
34 #define prefix_
35 ///////////////////////////////cc.p////////////////////////////////////////
36
37 using namespace senf;
38
39 BOOST_AUTO_UNIT_TEST(rtcpPacket_parser)
40 {
41
42     // RTCP RR (no RB)
43     unsigned char data_1[] = {
44                              0x80, 0xc8, 0x00, 0x06,
45                              0xe5, 0x70, 0xaa, 0x18,
46                              0xc7, 0xc2, 0xb2, 0x00,
47                              0xc3, 0xd7, 0x0e, 0x96,
48                              0x00, 0x00, 0x00, 0x00,
49                              0x00, 0x00, 0x00, 0x01,
50                              0x00, 0x00, 0x0d, 0xc8
51
52                            };
53
54     typedef unsigned char * iterator_1;
55     Parse_RTCP<iterator_1> p_1(data_1);
56
57     BOOST_CHECK_EQUAL( p_1.version(),            2u          );
58     BOOST_CHECK_EQUAL( p_1.padding(),            0           );
59     BOOST_CHECK_EQUAL( p_1.count(),              0u          );
60     BOOST_CHECK_EQUAL( static_cast<unsigned>(p_1.payloadType()), 200u );
61     BOOST_CHECK_EQUAL( static_cast<unsigned>(p_1.length()), 0x0006u );
62
63     BOOST_CHECK_EQUAL(p_1.rr().ssrc(),           0xe570aa18u );
64
65     BOOST_CHECK_EQUAL(p_1.rr().ntp_msb(),        0xc7c2b200u );
66     BOOST_CHECK_EQUAL(p_1.rr().ntp_lsb(),        0xc3d70e96u );
67     BOOST_CHECK_EQUAL(p_1.rr().timestamp(),      0x00u       );
68     BOOST_CHECK_EQUAL(p_1.rr().spcount(),        0x01u       );
69     BOOST_CHECK_EQUAL(p_1.rr().socount(),        0x0dc8u     );
70
71
72     /// \todo RTCP RR
73     unsigned char data_2[] = {
74                              0x82, 0xc8, 0x00, 0x06,
75                              0xe5, 0x70, 0xaa, 0x18,
76                              0xc7, 0xc2, 0xb2, 0x00,
77                              0xc3, 0xd7, 0x0e, 0x96,
78                              0x00, 0x00, 0x00, 0x00,
79                              0x00, 0x00, 0x00, 0x01,
80                              0x00, 0x00, 0x0d, 0xc8,
81
82                              0x01, 0x02, 0x03, 0x04,
83                              0x05, 0x06, 0x07, 0x08,
84                              0x09, 0x10, 0x11, 0x12,
85                              0x13, 0x14, 0x15, 0x16,
86                              0x20, 0x21, 0x22, 0x23,
87
88                              0x99, 0x02, 0x03, 0x04,
89                              0x05, 0x06, 0x07, 0x08,
90                              0x09, 0x10, 0x11, 0x12,
91                              0x13, 0x14, 0x15, 0x16,
92                              0x20, 0x21, 0x22, 0x23
93
94                            };
95
96     typedef unsigned char * iterator_2;
97     Parse_RTCP<iterator_2> p_2(data_2);
98
99     BOOST_CHECK_EQUAL( p_2.version(),            2u          );
100     BOOST_CHECK_EQUAL( p_2.padding(),            0           );
101     BOOST_CHECK_EQUAL( p_2.count(),              2u          );
102     BOOST_CHECK_EQUAL( static_cast<unsigned>(p_2.payloadType()), 200u );
103     BOOST_CHECK_EQUAL( static_cast<unsigned>(p_2.length()), 0x0006u );
104
105     BOOST_CHECK_EQUAL(p_2.rr().ssrc(),           0xe570aa18u );
106
107     BOOST_CHECK_EQUAL(p_2.rr().ntp_msb(),        0xc7c2b200u );
108     BOOST_CHECK_EQUAL(p_2.rr().ntp_lsb(),        0xc3d70e96u );
109     BOOST_CHECK_EQUAL(p_2.rr().timestamp(),      0x00u       );
110     BOOST_CHECK_EQUAL(p_2.rr().spcount(),        0x01u       );
111     BOOST_CHECK_EQUAL(p_2.rr().socount(),        0x0dc8u     );
112
113     BOOST_CHECK_EQUAL( p_2.rr().rbVec().size(),    0x02u  );
114
115
116     BOOST_CHECK_EQUAL( p_2.rr().rbVec().begin()->ssrc(),     0x01020304u  );
117     BOOST_CHECK_EQUAL( static_cast<unsigned>(p_2.rr().rbVec().begin()->fragLost()), 0x05u );
118     BOOST_CHECK_EQUAL( static_cast<unsigned>(p_2.rr().rbVec().begin()->cnpl()[0]), 0x06u );
119     BOOST_CHECK_EQUAL( p_2.rr().rbVec().begin()->ehsnr(),    0x09101112u  );
120     BOOST_CHECK_EQUAL( p_2.rr().rbVec().begin()->LSR(),      0x13141516u  );
121     BOOST_CHECK_EQUAL( p_2.rr().rbVec().begin()->DLSR(),     0x20212223u  );
122
123     typedef unsigned char * iterator;
124     typedef Parse_UIntField     < 3, 8, iterator >    Parse_Count;
125     typedef Parse_Vector        < Parse_RTCP_RB<>, Parse_Count, iterator > Parse_rbVec;
126
127     Parse_rbVec::iterator j_2 (p_2.rr().rbVec().begin());
128
129     BOOST_CHECK_EQUAL( j_2->ssrc(),     0x01020304u  );
130     BOOST_CHECK_EQUAL( static_cast<unsigned>(j_2->fragLost()), 0x05u );
131     BOOST_CHECK_EQUAL( static_cast<unsigned>(j_2->cnpl()[0]), 0x06u );
132     BOOST_CHECK_EQUAL( j_2->ehsnr(),    0x09101112u  );
133     BOOST_CHECK_EQUAL( j_2->LSR(),      0x13141516u  );
134     BOOST_CHECK_EQUAL( j_2->DLSR(),     0x20212223u  );
135
136     ++j_2;
137
138     BOOST_CHECK_EQUAL( j_2->ssrc(),     0x99020304u  );
139     BOOST_CHECK_EQUAL( static_cast<unsigned>(j_2->fragLost()), 0x05u );
140     BOOST_CHECK_EQUAL( static_cast<unsigned>(j_2->cnpl()[0]), 0x06u );
141     BOOST_CHECK_EQUAL( j_2->ehsnr(),    0x09101112u  );
142     BOOST_CHECK_EQUAL( j_2->LSR(),      0x13141516u  );
143     BOOST_CHECK_EQUAL( j_2->DLSR(),     0x20212223u  );
144
145
146
147
148
149
150     // RTCP SR
151     unsigned char data_3[] = {
152                              0x82, 0xc9, 0x00, 0x06,
153                              0xe5, 0x70, 0xaa, 0x18,
154
155                              0x99, 0x02, 0x03, 0x04,
156                              0x05, 0x06, 0x07, 0x08,
157                              0x09, 0x10, 0x11, 0x12,
158                              0x13, 0x14, 0x15, 0x16,
159                              0x20, 0x21, 0x22, 0x23,
160
161                              0x01, 0x02, 0x03, 0x04,
162                              0x05, 0x06, 0x07, 0x08,
163                              0x09, 0x10, 0x11, 0x12,
164                              0x13, 0x14, 0x15, 0x16,
165                              0x20, 0x21, 0x22, 0x23
166
167                            };
168
169     typedef unsigned char * iterator_3;
170     Parse_RTCP<iterator_3> p_3(data_3);
171
172     BOOST_CHECK_EQUAL( p_3.version(),            2u          );
173     BOOST_CHECK_EQUAL( p_3.padding(),            0           );
174     BOOST_CHECK_EQUAL( p_3.count(),              2u          );
175     BOOST_CHECK_EQUAL( static_cast<unsigned>(p_3.payloadType()), 201u );
176     BOOST_CHECK_EQUAL( static_cast<unsigned>(p_3.length()), 0x0006u );
177
178     BOOST_CHECK_EQUAL( p_3.sr().ssrc(),           0xe570aa18u );
179     BOOST_CHECK_EQUAL( p_3.sr().rbVec().size(),    0x02u  );
180
181
182     typedef unsigned char * iterator;
183     typedef Parse_UIntField     < 3, 8, iterator >    Parse_Count;
184     typedef Parse_Vector        < Parse_RTCP_RB<>, Parse_Count, iterator > Parse_rbVec;
185
186     Parse_rbVec::iterator j (p_3.rr().rbVec().begin());
187     BOOST_CHECK_EQUAL( j->ssrc(),     0x01020304u  );
188     BOOST_CHECK_EQUAL( static_cast<unsigned>(j->fragLost()), 0x05u );
189     BOOST_CHECK_EQUAL( j->ehsnr(),    0x09101112u  );
190     BOOST_CHECK_EQUAL( j->LSR(),      0x13141516u  );
191     BOOST_CHECK_EQUAL( j->DLSR(),     0x20212223u  );
192
193     ++j;
194
195 #if 0
196     BOOST_CHECK_EQUAL( j->ssrc(),     0x99020304u  );
197     BOOST_CHECK_EQUAL( static_cast<unsigned>(j->fragLost()), 0x05u );
198     BOOST_CHECK_EQUAL( static_cast<unsigned>(j->cnpl()[0]), 0x06u );
199     BOOST_CHECK_EQUAL( j->ehsnr(),    0x09101112u  );
200     BOOST_CHECK_EQUAL( j->LSR(),      0x13141516u  );
201     BOOST_CHECK_EQUAL( j->DLSR(),     0x20212223u  );
202 #endif
203
204     /// \todo RTCP SDES
205
206     unsigned char data_4[] = {
207                              0x81, 0xca, 0x00, 0x04,
208                              0xe5, 0x70, 0xaa, 0x18,
209                              0x01, 0x09, 0x39, 0x30,
210                              0x31, 0x31, 0x33, 0x35,
211                              0x37, 0x36, 0x37, 0x00
212
213                            };
214
215     typedef unsigned char * iterator_4;
216     Parse_RTCP<iterator_4> p_4(data_4);
217
218     BOOST_CHECK_EQUAL( p_4.version(),            2u          );
219     BOOST_CHECK_EQUAL( p_4.padding(),            0           );
220     BOOST_CHECK_EQUAL( p_4.count(),              1u          );
221     BOOST_CHECK_EQUAL( static_cast<unsigned>(p_4.payloadType()), 202u );
222     BOOST_CHECK_EQUAL( static_cast<unsigned>(p_4.length()), 0x0004u );
223
224     BOOST_CHECK_EQUAL( p_4.sdes().chunkVec().size(),    0x01u      );
225 #if 0
226     Parse_RTCP_SDES::Parse_itemList::iterator j_4 (p_4.sdes().chunkVec().begin());
227
228 /// \todo ask Stefan
229
230  // BOOST_CHECK_EQUAL( p_4.sdes().chunkList()[0].ssrc(), 0xe570aa18u);
231  // BOOST_CHECK_EQUAL( p_4.sdes().chunkList()[0].itemList().size(), 0x01u);
232  // BOOST_CHECK( p_4.sdes().chunkList()[0].itemList().check(data_4+20) );
233  // BOOST_CHECK_EQUAL(p.sdes().chunkList()[0].chunkList().size(),  1);
234
235 //item
236 //     typeField(), 0x01u
237 //     length(), 0x09u
238 //     desc(), 0x393031313335373637u
239
240 #endif
241
242
243    // RTCP BYE
244    unsigned char data_5[] = {
245                              0x82, 0xcb, 0x00, 0x06,
246
247                              0x01, 0x02, 0x03, 0x04,
248                              0x05, 0x06, 0x07, 0x08
249
250                            };
251
252     typedef unsigned char * iterator_5;
253     Parse_RTCP<iterator_5> p_5(data_5);
254
255     BOOST_CHECK_EQUAL( p_5.version(),            2u          );
256     BOOST_CHECK_EQUAL( p_5.padding(),            0           );
257     BOOST_CHECK_EQUAL( p_5.count(),              2u          );
258     BOOST_CHECK_EQUAL( static_cast<unsigned>(p_5.payloadType()), 203u );
259     BOOST_CHECK_EQUAL( static_cast<unsigned>(p_5.length()), 0x0006u );
260
261     BOOST_CHECK_EQUAL( p_5.bye().ssrcVec().size(),    0x02u  );
262
263     BOOST_CHECK_EQUAL( p_5.bye().ssrcVec()[0],     0x01020304u  );
264     BOOST_CHECK_EQUAL( p_5.bye().ssrcVec()[1],     0x05060708u  );
265
266
267    // RTCP APP
268    unsigned char data_6[] = {
269                              0x82, 0x7b, 0x00, 0x05,
270
271                              0x01, 0x02, 0x03, 0x04,
272                              0x05, 0x06, 0x07, 0x08,
273                              0x09, 0x10, 0x11, 0x12,
274                              0x00, 0x00, 0x00, 0x08
275
276                            };
277
278     typedef unsigned char * iterator_6;
279     Parse_RTCP<iterator_6> p_6(data_6);
280
281     BOOST_CHECK_EQUAL( p_6.version(),              2u           );
282     BOOST_CHECK_EQUAL( p_6.padding(),              0            );
283     BOOST_CHECK_EQUAL( p_6.count(),                2u           );
284     BOOST_CHECK_EQUAL( static_cast<unsigned>(p_6.payloadType()), 123u );
285     BOOST_CHECK_EQUAL( static_cast<unsigned>(p_6.length()), 0x0005u );
286
287     BOOST_CHECK_EQUAL( p_6.app().ssrc(),           0x01020304u  );
288     BOOST_CHECK_EQUAL( p_6.app().name(),           0x05060708u  );
289 #if 0
290     BOOST_CHECK_EQUAL( p_6.app().appData().size(), 2u           );
291 #endif
292     BOOST_CHECK_EQUAL( p_6.app().appData()[0],     0x09101112u  );
293     BOOST_CHECK_EQUAL( p_6.app().appData()[1],     0x08u        );
294
295 }
296
297
298 BOOST_AUTO_UNIT_TEST(rtcpPacket_packet)
299 {
300 #if 0
301     unsigned char data_1[] = {
302                              0x80, 0xc8, 0x00, 0x06,
303                              0xe5, 0x70, 0xaa, 0x18,
304                              0xc7, 0xc2, 0xb2, 0x00,
305                              0xc3, 0xd7, 0x0e, 0x96,
306                              0x00, 0x00, 0x00, 0x00,
307                              0x00, 0x00, 0x00, 0x01,
308                              0x00, 0x00, 0x0d, 0xc8
309
310                            };
311
312     RTCPPacket::ptr p_1 (Packet::create<RTCPPacket>(data_1, data_1+sizeof(data_1)));
313
314     BOOST_CHECK_EQUAL( p_1->version(),            2u          );
315     BOOST_CHECK_EQUAL( p_1->padding(),            0           );
316     BOOST_CHECK_EQUAL( p_1->count(),              0u          );
317     BOOST_CHECK_EQUAL( static_cast<unsigned>(p_1->payloadType()), 200u );
318     BOOST_CHECK_EQUAL( static_cast<unsigned>(p_1->length()), 0x0006u );
319
320     BOOST_CHECK_EQUAL(p_1->rr().ssrc(),           0xe570aa18u );
321
322     BOOST_CHECK_EQUAL(p_1->rr().ntp_msb(),        0xc7c2b200u );
323     BOOST_CHECK_EQUAL(p_1->rr().ntp_lsb(),        0xc3d70e96u );
324     BOOST_CHECK_EQUAL(p_1->rr().timestamp(),      0x00u       );
325     BOOST_CHECK_EQUAL(p_1->rr().spcount(),        0x01u       );
326     BOOST_CHECK_EQUAL(p_1->rr().socount(),        0x0dc8u     );
327 #endif
328
329 }
330
331
332 ///////////////////////////////cc.e////////////////////////////////////////
333 #undef prefix_
334
335 \f
336 // Local Variables:
337 // mode: c++
338 // fill-column: 100
339 // c-file-style: "senf"
340 // indent-tabs-mode: nil
341 // ispell-local-dictionary: "american"
342 // End: