blob: be28bf1dbe65bb705036d96a25a5eb6a7058832b [file] [log] [blame]
Stefan Holmere5904162015-03-26 11:11:06 +01001/*
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 <list>
kwiberg22feaa32016-03-17 09:17:43 -070012#include <memory>
Stefan Holmere5904162015-03-26 11:11:06 +010013
14#include "webrtc/base/checks.h"
Henrik Kjellander0b9e29c2015-11-16 11:12:24 +010015#include "webrtc/modules/pacing/packet_router.h"
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010016#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
Stefan Holmere5904162015-03-26 11:11:06 +010017#include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
stefanbba9dec2016-02-01 04:39:55 -080018#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
kwibergac9f8762016-09-30 22:29:43 -070019#include "webrtc/test/gmock.h"
20#include "webrtc/test/gtest.h"
Stefan Holmere5904162015-03-26 11:11:06 +010021
22using ::testing::_;
23using ::testing::AnyNumber;
philipelc7bf32a2017-02-17 03:59:43 -080024using ::testing::Field;
Stefan Holmere5904162015-03-26 11:11:06 +010025using ::testing::NiceMock;
26using ::testing::Return;
27
28namespace webrtc {
29
30class PacketRouterTest : public ::testing::Test {
31 public:
32 PacketRouterTest() : packet_router_(new PacketRouter()) {}
33 protected:
philipelc7bf32a2017-02-17 03:59:43 -080034 static const int kProbeMinProbes = 5;
35 static const int kProbeMinBytes = 1000;
kwiberg22feaa32016-03-17 09:17:43 -070036 const std::unique_ptr<PacketRouter> packet_router_;
Stefan Holmere5904162015-03-26 11:11:06 +010037};
38
39TEST_F(PacketRouterTest, TimeToSendPacket) {
40 MockRtpRtcp rtp_1;
41 MockRtpRtcp rtp_2;
nissefdbfdc92017-03-31 05:44:52 -070042 packet_router_->AddSendRtpModule(&rtp_1);
43 packet_router_->AddSendRtpModule(&rtp_2);
Stefan Holmere5904162015-03-26 11:11:06 +010044
45 const uint16_t kSsrc1 = 1234;
46 uint16_t sequence_number = 17;
47 uint64_t timestamp = 7890;
48 bool retransmission = false;
49
50 // Send on the first module by letting rtp_1 be sending with correct ssrc.
51 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
52 EXPECT_CALL(rtp_1, SSRC()).Times(1).WillOnce(Return(kSsrc1));
philipelc7bf32a2017-02-17 03:59:43 -080053 EXPECT_CALL(rtp_1, TimeToSendPacket(
54 kSsrc1, sequence_number, timestamp, retransmission,
55 Field(&PacedPacketInfo::probe_cluster_id, 1)))
Stefan Holmere5904162015-03-26 11:11:06 +010056 .Times(1)
57 .WillOnce(Return(true));
philipela1ed0b32016-06-01 06:31:17 -070058 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _, _)).Times(0);
philipelc7bf32a2017-02-17 03:59:43 -080059 EXPECT_TRUE(packet_router_->TimeToSendPacket(
60 kSsrc1, sequence_number, timestamp, retransmission,
61 PacedPacketInfo(1, kProbeMinProbes, kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +010062
63 // Send on the second module by letting rtp_2 be sending, but not rtp_1.
64 ++sequence_number;
65 timestamp += 30;
66 retransmission = true;
67 const uint16_t kSsrc2 = 4567;
68 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false));
69 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
70 EXPECT_CALL(rtp_2, SSRC()).Times(1).WillOnce(Return(kSsrc2));
philipela1ed0b32016-06-01 06:31:17 -070071 EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _, _, _)).Times(0);
philipelc7bf32a2017-02-17 03:59:43 -080072 EXPECT_CALL(rtp_2, TimeToSendPacket(
73 kSsrc2, sequence_number, timestamp, retransmission,
74 Field(&PacedPacketInfo::probe_cluster_id, 2)))
Stefan Holmere5904162015-03-26 11:11:06 +010075 .Times(1)
76 .WillOnce(Return(true));
philipelc7bf32a2017-02-17 03:59:43 -080077 EXPECT_TRUE(packet_router_->TimeToSendPacket(
78 kSsrc2, sequence_number, timestamp, retransmission,
79 PacedPacketInfo(2, kProbeMinProbes, kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +010080
81 // No module is sending, hence no packet should be sent.
82 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false));
philipela1ed0b32016-06-01 06:31:17 -070083 EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _, _, _)).Times(0);
Stefan Holmere5904162015-03-26 11:11:06 +010084 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(false));
philipela1ed0b32016-06-01 06:31:17 -070085 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _, _)).Times(0);
philipelc7bf32a2017-02-17 03:59:43 -080086 EXPECT_TRUE(packet_router_->TimeToSendPacket(
87 kSsrc1, sequence_number, timestamp, retransmission,
88 PacedPacketInfo(1, kProbeMinProbes, kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +010089
90 // Add a packet with incorrect ssrc and test it's dropped in the router.
91 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
92 EXPECT_CALL(rtp_1, SSRC()).Times(1).WillOnce(Return(kSsrc1));
93 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
94 EXPECT_CALL(rtp_2, SSRC()).Times(1).WillOnce(Return(kSsrc2));
philipela1ed0b32016-06-01 06:31:17 -070095 EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _, _, _)).Times(0);
96 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _, _)).Times(0);
philipelc7bf32a2017-02-17 03:59:43 -080097 EXPECT_TRUE(packet_router_->TimeToSendPacket(
98 kSsrc1 + kSsrc2, sequence_number, timestamp, retransmission,
99 PacedPacketInfo(1, kProbeMinProbes, kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100100
nissefdbfdc92017-03-31 05:44:52 -0700101 packet_router_->RemoveSendRtpModule(&rtp_1);
Stefan Holmere5904162015-03-26 11:11:06 +0100102
103 // rtp_1 has been removed, try sending a packet on that ssrc and make sure
104 // it is dropped as expected by not expecting any calls to rtp_1.
105 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
106 EXPECT_CALL(rtp_2, SSRC()).Times(1).WillOnce(Return(kSsrc2));
philipela1ed0b32016-06-01 06:31:17 -0700107 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _, _)).Times(0);
philipelc7bf32a2017-02-17 03:59:43 -0800108 EXPECT_TRUE(packet_router_->TimeToSendPacket(
109 kSsrc1, sequence_number, timestamp, retransmission,
110 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
111 kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100112
nissefdbfdc92017-03-31 05:44:52 -0700113 packet_router_->RemoveSendRtpModule(&rtp_2);
Stefan Holmere5904162015-03-26 11:11:06 +0100114}
115
116TEST_F(PacketRouterTest, TimeToSendPadding) {
sprang867fb522015-08-03 04:38:41 -0700117 const uint16_t kSsrc1 = 1234;
118 const uint16_t kSsrc2 = 4567;
119
Stefan Holmere5904162015-03-26 11:11:06 +0100120 MockRtpRtcp rtp_1;
stefan16b02212017-01-27 07:12:16 -0800121 EXPECT_CALL(rtp_1, RtxSendStatus()).WillOnce(Return(kRtxOff));
sprang867fb522015-08-03 04:38:41 -0700122 EXPECT_CALL(rtp_1, SSRC()).WillRepeatedly(Return(kSsrc1));
Stefan Holmere5904162015-03-26 11:11:06 +0100123 MockRtpRtcp rtp_2;
stefan16b02212017-01-27 07:12:16 -0800124 // rtp_2 will be prioritized for padding.
125 EXPECT_CALL(rtp_2, RtxSendStatus()).WillOnce(Return(kRtxRedundantPayloads));
sprang867fb522015-08-03 04:38:41 -0700126 EXPECT_CALL(rtp_2, SSRC()).WillRepeatedly(Return(kSsrc2));
nissefdbfdc92017-03-31 05:44:52 -0700127 packet_router_->AddSendRtpModule(&rtp_1);
128 packet_router_->AddSendRtpModule(&rtp_2);
Stefan Holmere5904162015-03-26 11:11:06 +0100129
sprang867fb522015-08-03 04:38:41 -0700130 // Default configuration, sending padding on all modules sending media,
stefan16b02212017-01-27 07:12:16 -0800131 // ordered by priority (based on rtx mode).
Stefan Holmere5904162015-03-26 11:11:06 +0100132 const size_t requested_padding_bytes = 1000;
133 const size_t sent_padding_bytes = 890;
stefan16b02212017-01-27 07:12:16 -0800134 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
stefan53b6cc32017-02-03 08:13:57 -0800135 EXPECT_CALL(rtp_2, HasBweExtensions()).Times(1).WillOnce(Return(true));
philipelc7bf32a2017-02-17 03:59:43 -0800136 EXPECT_CALL(rtp_2,
137 TimeToSendPadding(requested_padding_bytes,
138 Field(&PacedPacketInfo::probe_cluster_id, 111)))
Stefan Holmere5904162015-03-26 11:11:06 +0100139 .Times(1)
140 .WillOnce(Return(sent_padding_bytes));
stefan16b02212017-01-27 07:12:16 -0800141 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
stefan53b6cc32017-02-03 08:13:57 -0800142 EXPECT_CALL(rtp_1, HasBweExtensions()).Times(1).WillOnce(Return(true));
philipelc7bf32a2017-02-17 03:59:43 -0800143 EXPECT_CALL(rtp_1,
144 TimeToSendPadding(requested_padding_bytes - sent_padding_bytes,
145 Field(&PacedPacketInfo::probe_cluster_id, 111)))
sprang867fb522015-08-03 04:38:41 -0700146 .Times(1)
147 .WillOnce(Return(requested_padding_bytes - sent_padding_bytes));
148 EXPECT_EQ(requested_padding_bytes,
philipelc7bf32a2017-02-17 03:59:43 -0800149 packet_router_->TimeToSendPadding(
150 requested_padding_bytes,
151 PacedPacketInfo(111, kProbeMinBytes, kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100152
stefan16b02212017-01-27 07:12:16 -0800153 // Let only the lower priority module be sending and verify the padding
154 // request is routed there.
155 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(false));
156 EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes, _)).Times(0);
157 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
stefan53b6cc32017-02-03 08:13:57 -0800158 EXPECT_CALL(rtp_1, HasBweExtensions()).Times(1).WillOnce(Return(true));
stefan16b02212017-01-27 07:12:16 -0800159 EXPECT_CALL(rtp_1, TimeToSendPadding(_, _))
Stefan Holmere5904162015-03-26 11:11:06 +0100160 .Times(1)
161 .WillOnce(Return(sent_padding_bytes));
162 EXPECT_EQ(sent_padding_bytes,
philipelc7bf32a2017-02-17 03:59:43 -0800163 packet_router_->TimeToSendPadding(
164 requested_padding_bytes,
165 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
166 kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100167
168 // No sending module at all.
169 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false));
philipela1ed0b32016-06-01 06:31:17 -0700170 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes, _)).Times(0);
Stefan Holmere5904162015-03-26 11:11:06 +0100171 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(false));
philipela1ed0b32016-06-01 06:31:17 -0700172 EXPECT_CALL(rtp_2, TimeToSendPadding(_, _)).Times(0);
philipelc7bf32a2017-02-17 03:59:43 -0800173 EXPECT_EQ(0u,
174 packet_router_->TimeToSendPadding(
175 requested_padding_bytes,
176 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
177 kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100178
stefan53b6cc32017-02-03 08:13:57 -0800179 // Only one module has BWE extensions.
180 EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
181 EXPECT_CALL(rtp_1, HasBweExtensions()).Times(1).WillOnce(Return(false));
182 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes, _)).Times(0);
183 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
184 EXPECT_CALL(rtp_2, HasBweExtensions()).Times(1).WillOnce(Return(true));
185 EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes, _))
186 .Times(1)
187 .WillOnce(Return(sent_padding_bytes));
188 EXPECT_EQ(sent_padding_bytes,
philipelc7bf32a2017-02-17 03:59:43 -0800189 packet_router_->TimeToSendPadding(
190 requested_padding_bytes,
191 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
192 kProbeMinBytes)));
stefan53b6cc32017-02-03 08:13:57 -0800193
nissefdbfdc92017-03-31 05:44:52 -0700194 packet_router_->RemoveSendRtpModule(&rtp_1);
Stefan Holmere5904162015-03-26 11:11:06 +0100195
196 // rtp_1 has been removed, try sending padding and make sure rtp_1 isn't asked
197 // to send by not expecting any calls. Instead verify rtp_2 is called.
198 EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
stefan53b6cc32017-02-03 08:13:57 -0800199 EXPECT_CALL(rtp_2, HasBweExtensions()).Times(1).WillOnce(Return(true));
philipela1ed0b32016-06-01 06:31:17 -0700200 EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes, _)).Times(1);
philipelc7bf32a2017-02-17 03:59:43 -0800201 EXPECT_EQ(0u,
202 packet_router_->TimeToSendPadding(
203 requested_padding_bytes,
204 PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
205 kProbeMinBytes)));
Stefan Holmere5904162015-03-26 11:11:06 +0100206
nissefdbfdc92017-03-31 05:44:52 -0700207 packet_router_->RemoveSendRtpModule(&rtp_2);
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100208}
209
210TEST_F(PacketRouterTest, SenderOnlyFunctionsRespectSendingMedia) {
211 MockRtpRtcp rtp;
nissefdbfdc92017-03-31 05:44:52 -0700212 packet_router_->AddSendRtpModule(&rtp);
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100213 static const uint16_t kSsrc = 1234;
214 EXPECT_CALL(rtp, SSRC()).WillRepeatedly(Return(kSsrc));
215 EXPECT_CALL(rtp, SendingMedia()).WillRepeatedly(Return(false));
216
217 // Verify that TimeToSendPacket does not end up in a receiver.
philipela1ed0b32016-06-01 06:31:17 -0700218 EXPECT_CALL(rtp, TimeToSendPacket(_, _, _, _, _)).Times(0);
philipelc7bf32a2017-02-17 03:59:43 -0800219 EXPECT_TRUE(packet_router_->TimeToSendPacket(
220 kSsrc, 1, 1, false, PacedPacketInfo(PacedPacketInfo::kNotAProbe,
221 kProbeMinBytes, kProbeMinBytes)));
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100222 // Verify that TimeToSendPadding does not end up in a receiver.
philipela1ed0b32016-06-01 06:31:17 -0700223 EXPECT_CALL(rtp, TimeToSendPadding(_, _)).Times(0);
philipelc7bf32a2017-02-17 03:59:43 -0800224 EXPECT_EQ(0u,
225 packet_router_->TimeToSendPadding(
226 200, PacedPacketInfo(PacedPacketInfo::kNotAProbe,
227 kProbeMinBytes, kProbeMinBytes)));
Peter Boström3dd5d1d2016-02-25 16:56:48 +0100228
nissefdbfdc92017-03-31 05:44:52 -0700229 packet_router_->RemoveSendRtpModule(&rtp);
Stefan Holmere5904162015-03-26 11:11:06 +0100230}
sprang867fb522015-08-03 04:38:41 -0700231
232TEST_F(PacketRouterTest, AllocateSequenceNumbers) {
233 const uint16_t kStartSeq = 0xFFF0;
234 const size_t kNumPackets = 32;
235
236 packet_router_->SetTransportWideSequenceNumber(kStartSeq - 1);
237
238 for (size_t i = 0; i < kNumPackets; ++i) {
239 uint16_t seq = packet_router_->AllocateSequenceNumber();
240 uint32_t expected_unwrapped_seq = static_cast<uint32_t>(kStartSeq) + i;
241 EXPECT_EQ(static_cast<uint16_t>(expected_unwrapped_seq & 0xFFFF), seq);
242 }
243}
stefanbba9dec2016-02-01 04:39:55 -0800244
245TEST_F(PacketRouterTest, SendFeedback) {
246 MockRtpRtcp rtp_1;
247 MockRtpRtcp rtp_2;
nissefdbfdc92017-03-31 05:44:52 -0700248 packet_router_->AddSendRtpModule(&rtp_1);
249 packet_router_->AddReceiveRtpModule(&rtp_2);
stefanbba9dec2016-02-01 04:39:55 -0800250
251 rtcp::TransportFeedback feedback;
252 EXPECT_CALL(rtp_1, SendFeedbackPacket(_)).Times(1);
253 packet_router_->SendFeedback(&feedback);
nissefdbfdc92017-03-31 05:44:52 -0700254 packet_router_->RemoveSendRtpModule(&rtp_1);
stefanbba9dec2016-02-01 04:39:55 -0800255 EXPECT_CALL(rtp_2, SendFeedbackPacket(_)).Times(1);
256 packet_router_->SendFeedback(&feedback);
nissefdbfdc92017-03-31 05:44:52 -0700257 packet_router_->RemoveReceiveRtpModule(&rtp_2);
stefanbba9dec2016-02-01 04:39:55 -0800258}
Stefan Holmere5904162015-03-26 11:11:06 +0100259} // namespace webrtc