• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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 "call/rtp_demuxer.h"
12 
13 #include <memory>
14 #include <set>
15 #include <string>
16 
17 #include "call/test/mock_rtp_packet_sink_interface.h"
18 #include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
19 #include "modules/rtp_rtcp/source/rtp_header_extensions.h"
20 #include "modules/rtp_rtcp/source/rtp_packet_received.h"
21 #include "rtc_base/arraysize.h"
22 #include "rtc_base/checks.h"
23 #include "rtc_base/numerics/safe_conversions.h"
24 #include "test/gmock.h"
25 #include "test/gtest.h"
26 
27 namespace webrtc {
28 
29 namespace {
30 
31 using ::testing::_;
32 using ::testing::AtLeast;
33 using ::testing::InSequence;
34 using ::testing::NiceMock;
35 
36 class RtpDemuxerTest : public ::testing::Test {
37  protected:
~RtpDemuxerTest()38   ~RtpDemuxerTest() {
39     for (auto* sink : sinks_to_tear_down_) {
40       demuxer_.RemoveSink(sink);
41     }
42   }
43 
44   // These are convenience methods for calling demuxer.AddSink with different
45   // parameters and will ensure that the sink is automatically removed when the
46   // test case finishes.
47 
AddSink(const RtpDemuxerCriteria & criteria,RtpPacketSinkInterface * sink)48   bool AddSink(const RtpDemuxerCriteria& criteria,
49                RtpPacketSinkInterface* sink) {
50     bool added = demuxer_.AddSink(criteria, sink);
51     if (added) {
52       sinks_to_tear_down_.insert(sink);
53     }
54     return added;
55   }
56 
AddSinkOnlySsrc(uint32_t ssrc,RtpPacketSinkInterface * sink)57   bool AddSinkOnlySsrc(uint32_t ssrc, RtpPacketSinkInterface* sink) {
58     RtpDemuxerCriteria criteria;
59     criteria.ssrcs = {ssrc};
60     return AddSink(criteria, sink);
61   }
62 
AddSinkOnlyRsid(const std::string & rsid,RtpPacketSinkInterface * sink)63   bool AddSinkOnlyRsid(const std::string& rsid, RtpPacketSinkInterface* sink) {
64     RtpDemuxerCriteria criteria;
65     criteria.rsid = rsid;
66     return AddSink(criteria, sink);
67   }
68 
AddSinkOnlyMid(const std::string & mid,RtpPacketSinkInterface * sink)69   bool AddSinkOnlyMid(const std::string& mid, RtpPacketSinkInterface* sink) {
70     RtpDemuxerCriteria criteria;
71     criteria.mid = mid;
72     return AddSink(criteria, sink);
73   }
74 
AddSinkBothMidRsid(const std::string & mid,const std::string & rsid,RtpPacketSinkInterface * sink)75   bool AddSinkBothMidRsid(const std::string& mid,
76                           const std::string& rsid,
77                           RtpPacketSinkInterface* sink) {
78     RtpDemuxerCriteria criteria;
79     criteria.mid = mid;
80     criteria.rsid = rsid;
81     return AddSink(criteria, sink);
82   }
83 
RemoveSink(RtpPacketSinkInterface * sink)84   bool RemoveSink(RtpPacketSinkInterface* sink) {
85     sinks_to_tear_down_.erase(sink);
86     return demuxer_.RemoveSink(sink);
87   }
88 
89   // The CreatePacket* methods are helpers for creating new RTP packets with
90   // various attributes set. Tests should use the helper that provides the
91   // minimum information needed to exercise the behavior under test. Tests also
92   // should not rely on any behavior which is not clearly described in the
93   // helper name/arguments. Any additional settings that are not covered by the
94   // helper should be set manually on the packet once it has been returned.
95   // For example, most tests in this file do not care about the RTP sequence
96   // number, but to ensure that the returned packets are valid the helpers will
97   // auto-increment the sequence number starting with 1. Tests that rely on
98   // specific sequence number behavior should call SetSequenceNumber manually on
99   // the returned packet.
100 
101   // Intended for use only by other CreatePacket* helpers.
CreatePacket(uint32_t ssrc,RtpPacketReceived::ExtensionManager * extension_manager)102   std::unique_ptr<RtpPacketReceived> CreatePacket(
103       uint32_t ssrc,
104       RtpPacketReceived::ExtensionManager* extension_manager) {
105     auto packet = std::make_unique<RtpPacketReceived>(extension_manager);
106     packet->SetSsrc(ssrc);
107     packet->SetSequenceNumber(next_sequence_number_++);
108     return packet;
109   }
110 
CreatePacketWithSsrc(uint32_t ssrc)111   std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrc(uint32_t ssrc) {
112     return CreatePacket(ssrc, nullptr);
113   }
114 
CreatePacketWithSsrcMid(uint32_t ssrc,const std::string & mid)115   std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcMid(
116       uint32_t ssrc,
117       const std::string& mid) {
118     RtpPacketReceived::ExtensionManager extension_manager;
119     extension_manager.Register<RtpMid>(11);
120 
121     auto packet = CreatePacket(ssrc, &extension_manager);
122     packet->SetExtension<RtpMid>(mid);
123     return packet;
124   }
125 
CreatePacketWithSsrcRsid(uint32_t ssrc,const std::string & rsid)126   std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcRsid(
127       uint32_t ssrc,
128       const std::string& rsid) {
129     RtpPacketReceived::ExtensionManager extension_manager;
130     extension_manager.Register<RtpStreamId>(6);
131 
132     auto packet = CreatePacket(ssrc, &extension_manager);
133     packet->SetExtension<RtpStreamId>(rsid);
134     return packet;
135   }
136 
CreatePacketWithSsrcRrid(uint32_t ssrc,const std::string & rrid)137   std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcRrid(
138       uint32_t ssrc,
139       const std::string& rrid) {
140     RtpPacketReceived::ExtensionManager extension_manager;
141     extension_manager.Register<RepairedRtpStreamId>(7);
142 
143     auto packet = CreatePacket(ssrc, &extension_manager);
144     packet->SetExtension<RepairedRtpStreamId>(rrid);
145     return packet;
146   }
147 
CreatePacketWithSsrcMidRsid(uint32_t ssrc,const std::string & mid,const std::string & rsid)148   std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcMidRsid(
149       uint32_t ssrc,
150       const std::string& mid,
151       const std::string& rsid) {
152     RtpPacketReceived::ExtensionManager extension_manager;
153     extension_manager.Register<RtpMid>(11);
154     extension_manager.Register<RtpStreamId>(6);
155 
156     auto packet = CreatePacket(ssrc, &extension_manager);
157     packet->SetExtension<RtpMid>(mid);
158     packet->SetExtension<RtpStreamId>(rsid);
159     return packet;
160   }
161 
CreatePacketWithSsrcRsidRrid(uint32_t ssrc,const std::string & rsid,const std::string & rrid)162   std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcRsidRrid(
163       uint32_t ssrc,
164       const std::string& rsid,
165       const std::string& rrid) {
166     RtpPacketReceived::ExtensionManager extension_manager;
167     extension_manager.Register<RtpStreamId>(6);
168     extension_manager.Register<RepairedRtpStreamId>(7);
169 
170     auto packet = CreatePacket(ssrc, &extension_manager);
171     packet->SetExtension<RtpStreamId>(rsid);
172     packet->SetExtension<RepairedRtpStreamId>(rrid);
173     return packet;
174   }
175 
176   RtpDemuxer demuxer_;
177   std::set<RtpPacketSinkInterface*> sinks_to_tear_down_;
178   uint16_t next_sequence_number_ = 1;
179 };
180 
181 class RtpDemuxerDeathTest : public RtpDemuxerTest {};
182 
183 MATCHER_P(SamePacketAs, other, "") {
184   return arg.Ssrc() == other.Ssrc() &&
185          arg.SequenceNumber() == other.SequenceNumber();
186 }
187 
TEST_F(RtpDemuxerTest,CanAddSinkBySsrc)188 TEST_F(RtpDemuxerTest, CanAddSinkBySsrc) {
189   MockRtpPacketSink sink;
190   constexpr uint32_t ssrc = 1;
191 
192   EXPECT_TRUE(AddSinkOnlySsrc(ssrc, &sink));
193 }
194 
TEST_F(RtpDemuxerTest,AllowAddSinkWithOverlappingPayloadTypesIfDifferentMid)195 TEST_F(RtpDemuxerTest, AllowAddSinkWithOverlappingPayloadTypesIfDifferentMid) {
196   const std::string mid1 = "v";
197   const std::string mid2 = "a";
198   constexpr uint8_t pt1 = 30;
199   constexpr uint8_t pt2 = 31;
200   constexpr uint8_t pt3 = 32;
201 
202   RtpDemuxerCriteria pt1_pt2;
203   pt1_pt2.mid = mid1;
204   pt1_pt2.payload_types = {pt1, pt2};
205   MockRtpPacketSink sink1;
206   AddSink(pt1_pt2, &sink1);
207 
208   RtpDemuxerCriteria pt1_pt3;
209   pt1_pt2.mid = mid2;
210   pt1_pt3.payload_types = {pt1, pt3};
211   MockRtpPacketSink sink2;
212   EXPECT_TRUE(AddSink(pt1_pt3, &sink2));
213 }
214 
TEST_F(RtpDemuxerTest,RejectAddSinkForSameMidOnly)215 TEST_F(RtpDemuxerTest, RejectAddSinkForSameMidOnly) {
216   const std::string mid = "mid";
217 
218   MockRtpPacketSink sink;
219   AddSinkOnlyMid(mid, &sink);
220   EXPECT_FALSE(AddSinkOnlyMid(mid, &sink));
221 }
222 
TEST_F(RtpDemuxerTest,RejectAddSinkForSameMidRsid)223 TEST_F(RtpDemuxerTest, RejectAddSinkForSameMidRsid) {
224   const std::string mid = "v";
225   const std::string rsid = "1";
226 
227   MockRtpPacketSink sink1;
228   AddSinkBothMidRsid(mid, rsid, &sink1);
229 
230   MockRtpPacketSink sink2;
231   EXPECT_FALSE(AddSinkBothMidRsid(mid, rsid, &sink2));
232 }
233 
TEST_F(RtpDemuxerTest,RejectAddSinkForConflictingMidAndMidRsid)234 TEST_F(RtpDemuxerTest, RejectAddSinkForConflictingMidAndMidRsid) {
235   const std::string mid = "v";
236   const std::string rsid = "1";
237 
238   MockRtpPacketSink mid_sink;
239   AddSinkOnlyMid(mid, &mid_sink);
240 
241   // This sink would never get any packets routed to it because the above sink
242   // would receive them all.
243   MockRtpPacketSink mid_rsid_sink;
244   EXPECT_FALSE(AddSinkBothMidRsid(mid, rsid, &mid_rsid_sink));
245 }
246 
TEST_F(RtpDemuxerTest,RejectAddSinkForConflictingMidRsidAndMid)247 TEST_F(RtpDemuxerTest, RejectAddSinkForConflictingMidRsidAndMid) {
248   const std::string mid = "v";
249   const std::string rsid = "";
250 
251   MockRtpPacketSink mid_rsid_sink;
252   AddSinkBothMidRsid(mid, rsid, &mid_rsid_sink);
253 
254   // This sink would shadow the above sink.
255   MockRtpPacketSink mid_sink;
256   EXPECT_FALSE(AddSinkOnlyMid(mid, &mid_sink));
257 }
258 
TEST_F(RtpDemuxerTest,AddSinkFailsIfCalledForTwoSinksWithSameSsrc)259 TEST_F(RtpDemuxerTest, AddSinkFailsIfCalledForTwoSinksWithSameSsrc) {
260   MockRtpPacketSink sink_a;
261   MockRtpPacketSink sink_b;
262   constexpr uint32_t ssrc = 1;
263   ASSERT_TRUE(AddSinkOnlySsrc(ssrc, &sink_a));
264 
265   EXPECT_FALSE(AddSinkOnlySsrc(ssrc, &sink_b));
266 }
267 
TEST_F(RtpDemuxerTest,AddSinkFailsIfCalledTwiceEvenIfSameSinkWithSameSsrc)268 TEST_F(RtpDemuxerTest, AddSinkFailsIfCalledTwiceEvenIfSameSinkWithSameSsrc) {
269   MockRtpPacketSink sink;
270   constexpr uint32_t ssrc = 1;
271   ASSERT_TRUE(AddSinkOnlySsrc(ssrc, &sink));
272 
273   EXPECT_FALSE(AddSinkOnlySsrc(ssrc, &sink));
274 }
275 
276 // TODO(steveanton): Currently fails because payload type validation is not
277 // complete in AddSink (see note in rtp_demuxer.cc).
TEST_F(RtpDemuxerTest,DISABLED_RejectAddSinkForSamePayloadTypes)278 TEST_F(RtpDemuxerTest, DISABLED_RejectAddSinkForSamePayloadTypes) {
279   constexpr uint8_t pt1 = 30;
280   constexpr uint8_t pt2 = 31;
281 
282   RtpDemuxerCriteria pt1_pt2;
283   pt1_pt2.payload_types = {pt1, pt2};
284   MockRtpPacketSink sink1;
285   AddSink(pt1_pt2, &sink1);
286 
287   RtpDemuxerCriteria pt2_pt1;
288   pt2_pt1.payload_types = {pt2, pt1};
289   MockRtpPacketSink sink2;
290   EXPECT_FALSE(AddSink(pt2_pt1, &sink2));
291 }
292 
293 // Routing Tests
294 
TEST_F(RtpDemuxerTest,OnRtpPacketCalledOnCorrectSinkBySsrc)295 TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkBySsrc) {
296   constexpr uint32_t ssrcs[] = {101, 202, 303};
297   MockRtpPacketSink sinks[arraysize(ssrcs)];
298   for (size_t i = 0; i < arraysize(ssrcs); i++) {
299     AddSinkOnlySsrc(ssrcs[i], &sinks[i]);
300   }
301 
302   for (size_t i = 0; i < arraysize(ssrcs); i++) {
303     auto packet = CreatePacketWithSsrc(ssrcs[i]);
304     EXPECT_CALL(sinks[i], OnRtpPacket(SamePacketAs(*packet))).Times(1);
305     EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
306   }
307 }
308 
TEST_F(RtpDemuxerTest,OnRtpPacketCalledOnCorrectSinkByRsid)309 TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByRsid) {
310   const std::string rsids[] = {"a", "b", "c"};
311   MockRtpPacketSink sinks[arraysize(rsids)];
312   for (size_t i = 0; i < arraysize(rsids); i++) {
313     AddSinkOnlyRsid(rsids[i], &sinks[i]);
314   }
315 
316   for (size_t i = 0; i < arraysize(rsids); i++) {
317     auto packet =
318         CreatePacketWithSsrcRsid(rtc::checked_cast<uint32_t>(i), rsids[i]);
319     EXPECT_CALL(sinks[i], OnRtpPacket(SamePacketAs(*packet))).Times(1);
320     EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
321   }
322 }
323 
TEST_F(RtpDemuxerTest,OnRtpPacketCalledOnCorrectSinkByMid)324 TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByMid) {
325   const std::string mids[] = {"a", "v", "s"};
326   MockRtpPacketSink sinks[arraysize(mids)];
327   for (size_t i = 0; i < arraysize(mids); i++) {
328     AddSinkOnlyMid(mids[i], &sinks[i]);
329   }
330 
331   for (size_t i = 0; i < arraysize(mids); i++) {
332     auto packet =
333         CreatePacketWithSsrcMid(rtc::checked_cast<uint32_t>(i), mids[i]);
334     EXPECT_CALL(sinks[i], OnRtpPacket(SamePacketAs(*packet))).Times(1);
335     EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
336   }
337 }
338 
TEST_F(RtpDemuxerTest,OnRtpPacketCalledOnCorrectSinkByMidAndRsid)339 TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByMidAndRsid) {
340   const std::string mid = "v";
341   const std::string rsid = "1";
342   constexpr uint32_t ssrc = 10;
343 
344   MockRtpPacketSink sink;
345   AddSinkBothMidRsid(mid, rsid, &sink);
346 
347   auto packet = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
348   EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
349   EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
350 }
351 
TEST_F(RtpDemuxerTest,OnRtpPacketCalledOnCorrectSinkByRepairedRsid)352 TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByRepairedRsid) {
353   const std::string rrid = "1";
354   constexpr uint32_t ssrc = 10;
355 
356   MockRtpPacketSink sink;
357   AddSinkOnlyRsid(rrid, &sink);
358 
359   auto packet_with_rrid = CreatePacketWithSsrcRrid(ssrc, rrid);
360   EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_rrid))).Times(1);
361   EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_rrid));
362 }
363 
TEST_F(RtpDemuxerTest,OnRtpPacketCalledOnCorrectSinkByPayloadType)364 TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByPayloadType) {
365   constexpr uint32_t ssrc = 10;
366   constexpr uint8_t payload_type = 30;
367 
368   MockRtpPacketSink sink;
369   RtpDemuxerCriteria criteria;
370   criteria.payload_types = {payload_type};
371   AddSink(criteria, &sink);
372 
373   auto packet = CreatePacketWithSsrc(ssrc);
374   packet->SetPayloadType(payload_type);
375   EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
376   EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
377 }
378 
TEST_F(RtpDemuxerTest,PacketsDeliveredInRightOrder)379 TEST_F(RtpDemuxerTest, PacketsDeliveredInRightOrder) {
380   constexpr uint32_t ssrc = 101;
381   MockRtpPacketSink sink;
382   AddSinkOnlySsrc(ssrc, &sink);
383 
384   std::unique_ptr<RtpPacketReceived> packets[5];
385   for (size_t i = 0; i < arraysize(packets); i++) {
386     packets[i] = CreatePacketWithSsrc(ssrc);
387     packets[i]->SetSequenceNumber(rtc::checked_cast<uint16_t>(i));
388   }
389 
390   InSequence sequence;
391   for (const auto& packet : packets) {
392     EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
393   }
394 
395   for (const auto& packet : packets) {
396     EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
397   }
398 }
399 
TEST_F(RtpDemuxerTest,SinkMappedToMultipleSsrcs)400 TEST_F(RtpDemuxerTest, SinkMappedToMultipleSsrcs) {
401   constexpr uint32_t ssrcs[] = {404, 505, 606};
402   MockRtpPacketSink sink;
403   for (uint32_t ssrc : ssrcs) {
404     AddSinkOnlySsrc(ssrc, &sink);
405   }
406 
407   // The sink which is associated with multiple SSRCs gets the callback
408   // triggered for each of those SSRCs.
409   for (uint32_t ssrc : ssrcs) {
410     auto packet = CreatePacketWithSsrc(ssrc);
411     EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
412     EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
413   }
414 }
415 
TEST_F(RtpDemuxerTest,NoCallbackOnSsrcSinkRemovedBeforeFirstPacket)416 TEST_F(RtpDemuxerTest, NoCallbackOnSsrcSinkRemovedBeforeFirstPacket) {
417   constexpr uint32_t ssrc = 404;
418   MockRtpPacketSink sink;
419   AddSinkOnlySsrc(ssrc, &sink);
420 
421   ASSERT_TRUE(RemoveSink(&sink));
422 
423   // The removed sink does not get callbacks.
424   auto packet = CreatePacketWithSsrc(ssrc);
425   EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);  // Not called.
426   EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
427 }
428 
TEST_F(RtpDemuxerTest,NoCallbackOnSsrcSinkRemovedAfterFirstPacket)429 TEST_F(RtpDemuxerTest, NoCallbackOnSsrcSinkRemovedAfterFirstPacket) {
430   constexpr uint32_t ssrc = 404;
431   NiceMock<MockRtpPacketSink> sink;
432   AddSinkOnlySsrc(ssrc, &sink);
433 
434   InSequence sequence;
435   for (size_t i = 0; i < 10; i++) {
436     ASSERT_TRUE(demuxer_.OnRtpPacket(*CreatePacketWithSsrc(ssrc)));
437   }
438 
439   ASSERT_TRUE(RemoveSink(&sink));
440 
441   // The removed sink does not get callbacks.
442   auto packet = CreatePacketWithSsrc(ssrc);
443   EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);  // Not called.
444   EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
445 }
446 
447 // An SSRC may only be mapped to a single sink. However, since configuration
448 // of this associations might come from the network, we need to fail gracefully.
TEST_F(RtpDemuxerTest,OnlyOneSinkPerSsrcGetsOnRtpPacketTriggered)449 TEST_F(RtpDemuxerTest, OnlyOneSinkPerSsrcGetsOnRtpPacketTriggered) {
450   MockRtpPacketSink sinks[3];
451   constexpr uint32_t ssrc = 404;
452   ASSERT_TRUE(AddSinkOnlySsrc(ssrc, &sinks[0]));
453   ASSERT_FALSE(AddSinkOnlySsrc(ssrc, &sinks[1]));
454   ASSERT_FALSE(AddSinkOnlySsrc(ssrc, &sinks[2]));
455 
456   // The first sink associated with the SSRC remains active; other sinks
457   // were not really added, and so do not get OnRtpPacket() called.
458   auto packet = CreatePacketWithSsrc(ssrc);
459   EXPECT_CALL(sinks[0], OnRtpPacket(SamePacketAs(*packet))).Times(1);
460   EXPECT_CALL(sinks[1], OnRtpPacket(_)).Times(0);
461   EXPECT_CALL(sinks[2], OnRtpPacket(_)).Times(0);
462   ASSERT_TRUE(demuxer_.OnRtpPacket(*packet));
463 }
464 
TEST_F(RtpDemuxerTest,NoRepeatedCallbackOnRepeatedAddSinkForSameSink)465 TEST_F(RtpDemuxerTest, NoRepeatedCallbackOnRepeatedAddSinkForSameSink) {
466   constexpr uint32_t ssrc = 111;
467   MockRtpPacketSink sink;
468 
469   ASSERT_TRUE(AddSinkOnlySsrc(ssrc, &sink));
470   ASSERT_FALSE(AddSinkOnlySsrc(ssrc, &sink));
471 
472   auto packet = CreatePacketWithSsrc(ssrc);
473   EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
474   EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
475 }
476 
TEST_F(RtpDemuxerTest,RemoveSinkReturnsFalseForNeverAddedSink)477 TEST_F(RtpDemuxerTest, RemoveSinkReturnsFalseForNeverAddedSink) {
478   MockRtpPacketSink sink;
479   EXPECT_FALSE(RemoveSink(&sink));
480 }
481 
TEST_F(RtpDemuxerTest,RemoveSinkReturnsTrueForPreviouslyAddedSsrcSink)482 TEST_F(RtpDemuxerTest, RemoveSinkReturnsTrueForPreviouslyAddedSsrcSink) {
483   constexpr uint32_t ssrc = 101;
484   MockRtpPacketSink sink;
485   AddSinkOnlySsrc(ssrc, &sink);
486 
487   EXPECT_TRUE(RemoveSink(&sink));
488 }
489 
TEST_F(RtpDemuxerTest,RemoveSinkReturnsTrueForUnresolvedPreviouslyAddedRsidSink)490 TEST_F(RtpDemuxerTest,
491        RemoveSinkReturnsTrueForUnresolvedPreviouslyAddedRsidSink) {
492   const std::string rsid = "a";
493   MockRtpPacketSink sink;
494   AddSinkOnlyRsid(rsid, &sink);
495 
496   EXPECT_TRUE(RemoveSink(&sink));
497 }
498 
TEST_F(RtpDemuxerTest,RemoveSinkReturnsTrueForResolvedPreviouslyAddedRsidSink)499 TEST_F(RtpDemuxerTest,
500        RemoveSinkReturnsTrueForResolvedPreviouslyAddedRsidSink) {
501   const std::string rsid = "a";
502   constexpr uint32_t ssrc = 101;
503   NiceMock<MockRtpPacketSink> sink;
504   AddSinkOnlyRsid(rsid, &sink);
505   ASSERT_TRUE(demuxer_.OnRtpPacket(*CreatePacketWithSsrcRsid(ssrc, rsid)));
506 
507   EXPECT_TRUE(RemoveSink(&sink));
508 }
509 
TEST_F(RtpDemuxerTest,RsidLearnedAndLaterPacketsDeliveredWithOnlySsrc)510 TEST_F(RtpDemuxerTest, RsidLearnedAndLaterPacketsDeliveredWithOnlySsrc) {
511   MockRtpPacketSink sink;
512   const std::string rsid = "a";
513   AddSinkOnlyRsid(rsid, &sink);
514 
515   // Create a sequence of RTP packets, where only the first one actually
516   // mentions the RSID.
517   std::unique_ptr<RtpPacketReceived> packets[5];
518   constexpr uint32_t rsid_ssrc = 111;
519   packets[0] = CreatePacketWithSsrcRsid(rsid_ssrc, rsid);
520   for (size_t i = 1; i < arraysize(packets); i++) {
521     packets[i] = CreatePacketWithSsrc(rsid_ssrc);
522   }
523 
524   // The first packet associates the RSID with the SSRC, thereby allowing the
525   // demuxer to correctly demux all of the packets.
526   InSequence sequence;
527   for (const auto& packet : packets) {
528     EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
529   }
530   for (const auto& packet : packets) {
531     EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
532   }
533 }
534 
TEST_F(RtpDemuxerTest,NoCallbackOnRsidSinkRemovedBeforeFirstPacket)535 TEST_F(RtpDemuxerTest, NoCallbackOnRsidSinkRemovedBeforeFirstPacket) {
536   MockRtpPacketSink sink;
537   const std::string rsid = "a";
538   AddSinkOnlyRsid(rsid, &sink);
539 
540   // Sink removed - it won't get triggers even if packets with its RSID arrive.
541   ASSERT_TRUE(RemoveSink(&sink));
542 
543   constexpr uint32_t ssrc = 111;
544   auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
545   EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);  // Not called.
546   EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
547 }
548 
TEST_F(RtpDemuxerTest,NoCallbackOnRsidSinkRemovedAfterFirstPacket)549 TEST_F(RtpDemuxerTest, NoCallbackOnRsidSinkRemovedAfterFirstPacket) {
550   NiceMock<MockRtpPacketSink> sink;
551   const std::string rsid = "a";
552   AddSinkOnlyRsid(rsid, &sink);
553 
554   InSequence sequence;
555   constexpr uint32_t ssrc = 111;
556   for (size_t i = 0; i < 10; i++) {
557     auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
558     ASSERT_TRUE(demuxer_.OnRtpPacket(*packet));
559   }
560 
561   // Sink removed - it won't get triggers even if packets with its RSID arrive.
562   ASSERT_TRUE(RemoveSink(&sink));
563 
564   auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
565   EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);  // Not called.
566   EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
567 }
568 
TEST_F(RtpDemuxerTest,NoCallbackOnMidSinkRemovedBeforeFirstPacket)569 TEST_F(RtpDemuxerTest, NoCallbackOnMidSinkRemovedBeforeFirstPacket) {
570   const std::string mid = "v";
571   constexpr uint32_t ssrc = 10;
572 
573   MockRtpPacketSink sink;
574   AddSinkOnlyMid(mid, &sink);
575   RemoveSink(&sink);
576 
577   auto packet = CreatePacketWithSsrcMid(ssrc, mid);
578   EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
579   EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
580 }
581 
TEST_F(RtpDemuxerTest,NoCallbackOnMidSinkRemovedAfterFirstPacket)582 TEST_F(RtpDemuxerTest, NoCallbackOnMidSinkRemovedAfterFirstPacket) {
583   const std::string mid = "v";
584   constexpr uint32_t ssrc = 10;
585 
586   NiceMock<MockRtpPacketSink> sink;
587   AddSinkOnlyMid(mid, &sink);
588 
589   auto p1 = CreatePacketWithSsrcMid(ssrc, mid);
590   demuxer_.OnRtpPacket(*p1);
591 
592   RemoveSink(&sink);
593 
594   auto p2 = CreatePacketWithSsrcMid(ssrc, mid);
595   EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
596   EXPECT_FALSE(demuxer_.OnRtpPacket(*p2));
597 }
598 
TEST_F(RtpDemuxerTest,NoCallbackOnMidRsidSinkRemovedAfterFirstPacket)599 TEST_F(RtpDemuxerTest, NoCallbackOnMidRsidSinkRemovedAfterFirstPacket) {
600   const std::string mid = "v";
601   const std::string rsid = "1";
602   constexpr uint32_t ssrc = 10;
603 
604   NiceMock<MockRtpPacketSink> sink;
605   AddSinkBothMidRsid(mid, rsid, &sink);
606 
607   auto p1 = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
608   demuxer_.OnRtpPacket(*p1);
609 
610   RemoveSink(&sink);
611 
612   auto p2 = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
613   EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
614   EXPECT_FALSE(demuxer_.OnRtpPacket(*p2));
615 }
616 
617 // The RSID to SSRC mapping should be one-to-one. If we end up receiving
618 // two (or more) packets with the same SSRC, but different RSIDs, we guarantee
619 // delivery to one of them but not both.
TEST_F(RtpDemuxerTest,FirstSsrcAssociatedWithAnRsidIsNotForgotten)620 TEST_F(RtpDemuxerTest, FirstSsrcAssociatedWithAnRsidIsNotForgotten) {
621   // Each sink has a distinct RSID.
622   MockRtpPacketSink sink_a;
623   const std::string rsid_a = "a";
624   AddSinkOnlyRsid(rsid_a, &sink_a);
625 
626   MockRtpPacketSink sink_b;
627   const std::string rsid_b = "b";
628   AddSinkOnlyRsid(rsid_b, &sink_b);
629 
630   InSequence sequence;  // Verify that the order of delivery is unchanged.
631 
632   constexpr uint32_t shared_ssrc = 100;
633 
634   // First a packet with |rsid_a| is received, and |sink_a| is associated with
635   // its SSRC.
636   auto packet_a = CreatePacketWithSsrcRsid(shared_ssrc, rsid_a);
637   EXPECT_CALL(sink_a, OnRtpPacket(SamePacketAs(*packet_a))).Times(1);
638   EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_a));
639 
640   // Second, a packet with |rsid_b| is received. We guarantee that |sink_b|
641   // receives it.
642   auto packet_b = CreatePacketWithSsrcRsid(shared_ssrc, rsid_b);
643   EXPECT_CALL(sink_a, OnRtpPacket(_)).Times(0);
644   EXPECT_CALL(sink_b, OnRtpPacket(SamePacketAs(*packet_b))).Times(1);
645   EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_b));
646 
647   // Known edge-case; adding a new RSID association makes us re-examine all
648   // SSRCs. |sink_b| may or may not be associated with the SSRC now; we make
649   // no promises on that. However, since the RSID is specified and it cannot be
650   // found the packet should be dropped.
651   MockRtpPacketSink sink_c;
652   const std::string rsid_c = "c";
653   constexpr uint32_t some_other_ssrc = shared_ssrc + 1;
654   AddSinkOnlySsrc(some_other_ssrc, &sink_c);
655 
656   auto packet_c = CreatePacketWithSsrcMid(shared_ssrc, rsid_c);
657   EXPECT_CALL(sink_a, OnRtpPacket(_)).Times(0);
658   EXPECT_CALL(sink_b, OnRtpPacket(_)).Times(0);
659   EXPECT_CALL(sink_c, OnRtpPacket(_)).Times(0);
660   EXPECT_FALSE(demuxer_.OnRtpPacket(*packet_c));
661 }
662 
TEST_F(RtpDemuxerTest,MultipleRsidsOnSameSink)663 TEST_F(RtpDemuxerTest, MultipleRsidsOnSameSink) {
664   MockRtpPacketSink sink;
665   const std::string rsids[] = {"a", "b", "c"};
666 
667   for (const std::string& rsid : rsids) {
668     AddSinkOnlyRsid(rsid, &sink);
669   }
670 
671   InSequence sequence;
672   for (size_t i = 0; i < arraysize(rsids); i++) {
673     // Assign different SSRCs and sequence numbers to all packets.
674     const uint32_t ssrc = 1000 + static_cast<uint32_t>(i);
675     const uint16_t sequence_number = 50 + static_cast<uint16_t>(i);
676     auto packet = CreatePacketWithSsrcRsid(ssrc, rsids[i]);
677     packet->SetSequenceNumber(sequence_number);
678     EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
679     EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
680   }
681 }
682 
683 // RSIDs are given higher priority than SSRC because we believe senders are less
684 // likely to mislabel packets with RSID than mislabel them with SSRCs.
TEST_F(RtpDemuxerTest,SinkWithBothRsidAndSsrcAssociations)685 TEST_F(RtpDemuxerTest, SinkWithBothRsidAndSsrcAssociations) {
686   MockRtpPacketSink sink;
687   constexpr uint32_t standalone_ssrc = 10101;
688   constexpr uint32_t rsid_ssrc = 20202;
689   const std::string rsid = "1";
690 
691   AddSinkOnlySsrc(standalone_ssrc, &sink);
692   AddSinkOnlyRsid(rsid, &sink);
693 
694   InSequence sequence;
695 
696   auto ssrc_packet = CreatePacketWithSsrc(standalone_ssrc);
697   EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*ssrc_packet))).Times(1);
698   EXPECT_TRUE(demuxer_.OnRtpPacket(*ssrc_packet));
699 
700   auto rsid_packet = CreatePacketWithSsrcRsid(rsid_ssrc, rsid);
701   EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*rsid_packet))).Times(1);
702   EXPECT_TRUE(demuxer_.OnRtpPacket(*rsid_packet));
703 }
704 
705 // Packets are always guaranteed to be routed to only one sink.
TEST_F(RtpDemuxerTest,AssociatingByRsidAndBySsrcCannotTriggerDoubleCall)706 TEST_F(RtpDemuxerTest, AssociatingByRsidAndBySsrcCannotTriggerDoubleCall) {
707   constexpr uint32_t ssrc = 10101;
708   const std::string rsid = "a";
709 
710   MockRtpPacketSink sink;
711   AddSinkOnlySsrc(ssrc, &sink);
712   AddSinkOnlyRsid(rsid, &sink);
713 
714   auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
715   EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
716   EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
717 }
718 
719 
720 // If one sink is associated with SSRC x, and another sink with RSID y, then if
721 // we receive a packet with both SSRC x and RSID y, route that to only the sink
722 // for RSID y since we believe RSID tags to be more trustworthy than signaled
723 // SSRCs.
TEST_F(RtpDemuxerTest,PacketFittingBothRsidSinkAndSsrcSinkGivenOnlyToRsidSink)724 TEST_F(RtpDemuxerTest,
725        PacketFittingBothRsidSinkAndSsrcSinkGivenOnlyToRsidSink) {
726   constexpr uint32_t ssrc = 111;
727   MockRtpPacketSink ssrc_sink;
728   AddSinkOnlySsrc(ssrc, &ssrc_sink);
729 
730   const std::string rsid = "a";
731   MockRtpPacketSink rsid_sink;
732   AddSinkOnlyRsid(rsid, &rsid_sink);
733 
734   auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
735 
736   EXPECT_CALL(ssrc_sink, OnRtpPacket(_)).Times(0);
737   EXPECT_CALL(rsid_sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
738   EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
739 }
740 
741 // We're not expecting RSIDs to be resolved to SSRCs which were previously
742 // mapped to sinks, and make no guarantees except for graceful handling.
TEST_F(RtpDemuxerTest,GracefullyHandleRsidBeingMappedToPrevouslyAssociatedSsrc)743 TEST_F(RtpDemuxerTest,
744        GracefullyHandleRsidBeingMappedToPrevouslyAssociatedSsrc) {
745   constexpr uint32_t ssrc = 111;
746   NiceMock<MockRtpPacketSink> ssrc_sink;
747   AddSinkOnlySsrc(ssrc, &ssrc_sink);
748 
749   const std::string rsid = "a";
750   NiceMock<MockRtpPacketSink> rsid_sink;
751   AddSinkOnlyRsid(rsid, &rsid_sink);
752 
753   // The SSRC was mapped to an SSRC sink, but was even active (packets flowed
754   // over it).
755   auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
756   demuxer_.OnRtpPacket(*packet);
757 
758   // If the SSRC sink is ever removed, the RSID sink *might* receive indications
759   // of packets, and observers *might* be informed. Only graceful handling
760   // is guaranteed.
761   RemoveSink(&ssrc_sink);
762   EXPECT_CALL(rsid_sink, OnRtpPacket(SamePacketAs(*packet))).Times(AtLeast(0));
763   EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
764 }
765 
766 // Tests that when one MID sink is configured, packets that include the MID
767 // extension will get routed to that sink and any packets that use the same
768 // SSRC as one of those packets later will also get routed to the sink, even
769 // if a new SSRC is introduced for the same MID.
TEST_F(RtpDemuxerTest,RoutedByMidWhenSsrcAdded)770 TEST_F(RtpDemuxerTest, RoutedByMidWhenSsrcAdded) {
771   const std::string mid = "v";
772   NiceMock<MockRtpPacketSink> sink;
773   AddSinkOnlyMid(mid, &sink);
774 
775   constexpr uint32_t ssrc1 = 10;
776   constexpr uint32_t ssrc2 = 11;
777 
778   auto packet_ssrc1_mid = CreatePacketWithSsrcMid(ssrc1, mid);
779   demuxer_.OnRtpPacket(*packet_ssrc1_mid);
780   auto packet_ssrc2_mid = CreatePacketWithSsrcMid(ssrc2, mid);
781   demuxer_.OnRtpPacket(*packet_ssrc2_mid);
782 
783   auto packet_ssrc1_only = CreatePacketWithSsrc(ssrc1);
784   EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_ssrc1_only))).Times(1);
785   EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc1_only));
786 
787   auto packet_ssrc2_only = CreatePacketWithSsrc(ssrc2);
788   EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_ssrc2_only))).Times(1);
789   EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc2_only));
790 }
791 
TEST_F(RtpDemuxerTest,DontLearnMidSsrcBindingBeforeSinkAdded)792 TEST_F(RtpDemuxerTest, DontLearnMidSsrcBindingBeforeSinkAdded) {
793   const std::string mid = "v";
794   constexpr uint32_t ssrc = 10;
795 
796   auto packet_ssrc_mid = CreatePacketWithSsrcMid(ssrc, mid);
797   ASSERT_FALSE(demuxer_.OnRtpPacket(*packet_ssrc_mid));
798 
799   MockRtpPacketSink sink;
800   AddSinkOnlyMid(mid, &sink);
801 
802   auto packet_ssrc_only = CreatePacketWithSsrc(ssrc);
803   EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
804   EXPECT_FALSE(demuxer_.OnRtpPacket(*packet_ssrc_only));
805 }
806 
TEST_F(RtpDemuxerTest,DontForgetMidSsrcBindingWhenSinkRemoved)807 TEST_F(RtpDemuxerTest, DontForgetMidSsrcBindingWhenSinkRemoved) {
808   const std::string mid = "v";
809   constexpr uint32_t ssrc = 10;
810 
811   NiceMock<MockRtpPacketSink> sink1;
812   AddSinkOnlyMid(mid, &sink1);
813 
814   auto packet_with_mid = CreatePacketWithSsrcMid(ssrc, mid);
815   demuxer_.OnRtpPacket(*packet_with_mid);
816 
817   RemoveSink(&sink1);
818 
819   MockRtpPacketSink sink2;
820   AddSinkOnlyMid(mid, &sink2);
821 
822   auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
823   EXPECT_CALL(sink2, OnRtpPacket(SamePacketAs(*packet_with_ssrc)));
824   EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
825 }
826 
827 // If a sink is added with only a MID, then any packet with that MID no matter
828 // the RSID should be routed to that sink.
TEST_F(RtpDemuxerTest,RoutedByMidWithAnyRsid)829 TEST_F(RtpDemuxerTest, RoutedByMidWithAnyRsid) {
830   const std::string mid = "v";
831   const std::string rsid1 = "1";
832   const std::string rsid2 = "2";
833   constexpr uint32_t ssrc1 = 10;
834   constexpr uint32_t ssrc2 = 11;
835 
836   MockRtpPacketSink sink;
837   AddSinkOnlyMid(mid, &sink);
838 
839   InSequence sequence;
840 
841   auto packet_ssrc1_rsid1 = CreatePacketWithSsrcMidRsid(ssrc1, mid, rsid1);
842   EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_ssrc1_rsid1))).Times(1);
843   EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc1_rsid1));
844 
845   auto packet_ssrc2_rsid2 = CreatePacketWithSsrcMidRsid(ssrc2, mid, rsid2);
846   EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_ssrc2_rsid2))).Times(1);
847   EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc2_rsid2));
848 }
849 
850 // These two tests verify that for a sink added with a MID, RSID pair, if the
851 // MID and RSID are learned in separate packets (e.g., because the header
852 // extensions are sent separately), then a later packet with just SSRC will get
853 // routed to that sink.
854 // The first test checks that the functionality works when MID is learned first.
855 // The second test checks that the functionality works when RSID is learned
856 // first.
TEST_F(RtpDemuxerTest,LearnMidThenRsidSeparatelyAndRouteBySsrc)857 TEST_F(RtpDemuxerTest, LearnMidThenRsidSeparatelyAndRouteBySsrc) {
858   const std::string mid = "v";
859   const std::string rsid = "1";
860   constexpr uint32_t ssrc = 10;
861 
862   NiceMock<MockRtpPacketSink> sink;
863   AddSinkBothMidRsid(mid, rsid, &sink);
864 
865   auto packet_with_mid = CreatePacketWithSsrcMid(ssrc, mid);
866   ASSERT_FALSE(demuxer_.OnRtpPacket(*packet_with_mid));
867 
868   auto packet_with_rsid = CreatePacketWithSsrcRsid(ssrc, rsid);
869   ASSERT_TRUE(demuxer_.OnRtpPacket(*packet_with_rsid));
870 
871   auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
872   EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_ssrc))).Times(1);
873   EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
874 }
875 
TEST_F(RtpDemuxerTest,LearnRsidThenMidSeparatelyAndRouteBySsrc)876 TEST_F(RtpDemuxerTest, LearnRsidThenMidSeparatelyAndRouteBySsrc) {
877   const std::string mid = "v";
878   const std::string rsid = "1";
879   constexpr uint32_t ssrc = 10;
880 
881   NiceMock<MockRtpPacketSink> sink;
882   AddSinkBothMidRsid(mid, rsid, &sink);
883 
884   auto packet_with_rsid = CreatePacketWithSsrcRsid(ssrc, rsid);
885   ASSERT_FALSE(demuxer_.OnRtpPacket(*packet_with_rsid));
886 
887   auto packet_with_mid = CreatePacketWithSsrcMid(ssrc, mid);
888   ASSERT_TRUE(demuxer_.OnRtpPacket(*packet_with_mid));
889 
890   auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
891   EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_ssrc))).Times(1);
892   EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
893 }
894 
TEST_F(RtpDemuxerTest,DontLearnMidRsidBindingBeforeSinkAdded)895 TEST_F(RtpDemuxerTest, DontLearnMidRsidBindingBeforeSinkAdded) {
896   const std::string mid = "v";
897   const std::string rsid = "1";
898   constexpr uint32_t ssrc = 10;
899 
900   auto packet_with_both = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
901   ASSERT_FALSE(demuxer_.OnRtpPacket(*packet_with_both));
902 
903   MockRtpPacketSink sink;
904   AddSinkBothMidRsid(mid, rsid, &sink);
905 
906   auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
907   EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
908   EXPECT_FALSE(demuxer_.OnRtpPacket(*packet_with_ssrc));
909 }
910 
TEST_F(RtpDemuxerTest,DontForgetMidRsidBindingWhenSinkRemoved)911 TEST_F(RtpDemuxerTest, DontForgetMidRsidBindingWhenSinkRemoved) {
912   const std::string mid = "v";
913   const std::string rsid = "1";
914   constexpr uint32_t ssrc = 10;
915 
916   NiceMock<MockRtpPacketSink> sink1;
917   AddSinkBothMidRsid(mid, rsid, &sink1);
918 
919   auto packet_with_both = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
920   demuxer_.OnRtpPacket(*packet_with_both);
921 
922   RemoveSink(&sink1);
923 
924   MockRtpPacketSink sink2;
925   AddSinkBothMidRsid(mid, rsid, &sink2);
926 
927   auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
928   EXPECT_CALL(sink2, OnRtpPacket(SamePacketAs(*packet_with_ssrc)));
929   EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
930 }
931 
TEST_F(RtpDemuxerTest,LearnMidRsidBindingAfterSinkAdded)932 TEST_F(RtpDemuxerTest, LearnMidRsidBindingAfterSinkAdded) {
933   const std::string mid = "v";
934   const std::string rsid = "1";
935   constexpr uint32_t ssrc = 10;
936 
937   NiceMock<MockRtpPacketSink> sink;
938   AddSinkBothMidRsid(mid, rsid, &sink);
939 
940   auto packet_with_both = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
941   demuxer_.OnRtpPacket(*packet_with_both);
942 
943   auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
944   EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_ssrc)));
945   EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
946 }
947 
TEST_F(RtpDemuxerTest,DropByPayloadTypeIfNoSink)948 TEST_F(RtpDemuxerTest, DropByPayloadTypeIfNoSink) {
949   constexpr uint8_t payload_type = 30;
950   constexpr uint32_t ssrc = 10;
951 
952   auto packet = CreatePacketWithSsrc(ssrc);
953   packet->SetPayloadType(payload_type);
954   EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
955 }
956 
957 // For legacy applications, it's possible for us to demux if the payload type is
958 // unique. But if multiple sinks are registered with different MIDs and the same
959 // payload types, then we cannot route a packet with just payload type because
960 // it is ambiguous which sink it should be sent to.
TEST_F(RtpDemuxerTest,DropByPayloadTypeIfAddedInMultipleSinks)961 TEST_F(RtpDemuxerTest, DropByPayloadTypeIfAddedInMultipleSinks) {
962   const std::string mid1 = "v";
963   const std::string mid2 = "a";
964   constexpr uint8_t payload_type = 30;
965   constexpr uint32_t ssrc = 10;
966 
967   RtpDemuxerCriteria mid1_pt;
968   mid1_pt.mid = mid1;
969   mid1_pt.payload_types = {payload_type};
970   MockRtpPacketSink sink1;
971   AddSink(mid1_pt, &sink1);
972 
973   RtpDemuxerCriteria mid2_pt;
974   mid2_pt.mid = mid2;
975   mid2_pt.payload_types = {payload_type};
976   MockRtpPacketSink sink2;
977   AddSink(mid2_pt, &sink2);
978 
979   auto packet = CreatePacketWithSsrc(ssrc);
980   packet->SetPayloadType(payload_type);
981 
982   EXPECT_CALL(sink1, OnRtpPacket(_)).Times(0);
983   EXPECT_CALL(sink2, OnRtpPacket(_)).Times(0);
984   EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
985 }
986 
987 // If two sinks are added with different MIDs but the same payload types, then
988 // we cannot demux on the payload type only unless one of the sinks is removed.
TEST_F(RtpDemuxerTest,RoutedByPayloadTypeIfAmbiguousSinkRemoved)989 TEST_F(RtpDemuxerTest, RoutedByPayloadTypeIfAmbiguousSinkRemoved) {
990   const std::string mid1 = "v";
991   const std::string mid2 = "a";
992   constexpr uint8_t payload_type = 30;
993   constexpr uint32_t ssrc = 10;
994 
995   RtpDemuxerCriteria mid1_pt;
996   mid1_pt.mid = mid1;
997   mid1_pt.payload_types = {payload_type};
998   MockRtpPacketSink sink1;
999   AddSink(mid1_pt, &sink1);
1000 
1001   RtpDemuxerCriteria mid2_pt;
1002   mid2_pt.mid = mid2;
1003   mid2_pt.payload_types = {payload_type};
1004   MockRtpPacketSink sink2;
1005   AddSink(mid2_pt, &sink2);
1006 
1007   RemoveSink(&sink1);
1008 
1009   auto packet = CreatePacketWithSsrc(ssrc);
1010   packet->SetPayloadType(payload_type);
1011 
1012   EXPECT_CALL(sink1, OnRtpPacket(_)).Times(0);
1013   EXPECT_CALL(sink2, OnRtpPacket(SamePacketAs(*packet))).Times(1);
1014 
1015   EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
1016 }
1017 
TEST_F(RtpDemuxerTest,RoutedByPayloadTypeLatchesSsrc)1018 TEST_F(RtpDemuxerTest, RoutedByPayloadTypeLatchesSsrc) {
1019   constexpr uint8_t payload_type = 30;
1020   constexpr uint32_t ssrc = 10;
1021 
1022   RtpDemuxerCriteria pt;
1023   pt.payload_types = {payload_type};
1024   NiceMock<MockRtpPacketSink> sink;
1025   AddSink(pt, &sink);
1026 
1027   auto packet_with_pt = CreatePacketWithSsrc(ssrc);
1028   packet_with_pt->SetPayloadType(payload_type);
1029   ASSERT_TRUE(demuxer_.OnRtpPacket(*packet_with_pt));
1030 
1031   auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
1032   EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_ssrc))).Times(1);
1033   EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
1034 }
1035 
1036 // RSIDs are scoped within MID, so if two sinks are registered with the same
1037 // RSIDs but different MIDs, then packets containing both extensions should be
1038 // routed to the correct one.
TEST_F(RtpDemuxerTest,PacketWithSameRsidDifferentMidRoutedToProperSink)1039 TEST_F(RtpDemuxerTest, PacketWithSameRsidDifferentMidRoutedToProperSink) {
1040   const std::string mid1 = "mid1";
1041   const std::string mid2 = "mid2";
1042   const std::string rsid = "rsid";
1043   constexpr uint32_t ssrc1 = 10;
1044   constexpr uint32_t ssrc2 = 11;
1045 
1046   NiceMock<MockRtpPacketSink> mid1_sink;
1047   AddSinkBothMidRsid(mid1, rsid, &mid1_sink);
1048 
1049   MockRtpPacketSink mid2_sink;
1050   AddSinkBothMidRsid(mid2, rsid, &mid2_sink);
1051 
1052   auto packet_mid1 = CreatePacketWithSsrcMidRsid(ssrc1, mid1, rsid);
1053   ASSERT_TRUE(demuxer_.OnRtpPacket(*packet_mid1));
1054 
1055   auto packet_mid2 = CreatePacketWithSsrcMidRsid(ssrc2, mid2, rsid);
1056   EXPECT_CALL(mid2_sink, OnRtpPacket(SamePacketAs(*packet_mid2))).Times(1);
1057   EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_mid2));
1058 }
1059 
1060 // If a sink is first bound to a given SSRC by signaling but later a new sink is
1061 // bound to a given MID by a later signaling, then when a packet arrives with
1062 // both the SSRC and MID, then the signaled MID sink should take precedence.
TEST_F(RtpDemuxerTest,SignaledMidShouldOverwriteSignaledSsrc)1063 TEST_F(RtpDemuxerTest, SignaledMidShouldOverwriteSignaledSsrc) {
1064   constexpr uint32_t ssrc = 11;
1065   const std::string mid = "mid";
1066 
1067   MockRtpPacketSink ssrc_sink;
1068   AddSinkOnlySsrc(ssrc, &ssrc_sink);
1069 
1070   MockRtpPacketSink mid_sink;
1071   AddSinkOnlyMid(mid, &mid_sink);
1072 
1073   auto p = CreatePacketWithSsrcMid(ssrc, mid);
1074   EXPECT_CALL(ssrc_sink, OnRtpPacket(_)).Times(0);
1075   EXPECT_CALL(mid_sink, OnRtpPacket(SamePacketAs(*p))).Times(1);
1076   EXPECT_TRUE(demuxer_.OnRtpPacket(*p));
1077 }
1078 
1079 // Extends the previous test to also ensure that later packets that do not
1080 // specify MID are still routed to the MID sink rather than the overwritten SSRC
1081 // sink.
TEST_F(RtpDemuxerTest,SignaledMidShouldOverwriteSignalledSsrcPersistent)1082 TEST_F(RtpDemuxerTest, SignaledMidShouldOverwriteSignalledSsrcPersistent) {
1083   constexpr uint32_t ssrc = 11;
1084   const std::string mid = "mid";
1085 
1086   MockRtpPacketSink ssrc_sink;
1087   AddSinkOnlySsrc(ssrc, &ssrc_sink);
1088 
1089   NiceMock<MockRtpPacketSink> mid_sink;
1090   AddSinkOnlyMid(mid, &mid_sink);
1091 
1092   EXPECT_CALL(ssrc_sink, OnRtpPacket(_)).Times(0);
1093 
1094   auto packet_with_mid = CreatePacketWithSsrcMid(ssrc, mid);
1095   demuxer_.OnRtpPacket(*packet_with_mid);
1096 
1097   auto packet_without_mid = CreatePacketWithSsrc(ssrc);
1098   EXPECT_CALL(mid_sink, OnRtpPacket(SamePacketAs(*packet_without_mid)))
1099       .Times(1);
1100   EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_without_mid));
1101 }
1102 
TEST_F(RtpDemuxerTest,RouteByPayloadTypeMultipleMatch)1103 TEST_F(RtpDemuxerTest, RouteByPayloadTypeMultipleMatch) {
1104   constexpr uint32_t ssrc = 10;
1105   constexpr uint8_t pt1 = 30;
1106   constexpr uint8_t pt2 = 31;
1107 
1108   MockRtpPacketSink sink;
1109   RtpDemuxerCriteria criteria;
1110   criteria.payload_types = {pt1, pt2};
1111   AddSink(criteria, &sink);
1112 
1113   auto packet_with_pt1 = CreatePacketWithSsrc(ssrc);
1114   packet_with_pt1->SetPayloadType(pt1);
1115   EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_pt1)));
1116   EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_pt1));
1117 
1118   auto packet_with_pt2 = CreatePacketWithSsrc(ssrc);
1119   packet_with_pt2->SetPayloadType(pt2);
1120   EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_pt2)));
1121   EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_pt2));
1122 }
1123 
TEST_F(RtpDemuxerTest,DontDemuxOnMidAloneIfAddedWithRsid)1124 TEST_F(RtpDemuxerTest, DontDemuxOnMidAloneIfAddedWithRsid) {
1125   const std::string mid = "v";
1126   const std::string rsid = "1";
1127   constexpr uint32_t ssrc = 10;
1128 
1129   MockRtpPacketSink sink;
1130   AddSinkBothMidRsid(mid, rsid, &sink);
1131 
1132   EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
1133 
1134   auto packet = CreatePacketWithSsrcMid(ssrc, mid);
1135   EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
1136 }
1137 
TEST_F(RtpDemuxerTest,DemuxBySsrcEvenWithMidAndRsid)1138 TEST_F(RtpDemuxerTest, DemuxBySsrcEvenWithMidAndRsid) {
1139   const std::string mid = "v";
1140   const std::string rsid = "1";
1141   constexpr uint32_t ssrc = 10;
1142 
1143   RtpDemuxerCriteria criteria;
1144   criteria.rsid = rsid;
1145   criteria.mid = mid;
1146   criteria.ssrcs = {ssrc};
1147   MockRtpPacketSink sink;
1148   AddSink(criteria, &sink);
1149 
1150   auto packet = CreatePacketWithSsrc(ssrc);
1151   EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
1152   EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
1153 }
1154 
1155 // In slight deviation from the BUNDLE spec, if we match a sink according to
1156 // SSRC, then we do not verify payload type against the criteria and defer to
1157 // the sink to check that it is correct.
TEST_F(RtpDemuxerTest,DoNotCheckPayloadTypeIfMatchedByOtherCriteria)1158 TEST_F(RtpDemuxerTest, DoNotCheckPayloadTypeIfMatchedByOtherCriteria) {
1159   constexpr uint32_t ssrc = 10;
1160   constexpr uint8_t payload_type = 30;
1161   constexpr uint8_t different_payload_type = payload_type + 1;
1162 
1163   RtpDemuxerCriteria criteria;
1164   criteria.ssrcs = {ssrc};
1165   criteria.payload_types = {payload_type};
1166   MockRtpPacketSink sink;
1167   AddSink(criteria, &sink);
1168 
1169   auto packet = CreatePacketWithSsrc(ssrc);
1170   packet->SetPayloadType(different_payload_type);
1171   EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
1172   EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
1173 }
1174 
1175 // If a repair packet includes an RSID it should be ignored and the packet
1176 // should be routed by its RRID.
TEST_F(RtpDemuxerTest,PacketWithRsidAndRridRoutedByRrid)1177 TEST_F(RtpDemuxerTest, PacketWithRsidAndRridRoutedByRrid) {
1178   const std::string rsid = "1";
1179   const std::string rrid = "1r";
1180   constexpr uint32_t ssrc = 10;
1181 
1182   MockRtpPacketSink sink_rsid;
1183   AddSinkOnlyRsid(rsid, &sink_rsid);
1184 
1185   MockRtpPacketSink sink_rrid;
1186   AddSinkOnlyRsid(rrid, &sink_rrid);
1187 
1188   auto packet = CreatePacketWithSsrcRsidRrid(ssrc, rsid, rrid);
1189   EXPECT_CALL(sink_rsid, OnRtpPacket(_)).Times(0);
1190   EXPECT_CALL(sink_rrid, OnRtpPacket(SamePacketAs(*packet))).Times(1);
1191   EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
1192 }
1193 
1194 // Same test as above but checks that the latched SSRC routes to the RRID sink.
TEST_F(RtpDemuxerTest,PacketWithRsidAndRridLatchesSsrcToRrid)1195 TEST_F(RtpDemuxerTest, PacketWithRsidAndRridLatchesSsrcToRrid) {
1196   const std::string rsid = "1";
1197   const std::string rrid = "1r";
1198   constexpr uint32_t ssrc = 10;
1199 
1200   MockRtpPacketSink sink_rsid;
1201   AddSinkOnlyRsid(rsid, &sink_rsid);
1202 
1203   NiceMock<MockRtpPacketSink> sink_rrid;
1204   AddSinkOnlyRsid(rrid, &sink_rrid);
1205 
1206   auto packet_rsid_rrid = CreatePacketWithSsrcRsidRrid(ssrc, rsid, rrid);
1207   demuxer_.OnRtpPacket(*packet_rsid_rrid);
1208 
1209   auto packet_ssrc_only = CreatePacketWithSsrc(ssrc);
1210   EXPECT_CALL(sink_rsid, OnRtpPacket(_)).Times(0);
1211   EXPECT_CALL(sink_rrid, OnRtpPacket(SamePacketAs(*packet_ssrc_only))).Times(1);
1212   EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc_only));
1213 }
1214 
1215 // Tests that a packet which includes MID and RSID is dropped and not routed by
1216 // SSRC if the MID and RSID do not match an added sink.
TEST_F(RtpDemuxerTest,PacketWithMidAndUnknownRsidIsNotRoutedBySsrc)1217 TEST_F(RtpDemuxerTest, PacketWithMidAndUnknownRsidIsNotRoutedBySsrc) {
1218   constexpr uint32_t ssrc = 10;
1219   const std::string mid = "v";
1220   const std::string rsid = "1";
1221   const std::string wrong_rsid = "2";
1222 
1223   RtpDemuxerCriteria criteria;
1224   criteria.mid = mid;
1225   criteria.rsid = rsid;
1226   criteria.ssrcs = {ssrc};
1227   MockRtpPacketSink sink;
1228   AddSink(criteria, &sink);
1229 
1230   auto packet = CreatePacketWithSsrcMidRsid(ssrc, mid, wrong_rsid);
1231   EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
1232   EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
1233 }
1234 
1235 // Tests that a packet which includes MID and RSID is dropped and not routed by
1236 // payload type if the MID and RSID do not match an added sink.
TEST_F(RtpDemuxerTest,PacketWithMidAndUnknownRsidIsNotRoutedByPayloadType)1237 TEST_F(RtpDemuxerTest, PacketWithMidAndUnknownRsidIsNotRoutedByPayloadType) {
1238   constexpr uint32_t ssrc = 10;
1239   const std::string mid = "v";
1240   const std::string rsid = "1";
1241   const std::string wrong_rsid = "2";
1242   constexpr uint8_t payload_type = 30;
1243 
1244   RtpDemuxerCriteria criteria;
1245   criteria.mid = mid;
1246   criteria.rsid = rsid;
1247   criteria.payload_types = {payload_type};
1248   MockRtpPacketSink sink;
1249   AddSink(criteria, &sink);
1250 
1251   auto packet = CreatePacketWithSsrcMidRsid(ssrc, mid, wrong_rsid);
1252   packet->SetPayloadType(payload_type);
1253   EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
1254   EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
1255 }
1256 
1257 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
1258 
TEST_F(RtpDemuxerDeathTest,CriteriaMustBeNonEmpty)1259 TEST_F(RtpDemuxerDeathTest, CriteriaMustBeNonEmpty) {
1260   MockRtpPacketSink sink;
1261   RtpDemuxerCriteria criteria;
1262   EXPECT_DEATH(AddSink(criteria, &sink), "");
1263 }
1264 
TEST_F(RtpDemuxerDeathTest,RsidMustBeAlphaNumeric)1265 TEST_F(RtpDemuxerDeathTest, RsidMustBeAlphaNumeric) {
1266   MockRtpPacketSink sink;
1267   EXPECT_DEATH(AddSinkOnlyRsid("a_3", &sink), "");
1268 }
1269 
TEST_F(RtpDemuxerDeathTest,MidMustBeToken)1270 TEST_F(RtpDemuxerDeathTest, MidMustBeToken) {
1271   MockRtpPacketSink sink;
1272   EXPECT_DEATH(AddSinkOnlyMid("a(3)", &sink), "");
1273 }
1274 
TEST_F(RtpDemuxerDeathTest,RsidMustNotExceedMaximumLength)1275 TEST_F(RtpDemuxerDeathTest, RsidMustNotExceedMaximumLength) {
1276   MockRtpPacketSink sink;
1277   std::string rsid(BaseRtpStringExtension::kMaxValueSizeBytes + 1, 'a');
1278   EXPECT_DEATH(AddSinkOnlyRsid(rsid, &sink), "");
1279 }
1280 
TEST_F(RtpDemuxerDeathTest,MidMustNotExceedMaximumLength)1281 TEST_F(RtpDemuxerDeathTest, MidMustNotExceedMaximumLength) {
1282   MockRtpPacketSink sink;
1283   std::string mid(BaseRtpStringExtension::kMaxValueSizeBytes + 1, 'a');
1284   EXPECT_DEATH(AddSinkOnlyMid(mid, &sink), "");
1285 }
1286 
1287 #endif
1288 
1289 }  // namespace
1290 }  // namespace webrtc
1291