OLD | NEW |
---|---|
(Empty) | |
1 /* | |
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | |
3 * | |
4 * Use of this source code is governed by a BSD-style license | |
5 * that can be found in the LICENSE file in the root of the source | |
6 * tree. An additional intellectual property rights grant can be found | |
7 * in the file PATENTS. All contributing project authors may | |
8 * be found in the AUTHORS file in the root of the source tree. | |
9 */ | |
10 | |
11 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h" | |
12 | |
13 #include <limits> | |
åsapersson
2015/12/03 13:56:42
needed?
danilchap
2015/12/03 14:23:16
Done.
| |
14 | |
15 #include "testing/gtest/include/gtest/gtest.h" | |
16 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h" | |
17 | |
18 using webrtc::rtcp::RawPacket; | |
19 using webrtc::rtcp::ReceiverReport; | |
20 using webrtc::rtcp::ReportBlock; | |
21 using webrtc::RTCPUtility::RtcpCommonHeader; | |
22 using webrtc::RTCPUtility::RtcpParseCommonHeader; | |
23 | |
24 namespace webrtc { | |
25 namespace { | |
26 | |
27 class RtcpPacketReceiverReportTest : public ::testing::Test { | |
28 protected: | |
29 void BuildPacket() { packet = rr.Build().Pass(); } | |
30 void ParsePacket() { | |
31 RtcpCommonHeader header; | |
32 EXPECT_TRUE( | |
33 RtcpParseCommonHeader(packet->Buffer(), packet->Length(), &header)); | |
34 EXPECT_EQ(header.BlockSize(), packet->Length()); | |
35 EXPECT_TRUE(parsed_.Parse( | |
36 header, packet->Buffer() + RtcpCommonHeader::kHeaderSizeBytes)); | |
37 } | |
38 | |
39 ReceiverReport rr; | |
40 rtc::scoped_ptr<RawPacket> packet; | |
41 const ReceiverReport& parsed() { return parsed_; } | |
42 | |
43 private: | |
44 ReceiverReport parsed_; | |
45 }; | |
46 | |
47 const uint32_t kSenderSsrc = 0x12345678; | |
48 const uint32_t kRemoteSsrc = 0x23456789; | |
49 const uint8_t kFractionLost = 55; | |
50 const uint32_t kCumulativeLost = 0x111213; | |
51 const uint32_t kExtHighestSeqNum = 0x22232425; | |
52 const uint32_t kJitter = 0x33343536; | |
53 const uint32_t kLastSr = 0x44454647; | |
54 const uint32_t kDelayLastSr = 0x55565758; | |
55 // Manually created ReciverReport with one ReportBlock matching constants above. | |
åsapersson
2015/12/03 13:56:41
s/ReciverReport/ReceiverReport
danilchap
2015/12/03 14:23:16
Done.
| |
56 // Having this block allows to test Create and Parse seperately. | |
åsapersson
2015/12/03 13:56:42
s/seperately/separately
danilchap
2015/12/03 14:23:16
Done.
| |
57 const uint8_t kPacket[] = {0x81, 201, 0x00, 0x07, 0x12, 0x34, 0x56, 0x78, | |
58 0x23, 0x45, 0x67, 0x89, 55, 0x11, 0x12, 0x13, | |
59 0x22, 0x23, 0x24, 0x25, 0x33, 0x34, 0x35, 0x36, | |
60 0x44, 0x45, 0x46, 0x47, 0x55, 0x56, 0x57, 0x58}; | |
61 const size_t kPacketLength = sizeof(kPacket); | |
åsapersson
2015/12/03 13:56:42
perhaps move the constants above the class
danilchap
2015/12/03 14:23:16
Done.
| |
62 | |
63 TEST_F(RtcpPacketReceiverReportTest, NoBlocks) { | |
åsapersson
2015/12/03 13:56:41
maybe WithNoReportBlock (and move below Create).
danilchap
2015/12/03 14:23:16
Done. WithNo = Without
| |
64 rr.From(kSenderSsrc); | |
65 | |
66 BuildPacket(); | |
67 ParsePacket(); | |
68 | |
69 EXPECT_EQ(kSenderSsrc, parsed().sender_ssrc()); | |
70 EXPECT_EQ(0u, parsed().report_blocks().size()); | |
71 } | |
72 | |
73 TEST_F(RtcpPacketReceiverReportTest, Parse) { | |
74 RtcpCommonHeader header; | |
75 RtcpParseCommonHeader(kPacket, kPacketLength, &header); | |
76 EXPECT_TRUE(rr.Parse(header, kPacket + RtcpCommonHeader::kHeaderSizeBytes)); | |
77 const ReceiverReport& parsed = rr; | |
78 | |
79 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); | |
80 EXPECT_EQ(1u, parsed.report_blocks().size()); | |
81 const ReportBlock& rb = parsed.report_blocks().front(); | |
82 EXPECT_EQ(kRemoteSsrc, rb.source_ssrc()); | |
83 EXPECT_EQ(kFractionLost, rb.fraction_lost()); | |
84 EXPECT_EQ(kCumulativeLost, rb.cumulative_lost()); | |
85 EXPECT_EQ(kExtHighestSeqNum, rb.extended_high_seq_num()); | |
86 EXPECT_EQ(kJitter, rb.jitter()); | |
87 EXPECT_EQ(kLastSr, rb.last_sr()); | |
88 EXPECT_EQ(kDelayLastSr, rb.delay_since_last_sr()); | |
89 } | |
90 | |
91 TEST_F(RtcpPacketReceiverReportTest, ParseFailesOnIncorretSize) { | |
åsapersson
2015/12/03 13:56:41
s/Failes/Fails
s/Incorret/Incorrect
danilchap
2015/12/03 14:23:16
Done.
| |
92 RtcpCommonHeader header; | |
93 RtcpParseCommonHeader(kPacket, kPacketLength, &header); | |
94 header.count_or_format++; // Damage the packet. | |
95 EXPECT_FALSE(rr.Parse(header, kPacket + kPacketLength)); | |
åsapersson
2015/12/03 13:56:41
kPacket + RtcpCommonHeader::kHeaderSizeBytes?
danilchap
2015/12/03 14:23:16
Done.
| |
96 } | |
97 | |
98 TEST_F(RtcpPacketReceiverReportTest, Create) { | |
99 rr.From(kSenderSsrc); | |
100 ReportBlock rb; | |
101 rb.To(kRemoteSsrc); | |
102 rb.WithFractionLost(kFractionLost); | |
103 rb.WithCumulativeLost(kCumulativeLost); | |
104 rb.WithExtHighestSeqNum(kExtHighestSeqNum); | |
105 rb.WithJitter(kJitter); | |
106 rb.WithLastSr(kLastSr); | |
107 rb.WithDelayLastSr(kDelayLastSr); | |
108 rr.WithReportBlock(rb); | |
109 | |
110 BuildPacket(); | |
111 | |
112 ASSERT_EQ(kPacketLength, packet->Length()); | |
113 EXPECT_EQ(0, memcmp(kPacket, packet->Buffer(), kPacketLength)); | |
114 } | |
115 | |
116 TEST_F(RtcpPacketReceiverReportTest, WithTwoReportBlocks) { | |
117 ReportBlock rb1; | |
118 rb1.To(kRemoteSsrc); | |
119 ReportBlock rb2; | |
120 rb2.To(kRemoteSsrc + 1); | |
121 | |
122 rr.From(kSenderSsrc); | |
123 EXPECT_TRUE(rr.WithReportBlock(rb1)); | |
124 EXPECT_TRUE(rr.WithReportBlock(rb2)); | |
125 | |
126 BuildPacket(); | |
127 ParsePacket(); | |
128 | |
129 EXPECT_EQ(kSenderSsrc, parsed().sender_ssrc()); | |
130 EXPECT_EQ(2u, parsed().report_blocks().size()); | |
131 EXPECT_EQ(kRemoteSsrc, parsed().report_blocks()[0].source_ssrc()); | |
132 EXPECT_EQ(kRemoteSsrc + 1, parsed().report_blocks()[1].source_ssrc()); | |
133 } | |
134 | |
135 TEST_F(RtcpPacketReceiverReportTest, WithTooManyReportBlocks) { | |
136 rr.From(kSenderSsrc); | |
137 const int kMaxReportBlocks = (1 << 5) - 1; | |
138 ReportBlock rb; | |
139 for (int i = 0; i < kMaxReportBlocks; ++i) { | |
140 rb.To(kRemoteSsrc + i); | |
141 EXPECT_TRUE(rr.WithReportBlock(rb)); | |
142 } | |
143 rb.To(kRemoteSsrc + kMaxReportBlocks); | |
144 EXPECT_FALSE(rr.WithReportBlock(rb)); | |
145 } | |
146 | |
147 } // namespace | |
148 } // namespace webrtc | |
OLD | NEW |