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