4 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
5 // Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
6 // Stefan Bund <stefan.bund@fokus.fraunhofer.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.
25 //#include "RTCPPacket.test.hh"
26 //#include "RTCPPacket.test.ih"
29 #include "RTCPPacket.hh"
31 #include <boost/test/auto_unit_test.hpp>
32 #include <boost/test/test_tools.hpp>
35 ///////////////////////////////cc.p////////////////////////////////////////
39 BOOST_AUTO_UNIT_TEST(rtcpPacket_parser)
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
54 typedef unsigned char * iterator_1;
55 Parse_RTCP<iterator_1> p_1(data_1);
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 );
63 BOOST_CHECK_EQUAL(p_1.rr().ssrc(), 0xe570aa18u );
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 );
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,
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,
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
96 typedef unsigned char * iterator_2;
97 Parse_RTCP<iterator_2> p_2(data_2);
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 );
105 BOOST_CHECK_EQUAL(p_2.rr().ssrc(), 0xe570aa18u );
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 );
113 BOOST_CHECK_EQUAL( p_2.rr().rbVec().size(), 0x02u );
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 );
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;
127 Parse_rbVec::iterator j_2 (p_2.rr().rbVec().begin());
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 );
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 );
151 unsigned char data_3[] = {
152 0x82, 0xc9, 0x00, 0x06,
153 0xe5, 0x70, 0xaa, 0x18,
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,
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
169 typedef unsigned char * iterator_3;
170 Parse_RTCP<iterator_3> p_3(data_3);
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 );
178 BOOST_CHECK_EQUAL( p_3.sr().ssrc(), 0xe570aa18u );
179 BOOST_CHECK_EQUAL( p_3.sr().rbVec().size(), 0x02u );
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;
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 );
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 );
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
215 typedef unsigned char * iterator_4;
216 Parse_RTCP<iterator_4> p_4(data_4);
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 );
224 BOOST_CHECK_EQUAL( p_4.sdes().chunkVec().size(), 0x01u );
226 Parse_RTCP_SDES::Parse_itemList::iterator j_4 (p_4.sdes().chunkVec().begin());
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);
236 // typeField(), 0x01u
238 // desc(), 0x393031313335373637u
244 unsigned char data_5[] = {
245 0x82, 0xcb, 0x00, 0x06,
247 0x01, 0x02, 0x03, 0x04,
248 0x05, 0x06, 0x07, 0x08
252 typedef unsigned char * iterator_5;
253 Parse_RTCP<iterator_5> p_5(data_5);
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 );
261 BOOST_CHECK_EQUAL( p_5.bye().ssrcVec().size(), 0x02u );
263 BOOST_CHECK_EQUAL( p_5.bye().ssrcVec()[0], 0x01020304u );
264 BOOST_CHECK_EQUAL( p_5.bye().ssrcVec()[1], 0x05060708u );
268 unsigned char data_6[] = {
269 0x82, 0x7b, 0x00, 0x05,
271 0x01, 0x02, 0x03, 0x04,
272 0x05, 0x06, 0x07, 0x08,
273 0x09, 0x10, 0x11, 0x12,
274 0x00, 0x00, 0x00, 0x08
278 typedef unsigned char * iterator_6;
279 Parse_RTCP<iterator_6> p_6(data_6);
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 );
287 BOOST_CHECK_EQUAL( p_6.app().ssrc(), 0x01020304u );
288 BOOST_CHECK_EQUAL( p_6.app().name(), 0x05060708u );
290 BOOST_CHECK_EQUAL( p_6.app().appData().size(), 2u );
292 BOOST_CHECK_EQUAL( p_6.app().appData()[0], 0x09101112u );
293 BOOST_CHECK_EQUAL( p_6.app().appData()[1], 0x08u );
298 BOOST_AUTO_UNIT_TEST(rtcpPacket_packet)
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
312 RTCPPacket::ptr p_1 (Packet::create<RTCPPacket>(data_1, data_1+sizeof(data_1)));
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 );
320 BOOST_CHECK_EQUAL(p_1->rr().ssrc(), 0xe570aa18u );
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 );
332 ///////////////////////////////cc.e////////////////////////////////////////
338 // c-file-style: "senf"