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