blob: 8c2eab11bfd8dd2f34453b1df6f8d51eb1184652 [file] [log] [blame]
eladalon760a0762017-05-31 09:12:25 -07001/*
2 * Copyright (c) 2017 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/call/rtp_demuxer.h"
12
13#include <memory>
eladalond0244c22017-06-08 04:19:13 -070014#include <string>
eladalon760a0762017-05-31 09:12:25 -070015
eladalona52722f2017-06-26 11:23:54 -070016#include "webrtc/call/rsid_resolution_observer.h"
nissed76b7b22017-06-01 04:02:35 -070017#include "webrtc/call/rtp_packet_sink_interface.h"
eladalona52722f2017-06-26 11:23:54 -070018#include "webrtc/common_types.h"
eladalond0244c22017-06-08 04:19:13 -070019#include "webrtc/modules/rtp_rtcp/include/rtp_header_extension_map.h"
20#include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
eladalon760a0762017-05-31 09:12:25 -070021#include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h"
Edward Lemurc20978e2017-07-06 19:44:34 +020022#include "webrtc/rtc_base/arraysize.h"
23#include "webrtc/rtc_base/basictypes.h"
24#include "webrtc/rtc_base/checks.h"
25#include "webrtc/rtc_base/ptr_util.h"
eladalon760a0762017-05-31 09:12:25 -070026#include "webrtc/test/gmock.h"
27#include "webrtc/test/gtest.h"
28
29namespace webrtc {
30
31namespace {
32
33using ::testing::_;
eladalond0244c22017-06-08 04:19:13 -070034using ::testing::AtLeast;
35using ::testing::InSequence;
36using ::testing::NiceMock;
eladalon760a0762017-05-31 09:12:25 -070037
38class MockRtpPacketSink : public RtpPacketSinkInterface {
39 public:
40 MOCK_METHOD1(OnRtpPacket, void(const RtpPacketReceived&));
41};
42
eladalona52722f2017-06-26 11:23:54 -070043class MockRsidResolutionObserver : public RsidResolutionObserver {
44 public:
45 MOCK_METHOD2(OnRsidResolved, void(const std::string& rsid, uint32_t ssrc));
46};
47
eladalond0244c22017-06-08 04:19:13 -070048MATCHER_P(SamePacketAs, other, "") {
49 return arg.Ssrc() == other.Ssrc() &&
50 arg.SequenceNumber() == other.SequenceNumber();
eladalon760a0762017-05-31 09:12:25 -070051}
52
eladalond0244c22017-06-08 04:19:13 -070053std::unique_ptr<RtpPacketReceived> CreateRtpPacketReceived(
54 uint32_t ssrc,
55 size_t sequence_number = 0) {
56 // |sequence_number| is declared |size_t| to prevent ugly casts when calling
57 // the function, but should in reality always be a |uint16_t|.
58 EXPECT_LT(sequence_number, 1u << 16);
59
eladalon760a0762017-05-31 09:12:25 -070060 auto packet = rtc::MakeUnique<RtpPacketReceived>();
61 packet->SetSsrc(ssrc);
eladalond0244c22017-06-08 04:19:13 -070062 packet->SetSequenceNumber(static_cast<uint16_t>(sequence_number));
eladalon760a0762017-05-31 09:12:25 -070063 return packet;
64}
65
eladalond0244c22017-06-08 04:19:13 -070066std::unique_ptr<RtpPacketReceived> CreateRtpPacketReceivedWithRsid(
67 const std::string& rsid,
68 uint32_t ssrc,
69 size_t sequence_number = 0) {
70 // |sequence_number| is declared |size_t| to prevent ugly casts when calling
71 // the function, but should in reality always be a |uint16_t|.
72 EXPECT_LT(sequence_number, 1u << 16);
eladalon760a0762017-05-31 09:12:25 -070073
eladalond0244c22017-06-08 04:19:13 -070074 const int rsid_extension_id = 6;
75 RtpPacketReceived::ExtensionManager extension_manager;
76 extension_manager.Register<RtpStreamId>(rsid_extension_id);
77 auto packet = rtc::MakeUnique<RtpPacketReceived>(&extension_manager);
78 packet->SetExtension<RtpStreamId>(rsid);
79 packet->SetSsrc(ssrc);
80 packet->SetSequenceNumber(static_cast<uint16_t>(sequence_number));
81 return packet;
82}
eladalon760a0762017-05-31 09:12:25 -070083
eladalond0244c22017-06-08 04:19:13 -070084TEST(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkBySsrc) {
eladalon760a0762017-05-31 09:12:25 -070085 RtpDemuxer demuxer;
eladalon760a0762017-05-31 09:12:25 -070086
eladalond0244c22017-06-08 04:19:13 -070087 constexpr uint32_t ssrcs[] = {101, 202, 303};
88 MockRtpPacketSink sinks[arraysize(ssrcs)];
89 for (size_t i = 0; i < arraysize(ssrcs); i++) {
90 demuxer.AddSink(ssrcs[i], &sinks[i]);
91 }
92
93 for (size_t i = 0; i < arraysize(ssrcs); i++) {
94 auto packet = CreateRtpPacketReceived(ssrcs[i]);
95 EXPECT_CALL(sinks[i], OnRtpPacket(SamePacketAs(*packet))).Times(1);
96 EXPECT_TRUE(demuxer.OnRtpPacket(*packet));
97 }
98
99 // Test tear-down
100 for (const auto& sink : sinks) {
101 demuxer.RemoveSink(&sink);
eladalon760a0762017-05-31 09:12:25 -0700102 }
103}
104
eladalond0244c22017-06-08 04:19:13 -0700105TEST(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByRsid) {
106 RtpDemuxer demuxer;
107
108 const std::string rsids[] = {"a", "b", "c"};
109 MockRtpPacketSink sinks[arraysize(rsids)];
110 for (size_t i = 0; i < arraysize(rsids); i++) {
111 demuxer.AddSink(rsids[i], &sinks[i]);
112 }
113
114 for (size_t i = 0; i < arraysize(rsids); i++) {
115 auto packet =
116 CreateRtpPacketReceivedWithRsid(rsids[i], static_cast<uint32_t>(i), i);
117 EXPECT_CALL(sinks[i], OnRtpPacket(SamePacketAs(*packet))).Times(1);
118 EXPECT_TRUE(demuxer.OnRtpPacket(*packet));
119 }
120
121 // Test tear-down
122 for (const auto& sink : sinks) {
123 demuxer.RemoveSink(&sink);
124 }
125}
126
127TEST(RtpDemuxerTest, PacketsDeliveredInRightOrder) {
128 RtpDemuxer demuxer;
129
eladalona52722f2017-06-26 11:23:54 -0700130 constexpr uint32_t ssrc = 101;
131 MockRtpPacketSink sink;
132 demuxer.AddSink(ssrc, &sink);
eladalond0244c22017-06-08 04:19:13 -0700133
134 std::unique_ptr<RtpPacketReceived> packets[5];
135 for (size_t i = 0; i < arraysize(packets); i++) {
eladalona52722f2017-06-26 11:23:54 -0700136 packets[i] = CreateRtpPacketReceived(ssrc, i);
eladalond0244c22017-06-08 04:19:13 -0700137 }
138
139 InSequence sequence;
140 for (const auto& packet : packets) {
eladalona52722f2017-06-26 11:23:54 -0700141 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
eladalond0244c22017-06-08 04:19:13 -0700142 }
143
144 for (const auto& packet : packets) {
145 EXPECT_TRUE(demuxer.OnRtpPacket(*packet));
146 }
147
148 // Test tear-down
eladalona52722f2017-06-26 11:23:54 -0700149 demuxer.RemoveSink(&sink);
eladalond0244c22017-06-08 04:19:13 -0700150}
151
152TEST(RtpDemuxerTest, MultipleSinksMappedToSameSsrc) {
153 RtpDemuxer demuxer;
154
155 MockRtpPacketSink sinks[3];
156 constexpr uint32_t ssrc = 404;
157 for (auto& sink : sinks) {
158 demuxer.AddSink(ssrc, &sink);
eladalon760a0762017-05-31 09:12:25 -0700159 }
160
161 // Reception of an RTP packet associated with the shared SSRC triggers the
eladalond0244c22017-06-08 04:19:13 -0700162 // callback on all of the sinks associated with it.
163 auto packet = CreateRtpPacketReceived(ssrc);
164 for (auto& sink : sinks) {
165 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet)));
eladalon760a0762017-05-31 09:12:25 -0700166 }
eladalond0244c22017-06-08 04:19:13 -0700167 EXPECT_TRUE(demuxer.OnRtpPacket(*packet));
eladalon760a0762017-05-31 09:12:25 -0700168
eladalond0244c22017-06-08 04:19:13 -0700169 // Test tear-down
170 for (const auto& sink : sinks) {
171 demuxer.RemoveSink(&sink);
eladalon760a0762017-05-31 09:12:25 -0700172 }
173}
174
eladalond0244c22017-06-08 04:19:13 -0700175TEST(RtpDemuxerTest, SinkMappedToMultipleSsrcs) {
176 RtpDemuxer demuxer;
177
178 constexpr uint32_t ssrcs[] = {404, 505, 606};
179 MockRtpPacketSink sink;
180 for (uint32_t ssrc : ssrcs) {
181 demuxer.AddSink(ssrc, &sink);
eladalon760a0762017-05-31 09:12:25 -0700182 }
183
184 // The sink which is associated with multiple SSRCs gets the callback
185 // triggered for each of those SSRCs.
eladalond0244c22017-06-08 04:19:13 -0700186 for (uint32_t ssrc : ssrcs) {
eladalon760a0762017-05-31 09:12:25 -0700187 auto packet = CreateRtpPacketReceived(ssrc);
eladalond0244c22017-06-08 04:19:13 -0700188 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet)));
189 EXPECT_TRUE(demuxer.OnRtpPacket(*packet));
eladalon760a0762017-05-31 09:12:25 -0700190 }
191
eladalond0244c22017-06-08 04:19:13 -0700192 // Test tear-down
193 demuxer.RemoveSink(&sink);
eladalon760a0762017-05-31 09:12:25 -0700194}
195
eladalond0244c22017-06-08 04:19:13 -0700196TEST(RtpDemuxerTest, NoCallbackOnSsrcSinkRemovedBeforeFirstPacket) {
197 RtpDemuxer demuxer;
198
199 constexpr uint32_t ssrc = 404;
200 MockRtpPacketSink sink;
201 demuxer.AddSink(ssrc, &sink);
202
203 ASSERT_TRUE(demuxer.RemoveSink(&sink));
204
205 // The removed sink does not get callbacks.
206 auto packet = CreateRtpPacketReceived(ssrc);
207 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0); // Not called.
208 EXPECT_FALSE(demuxer.OnRtpPacket(*packet));
209}
210
211TEST(RtpDemuxerTest, NoCallbackOnSsrcSinkRemovedAfterFirstPacket) {
212 RtpDemuxer demuxer;
213
214 constexpr uint32_t ssrc = 404;
215 NiceMock<MockRtpPacketSink> sink;
216 demuxer.AddSink(ssrc, &sink);
217
218 InSequence sequence;
219 uint16_t seq_num;
220 for (seq_num = 0; seq_num < 10; seq_num++) {
221 ASSERT_TRUE(demuxer.OnRtpPacket(*CreateRtpPacketReceived(ssrc, seq_num)));
eladalon760a0762017-05-31 09:12:25 -0700222 }
223
eladalond0244c22017-06-08 04:19:13 -0700224 ASSERT_TRUE(demuxer.RemoveSink(&sink));
eladalon760a0762017-05-31 09:12:25 -0700225
eladalond0244c22017-06-08 04:19:13 -0700226 // The removed sink does not get callbacks.
227 auto packet = CreateRtpPacketReceived(ssrc, seq_num);
228 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0); // Not called.
229 EXPECT_FALSE(demuxer.OnRtpPacket(*packet));
230}
231
232TEST(RtpDemuxerTest, RepeatedSsrcAssociationsDoNotTriggerRepeatedCallbacks) {
233 RtpDemuxer demuxer;
234
235 constexpr uint32_t ssrc = 111;
236 MockRtpPacketSink sink;
237
238 demuxer.AddSink(ssrc, &sink);
239 demuxer.AddSink(ssrc, &sink);
240
241 auto packet = CreateRtpPacketReceived(ssrc);
242 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
243 EXPECT_TRUE(demuxer.OnRtpPacket(*packet));
244
245 // Test tear-down
246 demuxer.RemoveSink(&sink);
247}
248
249TEST(RtpDemuxerTest, RemoveSinkReturnsFalseForNeverAddedSink) {
250 RtpDemuxer demuxer;
251 MockRtpPacketSink sink;
252
253 EXPECT_FALSE(demuxer.RemoveSink(&sink));
254}
255
256TEST(RtpDemuxerTest, RemoveSinkReturnsTrueForPreviouslyAddedSsrcSink) {
257 RtpDemuxer demuxer;
258
259 constexpr uint32_t ssrc = 101;
260 MockRtpPacketSink sink;
261 demuxer.AddSink(ssrc, &sink);
262
263 EXPECT_TRUE(demuxer.RemoveSink(&sink));
264}
265
266TEST(RtpDemuxerTest,
267 RemoveSinkReturnsTrueForUnresolvedPreviouslyAddedRsidSink) {
268 RtpDemuxer demuxer;
269
270 const std::string rsid = "a";
271 MockRtpPacketSink sink;
272 demuxer.AddSink(rsid, &sink);
273
274 EXPECT_TRUE(demuxer.RemoveSink(&sink));
275}
276
277TEST(RtpDemuxerTest, RemoveSinkReturnsTrueForResolvedPreviouslyAddedRsidSink) {
278 RtpDemuxer demuxer;
279
280 const std::string rsid = "a";
281 constexpr uint32_t ssrc = 101;
282 NiceMock<MockRtpPacketSink> sink;
283 demuxer.AddSink(rsid, &sink);
284 ASSERT_TRUE(
285 demuxer.OnRtpPacket(*CreateRtpPacketReceivedWithRsid(rsid, ssrc)));
286
287 EXPECT_TRUE(demuxer.RemoveSink(&sink));
288}
289
290TEST(RtpDemuxerTest, OnRtpPacketCalledForRsidSink) {
291 RtpDemuxer demuxer;
292
293 MockRtpPacketSink sink;
294 const std::string rsid = "a";
295 demuxer.AddSink(rsid, &sink);
296
297 // Create a sequence of RTP packets, where only the first one actually
298 // mentions the RSID.
299 std::unique_ptr<RtpPacketReceived> packets[5];
300 constexpr uint32_t rsid_ssrc = 111;
301 packets[0] = CreateRtpPacketReceivedWithRsid(rsid, rsid_ssrc);
302 for (size_t i = 1; i < arraysize(packets); i++) {
303 packets[i] = CreateRtpPacketReceived(rsid_ssrc, i);
eladalon760a0762017-05-31 09:12:25 -0700304 }
eladalond0244c22017-06-08 04:19:13 -0700305
306 // The first packet associates the RSID with the SSRC, thereby allowing the
307 // demuxer to correctly demux all of the packets.
308 InSequence sequence;
309 for (const auto& packet : packets) {
310 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
311 }
312 for (const auto& packet : packets) {
313 EXPECT_TRUE(demuxer.OnRtpPacket(*packet));
314 }
315
316 // Test tear-down
317 demuxer.RemoveSink(&sink);
318}
319
320TEST(RtpDemuxerTest, NoCallbackOnRsidSinkRemovedBeforeFirstPacket) {
321 RtpDemuxer demuxer;
322
323 MockRtpPacketSink sink;
324 const std::string rsid = "a";
325 demuxer.AddSink(rsid, &sink);
326
327 // Sink removed - it won't get triggers even if packets with its RSID arrive.
328 ASSERT_TRUE(demuxer.RemoveSink(&sink));
329
330 constexpr uint32_t ssrc = 111;
331 auto packet = CreateRtpPacketReceivedWithRsid(rsid, ssrc);
332 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0); // Not called.
333 EXPECT_FALSE(demuxer.OnRtpPacket(*packet));
334}
335
336TEST(RtpDemuxerTest, NoCallbackOnRsidSinkRemovedAfterFirstPacket) {
337 RtpDemuxer demuxer;
338
339 NiceMock<MockRtpPacketSink> sink;
340 const std::string rsid = "a";
341 demuxer.AddSink(rsid, &sink);
342
343 InSequence sequence;
344 constexpr uint32_t ssrc = 111;
345 uint16_t seq_num;
346 for (seq_num = 0; seq_num < 10; seq_num++) {
347 auto packet = CreateRtpPacketReceivedWithRsid(rsid, ssrc, seq_num);
348 ASSERT_TRUE(demuxer.OnRtpPacket(*packet));
349 }
350
351 // Sink removed - it won't get triggers even if packets with its RSID arrive.
352 ASSERT_TRUE(demuxer.RemoveSink(&sink));
353
354 auto packet = CreateRtpPacketReceivedWithRsid(rsid, ssrc, seq_num);
355 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0); // Not called.
356 EXPECT_FALSE(demuxer.OnRtpPacket(*packet));
357}
358
359// The RSID to SSRC mapping should be one-to-one. If we end up receiving
360// two (or more) packets with the same SSRC, but different RSIDs, we guarantee
361// remembering the first one; no guarantees are made about further associations.
362TEST(RtpDemuxerTest, FirstSsrcAssociatedWithAnRsidIsNotForgotten) {
363 RtpDemuxer demuxer;
364
365 // Each sink has a distinct RSID.
366 MockRtpPacketSink sink_a;
367 const std::string rsid_a = "a";
368 demuxer.AddSink(rsid_a, &sink_a);
369
370 MockRtpPacketSink sink_b;
371 const std::string rsid_b = "b";
372 demuxer.AddSink(rsid_b, &sink_b);
373
374 InSequence sequence; // Verify that the order of delivery is unchanged.
375
376 constexpr uint32_t shared_ssrc = 100;
377
378 // First a packet with |rsid_a| is received, and |sink_a| is associated with
379 // its SSRC.
380 auto packet_a = CreateRtpPacketReceivedWithRsid(rsid_a, shared_ssrc, 10);
381 EXPECT_CALL(sink_a, OnRtpPacket(SamePacketAs(*packet_a))).Times(1);
382 EXPECT_TRUE(demuxer.OnRtpPacket(*packet_a));
383
eladalon9addbeb2017-06-30 06:26:54 -0700384 // Second, a packet with |rsid_b| is received. We guarantee that |sink_a|
385 // would receive it, and make no guarantees about |sink_b|.
eladalond0244c22017-06-08 04:19:13 -0700386 auto packet_b = CreateRtpPacketReceivedWithRsid(rsid_b, shared_ssrc, 20);
387 EXPECT_CALL(sink_a, OnRtpPacket(SamePacketAs(*packet_b))).Times(1);
eladalon9addbeb2017-06-30 06:26:54 -0700388 EXPECT_CALL(sink_b, OnRtpPacket(SamePacketAs(*packet_b))).Times(AtLeast(0));
eladalond0244c22017-06-08 04:19:13 -0700389 EXPECT_TRUE(demuxer.OnRtpPacket(*packet_b));
390
391 // Known edge-case; adding a new RSID association makes us re-examine all
392 // SSRCs. |sink_b| may or may not be associated with the SSRC now; we make
393 // no promises on that. We do however still guarantee that |sink_a| still
394 // receives the new packets.
eladalon9addbeb2017-06-30 06:26:54 -0700395 MockRtpPacketSink sink_c;
396 const std::string rsid_c = "c";
397 constexpr uint32_t some_other_ssrc = shared_ssrc + 1;
398 demuxer.AddSink(some_other_ssrc, &sink_c);
399 auto packet_c = CreateRtpPacketReceivedWithRsid(rsid_c, shared_ssrc, 30);
eladalond0244c22017-06-08 04:19:13 -0700400 EXPECT_CALL(sink_a, OnRtpPacket(SamePacketAs(*packet_c))).Times(1);
401 EXPECT_CALL(sink_b, OnRtpPacket(SamePacketAs(*packet_c))).Times(AtLeast(0));
402 EXPECT_TRUE(demuxer.OnRtpPacket(*packet_c));
403
404 // Test tear-down
405 demuxer.RemoveSink(&sink_a);
406 demuxer.RemoveSink(&sink_b);
eladalon9addbeb2017-06-30 06:26:54 -0700407 demuxer.RemoveSink(&sink_c);
eladalond0244c22017-06-08 04:19:13 -0700408}
409
410TEST(RtpDemuxerTest, MultipleRsidsOnSameSink) {
411 RtpDemuxer demuxer;
412
413 MockRtpPacketSink sink;
414 const std::string rsids[] = {"a", "b", "c"};
415
416 for (const std::string& rsid : rsids) {
417 demuxer.AddSink(rsid, &sink);
418 }
419
420 InSequence sequence;
421 for (size_t i = 0; i < arraysize(rsids); i++) {
422 // Assign different SSRCs and sequence numbers to all packets.
423 const uint32_t ssrc = 1000 + static_cast<uint32_t>(i);
424 const uint16_t sequence_number = 50 + static_cast<uint16_t>(i);
425 auto packet =
426 CreateRtpPacketReceivedWithRsid(rsids[i], ssrc, sequence_number);
427 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
428 EXPECT_TRUE(demuxer.OnRtpPacket(*packet));
429 }
430
431 // Test tear-down
432 demuxer.RemoveSink(&sink);
433}
434
eladalona52722f2017-06-26 11:23:54 -0700435TEST(RtpDemuxerTest, RsidUsedByMultipleSinks) {
436 RtpDemuxer demuxer;
437
438 MockRtpPacketSink sinks[3];
439 const std::string shared_rsid = "a";
440
441 for (MockRtpPacketSink& sink : sinks) {
442 demuxer.AddSink(shared_rsid, &sink);
443 }
444
445 constexpr uint32_t shared_ssrc = 888;
446 auto packet = CreateRtpPacketReceivedWithRsid(shared_rsid, shared_ssrc);
447
448 for (auto& sink : sinks) {
449 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
450 }
451
452 EXPECT_TRUE(demuxer.OnRtpPacket(*packet));
453
454 // Test tear-down
455 for (MockRtpPacketSink& sink : sinks) {
456 demuxer.RemoveSink(&sink);
457 }
458}
459
eladalond0244c22017-06-08 04:19:13 -0700460TEST(RtpDemuxerTest, SinkWithBothRsidAndSsrcAssociations) {
461 RtpDemuxer demuxer;
462
463 MockRtpPacketSink sink;
464 constexpr uint32_t standalone_ssrc = 10101;
465 constexpr uint32_t rsid_ssrc = 20202;
466 const std::string rsid = "a";
467
468 demuxer.AddSink(standalone_ssrc, &sink);
469 demuxer.AddSink(rsid, &sink);
470
471 InSequence sequence;
472
473 auto ssrc_packet = CreateRtpPacketReceived(standalone_ssrc, 11);
474 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*ssrc_packet))).Times(1);
475 EXPECT_TRUE(demuxer.OnRtpPacket(*ssrc_packet));
476
477 auto rsid_packet = CreateRtpPacketReceivedWithRsid(rsid, rsid_ssrc, 22);
478 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*rsid_packet))).Times(1);
479 EXPECT_TRUE(demuxer.OnRtpPacket(*rsid_packet));
480
481 // Test tear-down
482 demuxer.RemoveSink(&sink);
483}
484
485TEST(RtpDemuxerTest, AssociatingByRsidAndBySsrcCannotTriggerDoubleCall) {
486 RtpDemuxer demuxer;
487 MockRtpPacketSink sink;
488
489 constexpr uint32_t ssrc = 10101;
490 demuxer.AddSink(ssrc, &sink);
491
492 const std::string rsid = "a";
493 demuxer.AddSink(rsid, &sink);
494
495 constexpr uint16_t seq_num = 999;
496 auto packet = CreateRtpPacketReceivedWithRsid(rsid, ssrc, seq_num);
497 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
498 EXPECT_TRUE(demuxer.OnRtpPacket(*packet));
499
500 // Test tear-down
501 demuxer.RemoveSink(&sink);
eladalon760a0762017-05-31 09:12:25 -0700502}
503
eladalona52722f2017-06-26 11:23:54 -0700504TEST(RtpDemuxerTest, RsidObserversInformedOfResolutions) {
505 RtpDemuxer demuxer;
506
507 constexpr uint32_t ssrc = 111;
508 const std::string rsid = "a";
509
510 MockRsidResolutionObserver rsid_resolution_observers[3];
511 for (auto& observer : rsid_resolution_observers) {
512 demuxer.RegisterRsidResolutionObserver(&observer);
513 EXPECT_CALL(observer, OnRsidResolved(rsid, ssrc)).Times(1);
514 }
515
516 // The expected calls to OnRsidResolved() will be triggered by this.
517 demuxer.OnRtpPacket(*CreateRtpPacketReceivedWithRsid(rsid, ssrc));
518
519 // Test tear-down
520 for (auto& observer : rsid_resolution_observers) {
521 demuxer.DeregisterRsidResolutionObserver(&observer);
522 }
523}
524
eladalona52722f2017-06-26 11:23:54 -0700525TEST(RtpDemuxerTest, DeregisteredRsidObserversNotInformedOfResolutions) {
526 RtpDemuxer demuxer;
527
528 constexpr uint32_t ssrc = 111;
529 const std::string rsid = "a";
530 NiceMock<MockRtpPacketSink> sink;
531 demuxer.AddSink(rsid, &sink);
532
533 // Register several, then deregister only one, to show that not all of the
534 // observers had been forgotten when one was removed.
535 MockRsidResolutionObserver observer_1;
536 MockRsidResolutionObserver observer_2_removed;
537 MockRsidResolutionObserver observer_3;
538
539 demuxer.RegisterRsidResolutionObserver(&observer_1);
540 demuxer.RegisterRsidResolutionObserver(&observer_2_removed);
541 demuxer.RegisterRsidResolutionObserver(&observer_3);
542
543 demuxer.DeregisterRsidResolutionObserver(&observer_2_removed);
544
545 EXPECT_CALL(observer_1, OnRsidResolved(rsid, ssrc)).Times(1);
546 EXPECT_CALL(observer_2_removed, OnRsidResolved(_, _)).Times(0);
547 EXPECT_CALL(observer_3, OnRsidResolved(rsid, ssrc)).Times(1);
548
549 // The expected calls to OnRsidResolved() will be triggered by this.
550 demuxer.OnRtpPacket(*CreateRtpPacketReceivedWithRsid(rsid, ssrc));
551
552 // Test tear-down
553 demuxer.RemoveSink(&sink);
554 demuxer.DeregisterRsidResolutionObserver(&observer_1);
555 demuxer.DeregisterRsidResolutionObserver(&observer_3);
556}
557
eladalon760a0762017-05-31 09:12:25 -0700558#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
eladalond0244c22017-06-08 04:19:13 -0700559TEST(RtpDemuxerTest, RsidMustBeNonEmpty) {
560 RtpDemuxer demuxer;
561 MockRtpPacketSink sink;
562 EXPECT_DEATH(demuxer.AddSink("", &sink), "");
563}
564
565TEST(RtpDemuxerTest, RsidMustBeAlphaNumeric) {
566 RtpDemuxer demuxer;
567 MockRtpPacketSink sink;
568 EXPECT_DEATH(demuxer.AddSink("a_3", &sink), "");
569}
570
571TEST(RtpDemuxerTest, RsidMustNotExceedMaximumLength) {
572 RtpDemuxer demuxer;
573 MockRtpPacketSink sink;
574 std::string rsid(StreamId::kMaxSize + 1, 'a');
575 EXPECT_DEATH(demuxer.AddSink(rsid, &sink), "");
576}
577
578TEST(RtpDemuxerTest, RepeatedRsidAssociationsDisallowed) {
579 RtpDemuxer demuxer;
580 MockRtpPacketSink sink;
581 demuxer.AddSink("a", &sink);
582 EXPECT_DEATH(demuxer.AddSink("a", &sink), "");
eladalona52722f2017-06-26 11:23:54 -0700583 demuxer.RemoveSink(&sink);
eladalon760a0762017-05-31 09:12:25 -0700584}
eladalona52722f2017-06-26 11:23:54 -0700585
586TEST(RtpDemuxerTest,
587 DoubleRegisterationOfNeverRegisteredRsidResolutionObserverDisallowed) {
588 RtpDemuxer demuxer;
589 MockRsidResolutionObserver observer;
590 demuxer.RegisterRsidResolutionObserver(&observer);
591 EXPECT_DEATH(demuxer.RegisterRsidResolutionObserver(&observer), "");
592 demuxer.DeregisterRsidResolutionObserver(&observer);
593}
594
595TEST(RtpDemuxerTest,
596 DregisterationOfNeverRegisteredRsidResolutionObserverDisallowed) {
597 RtpDemuxer demuxer;
598 MockRsidResolutionObserver observer;
599 EXPECT_DEATH(demuxer.DeregisterRsidResolutionObserver(&observer), "");
600}
601
eladalon760a0762017-05-31 09:12:25 -0700602#endif
603
604} // namespace
605} // namespace webrtc