blob: 2b394d3bffc2cee1a2558276c92e76bf5724c36f [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
715// If one sink is associated with SSRC x, and another sink with RSID y, then if
716// we receive a packet with both SSRC x and RSID y, route that to only the sink
717// for RSID y since we believe RSID tags to be more trustworthy than signaled
718// SSRCs.
Steve Anton9e0c7422017-08-18 01:59:47719TEST_F(RtpDemuxerTest,
Steve Anton53c7ba62017-08-18 17:05:47720 PacketFittingBothRsidSinkAndSsrcSinkGivenOnlyToRsidSink) {
eladalon5daecca2017-08-04 13:34:54721 constexpr uint32_t ssrc = 111;
722 MockRtpPacketSink ssrc_sink;
Steve Anton9e0c7422017-08-18 01:59:47723 AddSinkOnlySsrc(ssrc, &ssrc_sink);
eladalon5daecca2017-08-04 13:34:54724
725 const std::string rsid = "a";
726 MockRtpPacketSink rsid_sink;
Steve Anton9e0c7422017-08-18 01:59:47727 AddSinkOnlyRsid(rsid, &rsid_sink);
eladalon5daecca2017-08-04 13:34:54728
Steve Anton9e0c7422017-08-18 01:59:47729 auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
eladalon5daecca2017-08-04 13:34:54730
Steve Anton53c7ba62017-08-18 17:05:47731 EXPECT_CALL(ssrc_sink, OnRtpPacket(_)).Times(0);
732 EXPECT_CALL(rsid_sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
733 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalon5daecca2017-08-04 13:34:54734}
735
736// We're not expecting RSIDs to be resolved to SSRCs which were previously
737// mapped to sinks, and make no guarantees except for graceful handling.
Steve Anton9e0c7422017-08-18 01:59:47738TEST_F(RtpDemuxerTest,
739 GracefullyHandleRsidBeingMappedToPrevouslyAssociatedSsrc) {
eladalon5daecca2017-08-04 13:34:54740 constexpr uint32_t ssrc = 111;
741 NiceMock<MockRtpPacketSink> ssrc_sink;
Steve Anton9e0c7422017-08-18 01:59:47742 AddSinkOnlySsrc(ssrc, &ssrc_sink);
eladalon5daecca2017-08-04 13:34:54743
744 const std::string rsid = "a";
Steve Anton53c7ba62017-08-18 17:05:47745 NiceMock<MockRtpPacketSink> rsid_sink;
Steve Anton9e0c7422017-08-18 01:59:47746 AddSinkOnlyRsid(rsid, &rsid_sink);
eladalon5daecca2017-08-04 13:34:54747
eladalon5daecca2017-08-04 13:34:54748 // The SSRC was mapped to an SSRC sink, but was even active (packets flowed
749 // over it).
Steve Anton9e0c7422017-08-18 01:59:47750 auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
751 demuxer_.OnRtpPacket(*packet);
eladalon5daecca2017-08-04 13:34:54752
753 // If the SSRC sink is ever removed, the RSID sink *might* receive indications
754 // of packets, and observers *might* be informed. Only graceful handling
755 // is guaranteed.
Steve Anton9e0c7422017-08-18 01:59:47756 RemoveSink(&ssrc_sink);
eladalon5daecca2017-08-04 13:34:54757 EXPECT_CALL(rsid_sink, OnRtpPacket(SamePacketAs(*packet))).Times(AtLeast(0));
Steve Anton53c7ba62017-08-18 17:05:47758 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
759}
760
761// Tests that when one MID sink is configured, packets that include the MID
762// extension will get routed to that sink and any packets that use the same
763// SSRC as one of those packets later will also get routed to the sink, even
764// if a new SSRC is introduced for the same MID.
765TEST_F(RtpDemuxerTest, RoutedByMidWhenSsrcAdded) {
766 const std::string mid = "v";
767 NiceMock<MockRtpPacketSink> sink;
768 AddSinkOnlyMid(mid, &sink);
769
770 constexpr uint32_t ssrc1 = 10;
771 constexpr uint32_t ssrc2 = 11;
772
773 auto packet_ssrc1_mid = CreatePacketWithSsrcMid(ssrc1, mid);
774 demuxer_.OnRtpPacket(*packet_ssrc1_mid);
775 auto packet_ssrc2_mid = CreatePacketWithSsrcMid(ssrc2, mid);
776 demuxer_.OnRtpPacket(*packet_ssrc2_mid);
777
778 auto packet_ssrc1_only = CreatePacketWithSsrc(ssrc1);
779 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_ssrc1_only))).Times(1);
780 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc1_only));
781
782 auto packet_ssrc2_only = CreatePacketWithSsrc(ssrc2);
783 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_ssrc2_only))).Times(1);
784 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc2_only));
785}
786
787TEST_F(RtpDemuxerTest, DontLearnMidSsrcBindingBeforeSinkAdded) {
788 const std::string mid = "v";
789 constexpr uint32_t ssrc = 10;
790
791 auto packet_ssrc_mid = CreatePacketWithSsrcMid(ssrc, mid);
792 ASSERT_FALSE(demuxer_.OnRtpPacket(*packet_ssrc_mid));
793
794 MockRtpPacketSink sink;
795 AddSinkOnlyMid(mid, &sink);
796
797 auto packet_ssrc_only = CreatePacketWithSsrc(ssrc);
798 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
799 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet_ssrc_only));
800}
801
802TEST_F(RtpDemuxerTest, DontForgetMidSsrcBindingWhenSinkRemoved) {
803 const std::string mid = "v";
804 constexpr uint32_t ssrc = 10;
805
806 NiceMock<MockRtpPacketSink> sink1;
807 AddSinkOnlyMid(mid, &sink1);
808
809 auto packet_with_mid = CreatePacketWithSsrcMid(ssrc, mid);
810 demuxer_.OnRtpPacket(*packet_with_mid);
811
812 RemoveSink(&sink1);
813
814 MockRtpPacketSink sink2;
815 AddSinkOnlyMid(mid, &sink2);
816
817 auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
818 EXPECT_CALL(sink2, OnRtpPacket(SamePacketAs(*packet_with_ssrc)));
819 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
820}
821
822// If a sink is added with only a MID, then any packet with that MID no matter
823// the RSID should be routed to that sink.
824TEST_F(RtpDemuxerTest, RoutedByMidWithAnyRsid) {
825 const std::string mid = "v";
826 const std::string rsid1 = "1";
827 const std::string rsid2 = "2";
828 constexpr uint32_t ssrc1 = 10;
829 constexpr uint32_t ssrc2 = 11;
830
831 MockRtpPacketSink sink;
832 AddSinkOnlyMid(mid, &sink);
833
834 InSequence sequence;
835
836 auto packet_ssrc1_rsid1 = CreatePacketWithSsrcMidRsid(ssrc1, mid, rsid1);
837 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_ssrc1_rsid1))).Times(1);
838 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc1_rsid1));
839
840 auto packet_ssrc2_rsid2 = CreatePacketWithSsrcMidRsid(ssrc2, mid, rsid2);
841 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_ssrc2_rsid2))).Times(1);
842 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc2_rsid2));
843}
844
845// These two tests verify that for a sink added with a MID, RSID pair, if the
846// MID and RSID are learned in separate packets (e.g., because the header
847// extensions are sent separately), then a later packet with just SSRC will get
848// routed to that sink.
849// The first test checks that the functionality works when MID is learned first.
850// The second test checks that the functionality works when RSID is learned
851// first.
852TEST_F(RtpDemuxerTest, LearnMidThenRsidSeparatelyAndRouteBySsrc) {
853 const std::string mid = "v";
854 const std::string rsid = "1";
855 constexpr uint32_t ssrc = 10;
856
857 NiceMock<MockRtpPacketSink> sink;
858 AddSinkBothMidRsid(mid, rsid, &sink);
859
860 auto packet_with_mid = CreatePacketWithSsrcMid(ssrc, mid);
861 ASSERT_FALSE(demuxer_.OnRtpPacket(*packet_with_mid));
862
863 auto packet_with_rsid = CreatePacketWithSsrcRsid(ssrc, rsid);
864 ASSERT_TRUE(demuxer_.OnRtpPacket(*packet_with_rsid));
865
866 auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
867 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_ssrc))).Times(1);
868 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
869}
870
871TEST_F(RtpDemuxerTest, LearnRsidThenMidSeparatelyAndRouteBySsrc) {
872 const std::string mid = "v";
873 const std::string rsid = "1";
874 constexpr uint32_t ssrc = 10;
875
876 NiceMock<MockRtpPacketSink> sink;
877 AddSinkBothMidRsid(mid, rsid, &sink);
878
879 auto packet_with_rsid = CreatePacketWithSsrcRsid(ssrc, rsid);
880 ASSERT_FALSE(demuxer_.OnRtpPacket(*packet_with_rsid));
881
882 auto packet_with_mid = CreatePacketWithSsrcMid(ssrc, mid);
883 ASSERT_TRUE(demuxer_.OnRtpPacket(*packet_with_mid));
884
885 auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
886 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_ssrc))).Times(1);
887 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
888}
889
890TEST_F(RtpDemuxerTest, DontLearnMidRsidBindingBeforeSinkAdded) {
891 const std::string mid = "v";
892 const std::string rsid = "1";
893 constexpr uint32_t ssrc = 10;
894
895 auto packet_with_both = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
896 ASSERT_FALSE(demuxer_.OnRtpPacket(*packet_with_both));
897
898 MockRtpPacketSink sink;
899 AddSinkBothMidRsid(mid, rsid, &sink);
900
901 auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
902 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
903 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet_with_ssrc));
904}
905
906TEST_F(RtpDemuxerTest, DontForgetMidRsidBindingWhenSinkRemoved) {
907 const std::string mid = "v";
908 const std::string rsid = "1";
909 constexpr uint32_t ssrc = 10;
910
911 NiceMock<MockRtpPacketSink> sink1;
912 AddSinkBothMidRsid(mid, rsid, &sink1);
913
914 auto packet_with_both = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
915 demuxer_.OnRtpPacket(*packet_with_both);
916
917 RemoveSink(&sink1);
918
919 MockRtpPacketSink sink2;
920 AddSinkBothMidRsid(mid, rsid, &sink2);
921
922 auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
923 EXPECT_CALL(sink2, OnRtpPacket(SamePacketAs(*packet_with_ssrc)));
924 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
925}
926
927TEST_F(RtpDemuxerTest, LearnMidRsidBindingAfterSinkAdded) {
928 const std::string mid = "v";
929 const std::string rsid = "1";
930 constexpr uint32_t ssrc = 10;
931
932 NiceMock<MockRtpPacketSink> sink;
933 AddSinkBothMidRsid(mid, rsid, &sink);
934
935 auto packet_with_both = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
936 demuxer_.OnRtpPacket(*packet_with_both);
937
938 auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
939 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_ssrc)));
940 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
941}
942
943TEST_F(RtpDemuxerTest, DropByPayloadTypeIfNoSink) {
944 constexpr uint8_t payload_type = 30;
945 constexpr uint32_t ssrc = 10;
946
947 auto packet = CreatePacketWithSsrc(ssrc);
948 packet->SetPayloadType(payload_type);
949 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
950}
951
952// For legacy applications, it's possible for us to demux if the payload type is
953// unique. But if multiple sinks are registered with different MIDs and the same
954// payload types, then we cannot route a packet with just payload type because
955// it is ambiguous which sink it should be sent to.
956TEST_F(RtpDemuxerTest, DropByPayloadTypeIfAddedInMultipleSinks) {
957 const std::string mid1 = "v";
958 const std::string mid2 = "a";
959 constexpr uint8_t payload_type = 30;
960 constexpr uint32_t ssrc = 10;
961
Tomas Gunnarsson8a5ac162022-01-03 14:16:46962 RtpDemuxerCriteria mid1_pt(mid1);
963 mid1_pt.payload_types() = {payload_type};
Steve Anton53c7ba62017-08-18 17:05:47964 MockRtpPacketSink sink1;
965 AddSink(mid1_pt, &sink1);
966
Tomas Gunnarsson8a5ac162022-01-03 14:16:46967 RtpDemuxerCriteria mid2_pt(mid2);
968 mid2_pt.payload_types() = {payload_type};
Steve Anton53c7ba62017-08-18 17:05:47969 MockRtpPacketSink sink2;
970 AddSink(mid2_pt, &sink2);
971
972 auto packet = CreatePacketWithSsrc(ssrc);
973 packet->SetPayloadType(payload_type);
974
975 EXPECT_CALL(sink1, OnRtpPacket(_)).Times(0);
976 EXPECT_CALL(sink2, OnRtpPacket(_)).Times(0);
977 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
978}
979
980// If two sinks are added with different MIDs but the same payload types, then
981// we cannot demux on the payload type only unless one of the sinks is removed.
982TEST_F(RtpDemuxerTest, RoutedByPayloadTypeIfAmbiguousSinkRemoved) {
983 const std::string mid1 = "v";
984 const std::string mid2 = "a";
985 constexpr uint8_t payload_type = 30;
986 constexpr uint32_t ssrc = 10;
987
Tomas Gunnarsson8a5ac162022-01-03 14:16:46988 RtpDemuxerCriteria mid1_pt(mid1);
989 mid1_pt.payload_types().insert(payload_type);
Steve Anton53c7ba62017-08-18 17:05:47990 MockRtpPacketSink sink1;
991 AddSink(mid1_pt, &sink1);
992
Tomas Gunnarsson8a5ac162022-01-03 14:16:46993 RtpDemuxerCriteria mid2_pt(mid2);
994 mid2_pt.payload_types().insert(payload_type);
Steve Anton53c7ba62017-08-18 17:05:47995 MockRtpPacketSink sink2;
996 AddSink(mid2_pt, &sink2);
997
998 RemoveSink(&sink1);
999
1000 auto packet = CreatePacketWithSsrc(ssrc);
1001 packet->SetPayloadType(payload_type);
1002
1003 EXPECT_CALL(sink1, OnRtpPacket(_)).Times(0);
1004 EXPECT_CALL(sink2, OnRtpPacket(SamePacketAs(*packet))).Times(1);
1005
1006 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
1007}
1008
1009TEST_F(RtpDemuxerTest, RoutedByPayloadTypeLatchesSsrc) {
1010 constexpr uint8_t payload_type = 30;
1011 constexpr uint32_t ssrc = 10;
1012
1013 RtpDemuxerCriteria pt;
Tomas Gunnarsson8a5ac162022-01-03 14:16:461014 pt.payload_types().insert(payload_type);
Steve Anton53c7ba62017-08-18 17:05:471015 NiceMock<MockRtpPacketSink> sink;
1016 AddSink(pt, &sink);
1017
1018 auto packet_with_pt = CreatePacketWithSsrc(ssrc);
1019 packet_with_pt->SetPayloadType(payload_type);
1020 ASSERT_TRUE(demuxer_.OnRtpPacket(*packet_with_pt));
1021
1022 auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
1023 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_ssrc))).Times(1);
1024 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
1025}
1026
1027// RSIDs are scoped within MID, so if two sinks are registered with the same
1028// RSIDs but different MIDs, then packets containing both extensions should be
1029// routed to the correct one.
1030TEST_F(RtpDemuxerTest, PacketWithSameRsidDifferentMidRoutedToProperSink) {
1031 const std::string mid1 = "mid1";
1032 const std::string mid2 = "mid2";
1033 const std::string rsid = "rsid";
1034 constexpr uint32_t ssrc1 = 10;
1035 constexpr uint32_t ssrc2 = 11;
1036
1037 NiceMock<MockRtpPacketSink> mid1_sink;
1038 AddSinkBothMidRsid(mid1, rsid, &mid1_sink);
1039
1040 MockRtpPacketSink mid2_sink;
1041 AddSinkBothMidRsid(mid2, rsid, &mid2_sink);
1042
1043 auto packet_mid1 = CreatePacketWithSsrcMidRsid(ssrc1, mid1, rsid);
1044 ASSERT_TRUE(demuxer_.OnRtpPacket(*packet_mid1));
1045
1046 auto packet_mid2 = CreatePacketWithSsrcMidRsid(ssrc2, mid2, rsid);
1047 EXPECT_CALL(mid2_sink, OnRtpPacket(SamePacketAs(*packet_mid2))).Times(1);
1048 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_mid2));
1049}
1050
1051// If a sink is first bound to a given SSRC by signaling but later a new sink is
1052// bound to a given MID by a later signaling, then when a packet arrives with
1053// both the SSRC and MID, then the signaled MID sink should take precedence.
1054TEST_F(RtpDemuxerTest, SignaledMidShouldOverwriteSignaledSsrc) {
1055 constexpr uint32_t ssrc = 11;
1056 const std::string mid = "mid";
1057
1058 MockRtpPacketSink ssrc_sink;
1059 AddSinkOnlySsrc(ssrc, &ssrc_sink);
1060
1061 MockRtpPacketSink mid_sink;
1062 AddSinkOnlyMid(mid, &mid_sink);
1063
1064 auto p = CreatePacketWithSsrcMid(ssrc, mid);
1065 EXPECT_CALL(ssrc_sink, OnRtpPacket(_)).Times(0);
1066 EXPECT_CALL(mid_sink, OnRtpPacket(SamePacketAs(*p))).Times(1);
1067 EXPECT_TRUE(demuxer_.OnRtpPacket(*p));
1068}
1069
1070// Extends the previous test to also ensure that later packets that do not
1071// specify MID are still routed to the MID sink rather than the overwritten SSRC
1072// sink.
1073TEST_F(RtpDemuxerTest, SignaledMidShouldOverwriteSignalledSsrcPersistent) {
1074 constexpr uint32_t ssrc = 11;
1075 const std::string mid = "mid";
1076
1077 MockRtpPacketSink ssrc_sink;
1078 AddSinkOnlySsrc(ssrc, &ssrc_sink);
1079
1080 NiceMock<MockRtpPacketSink> mid_sink;
1081 AddSinkOnlyMid(mid, &mid_sink);
1082
1083 EXPECT_CALL(ssrc_sink, OnRtpPacket(_)).Times(0);
1084
1085 auto packet_with_mid = CreatePacketWithSsrcMid(ssrc, mid);
1086 demuxer_.OnRtpPacket(*packet_with_mid);
1087
1088 auto packet_without_mid = CreatePacketWithSsrc(ssrc);
1089 EXPECT_CALL(mid_sink, OnRtpPacket(SamePacketAs(*packet_without_mid)))
1090 .Times(1);
1091 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_without_mid));
1092}
1093
1094TEST_F(RtpDemuxerTest, RouteByPayloadTypeMultipleMatch) {
1095 constexpr uint32_t ssrc = 10;
1096 constexpr uint8_t pt1 = 30;
1097 constexpr uint8_t pt2 = 31;
1098
1099 MockRtpPacketSink sink;
1100 RtpDemuxerCriteria criteria;
Tomas Gunnarsson8a5ac162022-01-03 14:16:461101 criteria.payload_types() = {pt1, pt2};
Steve Anton53c7ba62017-08-18 17:05:471102 AddSink(criteria, &sink);
1103
1104 auto packet_with_pt1 = CreatePacketWithSsrc(ssrc);
1105 packet_with_pt1->SetPayloadType(pt1);
1106 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_pt1)));
1107 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_pt1));
1108
1109 auto packet_with_pt2 = CreatePacketWithSsrc(ssrc);
1110 packet_with_pt2->SetPayloadType(pt2);
1111 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_pt2)));
1112 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_pt2));
1113}
1114
1115TEST_F(RtpDemuxerTest, DontDemuxOnMidAloneIfAddedWithRsid) {
1116 const std::string mid = "v";
1117 const std::string rsid = "1";
1118 constexpr uint32_t ssrc = 10;
1119
1120 MockRtpPacketSink sink;
1121 AddSinkBothMidRsid(mid, rsid, &sink);
1122
1123 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
1124
1125 auto packet = CreatePacketWithSsrcMid(ssrc, mid);
1126 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
1127}
1128
1129TEST_F(RtpDemuxerTest, DemuxBySsrcEvenWithMidAndRsid) {
1130 const std::string mid = "v";
1131 const std::string rsid = "1";
1132 constexpr uint32_t ssrc = 10;
1133
Tomas Gunnarsson8a5ac162022-01-03 14:16:461134 RtpDemuxerCriteria criteria(mid, rsid);
1135 criteria.ssrcs().insert(ssrc);
Steve Anton53c7ba62017-08-18 17:05:471136 MockRtpPacketSink sink;
1137 AddSink(criteria, &sink);
1138
1139 auto packet = CreatePacketWithSsrc(ssrc);
1140 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
1141 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
1142}
1143
1144// In slight deviation from the BUNDLE spec, if we match a sink according to
1145// SSRC, then we do not verify payload type against the criteria and defer to
1146// the sink to check that it is correct.
1147TEST_F(RtpDemuxerTest, DoNotCheckPayloadTypeIfMatchedByOtherCriteria) {
1148 constexpr uint32_t ssrc = 10;
1149 constexpr uint8_t payload_type = 30;
1150 constexpr uint8_t different_payload_type = payload_type + 1;
1151
1152 RtpDemuxerCriteria criteria;
Tomas Gunnarsson8a5ac162022-01-03 14:16:461153 criteria.ssrcs().insert(ssrc);
1154 criteria.payload_types().insert(payload_type);
Steve Anton53c7ba62017-08-18 17:05:471155 MockRtpPacketSink sink;
1156 AddSink(criteria, &sink);
1157
1158 auto packet = CreatePacketWithSsrc(ssrc);
1159 packet->SetPayloadType(different_payload_type);
1160 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
1161 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
1162}
1163
1164// If a repair packet includes an RSID it should be ignored and the packet
1165// should be routed by its RRID.
1166TEST_F(RtpDemuxerTest, PacketWithRsidAndRridRoutedByRrid) {
1167 const std::string rsid = "1";
1168 const std::string rrid = "1r";
1169 constexpr uint32_t ssrc = 10;
1170
1171 MockRtpPacketSink sink_rsid;
1172 AddSinkOnlyRsid(rsid, &sink_rsid);
1173
1174 MockRtpPacketSink sink_rrid;
1175 AddSinkOnlyRsid(rrid, &sink_rrid);
1176
1177 auto packet = CreatePacketWithSsrcRsidRrid(ssrc, rsid, rrid);
1178 EXPECT_CALL(sink_rsid, OnRtpPacket(_)).Times(0);
1179 EXPECT_CALL(sink_rrid, OnRtpPacket(SamePacketAs(*packet))).Times(1);
1180 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
1181}
1182
1183// Same test as above but checks that the latched SSRC routes to the RRID sink.
1184TEST_F(RtpDemuxerTest, PacketWithRsidAndRridLatchesSsrcToRrid) {
1185 const std::string rsid = "1";
1186 const std::string rrid = "1r";
1187 constexpr uint32_t ssrc = 10;
1188
1189 MockRtpPacketSink sink_rsid;
1190 AddSinkOnlyRsid(rsid, &sink_rsid);
1191
1192 NiceMock<MockRtpPacketSink> sink_rrid;
1193 AddSinkOnlyRsid(rrid, &sink_rrid);
1194
1195 auto packet_rsid_rrid = CreatePacketWithSsrcRsidRrid(ssrc, rsid, rrid);
1196 demuxer_.OnRtpPacket(*packet_rsid_rrid);
1197
1198 auto packet_ssrc_only = CreatePacketWithSsrc(ssrc);
1199 EXPECT_CALL(sink_rsid, OnRtpPacket(_)).Times(0);
1200 EXPECT_CALL(sink_rrid, OnRtpPacket(SamePacketAs(*packet_ssrc_only))).Times(1);
1201 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc_only));
1202}
1203
1204// Tests that a packet which includes MID and RSID is dropped and not routed by
1205// SSRC if the MID and RSID do not match an added sink.
1206TEST_F(RtpDemuxerTest, PacketWithMidAndUnknownRsidIsNotRoutedBySsrc) {
1207 constexpr uint32_t ssrc = 10;
1208 const std::string mid = "v";
1209 const std::string rsid = "1";
1210 const std::string wrong_rsid = "2";
1211
Tomas Gunnarsson8a5ac162022-01-03 14:16:461212 RtpDemuxerCriteria criteria(mid, rsid);
1213 criteria.ssrcs().insert(ssrc);
Steve Anton53c7ba62017-08-18 17:05:471214 MockRtpPacketSink sink;
1215 AddSink(criteria, &sink);
1216
1217 auto packet = CreatePacketWithSsrcMidRsid(ssrc, mid, wrong_rsid);
1218 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
1219 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
1220}
1221
1222// Tests that a packet which includes MID and RSID is dropped and not routed by
1223// payload type if the MID and RSID do not match an added sink.
1224TEST_F(RtpDemuxerTest, PacketWithMidAndUnknownRsidIsNotRoutedByPayloadType) {
1225 constexpr uint32_t ssrc = 10;
1226 const std::string mid = "v";
1227 const std::string rsid = "1";
1228 const std::string wrong_rsid = "2";
1229 constexpr uint8_t payload_type = 30;
1230
Tomas Gunnarsson8a5ac162022-01-03 14:16:461231 RtpDemuxerCriteria criteria(mid, rsid);
1232 criteria.payload_types().insert(payload_type);
Steve Anton53c7ba62017-08-18 17:05:471233 MockRtpPacketSink sink;
1234 AddSink(criteria, &sink);
1235
1236 auto packet = CreatePacketWithSsrcMidRsid(ssrc, mid, wrong_rsid);
1237 packet->SetPayloadType(payload_type);
1238 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
1239 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
1240}
1241
Tomas Gunnarsson8a5ac162022-01-03 14:16:461242TEST_F(RtpDemuxerTest, MidMustNotExceedMaximumLength) {
1243 MockRtpPacketSink sink1;
1244 std::string mid1(BaseRtpStringExtension::kMaxValueSizeBytes + 1, 'a');
1245 // Adding the sink should pass even though the supplied mid is too long.
1246 // The mid will be truncated though.
1247 EXPECT_TRUE(AddSinkOnlyMid(mid1, &sink1));
1248
1249 // Adding a second sink with a mid that matches the truncated mid that was
1250 // just added, should fail.
1251 MockRtpPacketSink sink2;
1252 std::string mid2(mid1.substr(0, BaseRtpStringExtension::kMaxValueSizeBytes));
1253 EXPECT_FALSE(AddSinkOnlyMid(mid2, &sink2));
1254 EXPECT_FALSE(RemoveSink(&sink2));
1255
1256 // Remove the original sink.
1257 EXPECT_TRUE(RemoveSink(&sink1));
1258}
1259
eladalon760a0762017-05-31 16:12:251260#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
Steve Anton53c7ba62017-08-18 17:05:471261
Tommi909f3a52020-05-18 14:47:561262TEST_F(RtpDemuxerDeathTest, CriteriaMustBeNonEmpty) {
eladalond0244c22017-06-08 11:19:131263 MockRtpPacketSink sink;
Steve Anton53c7ba62017-08-18 17:05:471264 RtpDemuxerCriteria criteria;
1265 EXPECT_DEATH(AddSink(criteria, &sink), "");
eladalond0244c22017-06-08 11:19:131266}
1267
Tommi909f3a52020-05-18 14:47:561268TEST_F(RtpDemuxerDeathTest, RsidMustBeAlphaNumeric) {
eladalond0244c22017-06-08 11:19:131269 MockRtpPacketSink sink;
Steve Anton9e0c7422017-08-18 01:59:471270 EXPECT_DEATH(AddSinkOnlyRsid("a_3", &sink), "");
eladalond0244c22017-06-08 11:19:131271}
1272
Tommi909f3a52020-05-18 14:47:561273TEST_F(RtpDemuxerDeathTest, MidMustBeToken) {
Steve Anton53c7ba62017-08-18 17:05:471274 MockRtpPacketSink sink;
Joachim Bauchd3b7ec22018-08-01 08:12:001275 EXPECT_DEATH(AddSinkOnlyMid("a(3)", &sink), "");
Steve Anton53c7ba62017-08-18 17:05:471276}
1277
Tommi909f3a52020-05-18 14:47:561278TEST_F(RtpDemuxerDeathTest, RsidMustNotExceedMaximumLength) {
eladalond0244c22017-06-08 11:19:131279 MockRtpPacketSink sink;
Niels Möllerd57efc12019-03-22 13:02:111280 std::string rsid(BaseRtpStringExtension::kMaxValueSizeBytes + 1, 'a');
Steve Anton9e0c7422017-08-18 01:59:471281 EXPECT_DEATH(AddSinkOnlyRsid(rsid, &sink), "");
eladalond0244c22017-06-08 11:19:131282}
1283
eladalon760a0762017-05-31 16:12:251284#endif
1285
1286} // namespace
1287} // namespace webrtc