blob: 86b458a0cc0b729d4c49788af2f87a011238e4ae [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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "call/rtp_demuxer.h"
eladalon760a0762017-05-31 09:12:25 -070012
13#include <memory>
Steve Anton9e0c7422017-08-17 18:59:47 -070014#include <set>
eladalond0244c22017-06-08 04:19:13 -070015#include <string>
eladalon760a0762017-05-31 09:12:25 -070016
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "call/ssrc_binding_observer.h"
18#include "call/test/mock_rtp_packet_sink_interface.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
20#include "modules/rtp_rtcp/source/rtp_header_extensions.h"
21#include "modules/rtp_rtcp/source/rtp_packet_received.h"
22#include "rtc_base/arraysize.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020023#include "rtc_base/checks.h"
Karl Wiberge40468b2017-11-22 10:42:26 +010024#include "rtc_base/numerics/safe_conversions.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020025#include "test/gmock.h"
26#include "test/gtest.h"
eladalon760a0762017-05-31 09:12:25 -070027
28namespace webrtc {
29
30namespace {
31
32using ::testing::_;
eladalond0244c22017-06-08 04:19:13 -070033using ::testing::AtLeast;
Steve Anton53c7ba62017-08-18 10:05:47 -070034using ::testing::AtMost;
eladalond0244c22017-06-08 04:19:13 -070035using ::testing::InSequence;
36using ::testing::NiceMock;
eladalon760a0762017-05-31 09:12:25 -070037
Steve Antonb3329172017-08-17 15:23:51 -070038class MockSsrcBindingObserver : public SsrcBindingObserver {
eladalona52722f2017-06-26 11:23:54 -070039 public:
Steve Antonb3329172017-08-17 15:23:51 -070040 MOCK_METHOD2(OnSsrcBoundToRsid, void(const std::string& rsid, uint32_t ssrc));
Steve Anton53c7ba62017-08-18 10:05:47 -070041 MOCK_METHOD2(OnSsrcBoundToMid, void(const std::string& mid, uint32_t ssrc));
42 MOCK_METHOD3(OnSsrcBoundToMidRsid,
43 void(const std::string& mid,
44 const std::string& rsid,
45 uint32_t ssrc));
46 MOCK_METHOD2(OnSsrcBoundToPayloadType,
47 void(uint8_t payload_type, uint32_t ssrc));
eladalona52722f2017-06-26 11:23:54 -070048};
49
Mirko Bonadei6a489f22019-04-09 15:11:12 +020050class RtpDemuxerTest : public ::testing::Test {
Steve Anton9e0c7422017-08-17 18:59:47 -070051 protected:
52 ~RtpDemuxerTest() {
53 for (auto* sink : sinks_to_tear_down_) {
54 demuxer_.RemoveSink(sink);
55 }
56 for (auto* observer : observers_to_tear_down_) {
57 demuxer_.DeregisterSsrcBindingObserver(observer);
58 }
59 }
60
Steve Anton53c7ba62017-08-18 10:05:47 -070061 // These are convenience methods for calling demuxer.AddSink with different
62 // parameters and will ensure that the sink is automatically removed when the
63 // test case finishes.
64
65 bool AddSink(const RtpDemuxerCriteria& criteria,
66 RtpPacketSinkInterface* sink) {
67 bool added = demuxer_.AddSink(criteria, sink);
Steve Anton9e0c7422017-08-17 18:59:47 -070068 if (added) {
69 sinks_to_tear_down_.insert(sink);
70 }
71 return added;
72 }
73
Steve Anton53c7ba62017-08-18 10:05:47 -070074 bool AddSinkOnlySsrc(uint32_t ssrc, RtpPacketSinkInterface* sink) {
75 RtpDemuxerCriteria criteria;
76 criteria.ssrcs = {ssrc};
77 return AddSink(criteria, sink);
78 }
79
80 bool AddSinkOnlyRsid(const std::string& rsid, RtpPacketSinkInterface* sink) {
81 RtpDemuxerCriteria criteria;
82 criteria.rsid = rsid;
83 return AddSink(criteria, sink);
84 }
85
86 bool AddSinkOnlyMid(const std::string& mid, RtpPacketSinkInterface* sink) {
87 RtpDemuxerCriteria criteria;
88 criteria.mid = mid;
89 return AddSink(criteria, sink);
90 }
91
92 bool AddSinkBothMidRsid(const std::string& mid,
93 const std::string& rsid,
94 RtpPacketSinkInterface* sink) {
95 RtpDemuxerCriteria criteria;
96 criteria.mid = mid;
97 criteria.rsid = rsid;
98 return AddSink(criteria, sink);
Steve Anton9e0c7422017-08-17 18:59:47 -070099 }
100
101 bool RemoveSink(RtpPacketSinkInterface* sink) {
102 sinks_to_tear_down_.erase(sink);
103 return demuxer_.RemoveSink(sink);
104 }
105
Steve Anton53c7ba62017-08-18 10:05:47 -0700106 // These are convenience methods for calling
107 // demuxer.{Register|Unregister}SsrcBindingObserver such that observers are
108 // automatically removed when the test finishes.
109
Steve Anton9e0c7422017-08-17 18:59:47 -0700110 void RegisterSsrcBindingObserver(SsrcBindingObserver* observer) {
111 demuxer_.RegisterSsrcBindingObserver(observer);
112 observers_to_tear_down_.insert(observer);
113 }
114
115 void DeregisterSsrcBindingObserver(SsrcBindingObserver* observer) {
116 demuxer_.DeregisterSsrcBindingObserver(observer);
117 observers_to_tear_down_.erase(observer);
118 }
119
120 // The CreatePacket* methods are helpers for creating new RTP packets with
121 // various attributes set. Tests should use the helper that provides the
122 // minimum information needed to exercise the behavior under test. Tests also
123 // should not rely on any behavior which is not clearly described in the
124 // helper name/arguments. Any additional settings that are not covered by the
125 // helper should be set manually on the packet once it has been returned.
126 // For example, most tests in this file do not care about the RTP sequence
127 // number, but to ensure that the returned packets are valid the helpers will
128 // auto-increment the sequence number starting with 1. Tests that rely on
129 // specific sequence number behavior should call SetSequenceNumber manually on
130 // the returned packet.
131
132 // Intended for use only by other CreatePacket* helpers.
133 std::unique_ptr<RtpPacketReceived> CreatePacket(
134 uint32_t ssrc,
135 RtpPacketReceived::ExtensionManager* extension_manager) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200136 auto packet = std::make_unique<RtpPacketReceived>(extension_manager);
Steve Anton9e0c7422017-08-17 18:59:47 -0700137 packet->SetSsrc(ssrc);
138 packet->SetSequenceNumber(next_sequence_number_++);
139 return packet;
140 }
141
142 std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrc(uint32_t ssrc) {
143 return CreatePacket(ssrc, nullptr);
144 }
145
Steve Anton53c7ba62017-08-18 10:05:47 -0700146 std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcMid(
147 uint32_t ssrc,
148 const std::string& mid) {
149 RtpPacketReceived::ExtensionManager extension_manager;
150 extension_manager.Register<RtpMid>(11);
151
152 auto packet = CreatePacket(ssrc, &extension_manager);
153 packet->SetExtension<RtpMid>(mid);
154 return packet;
155 }
156
Steve Anton9e0c7422017-08-17 18:59:47 -0700157 std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcRsid(
158 uint32_t ssrc,
159 const std::string& rsid) {
160 RtpPacketReceived::ExtensionManager extension_manager;
161 extension_manager.Register<RtpStreamId>(6);
162
163 auto packet = CreatePacket(ssrc, &extension_manager);
164 packet->SetExtension<RtpStreamId>(rsid);
165 return packet;
166 }
167
Steve Anton53c7ba62017-08-18 10:05:47 -0700168 std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcRrid(
169 uint32_t ssrc,
170 const std::string& rrid) {
171 RtpPacketReceived::ExtensionManager extension_manager;
172 extension_manager.Register<RepairedRtpStreamId>(7);
173
174 auto packet = CreatePacket(ssrc, &extension_manager);
175 packet->SetExtension<RepairedRtpStreamId>(rrid);
176 return packet;
177 }
178
179 std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcMidRsid(
180 uint32_t ssrc,
181 const std::string& mid,
182 const std::string& rsid) {
183 RtpPacketReceived::ExtensionManager extension_manager;
184 extension_manager.Register<RtpMid>(11);
185 extension_manager.Register<RtpStreamId>(6);
186
187 auto packet = CreatePacket(ssrc, &extension_manager);
188 packet->SetExtension<RtpMid>(mid);
189 packet->SetExtension<RtpStreamId>(rsid);
190 return packet;
191 }
192
193 std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcRsidRrid(
194 uint32_t ssrc,
195 const std::string& rsid,
196 const std::string& rrid) {
197 RtpPacketReceived::ExtensionManager extension_manager;
198 extension_manager.Register<RtpStreamId>(6);
199 extension_manager.Register<RepairedRtpStreamId>(7);
200
201 auto packet = CreatePacket(ssrc, &extension_manager);
202 packet->SetExtension<RtpStreamId>(rsid);
203 packet->SetExtension<RepairedRtpStreamId>(rrid);
204 return packet;
205 }
206
Steve Anton9e0c7422017-08-17 18:59:47 -0700207 RtpDemuxer demuxer_;
208 std::set<RtpPacketSinkInterface*> sinks_to_tear_down_;
209 std::set<SsrcBindingObserver*> observers_to_tear_down_;
210 uint16_t next_sequence_number_ = 1;
211};
212
eladalond0244c22017-06-08 04:19:13 -0700213MATCHER_P(SamePacketAs, other, "") {
214 return arg.Ssrc() == other.Ssrc() &&
215 arg.SequenceNumber() == other.SequenceNumber();
eladalon760a0762017-05-31 09:12:25 -0700216}
217
Steve Anton9e0c7422017-08-17 18:59:47 -0700218TEST_F(RtpDemuxerTest, CanAddSinkBySsrc) {
eladalon5daecca2017-08-04 06:34:54 -0700219 MockRtpPacketSink sink;
220 constexpr uint32_t ssrc = 1;
221
Steve Anton9e0c7422017-08-17 18:59:47 -0700222 EXPECT_TRUE(AddSinkOnlySsrc(ssrc, &sink));
eladalon5daecca2017-08-04 06:34:54 -0700223}
224
Steve Anton53c7ba62017-08-18 10:05:47 -0700225TEST_F(RtpDemuxerTest, AllowAddSinkWithOverlappingPayloadTypesIfDifferentMid) {
226 const std::string mid1 = "v";
227 const std::string mid2 = "a";
228 constexpr uint8_t pt1 = 30;
229 constexpr uint8_t pt2 = 31;
230 constexpr uint8_t pt3 = 32;
231
232 RtpDemuxerCriteria pt1_pt2;
233 pt1_pt2.mid = mid1;
234 pt1_pt2.payload_types = {pt1, pt2};
235 MockRtpPacketSink sink1;
236 AddSink(pt1_pt2, &sink1);
237
238 RtpDemuxerCriteria pt1_pt3;
239 pt1_pt2.mid = mid2;
240 pt1_pt3.payload_types = {pt1, pt3};
241 MockRtpPacketSink sink2;
242 EXPECT_TRUE(AddSink(pt1_pt3, &sink2));
243}
244
245TEST_F(RtpDemuxerTest, RejectAddSinkForSameMidOnly) {
246 const std::string mid = "mid";
247
248 MockRtpPacketSink sink;
249 AddSinkOnlyMid(mid, &sink);
250 EXPECT_FALSE(AddSinkOnlyMid(mid, &sink));
251}
252
253TEST_F(RtpDemuxerTest, RejectAddSinkForSameMidRsid) {
254 const std::string mid = "v";
255 const std::string rsid = "1";
256
257 MockRtpPacketSink sink1;
258 AddSinkBothMidRsid(mid, rsid, &sink1);
259
260 MockRtpPacketSink sink2;
261 EXPECT_FALSE(AddSinkBothMidRsid(mid, rsid, &sink2));
262}
263
264TEST_F(RtpDemuxerTest, RejectAddSinkForConflictingMidAndMidRsid) {
265 const std::string mid = "v";
266 const std::string rsid = "1";
267
268 MockRtpPacketSink mid_sink;
269 AddSinkOnlyMid(mid, &mid_sink);
270
271 // This sink would never get any packets routed to it because the above sink
272 // would receive them all.
273 MockRtpPacketSink mid_rsid_sink;
274 EXPECT_FALSE(AddSinkBothMidRsid(mid, rsid, &mid_rsid_sink));
275}
276
277TEST_F(RtpDemuxerTest, RejectAddSinkForConflictingMidRsidAndMid) {
278 const std::string mid = "v";
279 const std::string rsid = "";
280
281 MockRtpPacketSink mid_rsid_sink;
282 AddSinkBothMidRsid(mid, rsid, &mid_rsid_sink);
283
284 // This sink would shadow the above sink.
285 MockRtpPacketSink mid_sink;
286 EXPECT_FALSE(AddSinkOnlyMid(mid, &mid_sink));
287}
288
289TEST_F(RtpDemuxerTest, AddSinkFailsIfCalledForTwoSinksWithSameSsrc) {
290 MockRtpPacketSink sink_a;
291 MockRtpPacketSink sink_b;
292 constexpr uint32_t ssrc = 1;
293 ASSERT_TRUE(AddSinkOnlySsrc(ssrc, &sink_a));
294
295 EXPECT_FALSE(AddSinkOnlySsrc(ssrc, &sink_b));
296}
297
298TEST_F(RtpDemuxerTest, AddSinkFailsIfCalledTwiceEvenIfSameSinkWithSameSsrc) {
299 MockRtpPacketSink sink;
300 constexpr uint32_t ssrc = 1;
301 ASSERT_TRUE(AddSinkOnlySsrc(ssrc, &sink));
302
303 EXPECT_FALSE(AddSinkOnlySsrc(ssrc, &sink));
304}
305
306// TODO(steveanton): Currently fails because payload type validation is not
307// complete in AddSink (see note in rtp_demuxer.cc).
308TEST_F(RtpDemuxerTest, DISABLED_RejectAddSinkForSamePayloadTypes) {
309 constexpr uint8_t pt1 = 30;
310 constexpr uint8_t pt2 = 31;
311
312 RtpDemuxerCriteria pt1_pt2;
313 pt1_pt2.payload_types = {pt1, pt2};
314 MockRtpPacketSink sink1;
315 AddSink(pt1_pt2, &sink1);
316
317 RtpDemuxerCriteria pt2_pt1;
318 pt2_pt1.payload_types = {pt2, pt1};
319 MockRtpPacketSink sink2;
320 EXPECT_FALSE(AddSink(pt2_pt1, &sink2));
321}
322
323// Routing Tests
324
Steve Anton9e0c7422017-08-17 18:59:47 -0700325TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkBySsrc) {
eladalond0244c22017-06-08 04:19:13 -0700326 constexpr uint32_t ssrcs[] = {101, 202, 303};
327 MockRtpPacketSink sinks[arraysize(ssrcs)];
328 for (size_t i = 0; i < arraysize(ssrcs); i++) {
Steve Anton9e0c7422017-08-17 18:59:47 -0700329 AddSinkOnlySsrc(ssrcs[i], &sinks[i]);
eladalond0244c22017-06-08 04:19:13 -0700330 }
331
332 for (size_t i = 0; i < arraysize(ssrcs); i++) {
Steve Anton9e0c7422017-08-17 18:59:47 -0700333 auto packet = CreatePacketWithSsrc(ssrcs[i]);
eladalond0244c22017-06-08 04:19:13 -0700334 EXPECT_CALL(sinks[i], OnRtpPacket(SamePacketAs(*packet))).Times(1);
Steve Anton9e0c7422017-08-17 18:59:47 -0700335 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalon760a0762017-05-31 09:12:25 -0700336 }
337}
338
Steve Anton9e0c7422017-08-17 18:59:47 -0700339TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByRsid) {
eladalond0244c22017-06-08 04:19:13 -0700340 const std::string rsids[] = {"a", "b", "c"};
341 MockRtpPacketSink sinks[arraysize(rsids)];
342 for (size_t i = 0; i < arraysize(rsids); i++) {
Steve Anton9e0c7422017-08-17 18:59:47 -0700343 AddSinkOnlyRsid(rsids[i], &sinks[i]);
eladalond0244c22017-06-08 04:19:13 -0700344 }
345
346 for (size_t i = 0; i < arraysize(rsids); i++) {
Yves Gerey665174f2018-06-19 15:03:05 +0200347 auto packet =
348 CreatePacketWithSsrcRsid(rtc::checked_cast<uint32_t>(i), rsids[i]);
eladalond0244c22017-06-08 04:19:13 -0700349 EXPECT_CALL(sinks[i], OnRtpPacket(SamePacketAs(*packet))).Times(1);
Steve Anton9e0c7422017-08-17 18:59:47 -0700350 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 04:19:13 -0700351 }
352}
353
Steve Anton53c7ba62017-08-18 10:05:47 -0700354TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByMid) {
355 const std::string mids[] = {"a", "v", "s"};
356 MockRtpPacketSink sinks[arraysize(mids)];
357 for (size_t i = 0; i < arraysize(mids); i++) {
358 AddSinkOnlyMid(mids[i], &sinks[i]);
359 }
360
361 for (size_t i = 0; i < arraysize(mids); i++) {
Yves Gerey665174f2018-06-19 15:03:05 +0200362 auto packet =
363 CreatePacketWithSsrcMid(rtc::checked_cast<uint32_t>(i), mids[i]);
Steve Anton53c7ba62017-08-18 10:05:47 -0700364 EXPECT_CALL(sinks[i], OnRtpPacket(SamePacketAs(*packet))).Times(1);
365 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
366 }
367}
368
369TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByMidAndRsid) {
370 const std::string mid = "v";
371 const std::string rsid = "1";
372 constexpr uint32_t ssrc = 10;
373
374 MockRtpPacketSink sink;
375 AddSinkBothMidRsid(mid, rsid, &sink);
376
377 auto packet = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
378 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
379 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
380}
381
382TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByRepairedRsid) {
383 const std::string rrid = "1";
384 constexpr uint32_t ssrc = 10;
385
386 MockRtpPacketSink sink;
387 AddSinkOnlyRsid(rrid, &sink);
388
389 auto packet_with_rrid = CreatePacketWithSsrcRrid(ssrc, rrid);
390 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_rrid))).Times(1);
391 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_rrid));
392}
393
394TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByPayloadType) {
395 constexpr uint32_t ssrc = 10;
396 constexpr uint8_t payload_type = 30;
397
398 MockRtpPacketSink sink;
399 RtpDemuxerCriteria criteria;
400 criteria.payload_types = {payload_type};
401 AddSink(criteria, &sink);
402
403 auto packet = CreatePacketWithSsrc(ssrc);
404 packet->SetPayloadType(payload_type);
405 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
406 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
407}
408
Steve Anton9e0c7422017-08-17 18:59:47 -0700409TEST_F(RtpDemuxerTest, PacketsDeliveredInRightOrder) {
eladalona52722f2017-06-26 11:23:54 -0700410 constexpr uint32_t ssrc = 101;
411 MockRtpPacketSink sink;
Steve Anton9e0c7422017-08-17 18:59:47 -0700412 AddSinkOnlySsrc(ssrc, &sink);
eladalond0244c22017-06-08 04:19:13 -0700413
414 std::unique_ptr<RtpPacketReceived> packets[5];
415 for (size_t i = 0; i < arraysize(packets); i++) {
Steve Anton9e0c7422017-08-17 18:59:47 -0700416 packets[i] = CreatePacketWithSsrc(ssrc);
oprypin0826fb22017-08-22 13:57:48 -0700417 packets[i]->SetSequenceNumber(rtc::checked_cast<uint16_t>(i));
eladalond0244c22017-06-08 04:19:13 -0700418 }
419
420 InSequence sequence;
421 for (const auto& packet : packets) {
eladalona52722f2017-06-26 11:23:54 -0700422 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
eladalond0244c22017-06-08 04:19:13 -0700423 }
424
425 for (const auto& packet : packets) {
Steve Anton9e0c7422017-08-17 18:59:47 -0700426 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 04:19:13 -0700427 }
eladalond0244c22017-06-08 04:19:13 -0700428}
429
Steve Anton9e0c7422017-08-17 18:59:47 -0700430TEST_F(RtpDemuxerTest, SinkMappedToMultipleSsrcs) {
eladalond0244c22017-06-08 04:19:13 -0700431 constexpr uint32_t ssrcs[] = {404, 505, 606};
432 MockRtpPacketSink sink;
433 for (uint32_t ssrc : ssrcs) {
Steve Anton9e0c7422017-08-17 18:59:47 -0700434 AddSinkOnlySsrc(ssrc, &sink);
eladalon760a0762017-05-31 09:12:25 -0700435 }
436
437 // The sink which is associated with multiple SSRCs gets the callback
438 // triggered for each of those SSRCs.
eladalond0244c22017-06-08 04:19:13 -0700439 for (uint32_t ssrc : ssrcs) {
Steve Anton9e0c7422017-08-17 18:59:47 -0700440 auto packet = CreatePacketWithSsrc(ssrc);
Steve Anton53c7ba62017-08-18 10:05:47 -0700441 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
Steve Anton9e0c7422017-08-17 18:59:47 -0700442 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalon760a0762017-05-31 09:12:25 -0700443 }
eladalon760a0762017-05-31 09:12:25 -0700444}
445
Steve Anton9e0c7422017-08-17 18:59:47 -0700446TEST_F(RtpDemuxerTest, NoCallbackOnSsrcSinkRemovedBeforeFirstPacket) {
eladalond0244c22017-06-08 04:19:13 -0700447 constexpr uint32_t ssrc = 404;
448 MockRtpPacketSink sink;
Steve Anton9e0c7422017-08-17 18:59:47 -0700449 AddSinkOnlySsrc(ssrc, &sink);
eladalond0244c22017-06-08 04:19:13 -0700450
Steve Anton9e0c7422017-08-17 18:59:47 -0700451 ASSERT_TRUE(RemoveSink(&sink));
eladalond0244c22017-06-08 04:19:13 -0700452
453 // The removed sink does not get callbacks.
Steve Anton9e0c7422017-08-17 18:59:47 -0700454 auto packet = CreatePacketWithSsrc(ssrc);
eladalond0244c22017-06-08 04:19:13 -0700455 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0); // Not called.
Steve Anton9e0c7422017-08-17 18:59:47 -0700456 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 04:19:13 -0700457}
458
Steve Anton9e0c7422017-08-17 18:59:47 -0700459TEST_F(RtpDemuxerTest, NoCallbackOnSsrcSinkRemovedAfterFirstPacket) {
eladalond0244c22017-06-08 04:19:13 -0700460 constexpr uint32_t ssrc = 404;
461 NiceMock<MockRtpPacketSink> sink;
Steve Anton9e0c7422017-08-17 18:59:47 -0700462 AddSinkOnlySsrc(ssrc, &sink);
eladalond0244c22017-06-08 04:19:13 -0700463
464 InSequence sequence;
Steve Anton9e0c7422017-08-17 18:59:47 -0700465 for (size_t i = 0; i < 10; i++) {
466 ASSERT_TRUE(demuxer_.OnRtpPacket(*CreatePacketWithSsrc(ssrc)));
eladalon760a0762017-05-31 09:12:25 -0700467 }
468
Steve Anton9e0c7422017-08-17 18:59:47 -0700469 ASSERT_TRUE(RemoveSink(&sink));
eladalon760a0762017-05-31 09:12:25 -0700470
eladalond0244c22017-06-08 04:19:13 -0700471 // The removed sink does not get callbacks.
Steve Anton9e0c7422017-08-17 18:59:47 -0700472 auto packet = CreatePacketWithSsrc(ssrc);
eladalond0244c22017-06-08 04:19:13 -0700473 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0); // Not called.
Steve Anton9e0c7422017-08-17 18:59:47 -0700474 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 04:19:13 -0700475}
476
eladalon5daecca2017-08-04 06:34:54 -0700477// An SSRC may only be mapped to a single sink. However, since configuration
478// of this associations might come from the network, we need to fail gracefully.
Steve Anton9e0c7422017-08-17 18:59:47 -0700479TEST_F(RtpDemuxerTest, OnlyOneSinkPerSsrcGetsOnRtpPacketTriggered) {
eladalon5daecca2017-08-04 06:34:54 -0700480 MockRtpPacketSink sinks[3];
481 constexpr uint32_t ssrc = 404;
Steve Anton9e0c7422017-08-17 18:59:47 -0700482 ASSERT_TRUE(AddSinkOnlySsrc(ssrc, &sinks[0]));
483 ASSERT_FALSE(AddSinkOnlySsrc(ssrc, &sinks[1]));
484 ASSERT_FALSE(AddSinkOnlySsrc(ssrc, &sinks[2]));
eladalon5daecca2017-08-04 06:34:54 -0700485
486 // The first sink associated with the SSRC remains active; other sinks
487 // were not really added, and so do not get OnRtpPacket() called.
Steve Anton9e0c7422017-08-17 18:59:47 -0700488 auto packet = CreatePacketWithSsrc(ssrc);
eladalon5daecca2017-08-04 06:34:54 -0700489 EXPECT_CALL(sinks[0], OnRtpPacket(SamePacketAs(*packet))).Times(1);
490 EXPECT_CALL(sinks[1], OnRtpPacket(_)).Times(0);
491 EXPECT_CALL(sinks[2], OnRtpPacket(_)).Times(0);
Steve Anton9e0c7422017-08-17 18:59:47 -0700492 ASSERT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalon5daecca2017-08-04 06:34:54 -0700493}
494
Steve Anton9e0c7422017-08-17 18:59:47 -0700495TEST_F(RtpDemuxerTest, NoRepeatedCallbackOnRepeatedAddSinkForSameSink) {
eladalond0244c22017-06-08 04:19:13 -0700496 constexpr uint32_t ssrc = 111;
497 MockRtpPacketSink sink;
498
Steve Anton9e0c7422017-08-17 18:59:47 -0700499 ASSERT_TRUE(AddSinkOnlySsrc(ssrc, &sink));
500 ASSERT_FALSE(AddSinkOnlySsrc(ssrc, &sink));
eladalond0244c22017-06-08 04:19:13 -0700501
Steve Anton9e0c7422017-08-17 18:59:47 -0700502 auto packet = CreatePacketWithSsrc(ssrc);
eladalond0244c22017-06-08 04:19:13 -0700503 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
Steve Anton9e0c7422017-08-17 18:59:47 -0700504 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 04:19:13 -0700505}
506
Steve Anton9e0c7422017-08-17 18:59:47 -0700507TEST_F(RtpDemuxerTest, RemoveSinkReturnsFalseForNeverAddedSink) {
eladalond0244c22017-06-08 04:19:13 -0700508 MockRtpPacketSink sink;
Steve Anton9e0c7422017-08-17 18:59:47 -0700509 EXPECT_FALSE(RemoveSink(&sink));
eladalond0244c22017-06-08 04:19:13 -0700510}
511
Steve Anton9e0c7422017-08-17 18:59:47 -0700512TEST_F(RtpDemuxerTest, RemoveSinkReturnsTrueForPreviouslyAddedSsrcSink) {
eladalond0244c22017-06-08 04:19:13 -0700513 constexpr uint32_t ssrc = 101;
514 MockRtpPacketSink sink;
Steve Anton9e0c7422017-08-17 18:59:47 -0700515 AddSinkOnlySsrc(ssrc, &sink);
eladalond0244c22017-06-08 04:19:13 -0700516
Steve Anton9e0c7422017-08-17 18:59:47 -0700517 EXPECT_TRUE(RemoveSink(&sink));
eladalond0244c22017-06-08 04:19:13 -0700518}
519
Steve Anton9e0c7422017-08-17 18:59:47 -0700520TEST_F(RtpDemuxerTest,
521 RemoveSinkReturnsTrueForUnresolvedPreviouslyAddedRsidSink) {
eladalond0244c22017-06-08 04:19:13 -0700522 const std::string rsid = "a";
523 MockRtpPacketSink sink;
Steve Anton9e0c7422017-08-17 18:59:47 -0700524 AddSinkOnlyRsid(rsid, &sink);
eladalond0244c22017-06-08 04:19:13 -0700525
Steve Anton9e0c7422017-08-17 18:59:47 -0700526 EXPECT_TRUE(RemoveSink(&sink));
eladalond0244c22017-06-08 04:19:13 -0700527}
528
Steve Anton9e0c7422017-08-17 18:59:47 -0700529TEST_F(RtpDemuxerTest,
530 RemoveSinkReturnsTrueForResolvedPreviouslyAddedRsidSink) {
eladalond0244c22017-06-08 04:19:13 -0700531 const std::string rsid = "a";
532 constexpr uint32_t ssrc = 101;
533 NiceMock<MockRtpPacketSink> sink;
Steve Anton9e0c7422017-08-17 18:59:47 -0700534 AddSinkOnlyRsid(rsid, &sink);
535 ASSERT_TRUE(demuxer_.OnRtpPacket(*CreatePacketWithSsrcRsid(ssrc, rsid)));
eladalond0244c22017-06-08 04:19:13 -0700536
Steve Anton9e0c7422017-08-17 18:59:47 -0700537 EXPECT_TRUE(RemoveSink(&sink));
eladalond0244c22017-06-08 04:19:13 -0700538}
539
Steve Anton53c7ba62017-08-18 10:05:47 -0700540TEST_F(RtpDemuxerTest, RsidLearnedAndLaterPacketsDeliveredWithOnlySsrc) {
eladalond0244c22017-06-08 04:19:13 -0700541 MockRtpPacketSink sink;
542 const std::string rsid = "a";
Steve Anton9e0c7422017-08-17 18:59:47 -0700543 AddSinkOnlyRsid(rsid, &sink);
eladalond0244c22017-06-08 04:19:13 -0700544
545 // Create a sequence of RTP packets, where only the first one actually
546 // mentions the RSID.
547 std::unique_ptr<RtpPacketReceived> packets[5];
548 constexpr uint32_t rsid_ssrc = 111;
Steve Anton9e0c7422017-08-17 18:59:47 -0700549 packets[0] = CreatePacketWithSsrcRsid(rsid_ssrc, rsid);
eladalond0244c22017-06-08 04:19:13 -0700550 for (size_t i = 1; i < arraysize(packets); i++) {
Steve Anton9e0c7422017-08-17 18:59:47 -0700551 packets[i] = CreatePacketWithSsrc(rsid_ssrc);
eladalon760a0762017-05-31 09:12:25 -0700552 }
eladalond0244c22017-06-08 04:19:13 -0700553
554 // The first packet associates the RSID with the SSRC, thereby allowing the
555 // demuxer to correctly demux all of the packets.
556 InSequence sequence;
557 for (const auto& packet : packets) {
558 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
559 }
560 for (const auto& packet : packets) {
Steve Anton9e0c7422017-08-17 18:59:47 -0700561 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 04:19:13 -0700562 }
eladalond0244c22017-06-08 04:19:13 -0700563}
564
Steve Anton9e0c7422017-08-17 18:59:47 -0700565TEST_F(RtpDemuxerTest, NoCallbackOnRsidSinkRemovedBeforeFirstPacket) {
eladalond0244c22017-06-08 04:19:13 -0700566 MockRtpPacketSink sink;
567 const std::string rsid = "a";
Steve Anton9e0c7422017-08-17 18:59:47 -0700568 AddSinkOnlyRsid(rsid, &sink);
eladalond0244c22017-06-08 04:19:13 -0700569
570 // Sink removed - it won't get triggers even if packets with its RSID arrive.
Steve Anton9e0c7422017-08-17 18:59:47 -0700571 ASSERT_TRUE(RemoveSink(&sink));
eladalond0244c22017-06-08 04:19:13 -0700572
573 constexpr uint32_t ssrc = 111;
Steve Anton9e0c7422017-08-17 18:59:47 -0700574 auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
eladalond0244c22017-06-08 04:19:13 -0700575 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0); // Not called.
Steve Anton9e0c7422017-08-17 18:59:47 -0700576 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 04:19:13 -0700577}
578
Steve Anton9e0c7422017-08-17 18:59:47 -0700579TEST_F(RtpDemuxerTest, NoCallbackOnRsidSinkRemovedAfterFirstPacket) {
eladalond0244c22017-06-08 04:19:13 -0700580 NiceMock<MockRtpPacketSink> sink;
581 const std::string rsid = "a";
Steve Anton9e0c7422017-08-17 18:59:47 -0700582 AddSinkOnlyRsid(rsid, &sink);
eladalond0244c22017-06-08 04:19:13 -0700583
584 InSequence sequence;
585 constexpr uint32_t ssrc = 111;
Steve Anton9e0c7422017-08-17 18:59:47 -0700586 for (size_t i = 0; i < 10; i++) {
587 auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
588 ASSERT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 04:19:13 -0700589 }
590
591 // Sink removed - it won't get triggers even if packets with its RSID arrive.
Steve Anton9e0c7422017-08-17 18:59:47 -0700592 ASSERT_TRUE(RemoveSink(&sink));
eladalond0244c22017-06-08 04:19:13 -0700593
Steve Anton9e0c7422017-08-17 18:59:47 -0700594 auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
eladalond0244c22017-06-08 04:19:13 -0700595 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0); // Not called.
Steve Anton9e0c7422017-08-17 18:59:47 -0700596 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 04:19:13 -0700597}
598
Steve Anton53c7ba62017-08-18 10:05:47 -0700599TEST_F(RtpDemuxerTest, NoCallbackOnMidSinkRemovedBeforeFirstPacket) {
600 const std::string mid = "v";
601 constexpr uint32_t ssrc = 10;
602
603 MockRtpPacketSink sink;
604 AddSinkOnlyMid(mid, &sink);
605 RemoveSink(&sink);
606
607 auto packet = CreatePacketWithSsrcMid(ssrc, mid);
608 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
609 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
610}
611
612TEST_F(RtpDemuxerTest, NoCallbackOnMidSinkRemovedAfterFirstPacket) {
613 const std::string mid = "v";
614 constexpr uint32_t ssrc = 10;
615
616 NiceMock<MockRtpPacketSink> sink;
617 AddSinkOnlyMid(mid, &sink);
618
619 auto p1 = CreatePacketWithSsrcMid(ssrc, mid);
620 demuxer_.OnRtpPacket(*p1);
621
622 RemoveSink(&sink);
623
624 auto p2 = CreatePacketWithSsrcMid(ssrc, mid);
625 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
626 EXPECT_FALSE(demuxer_.OnRtpPacket(*p2));
627}
628
629TEST_F(RtpDemuxerTest, NoCallbackOnMidRsidSinkRemovedAfterFirstPacket) {
630 const std::string mid = "v";
631 const std::string rsid = "1";
632 constexpr uint32_t ssrc = 10;
633
634 NiceMock<MockRtpPacketSink> sink;
635 AddSinkBothMidRsid(mid, rsid, &sink);
636
637 auto p1 = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
638 demuxer_.OnRtpPacket(*p1);
639
640 RemoveSink(&sink);
641
642 auto p2 = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
643 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
644 EXPECT_FALSE(demuxer_.OnRtpPacket(*p2));
645}
646
eladalond0244c22017-06-08 04:19:13 -0700647// The RSID to SSRC mapping should be one-to-one. If we end up receiving
648// two (or more) packets with the same SSRC, but different RSIDs, we guarantee
Steve Anton53c7ba62017-08-18 10:05:47 -0700649// delivery to one of them but not both.
Steve Anton9e0c7422017-08-17 18:59:47 -0700650TEST_F(RtpDemuxerTest, FirstSsrcAssociatedWithAnRsidIsNotForgotten) {
eladalond0244c22017-06-08 04:19:13 -0700651 // Each sink has a distinct RSID.
652 MockRtpPacketSink sink_a;
653 const std::string rsid_a = "a";
Steve Anton9e0c7422017-08-17 18:59:47 -0700654 AddSinkOnlyRsid(rsid_a, &sink_a);
eladalond0244c22017-06-08 04:19:13 -0700655
656 MockRtpPacketSink sink_b;
657 const std::string rsid_b = "b";
Steve Anton9e0c7422017-08-17 18:59:47 -0700658 AddSinkOnlyRsid(rsid_b, &sink_b);
eladalond0244c22017-06-08 04:19:13 -0700659
660 InSequence sequence; // Verify that the order of delivery is unchanged.
661
662 constexpr uint32_t shared_ssrc = 100;
663
664 // First a packet with |rsid_a| is received, and |sink_a| is associated with
665 // its SSRC.
Steve Anton9e0c7422017-08-17 18:59:47 -0700666 auto packet_a = CreatePacketWithSsrcRsid(shared_ssrc, rsid_a);
eladalond0244c22017-06-08 04:19:13 -0700667 EXPECT_CALL(sink_a, OnRtpPacket(SamePacketAs(*packet_a))).Times(1);
Steve Anton9e0c7422017-08-17 18:59:47 -0700668 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_a));
eladalond0244c22017-06-08 04:19:13 -0700669
Steve Anton53c7ba62017-08-18 10:05:47 -0700670 // Second, a packet with |rsid_b| is received. We guarantee that |sink_b|
671 // receives it.
Steve Anton9e0c7422017-08-17 18:59:47 -0700672 auto packet_b = CreatePacketWithSsrcRsid(shared_ssrc, rsid_b);
Steve Anton53c7ba62017-08-18 10:05:47 -0700673 EXPECT_CALL(sink_a, OnRtpPacket(_)).Times(0);
674 EXPECT_CALL(sink_b, OnRtpPacket(SamePacketAs(*packet_b))).Times(1);
Steve Anton9e0c7422017-08-17 18:59:47 -0700675 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_b));
eladalond0244c22017-06-08 04:19:13 -0700676
677 // Known edge-case; adding a new RSID association makes us re-examine all
678 // SSRCs. |sink_b| may or may not be associated with the SSRC now; we make
Steve Anton53c7ba62017-08-18 10:05:47 -0700679 // no promises on that. However, since the RSID is specified and it cannot be
680 // found the packet should be dropped.
eladalon9addbeb2017-06-30 06:26:54 -0700681 MockRtpPacketSink sink_c;
682 const std::string rsid_c = "c";
683 constexpr uint32_t some_other_ssrc = shared_ssrc + 1;
Steve Anton9e0c7422017-08-17 18:59:47 -0700684 AddSinkOnlySsrc(some_other_ssrc, &sink_c);
Steve Anton53c7ba62017-08-18 10:05:47 -0700685
686 auto packet_c = CreatePacketWithSsrcMid(shared_ssrc, rsid_c);
687 EXPECT_CALL(sink_a, OnRtpPacket(_)).Times(0);
688 EXPECT_CALL(sink_b, OnRtpPacket(_)).Times(0);
689 EXPECT_CALL(sink_c, OnRtpPacket(_)).Times(0);
690 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet_c));
eladalond0244c22017-06-08 04:19:13 -0700691}
692
Steve Anton9e0c7422017-08-17 18:59:47 -0700693TEST_F(RtpDemuxerTest, MultipleRsidsOnSameSink) {
eladalond0244c22017-06-08 04:19:13 -0700694 MockRtpPacketSink sink;
695 const std::string rsids[] = {"a", "b", "c"};
696
697 for (const std::string& rsid : rsids) {
Steve Anton9e0c7422017-08-17 18:59:47 -0700698 AddSinkOnlyRsid(rsid, &sink);
eladalond0244c22017-06-08 04:19:13 -0700699 }
700
701 InSequence sequence;
702 for (size_t i = 0; i < arraysize(rsids); i++) {
703 // Assign different SSRCs and sequence numbers to all packets.
704 const uint32_t ssrc = 1000 + static_cast<uint32_t>(i);
Steve Anton53c7ba62017-08-18 10:05:47 -0700705 const uint16_t sequence_number = 50 + static_cast<uint16_t>(i);
Steve Anton9e0c7422017-08-17 18:59:47 -0700706 auto packet = CreatePacketWithSsrcRsid(ssrc, rsids[i]);
Steve Anton53c7ba62017-08-18 10:05:47 -0700707 packet->SetSequenceNumber(sequence_number);
eladalond0244c22017-06-08 04:19:13 -0700708 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
Steve Anton9e0c7422017-08-17 18:59:47 -0700709 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 04:19:13 -0700710 }
eladalond0244c22017-06-08 04:19:13 -0700711}
712
Steve Anton53c7ba62017-08-18 10:05:47 -0700713// RSIDs are given higher priority than SSRC because we believe senders are less
714// likely to mislabel packets with RSID than mislabel them with SSRCs.
Steve Anton9e0c7422017-08-17 18:59:47 -0700715TEST_F(RtpDemuxerTest, SinkWithBothRsidAndSsrcAssociations) {
Steve Anton53c7ba62017-08-18 10:05:47 -0700716 MockRtpPacketSink sink;
eladalond0244c22017-06-08 04:19:13 -0700717 constexpr uint32_t standalone_ssrc = 10101;
718 constexpr uint32_t rsid_ssrc = 20202;
Steve Anton53c7ba62017-08-18 10:05:47 -0700719 const std::string rsid = "1";
eladalond0244c22017-06-08 04:19:13 -0700720
Steve Anton9e0c7422017-08-17 18:59:47 -0700721 AddSinkOnlySsrc(standalone_ssrc, &sink);
722 AddSinkOnlyRsid(rsid, &sink);
eladalond0244c22017-06-08 04:19:13 -0700723
724 InSequence sequence;
725
Steve Anton9e0c7422017-08-17 18:59:47 -0700726 auto ssrc_packet = CreatePacketWithSsrc(standalone_ssrc);
eladalond0244c22017-06-08 04:19:13 -0700727 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*ssrc_packet))).Times(1);
Steve Anton9e0c7422017-08-17 18:59:47 -0700728 EXPECT_TRUE(demuxer_.OnRtpPacket(*ssrc_packet));
eladalond0244c22017-06-08 04:19:13 -0700729
Steve Anton9e0c7422017-08-17 18:59:47 -0700730 auto rsid_packet = CreatePacketWithSsrcRsid(rsid_ssrc, rsid);
eladalond0244c22017-06-08 04:19:13 -0700731 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*rsid_packet))).Times(1);
Steve Anton9e0c7422017-08-17 18:59:47 -0700732 EXPECT_TRUE(demuxer_.OnRtpPacket(*rsid_packet));
eladalond0244c22017-06-08 04:19:13 -0700733}
734
Steve Anton53c7ba62017-08-18 10:05:47 -0700735// Packets are always guaranteed to be routed to only one sink.
Steve Anton9e0c7422017-08-17 18:59:47 -0700736TEST_F(RtpDemuxerTest, AssociatingByRsidAndBySsrcCannotTriggerDoubleCall) {
eladalond0244c22017-06-08 04:19:13 -0700737 constexpr uint32_t ssrc = 10101;
eladalond0244c22017-06-08 04:19:13 -0700738 const std::string rsid = "a";
eladalond0244c22017-06-08 04:19:13 -0700739
Steve Anton9e0c7422017-08-17 18:59:47 -0700740 MockRtpPacketSink sink;
741 AddSinkOnlySsrc(ssrc, &sink);
742 AddSinkOnlyRsid(rsid, &sink);
743
744 auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
eladalond0244c22017-06-08 04:19:13 -0700745 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
Steve Anton9e0c7422017-08-17 18:59:47 -0700746 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalon760a0762017-05-31 09:12:25 -0700747}
748
Steve Anton53c7ba62017-08-18 10:05:47 -0700749TEST_F(RtpDemuxerTest, ObserversNotifiedOfSsrcBoundToMid) {
750 const std::string mid = "v";
751 constexpr uint32_t ssrc = 10;
752
753 NiceMock<MockRtpPacketSink> sink;
754 AddSinkOnlyMid(mid, &sink);
755
756 MockSsrcBindingObserver observer;
757 RegisterSsrcBindingObserver(&observer);
758
759 auto packet = CreatePacketWithSsrcMid(ssrc, mid);
760 EXPECT_CALL(observer, OnSsrcBoundToMid(mid, ssrc));
761 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
762}
763
764TEST_F(RtpDemuxerTest, ObserversNotifiedOfSsrcBoundToRsid) {
765 const std::string rsid = "1";
eladalona52722f2017-06-26 11:23:54 -0700766 constexpr uint32_t ssrc = 111;
eladalona52722f2017-06-26 11:23:54 -0700767
eladalon5daecca2017-08-04 06:34:54 -0700768 // Only RSIDs which the demuxer knows may be resolved.
769 NiceMock<MockRtpPacketSink> sink;
Steve Anton9e0c7422017-08-17 18:59:47 -0700770 AddSinkOnlyRsid(rsid, &sink);
eladalon5daecca2017-08-04 06:34:54 -0700771
Steve Anton53c7ba62017-08-18 10:05:47 -0700772 NiceMock<MockSsrcBindingObserver> rsid_resolution_observers[3];
eladalona52722f2017-06-26 11:23:54 -0700773 for (auto& observer : rsid_resolution_observers) {
Steve Anton9e0c7422017-08-17 18:59:47 -0700774 RegisterSsrcBindingObserver(&observer);
Steve Antonb3329172017-08-17 15:23:51 -0700775 EXPECT_CALL(observer, OnSsrcBoundToRsid(rsid, ssrc)).Times(1);
eladalona52722f2017-06-26 11:23:54 -0700776 }
777
Steve Antonb3329172017-08-17 15:23:51 -0700778 // The expected calls to OnSsrcBoundToRsid() will be triggered by this.
Steve Anton53c7ba62017-08-18 10:05:47 -0700779 auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
780 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalon5daecca2017-08-04 06:34:54 -0700781}
782
Steve Anton53c7ba62017-08-18 10:05:47 -0700783TEST_F(RtpDemuxerTest, ObserversNotifiedOfSsrcBoundToMidRsid) {
784 const std::string mid = "v";
785 const std::string rsid = "1";
786 constexpr uint32_t ssrc = 10;
eladalon5daecca2017-08-04 06:34:54 -0700787
Steve Anton53c7ba62017-08-18 10:05:47 -0700788 NiceMock<MockRtpPacketSink> sink;
789 AddSinkBothMidRsid(mid, rsid, &sink);
eladalon5daecca2017-08-04 06:34:54 -0700790
Steve Anton53c7ba62017-08-18 10:05:47 -0700791 MockSsrcBindingObserver observer;
792 RegisterSsrcBindingObserver(&observer);
793
794 auto packet = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
795 EXPECT_CALL(observer, OnSsrcBoundToMidRsid(mid, rsid, ssrc));
796 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalon5daecca2017-08-04 06:34:54 -0700797}
798
Steve Anton53c7ba62017-08-18 10:05:47 -0700799TEST_F(RtpDemuxerTest, ObserversNotifiedOfSsrcBoundToPayloadType) {
800 constexpr uint8_t payload_type = 3;
801 constexpr uint32_t ssrc = 10;
802
803 RtpDemuxerCriteria criteria;
804 criteria.payload_types = {payload_type};
805 NiceMock<MockRtpPacketSink> sink;
806 AddSink(criteria, &sink);
807
808 MockSsrcBindingObserver observer;
809 RegisterSsrcBindingObserver(&observer);
810
811 auto packet = CreatePacketWithSsrc(ssrc);
812 packet->SetPayloadType(payload_type);
813 EXPECT_CALL(observer, OnSsrcBoundToPayloadType(payload_type, ssrc));
814 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
815}
816
817// If one sink is associated with SSRC x, and another sink with RSID y, then if
818// we receive a packet with both SSRC x and RSID y, route that to only the sink
819// for RSID y since we believe RSID tags to be more trustworthy than signaled
820// SSRCs.
Steve Anton9e0c7422017-08-17 18:59:47 -0700821TEST_F(RtpDemuxerTest,
Steve Anton53c7ba62017-08-18 10:05:47 -0700822 PacketFittingBothRsidSinkAndSsrcSinkGivenOnlyToRsidSink) {
eladalon5daecca2017-08-04 06:34:54 -0700823 constexpr uint32_t ssrc = 111;
824 MockRtpPacketSink ssrc_sink;
Steve Anton9e0c7422017-08-17 18:59:47 -0700825 AddSinkOnlySsrc(ssrc, &ssrc_sink);
eladalon5daecca2017-08-04 06:34:54 -0700826
827 const std::string rsid = "a";
828 MockRtpPacketSink rsid_sink;
Steve Anton9e0c7422017-08-17 18:59:47 -0700829 AddSinkOnlyRsid(rsid, &rsid_sink);
eladalon5daecca2017-08-04 06:34:54 -0700830
Steve Anton9e0c7422017-08-17 18:59:47 -0700831 auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
eladalon5daecca2017-08-04 06:34:54 -0700832
Steve Anton53c7ba62017-08-18 10:05:47 -0700833 EXPECT_CALL(ssrc_sink, OnRtpPacket(_)).Times(0);
834 EXPECT_CALL(rsid_sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
835 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalon5daecca2017-08-04 06:34:54 -0700836}
837
838// We're not expecting RSIDs to be resolved to SSRCs which were previously
839// mapped to sinks, and make no guarantees except for graceful handling.
Steve Anton9e0c7422017-08-17 18:59:47 -0700840TEST_F(RtpDemuxerTest,
841 GracefullyHandleRsidBeingMappedToPrevouslyAssociatedSsrc) {
eladalon5daecca2017-08-04 06:34:54 -0700842 constexpr uint32_t ssrc = 111;
843 NiceMock<MockRtpPacketSink> ssrc_sink;
Steve Anton9e0c7422017-08-17 18:59:47 -0700844 AddSinkOnlySsrc(ssrc, &ssrc_sink);
eladalon5daecca2017-08-04 06:34:54 -0700845
846 const std::string rsid = "a";
Steve Anton53c7ba62017-08-18 10:05:47 -0700847 NiceMock<MockRtpPacketSink> rsid_sink;
Steve Anton9e0c7422017-08-17 18:59:47 -0700848 AddSinkOnlyRsid(rsid, &rsid_sink);
eladalon5daecca2017-08-04 06:34:54 -0700849
Steve Anton53c7ba62017-08-18 10:05:47 -0700850 NiceMock<MockSsrcBindingObserver> observer;
Steve Anton9e0c7422017-08-17 18:59:47 -0700851 RegisterSsrcBindingObserver(&observer);
eladalon5daecca2017-08-04 06:34:54 -0700852
853 // The SSRC was mapped to an SSRC sink, but was even active (packets flowed
854 // over it).
Steve Anton9e0c7422017-08-17 18:59:47 -0700855 auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
856 demuxer_.OnRtpPacket(*packet);
eladalon5daecca2017-08-04 06:34:54 -0700857
858 // If the SSRC sink is ever removed, the RSID sink *might* receive indications
859 // of packets, and observers *might* be informed. Only graceful handling
860 // is guaranteed.
Steve Anton9e0c7422017-08-17 18:59:47 -0700861 RemoveSink(&ssrc_sink);
eladalon5daecca2017-08-04 06:34:54 -0700862 EXPECT_CALL(rsid_sink, OnRtpPacket(SamePacketAs(*packet))).Times(AtLeast(0));
Steve Antonb3329172017-08-17 15:23:51 -0700863 EXPECT_CALL(observer, OnSsrcBoundToRsid(rsid, ssrc)).Times(AtLeast(0));
Steve Anton53c7ba62017-08-18 10:05:47 -0700864 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
865}
866
867// Tests that when one MID sink is configured, packets that include the MID
868// extension will get routed to that sink and any packets that use the same
869// SSRC as one of those packets later will also get routed to the sink, even
870// if a new SSRC is introduced for the same MID.
871TEST_F(RtpDemuxerTest, RoutedByMidWhenSsrcAdded) {
872 const std::string mid = "v";
873 NiceMock<MockRtpPacketSink> sink;
874 AddSinkOnlyMid(mid, &sink);
875
876 constexpr uint32_t ssrc1 = 10;
877 constexpr uint32_t ssrc2 = 11;
878
879 auto packet_ssrc1_mid = CreatePacketWithSsrcMid(ssrc1, mid);
880 demuxer_.OnRtpPacket(*packet_ssrc1_mid);
881 auto packet_ssrc2_mid = CreatePacketWithSsrcMid(ssrc2, mid);
882 demuxer_.OnRtpPacket(*packet_ssrc2_mid);
883
884 auto packet_ssrc1_only = CreatePacketWithSsrc(ssrc1);
885 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_ssrc1_only))).Times(1);
886 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc1_only));
887
888 auto packet_ssrc2_only = CreatePacketWithSsrc(ssrc2);
889 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_ssrc2_only))).Times(1);
890 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc2_only));
891}
892
893TEST_F(RtpDemuxerTest, DontLearnMidSsrcBindingBeforeSinkAdded) {
894 const std::string mid = "v";
895 constexpr uint32_t ssrc = 10;
896
897 auto packet_ssrc_mid = CreatePacketWithSsrcMid(ssrc, mid);
898 ASSERT_FALSE(demuxer_.OnRtpPacket(*packet_ssrc_mid));
899
900 MockRtpPacketSink sink;
901 AddSinkOnlyMid(mid, &sink);
902
903 auto packet_ssrc_only = CreatePacketWithSsrc(ssrc);
904 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
905 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet_ssrc_only));
906}
907
908TEST_F(RtpDemuxerTest, DontForgetMidSsrcBindingWhenSinkRemoved) {
909 const std::string mid = "v";
910 constexpr uint32_t ssrc = 10;
911
912 NiceMock<MockRtpPacketSink> sink1;
913 AddSinkOnlyMid(mid, &sink1);
914
915 auto packet_with_mid = CreatePacketWithSsrcMid(ssrc, mid);
916 demuxer_.OnRtpPacket(*packet_with_mid);
917
918 RemoveSink(&sink1);
919
920 MockRtpPacketSink sink2;
921 AddSinkOnlyMid(mid, &sink2);
922
923 auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
924 EXPECT_CALL(sink2, OnRtpPacket(SamePacketAs(*packet_with_ssrc)));
925 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
926}
927
928// If a sink is added with only a MID, then any packet with that MID no matter
929// the RSID should be routed to that sink.
930TEST_F(RtpDemuxerTest, RoutedByMidWithAnyRsid) {
931 const std::string mid = "v";
932 const std::string rsid1 = "1";
933 const std::string rsid2 = "2";
934 constexpr uint32_t ssrc1 = 10;
935 constexpr uint32_t ssrc2 = 11;
936
937 MockRtpPacketSink sink;
938 AddSinkOnlyMid(mid, &sink);
939
940 InSequence sequence;
941
942 auto packet_ssrc1_rsid1 = CreatePacketWithSsrcMidRsid(ssrc1, mid, rsid1);
943 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_ssrc1_rsid1))).Times(1);
944 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc1_rsid1));
945
946 auto packet_ssrc2_rsid2 = CreatePacketWithSsrcMidRsid(ssrc2, mid, rsid2);
947 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_ssrc2_rsid2))).Times(1);
948 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc2_rsid2));
949}
950
951// These two tests verify that for a sink added with a MID, RSID pair, if the
952// MID and RSID are learned in separate packets (e.g., because the header
953// extensions are sent separately), then a later packet with just SSRC will get
954// routed to that sink.
955// The first test checks that the functionality works when MID is learned first.
956// The second test checks that the functionality works when RSID is learned
957// first.
958TEST_F(RtpDemuxerTest, LearnMidThenRsidSeparatelyAndRouteBySsrc) {
959 const std::string mid = "v";
960 const std::string rsid = "1";
961 constexpr uint32_t ssrc = 10;
962
963 NiceMock<MockRtpPacketSink> sink;
964 AddSinkBothMidRsid(mid, rsid, &sink);
965
966 auto packet_with_mid = CreatePacketWithSsrcMid(ssrc, mid);
967 ASSERT_FALSE(demuxer_.OnRtpPacket(*packet_with_mid));
968
969 auto packet_with_rsid = CreatePacketWithSsrcRsid(ssrc, rsid);
970 ASSERT_TRUE(demuxer_.OnRtpPacket(*packet_with_rsid));
971
972 auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
973 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_ssrc))).Times(1);
974 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
975}
976
977TEST_F(RtpDemuxerTest, LearnRsidThenMidSeparatelyAndRouteBySsrc) {
978 const std::string mid = "v";
979 const std::string rsid = "1";
980 constexpr uint32_t ssrc = 10;
981
982 NiceMock<MockRtpPacketSink> sink;
983 AddSinkBothMidRsid(mid, rsid, &sink);
984
985 auto packet_with_rsid = CreatePacketWithSsrcRsid(ssrc, rsid);
986 ASSERT_FALSE(demuxer_.OnRtpPacket(*packet_with_rsid));
987
988 auto packet_with_mid = CreatePacketWithSsrcMid(ssrc, mid);
989 ASSERT_TRUE(demuxer_.OnRtpPacket(*packet_with_mid));
990
991 auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
992 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_ssrc))).Times(1);
993 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
994}
995
996TEST_F(RtpDemuxerTest, DontLearnMidRsidBindingBeforeSinkAdded) {
997 const std::string mid = "v";
998 const std::string rsid = "1";
999 constexpr uint32_t ssrc = 10;
1000
1001 auto packet_with_both = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
1002 ASSERT_FALSE(demuxer_.OnRtpPacket(*packet_with_both));
1003
1004 MockRtpPacketSink sink;
1005 AddSinkBothMidRsid(mid, rsid, &sink);
1006
1007 auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
1008 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
1009 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet_with_ssrc));
1010}
1011
1012TEST_F(RtpDemuxerTest, DontForgetMidRsidBindingWhenSinkRemoved) {
1013 const std::string mid = "v";
1014 const std::string rsid = "1";
1015 constexpr uint32_t ssrc = 10;
1016
1017 NiceMock<MockRtpPacketSink> sink1;
1018 AddSinkBothMidRsid(mid, rsid, &sink1);
1019
1020 auto packet_with_both = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
1021 demuxer_.OnRtpPacket(*packet_with_both);
1022
1023 RemoveSink(&sink1);
1024
1025 MockRtpPacketSink sink2;
1026 AddSinkBothMidRsid(mid, rsid, &sink2);
1027
1028 auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
1029 EXPECT_CALL(sink2, OnRtpPacket(SamePacketAs(*packet_with_ssrc)));
1030 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
1031}
1032
1033TEST_F(RtpDemuxerTest, LearnMidRsidBindingAfterSinkAdded) {
1034 const std::string mid = "v";
1035 const std::string rsid = "1";
1036 constexpr uint32_t ssrc = 10;
1037
1038 NiceMock<MockRtpPacketSink> sink;
1039 AddSinkBothMidRsid(mid, rsid, &sink);
1040
1041 auto packet_with_both = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
1042 demuxer_.OnRtpPacket(*packet_with_both);
1043
1044 auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
1045 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_ssrc)));
1046 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
1047}
1048
1049TEST_F(RtpDemuxerTest, DropByPayloadTypeIfNoSink) {
1050 constexpr uint8_t payload_type = 30;
1051 constexpr uint32_t ssrc = 10;
1052
1053 auto packet = CreatePacketWithSsrc(ssrc);
1054 packet->SetPayloadType(payload_type);
1055 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
1056}
1057
1058// For legacy applications, it's possible for us to demux if the payload type is
1059// unique. But if multiple sinks are registered with different MIDs and the same
1060// payload types, then we cannot route a packet with just payload type because
1061// it is ambiguous which sink it should be sent to.
1062TEST_F(RtpDemuxerTest, DropByPayloadTypeIfAddedInMultipleSinks) {
1063 const std::string mid1 = "v";
1064 const std::string mid2 = "a";
1065 constexpr uint8_t payload_type = 30;
1066 constexpr uint32_t ssrc = 10;
1067
1068 RtpDemuxerCriteria mid1_pt;
1069 mid1_pt.mid = mid1;
1070 mid1_pt.payload_types = {payload_type};
1071 MockRtpPacketSink sink1;
1072 AddSink(mid1_pt, &sink1);
1073
1074 RtpDemuxerCriteria mid2_pt;
1075 mid2_pt.mid = mid2;
1076 mid2_pt.payload_types = {payload_type};
1077 MockRtpPacketSink sink2;
1078 AddSink(mid2_pt, &sink2);
1079
1080 auto packet = CreatePacketWithSsrc(ssrc);
1081 packet->SetPayloadType(payload_type);
1082
1083 EXPECT_CALL(sink1, OnRtpPacket(_)).Times(0);
1084 EXPECT_CALL(sink2, OnRtpPacket(_)).Times(0);
1085 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
1086}
1087
1088// If two sinks are added with different MIDs but the same payload types, then
1089// we cannot demux on the payload type only unless one of the sinks is removed.
1090TEST_F(RtpDemuxerTest, RoutedByPayloadTypeIfAmbiguousSinkRemoved) {
1091 const std::string mid1 = "v";
1092 const std::string mid2 = "a";
1093 constexpr uint8_t payload_type = 30;
1094 constexpr uint32_t ssrc = 10;
1095
1096 RtpDemuxerCriteria mid1_pt;
1097 mid1_pt.mid = mid1;
1098 mid1_pt.payload_types = {payload_type};
1099 MockRtpPacketSink sink1;
1100 AddSink(mid1_pt, &sink1);
1101
1102 RtpDemuxerCriteria mid2_pt;
1103 mid2_pt.mid = mid2;
1104 mid2_pt.payload_types = {payload_type};
1105 MockRtpPacketSink sink2;
1106 AddSink(mid2_pt, &sink2);
1107
1108 RemoveSink(&sink1);
1109
1110 auto packet = CreatePacketWithSsrc(ssrc);
1111 packet->SetPayloadType(payload_type);
1112
1113 EXPECT_CALL(sink1, OnRtpPacket(_)).Times(0);
1114 EXPECT_CALL(sink2, OnRtpPacket(SamePacketAs(*packet))).Times(1);
1115
1116 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
1117}
1118
1119TEST_F(RtpDemuxerTest, RoutedByPayloadTypeLatchesSsrc) {
1120 constexpr uint8_t payload_type = 30;
1121 constexpr uint32_t ssrc = 10;
1122
1123 RtpDemuxerCriteria pt;
1124 pt.payload_types = {payload_type};
1125 NiceMock<MockRtpPacketSink> sink;
1126 AddSink(pt, &sink);
1127
1128 auto packet_with_pt = CreatePacketWithSsrc(ssrc);
1129 packet_with_pt->SetPayloadType(payload_type);
1130 ASSERT_TRUE(demuxer_.OnRtpPacket(*packet_with_pt));
1131
1132 auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
1133 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_ssrc))).Times(1);
1134 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
1135}
1136
1137// RSIDs are scoped within MID, so if two sinks are registered with the same
1138// RSIDs but different MIDs, then packets containing both extensions should be
1139// routed to the correct one.
1140TEST_F(RtpDemuxerTest, PacketWithSameRsidDifferentMidRoutedToProperSink) {
1141 const std::string mid1 = "mid1";
1142 const std::string mid2 = "mid2";
1143 const std::string rsid = "rsid";
1144 constexpr uint32_t ssrc1 = 10;
1145 constexpr uint32_t ssrc2 = 11;
1146
1147 NiceMock<MockRtpPacketSink> mid1_sink;
1148 AddSinkBothMidRsid(mid1, rsid, &mid1_sink);
1149
1150 MockRtpPacketSink mid2_sink;
1151 AddSinkBothMidRsid(mid2, rsid, &mid2_sink);
1152
1153 auto packet_mid1 = CreatePacketWithSsrcMidRsid(ssrc1, mid1, rsid);
1154 ASSERT_TRUE(demuxer_.OnRtpPacket(*packet_mid1));
1155
1156 auto packet_mid2 = CreatePacketWithSsrcMidRsid(ssrc2, mid2, rsid);
1157 EXPECT_CALL(mid2_sink, OnRtpPacket(SamePacketAs(*packet_mid2))).Times(1);
1158 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_mid2));
1159}
1160
1161// If a sink is first bound to a given SSRC by signaling but later a new sink is
1162// bound to a given MID by a later signaling, then when a packet arrives with
1163// both the SSRC and MID, then the signaled MID sink should take precedence.
1164TEST_F(RtpDemuxerTest, SignaledMidShouldOverwriteSignaledSsrc) {
1165 constexpr uint32_t ssrc = 11;
1166 const std::string mid = "mid";
1167
1168 MockRtpPacketSink ssrc_sink;
1169 AddSinkOnlySsrc(ssrc, &ssrc_sink);
1170
1171 MockRtpPacketSink mid_sink;
1172 AddSinkOnlyMid(mid, &mid_sink);
1173
1174 auto p = CreatePacketWithSsrcMid(ssrc, mid);
1175 EXPECT_CALL(ssrc_sink, OnRtpPacket(_)).Times(0);
1176 EXPECT_CALL(mid_sink, OnRtpPacket(SamePacketAs(*p))).Times(1);
1177 EXPECT_TRUE(demuxer_.OnRtpPacket(*p));
1178}
1179
1180// Extends the previous test to also ensure that later packets that do not
1181// specify MID are still routed to the MID sink rather than the overwritten SSRC
1182// sink.
1183TEST_F(RtpDemuxerTest, SignaledMidShouldOverwriteSignalledSsrcPersistent) {
1184 constexpr uint32_t ssrc = 11;
1185 const std::string mid = "mid";
1186
1187 MockRtpPacketSink ssrc_sink;
1188 AddSinkOnlySsrc(ssrc, &ssrc_sink);
1189
1190 NiceMock<MockRtpPacketSink> mid_sink;
1191 AddSinkOnlyMid(mid, &mid_sink);
1192
1193 EXPECT_CALL(ssrc_sink, OnRtpPacket(_)).Times(0);
1194
1195 auto packet_with_mid = CreatePacketWithSsrcMid(ssrc, mid);
1196 demuxer_.OnRtpPacket(*packet_with_mid);
1197
1198 auto packet_without_mid = CreatePacketWithSsrc(ssrc);
1199 EXPECT_CALL(mid_sink, OnRtpPacket(SamePacketAs(*packet_without_mid)))
1200 .Times(1);
1201 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_without_mid));
1202}
1203
1204TEST_F(RtpDemuxerTest, RouteByPayloadTypeMultipleMatch) {
1205 constexpr uint32_t ssrc = 10;
1206 constexpr uint8_t pt1 = 30;
1207 constexpr uint8_t pt2 = 31;
1208
1209 MockRtpPacketSink sink;
1210 RtpDemuxerCriteria criteria;
1211 criteria.payload_types = {pt1, pt2};
1212 AddSink(criteria, &sink);
1213
1214 auto packet_with_pt1 = CreatePacketWithSsrc(ssrc);
1215 packet_with_pt1->SetPayloadType(pt1);
1216 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_pt1)));
1217 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_pt1));
1218
1219 auto packet_with_pt2 = CreatePacketWithSsrc(ssrc);
1220 packet_with_pt2->SetPayloadType(pt2);
1221 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_pt2)));
1222 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_pt2));
1223}
1224
1225TEST_F(RtpDemuxerTest, DontDemuxOnMidAloneIfAddedWithRsid) {
1226 const std::string mid = "v";
1227 const std::string rsid = "1";
1228 constexpr uint32_t ssrc = 10;
1229
1230 MockRtpPacketSink sink;
1231 AddSinkBothMidRsid(mid, rsid, &sink);
1232
1233 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
1234
1235 auto packet = CreatePacketWithSsrcMid(ssrc, mid);
1236 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
1237}
1238
1239TEST_F(RtpDemuxerTest, DemuxBySsrcEvenWithMidAndRsid) {
1240 const std::string mid = "v";
1241 const std::string rsid = "1";
1242 constexpr uint32_t ssrc = 10;
1243
1244 RtpDemuxerCriteria criteria;
1245 criteria.rsid = rsid;
1246 criteria.mid = mid;
1247 criteria.ssrcs = {ssrc};
1248 MockRtpPacketSink sink;
1249 AddSink(criteria, &sink);
1250
1251 auto packet = CreatePacketWithSsrc(ssrc);
1252 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
1253 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
1254}
1255
1256// In slight deviation from the BUNDLE spec, if we match a sink according to
1257// SSRC, then we do not verify payload type against the criteria and defer to
1258// the sink to check that it is correct.
1259TEST_F(RtpDemuxerTest, DoNotCheckPayloadTypeIfMatchedByOtherCriteria) {
1260 constexpr uint32_t ssrc = 10;
1261 constexpr uint8_t payload_type = 30;
1262 constexpr uint8_t different_payload_type = payload_type + 1;
1263
1264 RtpDemuxerCriteria criteria;
1265 criteria.ssrcs = {ssrc};
1266 criteria.payload_types = {payload_type};
1267 MockRtpPacketSink sink;
1268 AddSink(criteria, &sink);
1269
1270 auto packet = CreatePacketWithSsrc(ssrc);
1271 packet->SetPayloadType(different_payload_type);
1272 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
1273 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
1274}
1275
1276// If a repair packet includes an RSID it should be ignored and the packet
1277// should be routed by its RRID.
1278TEST_F(RtpDemuxerTest, PacketWithRsidAndRridRoutedByRrid) {
1279 const std::string rsid = "1";
1280 const std::string rrid = "1r";
1281 constexpr uint32_t ssrc = 10;
1282
1283 MockRtpPacketSink sink_rsid;
1284 AddSinkOnlyRsid(rsid, &sink_rsid);
1285
1286 MockRtpPacketSink sink_rrid;
1287 AddSinkOnlyRsid(rrid, &sink_rrid);
1288
1289 auto packet = CreatePacketWithSsrcRsidRrid(ssrc, rsid, rrid);
1290 EXPECT_CALL(sink_rsid, OnRtpPacket(_)).Times(0);
1291 EXPECT_CALL(sink_rrid, OnRtpPacket(SamePacketAs(*packet))).Times(1);
1292 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
1293}
1294
1295// Same test as above but checks that the latched SSRC routes to the RRID sink.
1296TEST_F(RtpDemuxerTest, PacketWithRsidAndRridLatchesSsrcToRrid) {
1297 const std::string rsid = "1";
1298 const std::string rrid = "1r";
1299 constexpr uint32_t ssrc = 10;
1300
1301 MockRtpPacketSink sink_rsid;
1302 AddSinkOnlyRsid(rsid, &sink_rsid);
1303
1304 NiceMock<MockRtpPacketSink> sink_rrid;
1305 AddSinkOnlyRsid(rrid, &sink_rrid);
1306
1307 auto packet_rsid_rrid = CreatePacketWithSsrcRsidRrid(ssrc, rsid, rrid);
1308 demuxer_.OnRtpPacket(*packet_rsid_rrid);
1309
1310 auto packet_ssrc_only = CreatePacketWithSsrc(ssrc);
1311 EXPECT_CALL(sink_rsid, OnRtpPacket(_)).Times(0);
1312 EXPECT_CALL(sink_rrid, OnRtpPacket(SamePacketAs(*packet_ssrc_only))).Times(1);
1313 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc_only));
1314}
1315
1316// Tests that a packet which includes MID and RSID is dropped and not routed by
1317// SSRC if the MID and RSID do not match an added sink.
1318TEST_F(RtpDemuxerTest, PacketWithMidAndUnknownRsidIsNotRoutedBySsrc) {
1319 constexpr uint32_t ssrc = 10;
1320 const std::string mid = "v";
1321 const std::string rsid = "1";
1322 const std::string wrong_rsid = "2";
1323
1324 RtpDemuxerCriteria criteria;
1325 criteria.mid = mid;
1326 criteria.rsid = rsid;
1327 criteria.ssrcs = {ssrc};
1328 MockRtpPacketSink sink;
1329 AddSink(criteria, &sink);
1330
1331 auto packet = CreatePacketWithSsrcMidRsid(ssrc, mid, wrong_rsid);
1332 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
1333 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
1334}
1335
1336// Tests that a packet which includes MID and RSID is dropped and not routed by
1337// payload type if the MID and RSID do not match an added sink.
1338TEST_F(RtpDemuxerTest, PacketWithMidAndUnknownRsidIsNotRoutedByPayloadType) {
1339 constexpr uint32_t ssrc = 10;
1340 const std::string mid = "v";
1341 const std::string rsid = "1";
1342 const std::string wrong_rsid = "2";
1343 constexpr uint8_t payload_type = 30;
1344
1345 RtpDemuxerCriteria criteria;
1346 criteria.mid = mid;
1347 criteria.rsid = rsid;
1348 criteria.payload_types = {payload_type};
1349 MockRtpPacketSink sink;
1350 AddSink(criteria, &sink);
1351
1352 auto packet = CreatePacketWithSsrcMidRsid(ssrc, mid, wrong_rsid);
1353 packet->SetPayloadType(payload_type);
1354 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
1355 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
1356}
1357
1358// Observers are only notified of an SSRC binding to an RSID if we care about
1359// the RSID (i.e., have a sink added for that RSID).
1360TEST_F(RtpDemuxerTest, ObserversNotNotifiedOfUntrackedRsids) {
1361 const std::string rsid = "1";
1362 constexpr uint32_t ssrc = 111;
1363
1364 MockSsrcBindingObserver rsid_resolution_observers[3];
1365 for (auto& observer : rsid_resolution_observers) {
1366 RegisterSsrcBindingObserver(&observer);
1367 EXPECT_CALL(observer, OnSsrcBoundToRsid(_, _)).Times(0);
1368 }
1369
1370 // Since no sink is registered for this SSRC/RSID, expect the packet to not be
1371 // routed and no observers notified of the SSRC -> RSID binding.
1372 EXPECT_FALSE(demuxer_.OnRtpPacket(*CreatePacketWithSsrcRsid(ssrc, rsid)));
1373}
1374
1375// Ensure that observers are notified of SSRC bindings only once per unique
1376// binding source (e.g., SSRC -> MID, SSRC -> RSID, etc.)
1377TEST_F(RtpDemuxerTest, ObserversNotifiedOfSsrcBoundtoMidOnlyOnce) {
1378 const std::string mid = "v";
1379 constexpr uint32_t ssrc = 10;
1380
1381 NiceMock<MockRtpPacketSink> sink;
1382 AddSinkOnlyMid(mid, &sink);
1383
1384 MockSsrcBindingObserver observer;
1385 RegisterSsrcBindingObserver(&observer);
1386
1387 EXPECT_CALL(observer, OnSsrcBoundToMid(mid, ssrc)).Times(1);
1388
1389 demuxer_.OnRtpPacket(*CreatePacketWithSsrcMid(ssrc, mid));
1390 demuxer_.OnRtpPacket(*CreatePacketWithSsrcMid(ssrc, mid));
1391}
1392
1393// Ensure that when a new SSRC -> MID binding is discovered observers are also
1394// notified of that, even if there has already been an SSRC bound to the MID.
1395TEST_F(RtpDemuxerTest, ObserversNotifiedOfSsrcBoundtoMidWhenSsrcChanges) {
1396 const std::string mid = "v";
1397 constexpr uint32_t ssrc1 = 10;
1398 constexpr uint32_t ssrc2 = 11;
1399
1400 NiceMock<MockRtpPacketSink> sink;
1401 AddSinkOnlyMid(mid, &sink);
1402
1403 MockSsrcBindingObserver observer;
1404 RegisterSsrcBindingObserver(&observer);
1405
1406 InSequence seq;
1407 EXPECT_CALL(observer, OnSsrcBoundToMid(mid, ssrc1)).Times(1);
1408 EXPECT_CALL(observer, OnSsrcBoundToMid(mid, ssrc2)).Times(1);
1409
1410 auto p1 = CreatePacketWithSsrcMid(ssrc1, mid);
1411 demuxer_.OnRtpPacket(*p1);
1412
1413 auto p2 = CreatePacketWithSsrcMid(ssrc2, mid);
1414 demuxer_.OnRtpPacket(*p2);
eladalona52722f2017-06-26 11:23:54 -07001415}
1416
Steve Anton9e0c7422017-08-17 18:59:47 -07001417TEST_F(RtpDemuxerTest, DeregisteredRsidObserversNotInformedOfResolutions) {
eladalona52722f2017-06-26 11:23:54 -07001418 constexpr uint32_t ssrc = 111;
1419 const std::string rsid = "a";
1420 NiceMock<MockRtpPacketSink> sink;
Steve Anton9e0c7422017-08-17 18:59:47 -07001421 AddSinkOnlyRsid(rsid, &sink);
eladalona52722f2017-06-26 11:23:54 -07001422
1423 // Register several, then deregister only one, to show that not all of the
1424 // observers had been forgotten when one was removed.
Steve Antonb3329172017-08-17 15:23:51 -07001425 MockSsrcBindingObserver observer_1;
1426 MockSsrcBindingObserver observer_2_removed;
1427 MockSsrcBindingObserver observer_3;
eladalona52722f2017-06-26 11:23:54 -07001428
Steve Anton9e0c7422017-08-17 18:59:47 -07001429 RegisterSsrcBindingObserver(&observer_1);
1430 RegisterSsrcBindingObserver(&observer_2_removed);
1431 RegisterSsrcBindingObserver(&observer_3);
eladalona52722f2017-06-26 11:23:54 -07001432
Steve Anton9e0c7422017-08-17 18:59:47 -07001433 DeregisterSsrcBindingObserver(&observer_2_removed);
eladalona52722f2017-06-26 11:23:54 -07001434
Steve Antonb3329172017-08-17 15:23:51 -07001435 EXPECT_CALL(observer_1, OnSsrcBoundToRsid(rsid, ssrc)).Times(1);
1436 EXPECT_CALL(observer_2_removed, OnSsrcBoundToRsid(_, _)).Times(0);
1437 EXPECT_CALL(observer_3, OnSsrcBoundToRsid(rsid, ssrc)).Times(1);
eladalona52722f2017-06-26 11:23:54 -07001438
Steve Antonb3329172017-08-17 15:23:51 -07001439 // The expected calls to OnSsrcBoundToRsid() will be triggered by this.
Steve Anton9e0c7422017-08-17 18:59:47 -07001440 demuxer_.OnRtpPacket(*CreatePacketWithSsrcRsid(ssrc, rsid));
eladalona52722f2017-06-26 11:23:54 -07001441}
1442
Steve Anton53c7ba62017-08-18 10:05:47 -07001443TEST_F(RtpDemuxerTest,
1444 PacketFittingBothRsidSinkAndSsrcSinkTriggersResolutionCallbacks) {
1445 constexpr uint32_t ssrc = 111;
1446 NiceMock<MockRtpPacketSink> ssrc_sink;
1447 AddSinkOnlySsrc(ssrc, &ssrc_sink);
1448
1449 const std::string rsid = "a";
1450 NiceMock<MockRtpPacketSink> rsid_sink;
1451 AddSinkOnlyRsid(rsid, &rsid_sink);
1452
1453 MockSsrcBindingObserver observer;
1454 RegisterSsrcBindingObserver(&observer);
1455
1456 auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
1457 EXPECT_CALL(observer, OnSsrcBoundToRsid(rsid, ssrc)).Times(1);
1458 demuxer_.OnRtpPacket(*packet);
1459}
1460
1461TEST_F(RtpDemuxerTest, MaliciousPeerCannotCauseMemoryOveruse) {
1462 const std::string mid = "v";
1463
1464 NiceMock<MockRtpPacketSink> sink;
1465 AddSinkOnlyMid(mid, &sink);
1466
1467 MockSsrcBindingObserver observer;
1468 RegisterSsrcBindingObserver(&observer);
1469
1470 EXPECT_CALL(observer, OnSsrcBoundToMid(_, _))
1471 .Times(AtMost(RtpDemuxer::kMaxSsrcBindings));
1472
1473 for (int i = 0; i < RtpDemuxer::kMaxSsrcBindings + 1; i++) {
1474 auto packet = CreatePacketWithSsrcMid(i, mid);
1475 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
1476 }
1477}
1478
eladalon760a0762017-05-31 09:12:25 -07001479#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
Steve Anton53c7ba62017-08-18 10:05:47 -07001480
1481TEST_F(RtpDemuxerTest, CriteriaMustBeNonEmpty) {
eladalond0244c22017-06-08 04:19:13 -07001482 MockRtpPacketSink sink;
Steve Anton53c7ba62017-08-18 10:05:47 -07001483 RtpDemuxerCriteria criteria;
1484 EXPECT_DEATH(AddSink(criteria, &sink), "");
eladalond0244c22017-06-08 04:19:13 -07001485}
1486
Steve Anton9e0c7422017-08-17 18:59:47 -07001487TEST_F(RtpDemuxerTest, RsidMustBeAlphaNumeric) {
eladalond0244c22017-06-08 04:19:13 -07001488 MockRtpPacketSink sink;
Steve Anton9e0c7422017-08-17 18:59:47 -07001489 EXPECT_DEATH(AddSinkOnlyRsid("a_3", &sink), "");
eladalond0244c22017-06-08 04:19:13 -07001490}
1491
Joachim Bauchd3b7ec22018-08-01 10:12:00 +02001492TEST_F(RtpDemuxerTest, MidMustBeToken) {
Steve Anton53c7ba62017-08-18 10:05:47 -07001493 MockRtpPacketSink sink;
Joachim Bauchd3b7ec22018-08-01 10:12:00 +02001494 EXPECT_DEATH(AddSinkOnlyMid("a(3)", &sink), "");
Steve Anton53c7ba62017-08-18 10:05:47 -07001495}
1496
Steve Anton9e0c7422017-08-17 18:59:47 -07001497TEST_F(RtpDemuxerTest, RsidMustNotExceedMaximumLength) {
eladalond0244c22017-06-08 04:19:13 -07001498 MockRtpPacketSink sink;
Niels Möllerd57efc12019-03-22 14:02:11 +01001499 std::string rsid(BaseRtpStringExtension::kMaxValueSizeBytes + 1, 'a');
Steve Anton9e0c7422017-08-17 18:59:47 -07001500 EXPECT_DEATH(AddSinkOnlyRsid(rsid, &sink), "");
eladalond0244c22017-06-08 04:19:13 -07001501}
1502
Steve Anton53c7ba62017-08-18 10:05:47 -07001503TEST_F(RtpDemuxerTest, MidMustNotExceedMaximumLength) {
Steve Anton9e0c7422017-08-17 18:59:47 -07001504 MockRtpPacketSink sink;
Niels Möllerd57efc12019-03-22 14:02:11 +01001505 std::string mid(BaseRtpStringExtension::kMaxValueSizeBytes + 1, 'a');
Steve Anton53c7ba62017-08-18 10:05:47 -07001506 EXPECT_DEATH(AddSinkOnlyMid(mid, &sink), "");
eladalon760a0762017-05-31 09:12:25 -07001507}
eladalona52722f2017-06-26 11:23:54 -07001508
Steve Anton53c7ba62017-08-18 10:05:47 -07001509TEST_F(RtpDemuxerTest, DoubleRegisterationOfSsrcBindingObserverDisallowed) {
Steve Antonb3329172017-08-17 15:23:51 -07001510 MockSsrcBindingObserver observer;
Steve Anton9e0c7422017-08-17 18:59:47 -07001511 RegisterSsrcBindingObserver(&observer);
1512 EXPECT_DEATH(RegisterSsrcBindingObserver(&observer), "");
eladalona52722f2017-06-26 11:23:54 -07001513}
1514
Steve Anton9e0c7422017-08-17 18:59:47 -07001515TEST_F(RtpDemuxerTest,
Steve Anton53c7ba62017-08-18 10:05:47 -07001516 DregisterationOfNeverRegisteredSsrcBindingObserverDisallowed) {
Steve Antonb3329172017-08-17 15:23:51 -07001517 MockSsrcBindingObserver observer;
Steve Anton9e0c7422017-08-17 18:59:47 -07001518 EXPECT_DEATH(DeregisterSsrcBindingObserver(&observer), "");
eladalona52722f2017-06-26 11:23:54 -07001519}
1520
eladalon760a0762017-05-31 09:12:25 -07001521#endif
1522
1523} // namespace
1524} // namespace webrtc