blob: e85052810a0761cb16171cf1442fac267c016307 [file] [log] [blame]
eladalon760a0762017-05-31 16:12:251/*
2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Mirko Bonadei92ea95e2017-09-15 04:47:3111#include "call/rtp_demuxer.h"
eladalon760a0762017-05-31 16:12:2512
13#include <memory>
Steve Anton9e0c7422017-08-18 01:59:4714#include <set>
eladalond0244c22017-06-08 11:19:1315#include <string>
eladalon760a0762017-05-31 16:12:2516
Ali Tofigh641a1b12022-05-17 09:48:4617#include "absl/strings/string_view.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3118#include "call/test/mock_rtp_packet_sink_interface.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3119#include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
20#include "modules/rtp_rtcp/source/rtp_header_extensions.h"
21#include "modules/rtp_rtcp/source/rtp_packet_received.h"
22#include "rtc_base/arraysize.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3123#include "rtc_base/checks.h"
Karl Wiberge40468b2017-11-22 09:42:2624#include "rtc_base/numerics/safe_conversions.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3125#include "test/gmock.h"
26#include "test/gtest.h"
eladalon760a0762017-05-31 16:12:2527
28namespace webrtc {
29
30namespace {
31
32using ::testing::_;
eladalond0244c22017-06-08 11:19:1333using ::testing::AtLeast;
34using ::testing::InSequence;
35using ::testing::NiceMock;
eladalon760a0762017-05-31 16:12:2536
Mirko Bonadei6a489f22019-04-09 13:11:1237class RtpDemuxerTest : public ::testing::Test {
Steve Anton9e0c7422017-08-18 01:59:4738 protected:
39 ~RtpDemuxerTest() {
40 for (auto* sink : sinks_to_tear_down_) {
41 demuxer_.RemoveSink(sink);
42 }
Steve Anton9e0c7422017-08-18 01:59:4743 }
44
Steve Anton53c7ba62017-08-18 17:05:4745 // These are convenience methods for calling demuxer.AddSink with different
46 // parameters and will ensure that the sink is automatically removed when the
47 // test case finishes.
48
49 bool AddSink(const RtpDemuxerCriteria& criteria,
50 RtpPacketSinkInterface* sink) {
51 bool added = demuxer_.AddSink(criteria, sink);
Steve Anton9e0c7422017-08-18 01:59:4752 if (added) {
53 sinks_to_tear_down_.insert(sink);
54 }
55 return added;
56 }
57
Steve Anton53c7ba62017-08-18 17:05:4758 bool AddSinkOnlySsrc(uint32_t ssrc, RtpPacketSinkInterface* sink) {
59 RtpDemuxerCriteria criteria;
Tomas Gunnarsson8a5ac162022-01-03 14:16:4660 criteria.ssrcs().insert(ssrc);
Steve Anton53c7ba62017-08-18 17:05:4761 return AddSink(criteria, sink);
62 }
63
Ali Tofigh641a1b12022-05-17 09:48:4664 bool AddSinkOnlyRsid(absl::string_view rsid, RtpPacketSinkInterface* sink) {
Tomas Gunnarssonc3795ff2022-01-03 13:04:5165 RtpDemuxerCriteria criteria(absl::string_view(), rsid);
Steve Anton53c7ba62017-08-18 17:05:4766 return AddSink(criteria, sink);
67 }
68
Ali Tofigh641a1b12022-05-17 09:48:4669 bool AddSinkOnlyMid(absl::string_view mid, RtpPacketSinkInterface* sink) {
Tomas Gunnarssonc3795ff2022-01-03 13:04:5170 RtpDemuxerCriteria criteria(mid);
Steve Anton53c7ba62017-08-18 17:05:4771 return AddSink(criteria, sink);
72 }
73
Ali Tofigh641a1b12022-05-17 09:48:4674 bool AddSinkBothMidRsid(absl::string_view mid,
75 absl::string_view rsid,
Steve Anton53c7ba62017-08-18 17:05:4776 RtpPacketSinkInterface* sink) {
Tomas Gunnarssonc3795ff2022-01-03 13:04:5177 RtpDemuxerCriteria criteria(mid, rsid);
Steve Anton53c7ba62017-08-18 17:05:4778 return AddSink(criteria, sink);
Steve Anton9e0c7422017-08-18 01:59:4779 }
80
81 bool RemoveSink(RtpPacketSinkInterface* sink) {
82 sinks_to_tear_down_.erase(sink);
83 return demuxer_.RemoveSink(sink);
84 }
85
Steve Anton9e0c7422017-08-18 01:59:4786 // The CreatePacket* methods are helpers for creating new RTP packets with
87 // various attributes set. Tests should use the helper that provides the
88 // minimum information needed to exercise the behavior under test. Tests also
89 // should not rely on any behavior which is not clearly described in the
90 // helper name/arguments. Any additional settings that are not covered by the
91 // helper should be set manually on the packet once it has been returned.
92 // For example, most tests in this file do not care about the RTP sequence
93 // number, but to ensure that the returned packets are valid the helpers will
94 // auto-increment the sequence number starting with 1. Tests that rely on
95 // specific sequence number behavior should call SetSequenceNumber manually on
96 // the returned packet.
97
98 // Intended for use only by other CreatePacket* helpers.
99 std::unique_ptr<RtpPacketReceived> CreatePacket(
100 uint32_t ssrc,
101 RtpPacketReceived::ExtensionManager* extension_manager) {
Mirko Bonadei317a1f02019-09-17 15:06:18102 auto packet = std::make_unique<RtpPacketReceived>(extension_manager);
Steve Anton9e0c7422017-08-18 01:59:47103 packet->SetSsrc(ssrc);
104 packet->SetSequenceNumber(next_sequence_number_++);
105 return packet;
106 }
107
108 std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrc(uint32_t ssrc) {
109 return CreatePacket(ssrc, nullptr);
110 }
111
Steve Anton53c7ba62017-08-18 17:05:47112 std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcMid(
113 uint32_t ssrc,
Ali Tofigh641a1b12022-05-17 09:48:46114 absl::string_view mid) {
Steve Anton53c7ba62017-08-18 17:05:47115 RtpPacketReceived::ExtensionManager extension_manager;
116 extension_manager.Register<RtpMid>(11);
117
118 auto packet = CreatePacket(ssrc, &extension_manager);
119 packet->SetExtension<RtpMid>(mid);
120 return packet;
121 }
122
Steve Anton9e0c7422017-08-18 01:59:47123 std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcRsid(
124 uint32_t ssrc,
Ali Tofigh641a1b12022-05-17 09:48:46125 absl::string_view rsid) {
Steve Anton9e0c7422017-08-18 01:59:47126 RtpPacketReceived::ExtensionManager extension_manager;
127 extension_manager.Register<RtpStreamId>(6);
128
129 auto packet = CreatePacket(ssrc, &extension_manager);
130 packet->SetExtension<RtpStreamId>(rsid);
131 return packet;
132 }
133
Steve Anton53c7ba62017-08-18 17:05:47134 std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcRrid(
135 uint32_t ssrc,
Ali Tofigh641a1b12022-05-17 09:48:46136 absl::string_view rrid) {
Steve Anton53c7ba62017-08-18 17:05:47137 RtpPacketReceived::ExtensionManager extension_manager;
138 extension_manager.Register<RepairedRtpStreamId>(7);
139
140 auto packet = CreatePacket(ssrc, &extension_manager);
141 packet->SetExtension<RepairedRtpStreamId>(rrid);
142 return packet;
143 }
144
145 std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcMidRsid(
146 uint32_t ssrc,
Ali Tofigh641a1b12022-05-17 09:48:46147 absl::string_view mid,
148 absl::string_view rsid) {
Steve Anton53c7ba62017-08-18 17:05:47149 RtpPacketReceived::ExtensionManager extension_manager;
150 extension_manager.Register<RtpMid>(11);
151 extension_manager.Register<RtpStreamId>(6);
152
153 auto packet = CreatePacket(ssrc, &extension_manager);
154 packet->SetExtension<RtpMid>(mid);
155 packet->SetExtension<RtpStreamId>(rsid);
156 return packet;
157 }
158
159 std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcRsidRrid(
160 uint32_t ssrc,
Ali Tofigh641a1b12022-05-17 09:48:46161 absl::string_view rsid,
162 absl::string_view rrid) {
Steve Anton53c7ba62017-08-18 17:05:47163 RtpPacketReceived::ExtensionManager extension_manager;
164 extension_manager.Register<RtpStreamId>(6);
165 extension_manager.Register<RepairedRtpStreamId>(7);
166
167 auto packet = CreatePacket(ssrc, &extension_manager);
168 packet->SetExtension<RtpStreamId>(rsid);
169 packet->SetExtension<RepairedRtpStreamId>(rrid);
170 return packet;
171 }
172
Steve Anton9e0c7422017-08-18 01:59:47173 RtpDemuxer demuxer_;
174 std::set<RtpPacketSinkInterface*> sinks_to_tear_down_;
Steve Anton9e0c7422017-08-18 01:59:47175 uint16_t next_sequence_number_ = 1;
176};
177
Tommi909f3a52020-05-18 14:47:56178class RtpDemuxerDeathTest : public RtpDemuxerTest {};
179
eladalond0244c22017-06-08 11:19:13180MATCHER_P(SamePacketAs, other, "") {
181 return arg.Ssrc() == other.Ssrc() &&
182 arg.SequenceNumber() == other.SequenceNumber();
eladalon760a0762017-05-31 16:12:25183}
184
Steve Anton9e0c7422017-08-18 01:59:47185TEST_F(RtpDemuxerTest, CanAddSinkBySsrc) {
eladalon5daecca2017-08-04 13:34:54186 MockRtpPacketSink sink;
187 constexpr uint32_t ssrc = 1;
188
Steve Anton9e0c7422017-08-18 01:59:47189 EXPECT_TRUE(AddSinkOnlySsrc(ssrc, &sink));
eladalon5daecca2017-08-04 13:34:54190}
191
Steve Anton53c7ba62017-08-18 17:05:47192TEST_F(RtpDemuxerTest, AllowAddSinkWithOverlappingPayloadTypesIfDifferentMid) {
193 const std::string mid1 = "v";
194 const std::string mid2 = "a";
195 constexpr uint8_t pt1 = 30;
196 constexpr uint8_t pt2 = 31;
197 constexpr uint8_t pt3 = 32;
198
Tomas Gunnarsson8a5ac162022-01-03 14:16:46199 RtpDemuxerCriteria pt1_pt2(mid1);
200 pt1_pt2.payload_types() = {pt1, pt2};
Steve Anton53c7ba62017-08-18 17:05:47201 MockRtpPacketSink sink1;
202 AddSink(pt1_pt2, &sink1);
203
Tomas Gunnarsson8a5ac162022-01-03 14:16:46204 RtpDemuxerCriteria pt1_pt3(mid2);
205 pt1_pt3.payload_types() = {pt1, pt3};
Steve Anton53c7ba62017-08-18 17:05:47206 MockRtpPacketSink sink2;
207 EXPECT_TRUE(AddSink(pt1_pt3, &sink2));
208}
209
210TEST_F(RtpDemuxerTest, RejectAddSinkForSameMidOnly) {
211 const std::string mid = "mid";
212
213 MockRtpPacketSink sink;
214 AddSinkOnlyMid(mid, &sink);
215 EXPECT_FALSE(AddSinkOnlyMid(mid, &sink));
216}
217
218TEST_F(RtpDemuxerTest, RejectAddSinkForSameMidRsid) {
219 const std::string mid = "v";
220 const std::string rsid = "1";
221
222 MockRtpPacketSink sink1;
223 AddSinkBothMidRsid(mid, rsid, &sink1);
224
225 MockRtpPacketSink sink2;
226 EXPECT_FALSE(AddSinkBothMidRsid(mid, rsid, &sink2));
227}
228
229TEST_F(RtpDemuxerTest, RejectAddSinkForConflictingMidAndMidRsid) {
230 const std::string mid = "v";
231 const std::string rsid = "1";
232
233 MockRtpPacketSink mid_sink;
234 AddSinkOnlyMid(mid, &mid_sink);
235
236 // This sink would never get any packets routed to it because the above sink
237 // would receive them all.
238 MockRtpPacketSink mid_rsid_sink;
239 EXPECT_FALSE(AddSinkBothMidRsid(mid, rsid, &mid_rsid_sink));
240}
241
242TEST_F(RtpDemuxerTest, RejectAddSinkForConflictingMidRsidAndMid) {
243 const std::string mid = "v";
244 const std::string rsid = "";
245
246 MockRtpPacketSink mid_rsid_sink;
247 AddSinkBothMidRsid(mid, rsid, &mid_rsid_sink);
248
249 // This sink would shadow the above sink.
250 MockRtpPacketSink mid_sink;
251 EXPECT_FALSE(AddSinkOnlyMid(mid, &mid_sink));
252}
253
254TEST_F(RtpDemuxerTest, AddSinkFailsIfCalledForTwoSinksWithSameSsrc) {
255 MockRtpPacketSink sink_a;
256 MockRtpPacketSink sink_b;
257 constexpr uint32_t ssrc = 1;
258 ASSERT_TRUE(AddSinkOnlySsrc(ssrc, &sink_a));
259
260 EXPECT_FALSE(AddSinkOnlySsrc(ssrc, &sink_b));
261}
262
263TEST_F(RtpDemuxerTest, AddSinkFailsIfCalledTwiceEvenIfSameSinkWithSameSsrc) {
264 MockRtpPacketSink sink;
265 constexpr uint32_t ssrc = 1;
266 ASSERT_TRUE(AddSinkOnlySsrc(ssrc, &sink));
267
268 EXPECT_FALSE(AddSinkOnlySsrc(ssrc, &sink));
269}
270
271// TODO(steveanton): Currently fails because payload type validation is not
272// complete in AddSink (see note in rtp_demuxer.cc).
273TEST_F(RtpDemuxerTest, DISABLED_RejectAddSinkForSamePayloadTypes) {
274 constexpr uint8_t pt1 = 30;
275 constexpr uint8_t pt2 = 31;
276
277 RtpDemuxerCriteria pt1_pt2;
Tomas Gunnarsson8a5ac162022-01-03 14:16:46278 pt1_pt2.payload_types() = {pt1, pt2};
Steve Anton53c7ba62017-08-18 17:05:47279 MockRtpPacketSink sink1;
280 AddSink(pt1_pt2, &sink1);
281
282 RtpDemuxerCriteria pt2_pt1;
Tomas Gunnarsson8a5ac162022-01-03 14:16:46283 pt2_pt1.payload_types() = {pt2, pt1};
Steve Anton53c7ba62017-08-18 17:05:47284 MockRtpPacketSink sink2;
285 EXPECT_FALSE(AddSink(pt2_pt1, &sink2));
286}
287
288// Routing Tests
289
Steve Anton9e0c7422017-08-18 01:59:47290TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkBySsrc) {
eladalond0244c22017-06-08 11:19:13291 constexpr uint32_t ssrcs[] = {101, 202, 303};
292 MockRtpPacketSink sinks[arraysize(ssrcs)];
293 for (size_t i = 0; i < arraysize(ssrcs); i++) {
Steve Anton9e0c7422017-08-18 01:59:47294 AddSinkOnlySsrc(ssrcs[i], &sinks[i]);
eladalond0244c22017-06-08 11:19:13295 }
296
297 for (size_t i = 0; i < arraysize(ssrcs); i++) {
Steve Anton9e0c7422017-08-18 01:59:47298 auto packet = CreatePacketWithSsrc(ssrcs[i]);
eladalond0244c22017-06-08 11:19:13299 EXPECT_CALL(sinks[i], OnRtpPacket(SamePacketAs(*packet))).Times(1);
Steve Anton9e0c7422017-08-18 01:59:47300 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalon760a0762017-05-31 16:12:25301 }
302}
303
Steve Anton9e0c7422017-08-18 01:59:47304TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByRsid) {
eladalond0244c22017-06-08 11:19:13305 const std::string rsids[] = {"a", "b", "c"};
306 MockRtpPacketSink sinks[arraysize(rsids)];
307 for (size_t i = 0; i < arraysize(rsids); i++) {
Steve Anton9e0c7422017-08-18 01:59:47308 AddSinkOnlyRsid(rsids[i], &sinks[i]);
eladalond0244c22017-06-08 11:19:13309 }
310
311 for (size_t i = 0; i < arraysize(rsids); i++) {
Yves Gerey665174f2018-06-19 13:03:05312 auto packet =
313 CreatePacketWithSsrcRsid(rtc::checked_cast<uint32_t>(i), rsids[i]);
eladalond0244c22017-06-08 11:19:13314 EXPECT_CALL(sinks[i], OnRtpPacket(SamePacketAs(*packet))).Times(1);
Steve Anton9e0c7422017-08-18 01:59:47315 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 11:19:13316 }
317}
318
Steve Anton53c7ba62017-08-18 17:05:47319TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByMid) {
320 const std::string mids[] = {"a", "v", "s"};
321 MockRtpPacketSink sinks[arraysize(mids)];
322 for (size_t i = 0; i < arraysize(mids); i++) {
323 AddSinkOnlyMid(mids[i], &sinks[i]);
324 }
325
326 for (size_t i = 0; i < arraysize(mids); i++) {
Yves Gerey665174f2018-06-19 13:03:05327 auto packet =
328 CreatePacketWithSsrcMid(rtc::checked_cast<uint32_t>(i), mids[i]);
Steve Anton53c7ba62017-08-18 17:05:47329 EXPECT_CALL(sinks[i], OnRtpPacket(SamePacketAs(*packet))).Times(1);
330 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
331 }
332}
333
334TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByMidAndRsid) {
335 const std::string mid = "v";
336 const std::string rsid = "1";
337 constexpr uint32_t ssrc = 10;
338
339 MockRtpPacketSink sink;
340 AddSinkBothMidRsid(mid, rsid, &sink);
341
342 auto packet = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
343 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
344 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
345}
346
347TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByRepairedRsid) {
348 const std::string rrid = "1";
349 constexpr uint32_t ssrc = 10;
350
351 MockRtpPacketSink sink;
352 AddSinkOnlyRsid(rrid, &sink);
353
354 auto packet_with_rrid = CreatePacketWithSsrcRrid(ssrc, rrid);
355 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_rrid))).Times(1);
356 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_rrid));
357}
358
359TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByPayloadType) {
360 constexpr uint32_t ssrc = 10;
361 constexpr uint8_t payload_type = 30;
362
363 MockRtpPacketSink sink;
364 RtpDemuxerCriteria criteria;
Tomas Gunnarsson8a5ac162022-01-03 14:16:46365 criteria.payload_types() = {payload_type};
Steve Anton53c7ba62017-08-18 17:05:47366 AddSink(criteria, &sink);
367
368 auto packet = CreatePacketWithSsrc(ssrc);
369 packet->SetPayloadType(payload_type);
370 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
371 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
372}
373
Steve Anton9e0c7422017-08-18 01:59:47374TEST_F(RtpDemuxerTest, PacketsDeliveredInRightOrder) {
eladalona52722f2017-06-26 18:23:54375 constexpr uint32_t ssrc = 101;
376 MockRtpPacketSink sink;
Steve Anton9e0c7422017-08-18 01:59:47377 AddSinkOnlySsrc(ssrc, &sink);
eladalond0244c22017-06-08 11:19:13378
379 std::unique_ptr<RtpPacketReceived> packets[5];
380 for (size_t i = 0; i < arraysize(packets); i++) {
Steve Anton9e0c7422017-08-18 01:59:47381 packets[i] = CreatePacketWithSsrc(ssrc);
oprypin0826fb22017-08-22 20:57:48382 packets[i]->SetSequenceNumber(rtc::checked_cast<uint16_t>(i));
eladalond0244c22017-06-08 11:19:13383 }
384
385 InSequence sequence;
386 for (const auto& packet : packets) {
eladalona52722f2017-06-26 18:23:54387 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
eladalond0244c22017-06-08 11:19:13388 }
389
390 for (const auto& packet : packets) {
Steve Anton9e0c7422017-08-18 01:59:47391 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 11:19:13392 }
eladalond0244c22017-06-08 11:19:13393}
394
Steve Anton9e0c7422017-08-18 01:59:47395TEST_F(RtpDemuxerTest, SinkMappedToMultipleSsrcs) {
eladalond0244c22017-06-08 11:19:13396 constexpr uint32_t ssrcs[] = {404, 505, 606};
397 MockRtpPacketSink sink;
398 for (uint32_t ssrc : ssrcs) {
Steve Anton9e0c7422017-08-18 01:59:47399 AddSinkOnlySsrc(ssrc, &sink);
eladalon760a0762017-05-31 16:12:25400 }
401
402 // The sink which is associated with multiple SSRCs gets the callback
403 // triggered for each of those SSRCs.
eladalond0244c22017-06-08 11:19:13404 for (uint32_t ssrc : ssrcs) {
Steve Anton9e0c7422017-08-18 01:59:47405 auto packet = CreatePacketWithSsrc(ssrc);
Steve Anton53c7ba62017-08-18 17:05:47406 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
Steve Anton9e0c7422017-08-18 01:59:47407 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalon760a0762017-05-31 16:12:25408 }
eladalon760a0762017-05-31 16:12:25409}
410
Steve Anton9e0c7422017-08-18 01:59:47411TEST_F(RtpDemuxerTest, NoCallbackOnSsrcSinkRemovedBeforeFirstPacket) {
eladalond0244c22017-06-08 11:19:13412 constexpr uint32_t ssrc = 404;
413 MockRtpPacketSink sink;
Steve Anton9e0c7422017-08-18 01:59:47414 AddSinkOnlySsrc(ssrc, &sink);
eladalond0244c22017-06-08 11:19:13415
Steve Anton9e0c7422017-08-18 01:59:47416 ASSERT_TRUE(RemoveSink(&sink));
eladalond0244c22017-06-08 11:19:13417
418 // The removed sink does not get callbacks.
Steve Anton9e0c7422017-08-18 01:59:47419 auto packet = CreatePacketWithSsrc(ssrc);
eladalond0244c22017-06-08 11:19:13420 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0); // Not called.
Steve Anton9e0c7422017-08-18 01:59:47421 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 11:19:13422}
423
Steve Anton9e0c7422017-08-18 01:59:47424TEST_F(RtpDemuxerTest, NoCallbackOnSsrcSinkRemovedAfterFirstPacket) {
eladalond0244c22017-06-08 11:19:13425 constexpr uint32_t ssrc = 404;
426 NiceMock<MockRtpPacketSink> sink;
Steve Anton9e0c7422017-08-18 01:59:47427 AddSinkOnlySsrc(ssrc, &sink);
eladalond0244c22017-06-08 11:19:13428
429 InSequence sequence;
Steve Anton9e0c7422017-08-18 01:59:47430 for (size_t i = 0; i < 10; i++) {
431 ASSERT_TRUE(demuxer_.OnRtpPacket(*CreatePacketWithSsrc(ssrc)));
eladalon760a0762017-05-31 16:12:25432 }
433
Steve Anton9e0c7422017-08-18 01:59:47434 ASSERT_TRUE(RemoveSink(&sink));
eladalon760a0762017-05-31 16:12:25435
eladalond0244c22017-06-08 11:19:13436 // The removed sink does not get callbacks.
Steve Anton9e0c7422017-08-18 01:59:47437 auto packet = CreatePacketWithSsrc(ssrc);
eladalond0244c22017-06-08 11:19:13438 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0); // Not called.
Steve Anton9e0c7422017-08-18 01:59:47439 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 11:19:13440}
441
eladalon5daecca2017-08-04 13:34:54442// An SSRC may only be mapped to a single sink. However, since configuration
443// of this associations might come from the network, we need to fail gracefully.
Steve Anton9e0c7422017-08-18 01:59:47444TEST_F(RtpDemuxerTest, OnlyOneSinkPerSsrcGetsOnRtpPacketTriggered) {
eladalon5daecca2017-08-04 13:34:54445 MockRtpPacketSink sinks[3];
446 constexpr uint32_t ssrc = 404;
Steve Anton9e0c7422017-08-18 01:59:47447 ASSERT_TRUE(AddSinkOnlySsrc(ssrc, &sinks[0]));
448 ASSERT_FALSE(AddSinkOnlySsrc(ssrc, &sinks[1]));
449 ASSERT_FALSE(AddSinkOnlySsrc(ssrc, &sinks[2]));
eladalon5daecca2017-08-04 13:34:54450
451 // The first sink associated with the SSRC remains active; other sinks
452 // were not really added, and so do not get OnRtpPacket() called.
Steve Anton9e0c7422017-08-18 01:59:47453 auto packet = CreatePacketWithSsrc(ssrc);
eladalon5daecca2017-08-04 13:34:54454 EXPECT_CALL(sinks[0], OnRtpPacket(SamePacketAs(*packet))).Times(1);
455 EXPECT_CALL(sinks[1], OnRtpPacket(_)).Times(0);
456 EXPECT_CALL(sinks[2], OnRtpPacket(_)).Times(0);
Steve Anton9e0c7422017-08-18 01:59:47457 ASSERT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalon5daecca2017-08-04 13:34:54458}
459
Steve Anton9e0c7422017-08-18 01:59:47460TEST_F(RtpDemuxerTest, NoRepeatedCallbackOnRepeatedAddSinkForSameSink) {
eladalond0244c22017-06-08 11:19:13461 constexpr uint32_t ssrc = 111;
462 MockRtpPacketSink sink;
463
Steve Anton9e0c7422017-08-18 01:59:47464 ASSERT_TRUE(AddSinkOnlySsrc(ssrc, &sink));
465 ASSERT_FALSE(AddSinkOnlySsrc(ssrc, &sink));
eladalond0244c22017-06-08 11:19:13466
Steve Anton9e0c7422017-08-18 01:59:47467 auto packet = CreatePacketWithSsrc(ssrc);
eladalond0244c22017-06-08 11:19:13468 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
Steve Anton9e0c7422017-08-18 01:59:47469 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 11:19:13470}
471
Steve Anton9e0c7422017-08-18 01:59:47472TEST_F(RtpDemuxerTest, RemoveSinkReturnsFalseForNeverAddedSink) {
eladalond0244c22017-06-08 11:19:13473 MockRtpPacketSink sink;
Steve Anton9e0c7422017-08-18 01:59:47474 EXPECT_FALSE(RemoveSink(&sink));
eladalond0244c22017-06-08 11:19:13475}
476
Steve Anton9e0c7422017-08-18 01:59:47477TEST_F(RtpDemuxerTest, RemoveSinkReturnsTrueForPreviouslyAddedSsrcSink) {
eladalond0244c22017-06-08 11:19:13478 constexpr uint32_t ssrc = 101;
479 MockRtpPacketSink sink;
Steve Anton9e0c7422017-08-18 01:59:47480 AddSinkOnlySsrc(ssrc, &sink);
eladalond0244c22017-06-08 11:19:13481
Steve Anton9e0c7422017-08-18 01:59:47482 EXPECT_TRUE(RemoveSink(&sink));
eladalond0244c22017-06-08 11:19:13483}
484
Steve Anton9e0c7422017-08-18 01:59:47485TEST_F(RtpDemuxerTest,
486 RemoveSinkReturnsTrueForUnresolvedPreviouslyAddedRsidSink) {
eladalond0244c22017-06-08 11:19:13487 const std::string rsid = "a";
488 MockRtpPacketSink sink;
Steve Anton9e0c7422017-08-18 01:59:47489 AddSinkOnlyRsid(rsid, &sink);
eladalond0244c22017-06-08 11:19:13490
Steve Anton9e0c7422017-08-18 01:59:47491 EXPECT_TRUE(RemoveSink(&sink));
eladalond0244c22017-06-08 11:19:13492}
493
Steve Anton9e0c7422017-08-18 01:59:47494TEST_F(RtpDemuxerTest,
495 RemoveSinkReturnsTrueForResolvedPreviouslyAddedRsidSink) {
eladalond0244c22017-06-08 11:19:13496 const std::string rsid = "a";
497 constexpr uint32_t ssrc = 101;
498 NiceMock<MockRtpPacketSink> sink;
Steve Anton9e0c7422017-08-18 01:59:47499 AddSinkOnlyRsid(rsid, &sink);
500 ASSERT_TRUE(demuxer_.OnRtpPacket(*CreatePacketWithSsrcRsid(ssrc, rsid)));
eladalond0244c22017-06-08 11:19:13501
Steve Anton9e0c7422017-08-18 01:59:47502 EXPECT_TRUE(RemoveSink(&sink));
eladalond0244c22017-06-08 11:19:13503}
504
Steve Anton53c7ba62017-08-18 17:05:47505TEST_F(RtpDemuxerTest, RsidLearnedAndLaterPacketsDeliveredWithOnlySsrc) {
eladalond0244c22017-06-08 11:19:13506 MockRtpPacketSink sink;
507 const std::string rsid = "a";
Steve Anton9e0c7422017-08-18 01:59:47508 AddSinkOnlyRsid(rsid, &sink);
eladalond0244c22017-06-08 11:19:13509
510 // Create a sequence of RTP packets, where only the first one actually
511 // mentions the RSID.
512 std::unique_ptr<RtpPacketReceived> packets[5];
513 constexpr uint32_t rsid_ssrc = 111;
Steve Anton9e0c7422017-08-18 01:59:47514 packets[0] = CreatePacketWithSsrcRsid(rsid_ssrc, rsid);
eladalond0244c22017-06-08 11:19:13515 for (size_t i = 1; i < arraysize(packets); i++) {
Steve Anton9e0c7422017-08-18 01:59:47516 packets[i] = CreatePacketWithSsrc(rsid_ssrc);
eladalon760a0762017-05-31 16:12:25517 }
eladalond0244c22017-06-08 11:19:13518
519 // The first packet associates the RSID with the SSRC, thereby allowing the
520 // demuxer to correctly demux all of the packets.
521 InSequence sequence;
522 for (const auto& packet : packets) {
523 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
524 }
525 for (const auto& packet : packets) {
Steve Anton9e0c7422017-08-18 01:59:47526 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 11:19:13527 }
eladalond0244c22017-06-08 11:19:13528}
529
Steve Anton9e0c7422017-08-18 01:59:47530TEST_F(RtpDemuxerTest, NoCallbackOnRsidSinkRemovedBeforeFirstPacket) {
eladalond0244c22017-06-08 11:19:13531 MockRtpPacketSink sink;
532 const std::string rsid = "a";
Steve Anton9e0c7422017-08-18 01:59:47533 AddSinkOnlyRsid(rsid, &sink);
eladalond0244c22017-06-08 11:19:13534
535 // Sink removed - it won't get triggers even if packets with its RSID arrive.
Steve Anton9e0c7422017-08-18 01:59:47536 ASSERT_TRUE(RemoveSink(&sink));
eladalond0244c22017-06-08 11:19:13537
538 constexpr uint32_t ssrc = 111;
Steve Anton9e0c7422017-08-18 01:59:47539 auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
eladalond0244c22017-06-08 11:19:13540 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0); // Not called.
Steve Anton9e0c7422017-08-18 01:59:47541 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 11:19:13542}
543
Steve Anton9e0c7422017-08-18 01:59:47544TEST_F(RtpDemuxerTest, NoCallbackOnRsidSinkRemovedAfterFirstPacket) {
eladalond0244c22017-06-08 11:19:13545 NiceMock<MockRtpPacketSink> sink;
546 const std::string rsid = "a";
Steve Anton9e0c7422017-08-18 01:59:47547 AddSinkOnlyRsid(rsid, &sink);
eladalond0244c22017-06-08 11:19:13548
549 InSequence sequence;
550 constexpr uint32_t ssrc = 111;
Steve Anton9e0c7422017-08-18 01:59:47551 for (size_t i = 0; i < 10; i++) {
552 auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
553 ASSERT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 11:19:13554 }
555
556 // Sink removed - it won't get triggers even if packets with its RSID arrive.
Steve Anton9e0c7422017-08-18 01:59:47557 ASSERT_TRUE(RemoveSink(&sink));
eladalond0244c22017-06-08 11:19:13558
Steve Anton9e0c7422017-08-18 01:59:47559 auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
eladalond0244c22017-06-08 11:19:13560 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0); // Not called.
Steve Anton9e0c7422017-08-18 01:59:47561 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 11:19:13562}
563
Steve Anton53c7ba62017-08-18 17:05:47564TEST_F(RtpDemuxerTest, NoCallbackOnMidSinkRemovedBeforeFirstPacket) {
565 const std::string mid = "v";
566 constexpr uint32_t ssrc = 10;
567
568 MockRtpPacketSink sink;
569 AddSinkOnlyMid(mid, &sink);
570 RemoveSink(&sink);
571
572 auto packet = CreatePacketWithSsrcMid(ssrc, mid);
573 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
574 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
575}
576
577TEST_F(RtpDemuxerTest, NoCallbackOnMidSinkRemovedAfterFirstPacket) {
578 const std::string mid = "v";
579 constexpr uint32_t ssrc = 10;
580
581 NiceMock<MockRtpPacketSink> sink;
582 AddSinkOnlyMid(mid, &sink);
583
584 auto p1 = CreatePacketWithSsrcMid(ssrc, mid);
585 demuxer_.OnRtpPacket(*p1);
586
587 RemoveSink(&sink);
588
589 auto p2 = CreatePacketWithSsrcMid(ssrc, mid);
590 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
591 EXPECT_FALSE(demuxer_.OnRtpPacket(*p2));
592}
593
594TEST_F(RtpDemuxerTest, NoCallbackOnMidRsidSinkRemovedAfterFirstPacket) {
595 const std::string mid = "v";
596 const std::string rsid = "1";
597 constexpr uint32_t ssrc = 10;
598
599 NiceMock<MockRtpPacketSink> sink;
600 AddSinkBothMidRsid(mid, rsid, &sink);
601
602 auto p1 = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
603 demuxer_.OnRtpPacket(*p1);
604
605 RemoveSink(&sink);
606
607 auto p2 = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
608 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
609 EXPECT_FALSE(demuxer_.OnRtpPacket(*p2));
610}
611
eladalond0244c22017-06-08 11:19:13612// The RSID to SSRC mapping should be one-to-one. If we end up receiving
613// two (or more) packets with the same SSRC, but different RSIDs, we guarantee
Steve Anton53c7ba62017-08-18 17:05:47614// delivery to one of them but not both.
Steve Anton9e0c7422017-08-18 01:59:47615TEST_F(RtpDemuxerTest, FirstSsrcAssociatedWithAnRsidIsNotForgotten) {
eladalond0244c22017-06-08 11:19:13616 // Each sink has a distinct RSID.
617 MockRtpPacketSink sink_a;
618 const std::string rsid_a = "a";
Steve Anton9e0c7422017-08-18 01:59:47619 AddSinkOnlyRsid(rsid_a, &sink_a);
eladalond0244c22017-06-08 11:19:13620
621 MockRtpPacketSink sink_b;
622 const std::string rsid_b = "b";
Steve Anton9e0c7422017-08-18 01:59:47623 AddSinkOnlyRsid(rsid_b, &sink_b);
eladalond0244c22017-06-08 11:19:13624
625 InSequence sequence; // Verify that the order of delivery is unchanged.
626
627 constexpr uint32_t shared_ssrc = 100;
628
Artem Titovea240272021-07-26 10:40:21629 // First a packet with `rsid_a` is received, and `sink_a` is associated with
eladalond0244c22017-06-08 11:19:13630 // its SSRC.
Steve Anton9e0c7422017-08-18 01:59:47631 auto packet_a = CreatePacketWithSsrcRsid(shared_ssrc, rsid_a);
eladalond0244c22017-06-08 11:19:13632 EXPECT_CALL(sink_a, OnRtpPacket(SamePacketAs(*packet_a))).Times(1);
Steve Anton9e0c7422017-08-18 01:59:47633 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_a));
eladalond0244c22017-06-08 11:19:13634
Artem Titovea240272021-07-26 10:40:21635 // Second, a packet with `rsid_b` is received. We guarantee that `sink_b`
Steve Anton53c7ba62017-08-18 17:05:47636 // receives it.
Steve Anton9e0c7422017-08-18 01:59:47637 auto packet_b = CreatePacketWithSsrcRsid(shared_ssrc, rsid_b);
Steve Anton53c7ba62017-08-18 17:05:47638 EXPECT_CALL(sink_a, OnRtpPacket(_)).Times(0);
639 EXPECT_CALL(sink_b, OnRtpPacket(SamePacketAs(*packet_b))).Times(1);
Steve Anton9e0c7422017-08-18 01:59:47640 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_b));
eladalond0244c22017-06-08 11:19:13641
642 // Known edge-case; adding a new RSID association makes us re-examine all
Artem Titovea240272021-07-26 10:40:21643 // SSRCs. `sink_b` may or may not be associated with the SSRC now; we make
Steve Anton53c7ba62017-08-18 17:05:47644 // no promises on that. However, since the RSID is specified and it cannot be
645 // found the packet should be dropped.
eladalon9addbeb2017-06-30 13:26:54646 MockRtpPacketSink sink_c;
647 const std::string rsid_c = "c";
648 constexpr uint32_t some_other_ssrc = shared_ssrc + 1;
Steve Anton9e0c7422017-08-18 01:59:47649 AddSinkOnlySsrc(some_other_ssrc, &sink_c);
Steve Anton53c7ba62017-08-18 17:05:47650
651 auto packet_c = CreatePacketWithSsrcMid(shared_ssrc, rsid_c);
652 EXPECT_CALL(sink_a, OnRtpPacket(_)).Times(0);
653 EXPECT_CALL(sink_b, OnRtpPacket(_)).Times(0);
654 EXPECT_CALL(sink_c, OnRtpPacket(_)).Times(0);
655 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet_c));
eladalond0244c22017-06-08 11:19:13656}
657
Steve Anton9e0c7422017-08-18 01:59:47658TEST_F(RtpDemuxerTest, MultipleRsidsOnSameSink) {
eladalond0244c22017-06-08 11:19:13659 MockRtpPacketSink sink;
660 const std::string rsids[] = {"a", "b", "c"};
661
662 for (const std::string& rsid : rsids) {
Steve Anton9e0c7422017-08-18 01:59:47663 AddSinkOnlyRsid(rsid, &sink);
eladalond0244c22017-06-08 11:19:13664 }
665
666 InSequence sequence;
667 for (size_t i = 0; i < arraysize(rsids); i++) {
668 // Assign different SSRCs and sequence numbers to all packets.
669 const uint32_t ssrc = 1000 + static_cast<uint32_t>(i);
Steve Anton53c7ba62017-08-18 17:05:47670 const uint16_t sequence_number = 50 + static_cast<uint16_t>(i);
Steve Anton9e0c7422017-08-18 01:59:47671 auto packet = CreatePacketWithSsrcRsid(ssrc, rsids[i]);
Steve Anton53c7ba62017-08-18 17:05:47672 packet->SetSequenceNumber(sequence_number);
eladalond0244c22017-06-08 11:19:13673 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
Steve Anton9e0c7422017-08-18 01:59:47674 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 11:19:13675 }
eladalond0244c22017-06-08 11:19:13676}
677
Steve Anton53c7ba62017-08-18 17:05:47678// RSIDs are given higher priority than SSRC because we believe senders are less
679// likely to mislabel packets with RSID than mislabel them with SSRCs.
Steve Anton9e0c7422017-08-18 01:59:47680TEST_F(RtpDemuxerTest, SinkWithBothRsidAndSsrcAssociations) {
Steve Anton53c7ba62017-08-18 17:05:47681 MockRtpPacketSink sink;
eladalond0244c22017-06-08 11:19:13682 constexpr uint32_t standalone_ssrc = 10101;
683 constexpr uint32_t rsid_ssrc = 20202;
Steve Anton53c7ba62017-08-18 17:05:47684 const std::string rsid = "1";
eladalond0244c22017-06-08 11:19:13685
Steve Anton9e0c7422017-08-18 01:59:47686 AddSinkOnlySsrc(standalone_ssrc, &sink);
687 AddSinkOnlyRsid(rsid, &sink);
eladalond0244c22017-06-08 11:19:13688
689 InSequence sequence;
690
Steve Anton9e0c7422017-08-18 01:59:47691 auto ssrc_packet = CreatePacketWithSsrc(standalone_ssrc);
eladalond0244c22017-06-08 11:19:13692 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*ssrc_packet))).Times(1);
Steve Anton9e0c7422017-08-18 01:59:47693 EXPECT_TRUE(demuxer_.OnRtpPacket(*ssrc_packet));
eladalond0244c22017-06-08 11:19:13694
Steve Anton9e0c7422017-08-18 01:59:47695 auto rsid_packet = CreatePacketWithSsrcRsid(rsid_ssrc, rsid);
eladalond0244c22017-06-08 11:19:13696 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*rsid_packet))).Times(1);
Steve Anton9e0c7422017-08-18 01:59:47697 EXPECT_TRUE(demuxer_.OnRtpPacket(*rsid_packet));
eladalond0244c22017-06-08 11:19:13698}
699
Steve Anton53c7ba62017-08-18 17:05:47700// Packets are always guaranteed to be routed to only one sink.
Steve Anton9e0c7422017-08-18 01:59:47701TEST_F(RtpDemuxerTest, AssociatingByRsidAndBySsrcCannotTriggerDoubleCall) {
eladalond0244c22017-06-08 11:19:13702 constexpr uint32_t ssrc = 10101;
eladalond0244c22017-06-08 11:19:13703 const std::string rsid = "a";
eladalond0244c22017-06-08 11:19:13704
Steve Anton9e0c7422017-08-18 01:59:47705 MockRtpPacketSink sink;
706 AddSinkOnlySsrc(ssrc, &sink);
707 AddSinkOnlyRsid(rsid, &sink);
708
709 auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
eladalond0244c22017-06-08 11:19:13710 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
Steve Anton9e0c7422017-08-18 01:59:47711 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalon760a0762017-05-31 16:12:25712}
713
Steve Anton53c7ba62017-08-18 17:05:47714// If one sink is associated with SSRC x, and another sink with RSID y, then if
715// we receive a packet with both SSRC x and RSID y, route that to only the sink
716// for RSID y since we believe RSID tags to be more trustworthy than signaled
717// SSRCs.
Steve Anton9e0c7422017-08-18 01:59:47718TEST_F(RtpDemuxerTest,
Steve Anton53c7ba62017-08-18 17:05:47719 PacketFittingBothRsidSinkAndSsrcSinkGivenOnlyToRsidSink) {
eladalon5daecca2017-08-04 13:34:54720 constexpr uint32_t ssrc = 111;
721 MockRtpPacketSink ssrc_sink;
Steve Anton9e0c7422017-08-18 01:59:47722 AddSinkOnlySsrc(ssrc, &ssrc_sink);
eladalon5daecca2017-08-04 13:34:54723
724 const std::string rsid = "a";
725 MockRtpPacketSink rsid_sink;
Steve Anton9e0c7422017-08-18 01:59:47726 AddSinkOnlyRsid(rsid, &rsid_sink);
eladalon5daecca2017-08-04 13:34:54727
Steve Anton9e0c7422017-08-18 01:59:47728 auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
eladalon5daecca2017-08-04 13:34:54729
Steve Anton53c7ba62017-08-18 17:05:47730 EXPECT_CALL(ssrc_sink, OnRtpPacket(_)).Times(0);
731 EXPECT_CALL(rsid_sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
732 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalon5daecca2017-08-04 13:34:54733}
734
735// We're not expecting RSIDs to be resolved to SSRCs which were previously
736// mapped to sinks, and make no guarantees except for graceful handling.
Steve Anton9e0c7422017-08-18 01:59:47737TEST_F(RtpDemuxerTest,
738 GracefullyHandleRsidBeingMappedToPrevouslyAssociatedSsrc) {
eladalon5daecca2017-08-04 13:34:54739 constexpr uint32_t ssrc = 111;
740 NiceMock<MockRtpPacketSink> ssrc_sink;
Steve Anton9e0c7422017-08-18 01:59:47741 AddSinkOnlySsrc(ssrc, &ssrc_sink);
eladalon5daecca2017-08-04 13:34:54742
743 const std::string rsid = "a";
Steve Anton53c7ba62017-08-18 17:05:47744 NiceMock<MockRtpPacketSink> rsid_sink;
Steve Anton9e0c7422017-08-18 01:59:47745 AddSinkOnlyRsid(rsid, &rsid_sink);
eladalon5daecca2017-08-04 13:34:54746
eladalon5daecca2017-08-04 13:34:54747 // The SSRC was mapped to an SSRC sink, but was even active (packets flowed
748 // over it).
Steve Anton9e0c7422017-08-18 01:59:47749 auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
750 demuxer_.OnRtpPacket(*packet);
eladalon5daecca2017-08-04 13:34:54751
752 // If the SSRC sink is ever removed, the RSID sink *might* receive indications
753 // of packets, and observers *might* be informed. Only graceful handling
754 // is guaranteed.
Steve Anton9e0c7422017-08-18 01:59:47755 RemoveSink(&ssrc_sink);
eladalon5daecca2017-08-04 13:34:54756 EXPECT_CALL(rsid_sink, OnRtpPacket(SamePacketAs(*packet))).Times(AtLeast(0));
Steve Anton53c7ba62017-08-18 17:05:47757 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
758}
759
760// Tests that when one MID sink is configured, packets that include the MID
761// extension will get routed to that sink and any packets that use the same
762// SSRC as one of those packets later will also get routed to the sink, even
763// if a new SSRC is introduced for the same MID.
764TEST_F(RtpDemuxerTest, RoutedByMidWhenSsrcAdded) {
765 const std::string mid = "v";
766 NiceMock<MockRtpPacketSink> sink;
767 AddSinkOnlyMid(mid, &sink);
768
769 constexpr uint32_t ssrc1 = 10;
770 constexpr uint32_t ssrc2 = 11;
771
772 auto packet_ssrc1_mid = CreatePacketWithSsrcMid(ssrc1, mid);
773 demuxer_.OnRtpPacket(*packet_ssrc1_mid);
774 auto packet_ssrc2_mid = CreatePacketWithSsrcMid(ssrc2, mid);
775 demuxer_.OnRtpPacket(*packet_ssrc2_mid);
776
777 auto packet_ssrc1_only = CreatePacketWithSsrc(ssrc1);
778 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_ssrc1_only))).Times(1);
779 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc1_only));
780
781 auto packet_ssrc2_only = CreatePacketWithSsrc(ssrc2);
782 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_ssrc2_only))).Times(1);
783 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc2_only));
784}
785
786TEST_F(RtpDemuxerTest, DontLearnMidSsrcBindingBeforeSinkAdded) {
787 const std::string mid = "v";
788 constexpr uint32_t ssrc = 10;
789
790 auto packet_ssrc_mid = CreatePacketWithSsrcMid(ssrc, mid);
791 ASSERT_FALSE(demuxer_.OnRtpPacket(*packet_ssrc_mid));
792
793 MockRtpPacketSink sink;
794 AddSinkOnlyMid(mid, &sink);
795
796 auto packet_ssrc_only = CreatePacketWithSsrc(ssrc);
797 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
798 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet_ssrc_only));
799}
800
801TEST_F(RtpDemuxerTest, DontForgetMidSsrcBindingWhenSinkRemoved) {
802 const std::string mid = "v";
803 constexpr uint32_t ssrc = 10;
804
805 NiceMock<MockRtpPacketSink> sink1;
806 AddSinkOnlyMid(mid, &sink1);
807
808 auto packet_with_mid = CreatePacketWithSsrcMid(ssrc, mid);
809 demuxer_.OnRtpPacket(*packet_with_mid);
810
811 RemoveSink(&sink1);
812
813 MockRtpPacketSink sink2;
814 AddSinkOnlyMid(mid, &sink2);
815
816 auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
817 EXPECT_CALL(sink2, OnRtpPacket(SamePacketAs(*packet_with_ssrc)));
818 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
819}
820
821// If a sink is added with only a MID, then any packet with that MID no matter
822// the RSID should be routed to that sink.
823TEST_F(RtpDemuxerTest, RoutedByMidWithAnyRsid) {
824 const std::string mid = "v";
825 const std::string rsid1 = "1";
826 const std::string rsid2 = "2";
827 constexpr uint32_t ssrc1 = 10;
828 constexpr uint32_t ssrc2 = 11;
829
830 MockRtpPacketSink sink;
831 AddSinkOnlyMid(mid, &sink);
832
833 InSequence sequence;
834
835 auto packet_ssrc1_rsid1 = CreatePacketWithSsrcMidRsid(ssrc1, mid, rsid1);
836 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_ssrc1_rsid1))).Times(1);
837 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc1_rsid1));
838
839 auto packet_ssrc2_rsid2 = CreatePacketWithSsrcMidRsid(ssrc2, mid, rsid2);
840 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_ssrc2_rsid2))).Times(1);
841 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc2_rsid2));
842}
843
844// These two tests verify that for a sink added with a MID, RSID pair, if the
845// MID and RSID are learned in separate packets (e.g., because the header
846// extensions are sent separately), then a later packet with just SSRC will get
847// routed to that sink.
848// The first test checks that the functionality works when MID is learned first.
849// The second test checks that the functionality works when RSID is learned
850// first.
851TEST_F(RtpDemuxerTest, LearnMidThenRsidSeparatelyAndRouteBySsrc) {
852 const std::string mid = "v";
853 const std::string rsid = "1";
854 constexpr uint32_t ssrc = 10;
855
856 NiceMock<MockRtpPacketSink> sink;
857 AddSinkBothMidRsid(mid, rsid, &sink);
858
859 auto packet_with_mid = CreatePacketWithSsrcMid(ssrc, mid);
860 ASSERT_FALSE(demuxer_.OnRtpPacket(*packet_with_mid));
861
862 auto packet_with_rsid = CreatePacketWithSsrcRsid(ssrc, rsid);
863 ASSERT_TRUE(demuxer_.OnRtpPacket(*packet_with_rsid));
864
865 auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
866 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_ssrc))).Times(1);
867 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
868}
869
870TEST_F(RtpDemuxerTest, LearnRsidThenMidSeparatelyAndRouteBySsrc) {
871 const std::string mid = "v";
872 const std::string rsid = "1";
873 constexpr uint32_t ssrc = 10;
874
875 NiceMock<MockRtpPacketSink> sink;
876 AddSinkBothMidRsid(mid, rsid, &sink);
877
878 auto packet_with_rsid = CreatePacketWithSsrcRsid(ssrc, rsid);
879 ASSERT_FALSE(demuxer_.OnRtpPacket(*packet_with_rsid));
880
881 auto packet_with_mid = CreatePacketWithSsrcMid(ssrc, mid);
882 ASSERT_TRUE(demuxer_.OnRtpPacket(*packet_with_mid));
883
884 auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
885 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_ssrc))).Times(1);
886 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
887}
888
889TEST_F(RtpDemuxerTest, DontLearnMidRsidBindingBeforeSinkAdded) {
890 const std::string mid = "v";
891 const std::string rsid = "1";
892 constexpr uint32_t ssrc = 10;
893
894 auto packet_with_both = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
895 ASSERT_FALSE(demuxer_.OnRtpPacket(*packet_with_both));
896
897 MockRtpPacketSink sink;
898 AddSinkBothMidRsid(mid, rsid, &sink);
899
900 auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
901 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
902 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet_with_ssrc));
903}
904
905TEST_F(RtpDemuxerTest, DontForgetMidRsidBindingWhenSinkRemoved) {
906 const std::string mid = "v";
907 const std::string rsid = "1";
908 constexpr uint32_t ssrc = 10;
909
910 NiceMock<MockRtpPacketSink> sink1;
911 AddSinkBothMidRsid(mid, rsid, &sink1);
912
913 auto packet_with_both = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
914 demuxer_.OnRtpPacket(*packet_with_both);
915
916 RemoveSink(&sink1);
917
918 MockRtpPacketSink sink2;
919 AddSinkBothMidRsid(mid, rsid, &sink2);
920
921 auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
922 EXPECT_CALL(sink2, OnRtpPacket(SamePacketAs(*packet_with_ssrc)));
923 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
924}
925
926TEST_F(RtpDemuxerTest, LearnMidRsidBindingAfterSinkAdded) {
927 const std::string mid = "v";
928 const std::string rsid = "1";
929 constexpr uint32_t ssrc = 10;
930
931 NiceMock<MockRtpPacketSink> sink;
932 AddSinkBothMidRsid(mid, rsid, &sink);
933
934 auto packet_with_both = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
935 demuxer_.OnRtpPacket(*packet_with_both);
936
937 auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
938 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_ssrc)));
939 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
940}
941
942TEST_F(RtpDemuxerTest, DropByPayloadTypeIfNoSink) {
943 constexpr uint8_t payload_type = 30;
944 constexpr uint32_t ssrc = 10;
945
946 auto packet = CreatePacketWithSsrc(ssrc);
947 packet->SetPayloadType(payload_type);
948 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
949}
950
951// For legacy applications, it's possible for us to demux if the payload type is
952// unique. But if multiple sinks are registered with different MIDs and the same
953// payload types, then we cannot route a packet with just payload type because
954// it is ambiguous which sink it should be sent to.
955TEST_F(RtpDemuxerTest, DropByPayloadTypeIfAddedInMultipleSinks) {
956 const std::string mid1 = "v";
957 const std::string mid2 = "a";
958 constexpr uint8_t payload_type = 30;
959 constexpr uint32_t ssrc = 10;
960
Tomas Gunnarsson8a5ac162022-01-03 14:16:46961 RtpDemuxerCriteria mid1_pt(mid1);
962 mid1_pt.payload_types() = {payload_type};
Steve Anton53c7ba62017-08-18 17:05:47963 MockRtpPacketSink sink1;
964 AddSink(mid1_pt, &sink1);
965
Tomas Gunnarsson8a5ac162022-01-03 14:16:46966 RtpDemuxerCriteria mid2_pt(mid2);
967 mid2_pt.payload_types() = {payload_type};
Steve Anton53c7ba62017-08-18 17:05:47968 MockRtpPacketSink sink2;
969 AddSink(mid2_pt, &sink2);
970
971 auto packet = CreatePacketWithSsrc(ssrc);
972 packet->SetPayloadType(payload_type);
973
974 EXPECT_CALL(sink1, OnRtpPacket(_)).Times(0);
975 EXPECT_CALL(sink2, OnRtpPacket(_)).Times(0);
976 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
977}
978
979// If two sinks are added with different MIDs but the same payload types, then
980// we cannot demux on the payload type only unless one of the sinks is removed.
981TEST_F(RtpDemuxerTest, RoutedByPayloadTypeIfAmbiguousSinkRemoved) {
982 const std::string mid1 = "v";
983 const std::string mid2 = "a";
984 constexpr uint8_t payload_type = 30;
985 constexpr uint32_t ssrc = 10;
986
Tomas Gunnarsson8a5ac162022-01-03 14:16:46987 RtpDemuxerCriteria mid1_pt(mid1);
988 mid1_pt.payload_types().insert(payload_type);
Steve Anton53c7ba62017-08-18 17:05:47989 MockRtpPacketSink sink1;
990 AddSink(mid1_pt, &sink1);
991
Tomas Gunnarsson8a5ac162022-01-03 14:16:46992 RtpDemuxerCriteria mid2_pt(mid2);
993 mid2_pt.payload_types().insert(payload_type);
Steve Anton53c7ba62017-08-18 17:05:47994 MockRtpPacketSink sink2;
995 AddSink(mid2_pt, &sink2);
996
997 RemoveSink(&sink1);
998
999 auto packet = CreatePacketWithSsrc(ssrc);
1000 packet->SetPayloadType(payload_type);
1001
1002 EXPECT_CALL(sink1, OnRtpPacket(_)).Times(0);
1003 EXPECT_CALL(sink2, OnRtpPacket(SamePacketAs(*packet))).Times(1);
1004
1005 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
1006}
1007
1008TEST_F(RtpDemuxerTest, RoutedByPayloadTypeLatchesSsrc) {
1009 constexpr uint8_t payload_type = 30;
1010 constexpr uint32_t ssrc = 10;
1011
1012 RtpDemuxerCriteria pt;
Tomas Gunnarsson8a5ac162022-01-03 14:16:461013 pt.payload_types().insert(payload_type);
Steve Anton53c7ba62017-08-18 17:05:471014 NiceMock<MockRtpPacketSink> sink;
1015 AddSink(pt, &sink);
1016
1017 auto packet_with_pt = CreatePacketWithSsrc(ssrc);
1018 packet_with_pt->SetPayloadType(payload_type);
1019 ASSERT_TRUE(demuxer_.OnRtpPacket(*packet_with_pt));
1020
1021 auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
1022 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_ssrc))).Times(1);
1023 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
1024}
1025
1026// RSIDs are scoped within MID, so if two sinks are registered with the same
1027// RSIDs but different MIDs, then packets containing both extensions should be
1028// routed to the correct one.
1029TEST_F(RtpDemuxerTest, PacketWithSameRsidDifferentMidRoutedToProperSink) {
1030 const std::string mid1 = "mid1";
1031 const std::string mid2 = "mid2";
1032 const std::string rsid = "rsid";
1033 constexpr uint32_t ssrc1 = 10;
1034 constexpr uint32_t ssrc2 = 11;
1035
1036 NiceMock<MockRtpPacketSink> mid1_sink;
1037 AddSinkBothMidRsid(mid1, rsid, &mid1_sink);
1038
1039 MockRtpPacketSink mid2_sink;
1040 AddSinkBothMidRsid(mid2, rsid, &mid2_sink);
1041
1042 auto packet_mid1 = CreatePacketWithSsrcMidRsid(ssrc1, mid1, rsid);
1043 ASSERT_TRUE(demuxer_.OnRtpPacket(*packet_mid1));
1044
1045 auto packet_mid2 = CreatePacketWithSsrcMidRsid(ssrc2, mid2, rsid);
1046 EXPECT_CALL(mid2_sink, OnRtpPacket(SamePacketAs(*packet_mid2))).Times(1);
1047 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_mid2));
1048}
1049
1050// If a sink is first bound to a given SSRC by signaling but later a new sink is
1051// bound to a given MID by a later signaling, then when a packet arrives with
1052// both the SSRC and MID, then the signaled MID sink should take precedence.
1053TEST_F(RtpDemuxerTest, SignaledMidShouldOverwriteSignaledSsrc) {
1054 constexpr uint32_t ssrc = 11;
1055 const std::string mid = "mid";
1056
1057 MockRtpPacketSink ssrc_sink;
1058 AddSinkOnlySsrc(ssrc, &ssrc_sink);
1059
1060 MockRtpPacketSink mid_sink;
1061 AddSinkOnlyMid(mid, &mid_sink);
1062
1063 auto p = CreatePacketWithSsrcMid(ssrc, mid);
1064 EXPECT_CALL(ssrc_sink, OnRtpPacket(_)).Times(0);
1065 EXPECT_CALL(mid_sink, OnRtpPacket(SamePacketAs(*p))).Times(1);
1066 EXPECT_TRUE(demuxer_.OnRtpPacket(*p));
1067}
1068
1069// Extends the previous test to also ensure that later packets that do not
1070// specify MID are still routed to the MID sink rather than the overwritten SSRC
1071// sink.
1072TEST_F(RtpDemuxerTest, SignaledMidShouldOverwriteSignalledSsrcPersistent) {
1073 constexpr uint32_t ssrc = 11;
1074 const std::string mid = "mid";
1075
1076 MockRtpPacketSink ssrc_sink;
1077 AddSinkOnlySsrc(ssrc, &ssrc_sink);
1078
1079 NiceMock<MockRtpPacketSink> mid_sink;
1080 AddSinkOnlyMid(mid, &mid_sink);
1081
1082 EXPECT_CALL(ssrc_sink, OnRtpPacket(_)).Times(0);
1083
1084 auto packet_with_mid = CreatePacketWithSsrcMid(ssrc, mid);
1085 demuxer_.OnRtpPacket(*packet_with_mid);
1086
1087 auto packet_without_mid = CreatePacketWithSsrc(ssrc);
1088 EXPECT_CALL(mid_sink, OnRtpPacket(SamePacketAs(*packet_without_mid)))
1089 .Times(1);
1090 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_without_mid));
1091}
1092
1093TEST_F(RtpDemuxerTest, RouteByPayloadTypeMultipleMatch) {
1094 constexpr uint32_t ssrc = 10;
1095 constexpr uint8_t pt1 = 30;
1096 constexpr uint8_t pt2 = 31;
1097
1098 MockRtpPacketSink sink;
1099 RtpDemuxerCriteria criteria;
Tomas Gunnarsson8a5ac162022-01-03 14:16:461100 criteria.payload_types() = {pt1, pt2};
Steve Anton53c7ba62017-08-18 17:05:471101 AddSink(criteria, &sink);
1102
1103 auto packet_with_pt1 = CreatePacketWithSsrc(ssrc);
1104 packet_with_pt1->SetPayloadType(pt1);
1105 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_pt1)));
1106 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_pt1));
1107
1108 auto packet_with_pt2 = CreatePacketWithSsrc(ssrc);
1109 packet_with_pt2->SetPayloadType(pt2);
1110 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_pt2)));
1111 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_pt2));
1112}
1113
1114TEST_F(RtpDemuxerTest, DontDemuxOnMidAloneIfAddedWithRsid) {
1115 const std::string mid = "v";
1116 const std::string rsid = "1";
1117 constexpr uint32_t ssrc = 10;
1118
1119 MockRtpPacketSink sink;
1120 AddSinkBothMidRsid(mid, rsid, &sink);
1121
1122 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
1123
1124 auto packet = CreatePacketWithSsrcMid(ssrc, mid);
1125 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
1126}
1127
1128TEST_F(RtpDemuxerTest, DemuxBySsrcEvenWithMidAndRsid) {
1129 const std::string mid = "v";
1130 const std::string rsid = "1";
1131 constexpr uint32_t ssrc = 10;
1132
Tomas Gunnarsson8a5ac162022-01-03 14:16:461133 RtpDemuxerCriteria criteria(mid, rsid);
1134 criteria.ssrcs().insert(ssrc);
Steve Anton53c7ba62017-08-18 17:05:471135 MockRtpPacketSink sink;
1136 AddSink(criteria, &sink);
1137
1138 auto packet = CreatePacketWithSsrc(ssrc);
1139 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
1140 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
1141}
1142
1143// In slight deviation from the BUNDLE spec, if we match a sink according to
1144// SSRC, then we do not verify payload type against the criteria and defer to
1145// the sink to check that it is correct.
1146TEST_F(RtpDemuxerTest, DoNotCheckPayloadTypeIfMatchedByOtherCriteria) {
1147 constexpr uint32_t ssrc = 10;
1148 constexpr uint8_t payload_type = 30;
1149 constexpr uint8_t different_payload_type = payload_type + 1;
1150
1151 RtpDemuxerCriteria criteria;
Tomas Gunnarsson8a5ac162022-01-03 14:16:461152 criteria.ssrcs().insert(ssrc);
1153 criteria.payload_types().insert(payload_type);
Steve Anton53c7ba62017-08-18 17:05:471154 MockRtpPacketSink sink;
1155 AddSink(criteria, &sink);
1156
1157 auto packet = CreatePacketWithSsrc(ssrc);
1158 packet->SetPayloadType(different_payload_type);
1159 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
1160 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
1161}
1162
1163// If a repair packet includes an RSID it should be ignored and the packet
1164// should be routed by its RRID.
1165TEST_F(RtpDemuxerTest, PacketWithRsidAndRridRoutedByRrid) {
1166 const std::string rsid = "1";
1167 const std::string rrid = "1r";
1168 constexpr uint32_t ssrc = 10;
1169
1170 MockRtpPacketSink sink_rsid;
1171 AddSinkOnlyRsid(rsid, &sink_rsid);
1172
1173 MockRtpPacketSink sink_rrid;
1174 AddSinkOnlyRsid(rrid, &sink_rrid);
1175
1176 auto packet = CreatePacketWithSsrcRsidRrid(ssrc, rsid, rrid);
1177 EXPECT_CALL(sink_rsid, OnRtpPacket(_)).Times(0);
1178 EXPECT_CALL(sink_rrid, OnRtpPacket(SamePacketAs(*packet))).Times(1);
1179 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
1180}
1181
1182// Same test as above but checks that the latched SSRC routes to the RRID sink.
1183TEST_F(RtpDemuxerTest, PacketWithRsidAndRridLatchesSsrcToRrid) {
1184 const std::string rsid = "1";
1185 const std::string rrid = "1r";
1186 constexpr uint32_t ssrc = 10;
1187
1188 MockRtpPacketSink sink_rsid;
1189 AddSinkOnlyRsid(rsid, &sink_rsid);
1190
1191 NiceMock<MockRtpPacketSink> sink_rrid;
1192 AddSinkOnlyRsid(rrid, &sink_rrid);
1193
1194 auto packet_rsid_rrid = CreatePacketWithSsrcRsidRrid(ssrc, rsid, rrid);
1195 demuxer_.OnRtpPacket(*packet_rsid_rrid);
1196
1197 auto packet_ssrc_only = CreatePacketWithSsrc(ssrc);
1198 EXPECT_CALL(sink_rsid, OnRtpPacket(_)).Times(0);
1199 EXPECT_CALL(sink_rrid, OnRtpPacket(SamePacketAs(*packet_ssrc_only))).Times(1);
1200 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc_only));
1201}
1202
1203// Tests that a packet which includes MID and RSID is dropped and not routed by
1204// SSRC if the MID and RSID do not match an added sink.
1205TEST_F(RtpDemuxerTest, PacketWithMidAndUnknownRsidIsNotRoutedBySsrc) {
1206 constexpr uint32_t ssrc = 10;
1207 const std::string mid = "v";
1208 const std::string rsid = "1";
1209 const std::string wrong_rsid = "2";
1210
Tomas Gunnarsson8a5ac162022-01-03 14:16:461211 RtpDemuxerCriteria criteria(mid, rsid);
1212 criteria.ssrcs().insert(ssrc);
Steve Anton53c7ba62017-08-18 17:05:471213 MockRtpPacketSink sink;
1214 AddSink(criteria, &sink);
1215
1216 auto packet = CreatePacketWithSsrcMidRsid(ssrc, mid, wrong_rsid);
1217 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
1218 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
1219}
1220
1221// Tests that a packet which includes MID and RSID is dropped and not routed by
1222// payload type if the MID and RSID do not match an added sink.
1223TEST_F(RtpDemuxerTest, PacketWithMidAndUnknownRsidIsNotRoutedByPayloadType) {
1224 constexpr uint32_t ssrc = 10;
1225 const std::string mid = "v";
1226 const std::string rsid = "1";
1227 const std::string wrong_rsid = "2";
1228 constexpr uint8_t payload_type = 30;
1229
Tomas Gunnarsson8a5ac162022-01-03 14:16:461230 RtpDemuxerCriteria criteria(mid, rsid);
1231 criteria.payload_types().insert(payload_type);
Steve Anton53c7ba62017-08-18 17:05:471232 MockRtpPacketSink sink;
1233 AddSink(criteria, &sink);
1234
1235 auto packet = CreatePacketWithSsrcMidRsid(ssrc, mid, wrong_rsid);
1236 packet->SetPayloadType(payload_type);
1237 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
1238 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
1239}
1240
Tomas Gunnarsson8a5ac162022-01-03 14:16:461241TEST_F(RtpDemuxerTest, MidMustNotExceedMaximumLength) {
1242 MockRtpPacketSink sink1;
1243 std::string mid1(BaseRtpStringExtension::kMaxValueSizeBytes + 1, 'a');
1244 // Adding the sink should pass even though the supplied mid is too long.
1245 // The mid will be truncated though.
1246 EXPECT_TRUE(AddSinkOnlyMid(mid1, &sink1));
1247
1248 // Adding a second sink with a mid that matches the truncated mid that was
1249 // just added, should fail.
1250 MockRtpPacketSink sink2;
1251 std::string mid2(mid1.substr(0, BaseRtpStringExtension::kMaxValueSizeBytes));
1252 EXPECT_FALSE(AddSinkOnlyMid(mid2, &sink2));
1253 EXPECT_FALSE(RemoveSink(&sink2));
1254
1255 // Remove the original sink.
1256 EXPECT_TRUE(RemoveSink(&sink1));
1257}
1258
eladalon760a0762017-05-31 16:12:251259#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
Steve Anton53c7ba62017-08-18 17:05:471260
Tommi909f3a52020-05-18 14:47:561261TEST_F(RtpDemuxerDeathTest, CriteriaMustBeNonEmpty) {
eladalond0244c22017-06-08 11:19:131262 MockRtpPacketSink sink;
Steve Anton53c7ba62017-08-18 17:05:471263 RtpDemuxerCriteria criteria;
1264 EXPECT_DEATH(AddSink(criteria, &sink), "");
eladalond0244c22017-06-08 11:19:131265}
1266
Tommi909f3a52020-05-18 14:47:561267TEST_F(RtpDemuxerDeathTest, RsidMustBeAlphaNumeric) {
eladalond0244c22017-06-08 11:19:131268 MockRtpPacketSink sink;
Steve Anton9e0c7422017-08-18 01:59:471269 EXPECT_DEATH(AddSinkOnlyRsid("a_3", &sink), "");
eladalond0244c22017-06-08 11:19:131270}
1271
Tommi909f3a52020-05-18 14:47:561272TEST_F(RtpDemuxerDeathTest, MidMustBeToken) {
Steve Anton53c7ba62017-08-18 17:05:471273 MockRtpPacketSink sink;
Joachim Bauchd3b7ec22018-08-01 08:12:001274 EXPECT_DEATH(AddSinkOnlyMid("a(3)", &sink), "");
Steve Anton53c7ba62017-08-18 17:05:471275}
1276
Tommi909f3a52020-05-18 14:47:561277TEST_F(RtpDemuxerDeathTest, RsidMustNotExceedMaximumLength) {
eladalond0244c22017-06-08 11:19:131278 MockRtpPacketSink sink;
Niels Möllerd57efc12019-03-22 13:02:111279 std::string rsid(BaseRtpStringExtension::kMaxValueSizeBytes + 1, 'a');
Steve Anton9e0c7422017-08-18 01:59:471280 EXPECT_DEATH(AddSinkOnlyRsid(rsid, &sink), "");
eladalond0244c22017-06-08 11:19:131281}
1282
eladalon760a0762017-05-31 16:12:251283#endif
1284
1285} // namespace
1286} // namespace webrtc