blob: ff4f9b37d4cb3117b5763e37f790c181d8509969 [file] [log] [blame]
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +00001/*
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
12#include <list>
13
14#include "testing/gmock/include/gmock/gmock.h"
15#include "testing/gtest/include/gtest/gtest.h"
16#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h"
17#include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
18#include "webrtc/system_wrappers/interface/scoped_ptr.h"
19#include "webrtc/video_engine/payload_router.h"
20
21using ::testing::_;
22using ::testing::AnyNumber;
23using ::testing::NiceMock;
24using ::testing::Return;
25
26namespace webrtc {
27
28class PayloadRouterTest : public ::testing::Test {
29 protected:
30 virtual void SetUp() {
31 payload_router_.reset(new PayloadRouter());
32 }
33 scoped_ptr<PayloadRouter> payload_router_;
34};
35
36TEST_F(PayloadRouterTest, SendOnOneModule) {
37 MockRtpRtcp rtp;
38 std::list<RtpRtcp*> modules(1, &rtp);
39
40 payload_router_->SetSendingRtpModules(modules);
41
42 uint8_t payload = 'a';
43 FrameType frame_type = kVideoFrameKey;
44 int8_t payload_type = 96;
45
46 EXPECT_CALL(rtp, SendOutgoingData(frame_type, payload_type, 0, 0, _, 1, NULL,
47 NULL))
48 .Times(0);
49 EXPECT_FALSE(payload_router_->RoutePayload(frame_type, payload_type, 0, 0,
50 &payload, 1, NULL, NULL));
51
52 payload_router_->set_active(true);
53 EXPECT_CALL(rtp, SendOutgoingData(frame_type, payload_type, 0, 0, _, 1, NULL,
54 NULL))
55 .Times(1);
56 EXPECT_TRUE(payload_router_->RoutePayload(frame_type, payload_type, 0, 0,
57 &payload, 1, NULL, NULL));
58
59 payload_router_->set_active(false);
60 EXPECT_CALL(rtp, SendOutgoingData(frame_type, payload_type, 0, 0, _, 1, NULL,
61 NULL))
62 .Times(0);
63 EXPECT_FALSE(payload_router_->RoutePayload(frame_type, payload_type, 0, 0,
64 &payload, 1, NULL, NULL));
65
66 payload_router_->set_active(true);
67 EXPECT_CALL(rtp, SendOutgoingData(frame_type, payload_type, 0, 0, _, 1, NULL,
68 NULL))
69 .Times(1);
70 EXPECT_TRUE(payload_router_->RoutePayload(frame_type, payload_type, 0, 0,
71 &payload, 1, NULL, NULL));
72
73 modules.clear();
74 payload_router_->SetSendingRtpModules(modules);
75 EXPECT_CALL(rtp, SendOutgoingData(frame_type, payload_type, 0, 0, _, 1, NULL,
76 NULL))
77 .Times(0);
78 EXPECT_FALSE(payload_router_->RoutePayload(frame_type, payload_type, 0, 0,
79 &payload, 1, NULL, NULL));
80}
81
82TEST_F(PayloadRouterTest, SendSimulcast) {
83 MockRtpRtcp rtp_1;
84 MockRtpRtcp rtp_2;
85 std::list<RtpRtcp*> modules;
86 modules.push_back(&rtp_1);
87 modules.push_back(&rtp_2);
88
89 payload_router_->SetSendingRtpModules(modules);
90
91 uint8_t payload_1 = 'a';
92 FrameType frame_type_1 = kVideoFrameKey;
93 int8_t payload_type_1 = 96;
94 RTPVideoHeader rtp_hdr_1;
95 rtp_hdr_1.simulcastIdx = 0;
96
97 payload_router_->set_active(true);
98 EXPECT_CALL(rtp_1, SendOutgoingData(frame_type_1, payload_type_1, 0, 0, _, 1,
99 NULL, &rtp_hdr_1))
100 .Times(1);
101 EXPECT_CALL(rtp_2, SendOutgoingData(_, _, _, _, _, _, _, _))
102 .Times(0);
103 EXPECT_TRUE(payload_router_->RoutePayload(frame_type_1, payload_type_1, 0, 0,
104 &payload_1, 1, NULL, &rtp_hdr_1));
105
106 uint8_t payload_2 = 'b';
107 FrameType frame_type_2 = kVideoFrameDelta;
108 int8_t payload_type_2 = 97;
109 RTPVideoHeader rtp_hdr_2;
110 rtp_hdr_2.simulcastIdx = 1;
111 EXPECT_CALL(rtp_2, SendOutgoingData(frame_type_2, payload_type_2, 0, 0, _, 1,
112 NULL, &rtp_hdr_2))
113 .Times(1);
114 EXPECT_CALL(rtp_1, SendOutgoingData(_, _, _, _, _, _, _, _))
115 .Times(0);
116 EXPECT_TRUE(payload_router_->RoutePayload(frame_type_2, payload_type_2, 0, 0,
117 &payload_2, 1, NULL, &rtp_hdr_2));
118
119 payload_router_->set_active(false);
120 EXPECT_CALL(rtp_1, SendOutgoingData(_, _, _, _, _, _, _, _))
121 .Times(0);
122 EXPECT_CALL(rtp_2, SendOutgoingData(_, _, _, _, _, _, _, _))
123 .Times(0);
124 EXPECT_FALSE(payload_router_->RoutePayload(frame_type_1, payload_type_1, 0, 0,
125 &payload_1, 1, NULL, &rtp_hdr_1));
126 EXPECT_FALSE(payload_router_->RoutePayload(frame_type_2, payload_type_2, 0, 0,
127 &payload_2, 1, NULL, &rtp_hdr_2));
128}
129
mflodman@webrtc.orga4ef2ce2015-02-12 09:54:18 +0000130TEST_F(PayloadRouterTest, MaxPayloadLength) {
131 // Without any limitations from the modules, verify we get the max payload
132 // length for IP/UDP/SRTP with a MTU of 150 bytes.
133 const size_t kDefaultMaxLength = 1500 - 20 - 8 - 12 - 4;
134 EXPECT_EQ(kDefaultMaxLength, payload_router_->DefaultMaxPayloadLength());
135 EXPECT_EQ(kDefaultMaxLength, payload_router_->MaxPayloadLength());
136
137 MockRtpRtcp rtp_1;
138 MockRtpRtcp rtp_2;
139 std::list<RtpRtcp*> modules;
140 modules.push_back(&rtp_1);
141 modules.push_back(&rtp_2);
142 payload_router_->SetSendingRtpModules(modules);
143
144 // Modules return a higher length than the default value.
145 EXPECT_CALL(rtp_1, MaxDataPayloadLength())
146 .Times(1)
147 .WillOnce(Return(kDefaultMaxLength + 10));
148 EXPECT_CALL(rtp_2, MaxDataPayloadLength())
149 .Times(1)
150 .WillOnce(Return(kDefaultMaxLength + 10));
151 EXPECT_EQ(kDefaultMaxLength, payload_router_->MaxPayloadLength());
152
153 // The modules return a value lower than default.
154 const size_t kTestMinPayloadLength = 1001;
155 EXPECT_CALL(rtp_1, MaxDataPayloadLength())
156 .Times(1)
157 .WillOnce(Return(kTestMinPayloadLength + 10));
158 EXPECT_CALL(rtp_2, MaxDataPayloadLength())
159 .Times(1)
160 .WillOnce(Return(kTestMinPayloadLength));
161 EXPECT_EQ(kTestMinPayloadLength, payload_router_->MaxPayloadLength());
162}
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000163
mflodman@webrtc.org290cb562015-02-17 10:15:06 +0000164TEST_F(PayloadRouterTest, TimeToSendPacket) {
165 MockRtpRtcp rtp_1;
166 MockRtpRtcp rtp_2;
167 std::list<RtpRtcp*> modules;
168 modules.push_back(&rtp_1);
169 modules.push_back(&rtp_2);
170 payload_router_->SetSendingRtpModules(modules);
171
172 const uint16_t kSsrc1 = 1234;
173 uint16_t sequence_number = 17;
174 uint64_t timestamp = 7890;
175 bool retransmission = false;
176
177 // Send on the first module by letting rtp_1 be sending with correct ssrc.
178 EXPECT_CALL(rtp_1, SendingMedia())
179 .Times(1)
180 .WillOnce(Return(true));
181 EXPECT_CALL(rtp_1, SSRC())
182 .Times(1)
183 .WillOnce(Return(kSsrc1));
184 EXPECT_CALL(rtp_1, TimeToSendPacket(kSsrc1, sequence_number, timestamp,
185 retransmission))
186 .Times(1)
187 .WillOnce(Return(true));
188 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _))
189 .Times(0);
190 EXPECT_TRUE(payload_router_->TimeToSendPacket(
191 kSsrc1, sequence_number, timestamp, retransmission));
192
193
194 // Send on the second module by letting rtp_2 be sending, but not rtp_1.
195 ++sequence_number;
196 timestamp += 30;
197 retransmission = true;
198 const uint16_t kSsrc2 = 4567;
199 EXPECT_CALL(rtp_1, SendingMedia())
200 .Times(1)
201 .WillOnce(Return(false));
202 EXPECT_CALL(rtp_2, SendingMedia())
203 .Times(1)
204 .WillOnce(Return(true));
205 EXPECT_CALL(rtp_2, SSRC())
206 .Times(1)
207 .WillOnce(Return(kSsrc2));
208 EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _, _))
209 .Times(0);
210 EXPECT_CALL(rtp_2, TimeToSendPacket(kSsrc2, sequence_number, timestamp,
211 retransmission))
212 .Times(1)
213 .WillOnce(Return(true));
214 EXPECT_TRUE(payload_router_->TimeToSendPacket(
215 kSsrc2, sequence_number, timestamp, retransmission));
216
217 // No module is sending, hence no packet should be sent.
218 EXPECT_CALL(rtp_1, SendingMedia())
219 .Times(1)
220 .WillOnce(Return(false));
221 EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _,_))
222 .Times(0);
223 EXPECT_CALL(rtp_2, SendingMedia())
224 .Times(1)
225 .WillOnce(Return(false));
226 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _))
227 .Times(0);
228 EXPECT_TRUE(payload_router_->TimeToSendPacket(
229 kSsrc1, sequence_number, timestamp, retransmission));
230
231 // Add a packet with incorrect ssrc and test it's dropped in the router.
232 EXPECT_CALL(rtp_1, SendingMedia())
233 .Times(1)
234 .WillOnce(Return(true));
235 EXPECT_CALL(rtp_1, SSRC())
236 .Times(1)
237 .WillOnce(Return(kSsrc1));
238 EXPECT_CALL(rtp_2, SendingMedia())
239 .Times(1)
240 .WillOnce(Return(true));
241 EXPECT_CALL(rtp_2, SSRC())
242 .Times(1)
243 .WillOnce(Return(kSsrc2));
244 EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _,_))
245 .Times(0);
246 EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _))
247 .Times(0);
248 EXPECT_TRUE(payload_router_->TimeToSendPacket(
249 kSsrc1 + kSsrc2, sequence_number, timestamp, retransmission));
250}
251
252TEST_F(PayloadRouterTest, TimeToSendPadding) {
253 MockRtpRtcp rtp_1;
254 MockRtpRtcp rtp_2;
255 std::list<RtpRtcp*> modules;
256 modules.push_back(&rtp_1);
257 modules.push_back(&rtp_2);
258 payload_router_->SetSendingRtpModules(modules);
259
260
261 // Default configuration, sending padding on the first sending module.
262 const size_t requested_padding_bytes = 1000;
263 const size_t sent_padding_bytes = 890;
264 EXPECT_CALL(rtp_1, SendingMedia())
265 .Times(1)
266 .WillOnce(Return(true));
267 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes))
268 .Times(1)
269 .WillOnce(Return(sent_padding_bytes));
270 EXPECT_CALL(rtp_2, TimeToSendPadding(_))
271 .Times(0);
272 EXPECT_EQ(sent_padding_bytes,
273 payload_router_->TimeToSendPadding(requested_padding_bytes));
274
275 // Let only the second module be sending and verify the padding request is
276 // routed there.
277 EXPECT_CALL(rtp_1, SendingMedia())
278 .Times(1)
279 .WillOnce(Return(false));
280 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes))
281 .Times(0);
282 EXPECT_CALL(rtp_2, SendingMedia())
283 .Times(1)
284 .WillOnce(Return(true));
285 EXPECT_CALL(rtp_2, TimeToSendPadding(_))
286 .Times(1)
287 .WillOnce(Return(sent_padding_bytes));
288 EXPECT_EQ(sent_padding_bytes,
289 payload_router_->TimeToSendPadding(requested_padding_bytes));
290
291 // No sending module at all.
292 EXPECT_CALL(rtp_1, SendingMedia())
293 .Times(1)
294 .WillOnce(Return(false));
295 EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes))
296 .Times(0);
297 EXPECT_CALL(rtp_2, SendingMedia())
298 .Times(1)
299 .WillOnce(Return(false));
300 EXPECT_CALL(rtp_2, TimeToSendPadding(_))
301 .Times(0);
302 EXPECT_EQ(static_cast<size_t>(0),
303 payload_router_->TimeToSendPadding(requested_padding_bytes));
304}
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000305} // namespace webrtc