blob: 9348aee7e465794905615a1dab1d08b56ef7586a [file] [log] [blame]
danilchap2f7dea12016-01-13 10:03:041/*
2 * Copyright (c) 2016 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
Mirko Bonadei92ea95e2017-09-15 04:47:3111#include "modules/rtp_rtcp/source/rtcp_packet/compound_packet.h"
danilchap2f7dea12016-01-13 10:03:0412
Erik Språngde5507d2020-09-11 13:35:3213#include <memory>
14#include <utility>
15
Mirko Bonadei92ea95e2017-09-15 04:47:3116#include "modules/rtp_rtcp/source/rtcp_packet.h"
17#include "modules/rtp_rtcp/source/rtcp_packet/bye.h"
18#include "modules/rtp_rtcp/source/rtcp_packet/fir.h"
19#include "modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
20#include "modules/rtp_rtcp/source/rtcp_packet/sender_report.h"
Danil Chapovalov5c3cc412017-12-07 09:15:5321#include "test/gmock.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3122#include "test/gtest.h"
23#include "test/rtcp_packet_parser.h"
danilchap2f7dea12016-01-13 10:03:0424
Danil Chapovalov5c3cc412017-12-07 09:15:5325using ::testing::_;
26using ::testing::Invoke;
27using ::testing::MockFunction;
danilchap2f7dea12016-01-13 10:03:0428using webrtc::rtcp::Bye;
29using webrtc::rtcp::CompoundPacket;
30using webrtc::rtcp::Fir;
danilchap2f7dea12016-01-13 10:03:0431using webrtc::rtcp::ReceiverReport;
32using webrtc::rtcp::ReportBlock;
33using webrtc::rtcp::SenderReport;
34using webrtc::test::RtcpPacketParser;
35
36namespace webrtc {
37
38const uint32_t kSenderSsrc = 0x12345678;
Danil Chapovalov32e590e2016-01-22 10:04:5639const uint32_t kRemoteSsrc = 0x23456789;
40const uint8_t kSeqNo = 13;
danilchap2f7dea12016-01-13 10:03:0441
42TEST(RtcpCompoundPacketTest, AppendPacket) {
danilchap7a4116a2016-03-14 15:19:2843 CompoundPacket compound;
Erik Språngde5507d2020-09-11 13:35:3244 auto fir = std::make_unique<Fir>();
45 fir->AddRequestTo(kRemoteSsrc, kSeqNo);
danilchap2f7dea12016-01-13 10:03:0446 ReportBlock rb;
Erik Språngde5507d2020-09-11 13:35:3247 auto rr = std::make_unique<ReceiverReport>();
48 rr->SetSenderSsrc(kSenderSsrc);
49 EXPECT_TRUE(rr->AddReportBlock(rb));
50 compound.Append(std::move(rr));
51 compound.Append(std::move(fir));
danilchap2f7dea12016-01-13 10:03:0452
danilchap7a4116a2016-03-14 15:19:2853 rtc::Buffer packet = compound.Build();
danilchap2f7dea12016-01-13 10:03:0454 RtcpPacketParser parser;
danilchap69e59e62016-02-17 11:11:4255 parser.Parse(packet.data(), packet.size());
danilchap2f7dea12016-01-13 10:03:0456 EXPECT_EQ(1, parser.receiver_report()->num_packets());
Danil Chapovalovba6f7be2016-09-02 16:29:1057 EXPECT_EQ(kSenderSsrc, parser.receiver_report()->sender_ssrc());
58 EXPECT_EQ(1u, parser.receiver_report()->report_blocks().size());
danilchap2f7dea12016-01-13 10:03:0459 EXPECT_EQ(1, parser.fir()->num_packets());
60}
61
danilchap2f7dea12016-01-13 10:03:0462TEST(RtcpCompoundPacketTest, AppendPacketWithOwnAppendedPacket) {
danilchap7a4116a2016-03-14 15:19:2863 CompoundPacket root;
Erik Språngde5507d2020-09-11 13:35:3264 auto leaf = std::make_unique<CompoundPacket>();
65
66 auto fir = std::make_unique<Fir>();
67 fir->AddRequestTo(kRemoteSsrc, kSeqNo);
68 auto bye = std::make_unique<Bye>();
danilchap2f7dea12016-01-13 10:03:0469 ReportBlock rb;
70
Erik Språngde5507d2020-09-11 13:35:3271 auto rr = std::make_unique<ReceiverReport>();
72 EXPECT_TRUE(rr->AddReportBlock(rb));
73 leaf->Append(std::move(rr));
74 leaf->Append(std::move(fir));
danilchap2f7dea12016-01-13 10:03:0475
Erik Språngde5507d2020-09-11 13:35:3276 auto sr = std::make_unique<SenderReport>();
77 root.Append(std::move(sr));
78 root.Append(std::move(bye));
79 root.Append(std::move(leaf));
danilchap2f7dea12016-01-13 10:03:0480
danilchap7a4116a2016-03-14 15:19:2881 rtc::Buffer packet = root.Build();
danilchap2f7dea12016-01-13 10:03:0482 RtcpPacketParser parser;
danilchap69e59e62016-02-17 11:11:4283 parser.Parse(packet.data(), packet.size());
danilchap2f7dea12016-01-13 10:03:0484 EXPECT_EQ(1, parser.sender_report()->num_packets());
85 EXPECT_EQ(1, parser.receiver_report()->num_packets());
Danil Chapovalovba6f7be2016-09-02 16:29:1086 EXPECT_EQ(1u, parser.receiver_report()->report_blocks().size());
danilchap2f7dea12016-01-13 10:03:0487 EXPECT_EQ(1, parser.bye()->num_packets());
88 EXPECT_EQ(1, parser.fir()->num_packets());
89}
90
91TEST(RtcpCompoundPacketTest, BuildWithInputBuffer) {
danilchap7a4116a2016-03-14 15:19:2892 CompoundPacket compound;
Erik Språngde5507d2020-09-11 13:35:3293 auto fir = std::make_unique<Fir>();
94 fir->AddRequestTo(kRemoteSsrc, kSeqNo);
danilchap2f7dea12016-01-13 10:03:0495 ReportBlock rb;
Erik Språngde5507d2020-09-11 13:35:3296 auto rr = std::make_unique<ReceiverReport>();
97 rr->SetSenderSsrc(kSenderSsrc);
98 EXPECT_TRUE(rr->AddReportBlock(rb));
99 compound.Append(std::move(rr));
100 compound.Append(std::move(fir));
danilchap2f7dea12016-01-13 10:03:04101
102 const size_t kRrLength = 8;
103 const size_t kReportBlockLength = 24;
104 const size_t kFirLength = 20;
105
danilchap2f7dea12016-01-13 10:03:04106 const size_t kBufferSize = kRrLength + kReportBlockLength + kFirLength;
Danil Chapovalov5c3cc412017-12-07 09:15:53107 MockFunction<void(rtc::ArrayView<const uint8_t>)> callback;
108 EXPECT_CALL(callback, Call(_))
109 .WillOnce(Invoke([&](rtc::ArrayView<const uint8_t> packet) {
110 RtcpPacketParser parser;
111 parser.Parse(packet.data(), packet.size());
112 EXPECT_EQ(1, parser.receiver_report()->num_packets());
113 EXPECT_EQ(1u, parser.receiver_report()->report_blocks().size());
114 EXPECT_EQ(1, parser.fir()->num_packets());
115 }));
116
117 EXPECT_TRUE(compound.Build(kBufferSize, callback.AsStdFunction()));
danilchap2f7dea12016-01-13 10:03:04118}
119
120TEST(RtcpCompoundPacketTest, BuildWithTooSmallBuffer_FragmentedSend) {
danilchap7a4116a2016-03-14 15:19:28121 CompoundPacket compound;
Erik Språngde5507d2020-09-11 13:35:32122 auto fir = std::make_unique<Fir>();
123 fir->AddRequestTo(kRemoteSsrc, kSeqNo);
danilchap2f7dea12016-01-13 10:03:04124 ReportBlock rb;
Erik Språngde5507d2020-09-11 13:35:32125 auto rr = std::make_unique<ReceiverReport>();
126 rr->SetSenderSsrc(kSenderSsrc);
127 EXPECT_TRUE(rr->AddReportBlock(rb));
128 compound.Append(std::move(rr));
129 compound.Append(std::move(fir));
danilchap2f7dea12016-01-13 10:03:04130
131 const size_t kRrLength = 8;
132 const size_t kReportBlockLength = 24;
133
danilchap2f7dea12016-01-13 10:03:04134 const size_t kBufferSize = kRrLength + kReportBlockLength;
Danil Chapovalov5c3cc412017-12-07 09:15:53135 MockFunction<void(rtc::ArrayView<const uint8_t>)> callback;
136 EXPECT_CALL(callback, Call(_))
137 .WillOnce(Invoke([&](rtc::ArrayView<const uint8_t> packet) {
138 RtcpPacketParser parser;
139 parser.Parse(packet.data(), packet.size());
140 EXPECT_EQ(1, parser.receiver_report()->num_packets());
141 EXPECT_EQ(1U, parser.receiver_report()->report_blocks().size());
142 EXPECT_EQ(0, parser.fir()->num_packets());
143 }))
144 .WillOnce(Invoke([&](rtc::ArrayView<const uint8_t> packet) {
145 RtcpPacketParser parser;
146 parser.Parse(packet.data(), packet.size());
147 EXPECT_EQ(0, parser.receiver_report()->num_packets());
148 EXPECT_EQ(0U, parser.receiver_report()->report_blocks().size());
149 EXPECT_EQ(1, parser.fir()->num_packets());
150 }));
151
152 EXPECT_TRUE(compound.Build(kBufferSize, callback.AsStdFunction()));
danilchap2f7dea12016-01-13 10:03:04153}
154
155} // namespace webrtc