blob: 4dbee91785d270aee54bb99047bec937c272bf2e [file] [log] [blame]
eladalon760a0762017-05-31 09:12:25 -07001/*
2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "call/rtp_demuxer.h"
eladalon760a0762017-05-31 09:12:25 -070012
13#include <memory>
Steve Anton9e0c7422017-08-17 18:59:47 -070014#include <set>
eladalond0244c22017-06-08 04:19:13 -070015#include <string>
eladalon760a0762017-05-31 09:12:25 -070016
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "call/test/mock_rtp_packet_sink_interface.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
19#include "modules/rtp_rtcp/source/rtp_header_extensions.h"
20#include "modules/rtp_rtcp/source/rtp_packet_received.h"
21#include "rtc_base/arraysize.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020022#include "rtc_base/checks.h"
Karl Wiberge40468b2017-11-22 10:42:26 +010023#include "rtc_base/numerics/safe_conversions.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020024#include "test/gmock.h"
25#include "test/gtest.h"
eladalon760a0762017-05-31 09:12:25 -070026
27namespace webrtc {
28
29namespace {
30
31using ::testing::_;
eladalond0244c22017-06-08 04:19:13 -070032using ::testing::AtLeast;
33using ::testing::InSequence;
34using ::testing::NiceMock;
eladalon760a0762017-05-31 09:12:25 -070035
Mirko Bonadei6a489f22019-04-09 15:11:12 +020036class RtpDemuxerTest : public ::testing::Test {
Steve Anton9e0c7422017-08-17 18:59:47 -070037 protected:
38 ~RtpDemuxerTest() {
39 for (auto* sink : sinks_to_tear_down_) {
40 demuxer_.RemoveSink(sink);
41 }
Steve Anton9e0c7422017-08-17 18:59:47 -070042 }
43
Steve Anton53c7ba62017-08-18 10:05:47 -070044 // These are convenience methods for calling demuxer.AddSink with different
45 // parameters and will ensure that the sink is automatically removed when the
46 // test case finishes.
47
48 bool AddSink(const RtpDemuxerCriteria& criteria,
49 RtpPacketSinkInterface* sink) {
50 bool added = demuxer_.AddSink(criteria, sink);
Steve Anton9e0c7422017-08-17 18:59:47 -070051 if (added) {
52 sinks_to_tear_down_.insert(sink);
53 }
54 return added;
55 }
56
Steve Anton53c7ba62017-08-18 10:05:47 -070057 bool AddSinkOnlySsrc(uint32_t ssrc, RtpPacketSinkInterface* sink) {
58 RtpDemuxerCriteria criteria;
Tomas Gunnarsson8a5ac162022-01-03 14:16:46 +000059 criteria.ssrcs().insert(ssrc);
Steve Anton53c7ba62017-08-18 10:05:47 -070060 return AddSink(criteria, sink);
61 }
62
63 bool AddSinkOnlyRsid(const std::string& rsid, RtpPacketSinkInterface* sink) {
Tomas Gunnarssonc3795ff2022-01-03 13:04:51 +000064 RtpDemuxerCriteria criteria(absl::string_view(), rsid);
Steve Anton53c7ba62017-08-18 10:05:47 -070065 return AddSink(criteria, sink);
66 }
67
68 bool AddSinkOnlyMid(const std::string& mid, RtpPacketSinkInterface* sink) {
Tomas Gunnarssonc3795ff2022-01-03 13:04:51 +000069 RtpDemuxerCriteria criteria(mid);
Steve Anton53c7ba62017-08-18 10:05:47 -070070 return AddSink(criteria, sink);
71 }
72
73 bool AddSinkBothMidRsid(const std::string& mid,
74 const std::string& rsid,
75 RtpPacketSinkInterface* sink) {
Tomas Gunnarssonc3795ff2022-01-03 13:04:51 +000076 RtpDemuxerCriteria criteria(mid, rsid);
Steve Anton53c7ba62017-08-18 10:05:47 -070077 return AddSink(criteria, sink);
Steve Anton9e0c7422017-08-17 18:59:47 -070078 }
79
80 bool RemoveSink(RtpPacketSinkInterface* sink) {
81 sinks_to_tear_down_.erase(sink);
82 return demuxer_.RemoveSink(sink);
83 }
84
Steve Anton9e0c7422017-08-17 18:59:47 -070085 // The CreatePacket* methods are helpers for creating new RTP packets with
86 // various attributes set. Tests should use the helper that provides the
87 // minimum information needed to exercise the behavior under test. Tests also
88 // should not rely on any behavior which is not clearly described in the
89 // helper name/arguments. Any additional settings that are not covered by the
90 // helper should be set manually on the packet once it has been returned.
91 // For example, most tests in this file do not care about the RTP sequence
92 // number, but to ensure that the returned packets are valid the helpers will
93 // auto-increment the sequence number starting with 1. Tests that rely on
94 // specific sequence number behavior should call SetSequenceNumber manually on
95 // the returned packet.
96
97 // Intended for use only by other CreatePacket* helpers.
98 std::unique_ptr<RtpPacketReceived> CreatePacket(
99 uint32_t ssrc,
100 RtpPacketReceived::ExtensionManager* extension_manager) {
Mirko Bonadei317a1f02019-09-17 17:06:18 +0200101 auto packet = std::make_unique<RtpPacketReceived>(extension_manager);
Steve Anton9e0c7422017-08-17 18:59:47 -0700102 packet->SetSsrc(ssrc);
103 packet->SetSequenceNumber(next_sequence_number_++);
104 return packet;
105 }
106
107 std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrc(uint32_t ssrc) {
108 return CreatePacket(ssrc, nullptr);
109 }
110
Steve Anton53c7ba62017-08-18 10:05:47 -0700111 std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcMid(
112 uint32_t ssrc,
113 const std::string& mid) {
114 RtpPacketReceived::ExtensionManager extension_manager;
115 extension_manager.Register<RtpMid>(11);
116
117 auto packet = CreatePacket(ssrc, &extension_manager);
118 packet->SetExtension<RtpMid>(mid);
119 return packet;
120 }
121
Steve Anton9e0c7422017-08-17 18:59:47 -0700122 std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcRsid(
123 uint32_t ssrc,
124 const std::string& rsid) {
125 RtpPacketReceived::ExtensionManager extension_manager;
126 extension_manager.Register<RtpStreamId>(6);
127
128 auto packet = CreatePacket(ssrc, &extension_manager);
129 packet->SetExtension<RtpStreamId>(rsid);
130 return packet;
131 }
132
Steve Anton53c7ba62017-08-18 10:05:47 -0700133 std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcRrid(
134 uint32_t ssrc,
135 const std::string& rrid) {
136 RtpPacketReceived::ExtensionManager extension_manager;
137 extension_manager.Register<RepairedRtpStreamId>(7);
138
139 auto packet = CreatePacket(ssrc, &extension_manager);
140 packet->SetExtension<RepairedRtpStreamId>(rrid);
141 return packet;
142 }
143
144 std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcMidRsid(
145 uint32_t ssrc,
146 const std::string& mid,
147 const std::string& rsid) {
148 RtpPacketReceived::ExtensionManager extension_manager;
149 extension_manager.Register<RtpMid>(11);
150 extension_manager.Register<RtpStreamId>(6);
151
152 auto packet = CreatePacket(ssrc, &extension_manager);
153 packet->SetExtension<RtpMid>(mid);
154 packet->SetExtension<RtpStreamId>(rsid);
155 return packet;
156 }
157
158 std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcRsidRrid(
159 uint32_t ssrc,
160 const std::string& rsid,
161 const std::string& rrid) {
162 RtpPacketReceived::ExtensionManager extension_manager;
163 extension_manager.Register<RtpStreamId>(6);
164 extension_manager.Register<RepairedRtpStreamId>(7);
165
166 auto packet = CreatePacket(ssrc, &extension_manager);
167 packet->SetExtension<RtpStreamId>(rsid);
168 packet->SetExtension<RepairedRtpStreamId>(rrid);
169 return packet;
170 }
171
Steve Anton9e0c7422017-08-17 18:59:47 -0700172 RtpDemuxer demuxer_;
173 std::set<RtpPacketSinkInterface*> sinks_to_tear_down_;
Steve Anton9e0c7422017-08-17 18:59:47 -0700174 uint16_t next_sequence_number_ = 1;
175};
176
Tommi909f3a52020-05-18 16:47:56 +0200177class RtpDemuxerDeathTest : public RtpDemuxerTest {};
178
eladalond0244c22017-06-08 04:19:13 -0700179MATCHER_P(SamePacketAs, other, "") {
180 return arg.Ssrc() == other.Ssrc() &&
181 arg.SequenceNumber() == other.SequenceNumber();
eladalon760a0762017-05-31 09:12:25 -0700182}
183
Steve Anton9e0c7422017-08-17 18:59:47 -0700184TEST_F(RtpDemuxerTest, CanAddSinkBySsrc) {
eladalon5daecca2017-08-04 06:34:54 -0700185 MockRtpPacketSink sink;
186 constexpr uint32_t ssrc = 1;
187
Steve Anton9e0c7422017-08-17 18:59:47 -0700188 EXPECT_TRUE(AddSinkOnlySsrc(ssrc, &sink));
eladalon5daecca2017-08-04 06:34:54 -0700189}
190
Steve Anton53c7ba62017-08-18 10:05:47 -0700191TEST_F(RtpDemuxerTest, AllowAddSinkWithOverlappingPayloadTypesIfDifferentMid) {
192 const std::string mid1 = "v";
193 const std::string mid2 = "a";
194 constexpr uint8_t pt1 = 30;
195 constexpr uint8_t pt2 = 31;
196 constexpr uint8_t pt3 = 32;
197
Tomas Gunnarsson8a5ac162022-01-03 14:16:46 +0000198 RtpDemuxerCriteria pt1_pt2(mid1);
199 pt1_pt2.payload_types() = {pt1, pt2};
Steve Anton53c7ba62017-08-18 10:05:47 -0700200 MockRtpPacketSink sink1;
201 AddSink(pt1_pt2, &sink1);
202
Tomas Gunnarsson8a5ac162022-01-03 14:16:46 +0000203 RtpDemuxerCriteria pt1_pt3(mid2);
204 pt1_pt3.payload_types() = {pt1, pt3};
Steve Anton53c7ba62017-08-18 10:05:47 -0700205 MockRtpPacketSink sink2;
206 EXPECT_TRUE(AddSink(pt1_pt3, &sink2));
207}
208
209TEST_F(RtpDemuxerTest, RejectAddSinkForSameMidOnly) {
210 const std::string mid = "mid";
211
212 MockRtpPacketSink sink;
213 AddSinkOnlyMid(mid, &sink);
214 EXPECT_FALSE(AddSinkOnlyMid(mid, &sink));
215}
216
217TEST_F(RtpDemuxerTest, RejectAddSinkForSameMidRsid) {
218 const std::string mid = "v";
219 const std::string rsid = "1";
220
221 MockRtpPacketSink sink1;
222 AddSinkBothMidRsid(mid, rsid, &sink1);
223
224 MockRtpPacketSink sink2;
225 EXPECT_FALSE(AddSinkBothMidRsid(mid, rsid, &sink2));
226}
227
228TEST_F(RtpDemuxerTest, RejectAddSinkForConflictingMidAndMidRsid) {
229 const std::string mid = "v";
230 const std::string rsid = "1";
231
232 MockRtpPacketSink mid_sink;
233 AddSinkOnlyMid(mid, &mid_sink);
234
235 // This sink would never get any packets routed to it because the above sink
236 // would receive them all.
237 MockRtpPacketSink mid_rsid_sink;
238 EXPECT_FALSE(AddSinkBothMidRsid(mid, rsid, &mid_rsid_sink));
239}
240
241TEST_F(RtpDemuxerTest, RejectAddSinkForConflictingMidRsidAndMid) {
242 const std::string mid = "v";
243 const std::string rsid = "";
244
245 MockRtpPacketSink mid_rsid_sink;
246 AddSinkBothMidRsid(mid, rsid, &mid_rsid_sink);
247
248 // This sink would shadow the above sink.
249 MockRtpPacketSink mid_sink;
250 EXPECT_FALSE(AddSinkOnlyMid(mid, &mid_sink));
251}
252
253TEST_F(RtpDemuxerTest, AddSinkFailsIfCalledForTwoSinksWithSameSsrc) {
254 MockRtpPacketSink sink_a;
255 MockRtpPacketSink sink_b;
256 constexpr uint32_t ssrc = 1;
257 ASSERT_TRUE(AddSinkOnlySsrc(ssrc, &sink_a));
258
259 EXPECT_FALSE(AddSinkOnlySsrc(ssrc, &sink_b));
260}
261
262TEST_F(RtpDemuxerTest, AddSinkFailsIfCalledTwiceEvenIfSameSinkWithSameSsrc) {
263 MockRtpPacketSink sink;
264 constexpr uint32_t ssrc = 1;
265 ASSERT_TRUE(AddSinkOnlySsrc(ssrc, &sink));
266
267 EXPECT_FALSE(AddSinkOnlySsrc(ssrc, &sink));
268}
269
270// TODO(steveanton): Currently fails because payload type validation is not
271// complete in AddSink (see note in rtp_demuxer.cc).
272TEST_F(RtpDemuxerTest, DISABLED_RejectAddSinkForSamePayloadTypes) {
273 constexpr uint8_t pt1 = 30;
274 constexpr uint8_t pt2 = 31;
275
276 RtpDemuxerCriteria pt1_pt2;
Tomas Gunnarsson8a5ac162022-01-03 14:16:46 +0000277 pt1_pt2.payload_types() = {pt1, pt2};
Steve Anton53c7ba62017-08-18 10:05:47 -0700278 MockRtpPacketSink sink1;
279 AddSink(pt1_pt2, &sink1);
280
281 RtpDemuxerCriteria pt2_pt1;
Tomas Gunnarsson8a5ac162022-01-03 14:16:46 +0000282 pt2_pt1.payload_types() = {pt2, pt1};
Steve Anton53c7ba62017-08-18 10:05:47 -0700283 MockRtpPacketSink sink2;
284 EXPECT_FALSE(AddSink(pt2_pt1, &sink2));
285}
286
287// Routing Tests
288
Steve Anton9e0c7422017-08-17 18:59:47 -0700289TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkBySsrc) {
eladalond0244c22017-06-08 04:19:13 -0700290 constexpr uint32_t ssrcs[] = {101, 202, 303};
291 MockRtpPacketSink sinks[arraysize(ssrcs)];
292 for (size_t i = 0; i < arraysize(ssrcs); i++) {
Steve Anton9e0c7422017-08-17 18:59:47 -0700293 AddSinkOnlySsrc(ssrcs[i], &sinks[i]);
eladalond0244c22017-06-08 04:19:13 -0700294 }
295
296 for (size_t i = 0; i < arraysize(ssrcs); i++) {
Steve Anton9e0c7422017-08-17 18:59:47 -0700297 auto packet = CreatePacketWithSsrc(ssrcs[i]);
eladalond0244c22017-06-08 04:19:13 -0700298 EXPECT_CALL(sinks[i], OnRtpPacket(SamePacketAs(*packet))).Times(1);
Steve Anton9e0c7422017-08-17 18:59:47 -0700299 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalon760a0762017-05-31 09:12:25 -0700300 }
301}
302
Steve Anton9e0c7422017-08-17 18:59:47 -0700303TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByRsid) {
eladalond0244c22017-06-08 04:19:13 -0700304 const std::string rsids[] = {"a", "b", "c"};
305 MockRtpPacketSink sinks[arraysize(rsids)];
306 for (size_t i = 0; i < arraysize(rsids); i++) {
Steve Anton9e0c7422017-08-17 18:59:47 -0700307 AddSinkOnlyRsid(rsids[i], &sinks[i]);
eladalond0244c22017-06-08 04:19:13 -0700308 }
309
310 for (size_t i = 0; i < arraysize(rsids); i++) {
Yves Gerey665174f2018-06-19 15:03:05 +0200311 auto packet =
312 CreatePacketWithSsrcRsid(rtc::checked_cast<uint32_t>(i), rsids[i]);
eladalond0244c22017-06-08 04:19:13 -0700313 EXPECT_CALL(sinks[i], OnRtpPacket(SamePacketAs(*packet))).Times(1);
Steve Anton9e0c7422017-08-17 18:59:47 -0700314 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 04:19:13 -0700315 }
316}
317
Steve Anton53c7ba62017-08-18 10:05:47 -0700318TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByMid) {
319 const std::string mids[] = {"a", "v", "s"};
320 MockRtpPacketSink sinks[arraysize(mids)];
321 for (size_t i = 0; i < arraysize(mids); i++) {
322 AddSinkOnlyMid(mids[i], &sinks[i]);
323 }
324
325 for (size_t i = 0; i < arraysize(mids); i++) {
Yves Gerey665174f2018-06-19 15:03:05 +0200326 auto packet =
327 CreatePacketWithSsrcMid(rtc::checked_cast<uint32_t>(i), mids[i]);
Steve Anton53c7ba62017-08-18 10:05:47 -0700328 EXPECT_CALL(sinks[i], OnRtpPacket(SamePacketAs(*packet))).Times(1);
329 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
330 }
331}
332
333TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByMidAndRsid) {
334 const std::string mid = "v";
335 const std::string rsid = "1";
336 constexpr uint32_t ssrc = 10;
337
338 MockRtpPacketSink sink;
339 AddSinkBothMidRsid(mid, rsid, &sink);
340
341 auto packet = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
342 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
343 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
344}
345
346TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByRepairedRsid) {
347 const std::string rrid = "1";
348 constexpr uint32_t ssrc = 10;
349
350 MockRtpPacketSink sink;
351 AddSinkOnlyRsid(rrid, &sink);
352
353 auto packet_with_rrid = CreatePacketWithSsrcRrid(ssrc, rrid);
354 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_rrid))).Times(1);
355 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_rrid));
356}
357
358TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByPayloadType) {
359 constexpr uint32_t ssrc = 10;
360 constexpr uint8_t payload_type = 30;
361
362 MockRtpPacketSink sink;
363 RtpDemuxerCriteria criteria;
Tomas Gunnarsson8a5ac162022-01-03 14:16:46 +0000364 criteria.payload_types() = {payload_type};
Steve Anton53c7ba62017-08-18 10:05:47 -0700365 AddSink(criteria, &sink);
366
367 auto packet = CreatePacketWithSsrc(ssrc);
368 packet->SetPayloadType(payload_type);
369 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
370 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
371}
372
Steve Anton9e0c7422017-08-17 18:59:47 -0700373TEST_F(RtpDemuxerTest, PacketsDeliveredInRightOrder) {
eladalona52722f2017-06-26 11:23:54 -0700374 constexpr uint32_t ssrc = 101;
375 MockRtpPacketSink sink;
Steve Anton9e0c7422017-08-17 18:59:47 -0700376 AddSinkOnlySsrc(ssrc, &sink);
eladalond0244c22017-06-08 04:19:13 -0700377
378 std::unique_ptr<RtpPacketReceived> packets[5];
379 for (size_t i = 0; i < arraysize(packets); i++) {
Steve Anton9e0c7422017-08-17 18:59:47 -0700380 packets[i] = CreatePacketWithSsrc(ssrc);
oprypin0826fb22017-08-22 13:57:48 -0700381 packets[i]->SetSequenceNumber(rtc::checked_cast<uint16_t>(i));
eladalond0244c22017-06-08 04:19:13 -0700382 }
383
384 InSequence sequence;
385 for (const auto& packet : packets) {
eladalona52722f2017-06-26 11:23:54 -0700386 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
eladalond0244c22017-06-08 04:19:13 -0700387 }
388
389 for (const auto& packet : packets) {
Steve Anton9e0c7422017-08-17 18:59:47 -0700390 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 04:19:13 -0700391 }
eladalond0244c22017-06-08 04:19:13 -0700392}
393
Steve Anton9e0c7422017-08-17 18:59:47 -0700394TEST_F(RtpDemuxerTest, SinkMappedToMultipleSsrcs) {
eladalond0244c22017-06-08 04:19:13 -0700395 constexpr uint32_t ssrcs[] = {404, 505, 606};
396 MockRtpPacketSink sink;
397 for (uint32_t ssrc : ssrcs) {
Steve Anton9e0c7422017-08-17 18:59:47 -0700398 AddSinkOnlySsrc(ssrc, &sink);
eladalon760a0762017-05-31 09:12:25 -0700399 }
400
401 // The sink which is associated with multiple SSRCs gets the callback
402 // triggered for each of those SSRCs.
eladalond0244c22017-06-08 04:19:13 -0700403 for (uint32_t ssrc : ssrcs) {
Steve Anton9e0c7422017-08-17 18:59:47 -0700404 auto packet = CreatePacketWithSsrc(ssrc);
Steve Anton53c7ba62017-08-18 10:05:47 -0700405 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
Steve Anton9e0c7422017-08-17 18:59:47 -0700406 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalon760a0762017-05-31 09:12:25 -0700407 }
eladalon760a0762017-05-31 09:12:25 -0700408}
409
Steve Anton9e0c7422017-08-17 18:59:47 -0700410TEST_F(RtpDemuxerTest, NoCallbackOnSsrcSinkRemovedBeforeFirstPacket) {
eladalond0244c22017-06-08 04:19:13 -0700411 constexpr uint32_t ssrc = 404;
412 MockRtpPacketSink sink;
Steve Anton9e0c7422017-08-17 18:59:47 -0700413 AddSinkOnlySsrc(ssrc, &sink);
eladalond0244c22017-06-08 04:19:13 -0700414
Steve Anton9e0c7422017-08-17 18:59:47 -0700415 ASSERT_TRUE(RemoveSink(&sink));
eladalond0244c22017-06-08 04:19:13 -0700416
417 // The removed sink does not get callbacks.
Steve Anton9e0c7422017-08-17 18:59:47 -0700418 auto packet = CreatePacketWithSsrc(ssrc);
eladalond0244c22017-06-08 04:19:13 -0700419 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0); // Not called.
Steve Anton9e0c7422017-08-17 18:59:47 -0700420 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 04:19:13 -0700421}
422
Steve Anton9e0c7422017-08-17 18:59:47 -0700423TEST_F(RtpDemuxerTest, NoCallbackOnSsrcSinkRemovedAfterFirstPacket) {
eladalond0244c22017-06-08 04:19:13 -0700424 constexpr uint32_t ssrc = 404;
425 NiceMock<MockRtpPacketSink> sink;
Steve Anton9e0c7422017-08-17 18:59:47 -0700426 AddSinkOnlySsrc(ssrc, &sink);
eladalond0244c22017-06-08 04:19:13 -0700427
428 InSequence sequence;
Steve Anton9e0c7422017-08-17 18:59:47 -0700429 for (size_t i = 0; i < 10; i++) {
430 ASSERT_TRUE(demuxer_.OnRtpPacket(*CreatePacketWithSsrc(ssrc)));
eladalon760a0762017-05-31 09:12:25 -0700431 }
432
Steve Anton9e0c7422017-08-17 18:59:47 -0700433 ASSERT_TRUE(RemoveSink(&sink));
eladalon760a0762017-05-31 09:12:25 -0700434
eladalond0244c22017-06-08 04:19:13 -0700435 // The removed sink does not get callbacks.
Steve Anton9e0c7422017-08-17 18:59:47 -0700436 auto packet = CreatePacketWithSsrc(ssrc);
eladalond0244c22017-06-08 04:19:13 -0700437 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0); // Not called.
Steve Anton9e0c7422017-08-17 18:59:47 -0700438 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 04:19:13 -0700439}
440
eladalon5daecca2017-08-04 06:34:54 -0700441// An SSRC may only be mapped to a single sink. However, since configuration
442// of this associations might come from the network, we need to fail gracefully.
Steve Anton9e0c7422017-08-17 18:59:47 -0700443TEST_F(RtpDemuxerTest, OnlyOneSinkPerSsrcGetsOnRtpPacketTriggered) {
eladalon5daecca2017-08-04 06:34:54 -0700444 MockRtpPacketSink sinks[3];
445 constexpr uint32_t ssrc = 404;
Steve Anton9e0c7422017-08-17 18:59:47 -0700446 ASSERT_TRUE(AddSinkOnlySsrc(ssrc, &sinks[0]));
447 ASSERT_FALSE(AddSinkOnlySsrc(ssrc, &sinks[1]));
448 ASSERT_FALSE(AddSinkOnlySsrc(ssrc, &sinks[2]));
eladalon5daecca2017-08-04 06:34:54 -0700449
450 // The first sink associated with the SSRC remains active; other sinks
451 // were not really added, and so do not get OnRtpPacket() called.
Steve Anton9e0c7422017-08-17 18:59:47 -0700452 auto packet = CreatePacketWithSsrc(ssrc);
eladalon5daecca2017-08-04 06:34:54 -0700453 EXPECT_CALL(sinks[0], OnRtpPacket(SamePacketAs(*packet))).Times(1);
454 EXPECT_CALL(sinks[1], OnRtpPacket(_)).Times(0);
455 EXPECT_CALL(sinks[2], OnRtpPacket(_)).Times(0);
Steve Anton9e0c7422017-08-17 18:59:47 -0700456 ASSERT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalon5daecca2017-08-04 06:34:54 -0700457}
458
Steve Anton9e0c7422017-08-17 18:59:47 -0700459TEST_F(RtpDemuxerTest, NoRepeatedCallbackOnRepeatedAddSinkForSameSink) {
eladalond0244c22017-06-08 04:19:13 -0700460 constexpr uint32_t ssrc = 111;
461 MockRtpPacketSink sink;
462
Steve Anton9e0c7422017-08-17 18:59:47 -0700463 ASSERT_TRUE(AddSinkOnlySsrc(ssrc, &sink));
464 ASSERT_FALSE(AddSinkOnlySsrc(ssrc, &sink));
eladalond0244c22017-06-08 04:19:13 -0700465
Steve Anton9e0c7422017-08-17 18:59:47 -0700466 auto packet = CreatePacketWithSsrc(ssrc);
eladalond0244c22017-06-08 04:19:13 -0700467 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
Steve Anton9e0c7422017-08-17 18:59:47 -0700468 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 04:19:13 -0700469}
470
Steve Anton9e0c7422017-08-17 18:59:47 -0700471TEST_F(RtpDemuxerTest, RemoveSinkReturnsFalseForNeverAddedSink) {
eladalond0244c22017-06-08 04:19:13 -0700472 MockRtpPacketSink sink;
Steve Anton9e0c7422017-08-17 18:59:47 -0700473 EXPECT_FALSE(RemoveSink(&sink));
eladalond0244c22017-06-08 04:19:13 -0700474}
475
Steve Anton9e0c7422017-08-17 18:59:47 -0700476TEST_F(RtpDemuxerTest, RemoveSinkReturnsTrueForPreviouslyAddedSsrcSink) {
eladalond0244c22017-06-08 04:19:13 -0700477 constexpr uint32_t ssrc = 101;
478 MockRtpPacketSink sink;
Steve Anton9e0c7422017-08-17 18:59:47 -0700479 AddSinkOnlySsrc(ssrc, &sink);
eladalond0244c22017-06-08 04:19:13 -0700480
Steve Anton9e0c7422017-08-17 18:59:47 -0700481 EXPECT_TRUE(RemoveSink(&sink));
eladalond0244c22017-06-08 04:19:13 -0700482}
483
Steve Anton9e0c7422017-08-17 18:59:47 -0700484TEST_F(RtpDemuxerTest,
485 RemoveSinkReturnsTrueForUnresolvedPreviouslyAddedRsidSink) {
eladalond0244c22017-06-08 04:19:13 -0700486 const std::string rsid = "a";
487 MockRtpPacketSink sink;
Steve Anton9e0c7422017-08-17 18:59:47 -0700488 AddSinkOnlyRsid(rsid, &sink);
eladalond0244c22017-06-08 04:19:13 -0700489
Steve Anton9e0c7422017-08-17 18:59:47 -0700490 EXPECT_TRUE(RemoveSink(&sink));
eladalond0244c22017-06-08 04:19:13 -0700491}
492
Steve Anton9e0c7422017-08-17 18:59:47 -0700493TEST_F(RtpDemuxerTest,
494 RemoveSinkReturnsTrueForResolvedPreviouslyAddedRsidSink) {
eladalond0244c22017-06-08 04:19:13 -0700495 const std::string rsid = "a";
496 constexpr uint32_t ssrc = 101;
497 NiceMock<MockRtpPacketSink> sink;
Steve Anton9e0c7422017-08-17 18:59:47 -0700498 AddSinkOnlyRsid(rsid, &sink);
499 ASSERT_TRUE(demuxer_.OnRtpPacket(*CreatePacketWithSsrcRsid(ssrc, rsid)));
eladalond0244c22017-06-08 04:19:13 -0700500
Steve Anton9e0c7422017-08-17 18:59:47 -0700501 EXPECT_TRUE(RemoveSink(&sink));
eladalond0244c22017-06-08 04:19:13 -0700502}
503
Steve Anton53c7ba62017-08-18 10:05:47 -0700504TEST_F(RtpDemuxerTest, RsidLearnedAndLaterPacketsDeliveredWithOnlySsrc) {
eladalond0244c22017-06-08 04:19:13 -0700505 MockRtpPacketSink sink;
506 const std::string rsid = "a";
Steve Anton9e0c7422017-08-17 18:59:47 -0700507 AddSinkOnlyRsid(rsid, &sink);
eladalond0244c22017-06-08 04:19:13 -0700508
509 // Create a sequence of RTP packets, where only the first one actually
510 // mentions the RSID.
511 std::unique_ptr<RtpPacketReceived> packets[5];
512 constexpr uint32_t rsid_ssrc = 111;
Steve Anton9e0c7422017-08-17 18:59:47 -0700513 packets[0] = CreatePacketWithSsrcRsid(rsid_ssrc, rsid);
eladalond0244c22017-06-08 04:19:13 -0700514 for (size_t i = 1; i < arraysize(packets); i++) {
Steve Anton9e0c7422017-08-17 18:59:47 -0700515 packets[i] = CreatePacketWithSsrc(rsid_ssrc);
eladalon760a0762017-05-31 09:12:25 -0700516 }
eladalond0244c22017-06-08 04:19:13 -0700517
518 // The first packet associates the RSID with the SSRC, thereby allowing the
519 // demuxer to correctly demux all of the packets.
520 InSequence sequence;
521 for (const auto& packet : packets) {
522 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
523 }
524 for (const auto& packet : packets) {
Steve Anton9e0c7422017-08-17 18:59:47 -0700525 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 04:19:13 -0700526 }
eladalond0244c22017-06-08 04:19:13 -0700527}
528
Steve Anton9e0c7422017-08-17 18:59:47 -0700529TEST_F(RtpDemuxerTest, NoCallbackOnRsidSinkRemovedBeforeFirstPacket) {
eladalond0244c22017-06-08 04:19:13 -0700530 MockRtpPacketSink sink;
531 const std::string rsid = "a";
Steve Anton9e0c7422017-08-17 18:59:47 -0700532 AddSinkOnlyRsid(rsid, &sink);
eladalond0244c22017-06-08 04:19:13 -0700533
534 // Sink removed - it won't get triggers even if packets with its RSID arrive.
Steve Anton9e0c7422017-08-17 18:59:47 -0700535 ASSERT_TRUE(RemoveSink(&sink));
eladalond0244c22017-06-08 04:19:13 -0700536
537 constexpr uint32_t ssrc = 111;
Steve Anton9e0c7422017-08-17 18:59:47 -0700538 auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
eladalond0244c22017-06-08 04:19:13 -0700539 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0); // Not called.
Steve Anton9e0c7422017-08-17 18:59:47 -0700540 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 04:19:13 -0700541}
542
Steve Anton9e0c7422017-08-17 18:59:47 -0700543TEST_F(RtpDemuxerTest, NoCallbackOnRsidSinkRemovedAfterFirstPacket) {
eladalond0244c22017-06-08 04:19:13 -0700544 NiceMock<MockRtpPacketSink> sink;
545 const std::string rsid = "a";
Steve Anton9e0c7422017-08-17 18:59:47 -0700546 AddSinkOnlyRsid(rsid, &sink);
eladalond0244c22017-06-08 04:19:13 -0700547
548 InSequence sequence;
549 constexpr uint32_t ssrc = 111;
Steve Anton9e0c7422017-08-17 18:59:47 -0700550 for (size_t i = 0; i < 10; i++) {
551 auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
552 ASSERT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 04:19:13 -0700553 }
554
555 // Sink removed - it won't get triggers even if packets with its RSID arrive.
Steve Anton9e0c7422017-08-17 18:59:47 -0700556 ASSERT_TRUE(RemoveSink(&sink));
eladalond0244c22017-06-08 04:19:13 -0700557
Steve Anton9e0c7422017-08-17 18:59:47 -0700558 auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
eladalond0244c22017-06-08 04:19:13 -0700559 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0); // Not called.
Steve Anton9e0c7422017-08-17 18:59:47 -0700560 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 04:19:13 -0700561}
562
Steve Anton53c7ba62017-08-18 10:05:47 -0700563TEST_F(RtpDemuxerTest, NoCallbackOnMidSinkRemovedBeforeFirstPacket) {
564 const std::string mid = "v";
565 constexpr uint32_t ssrc = 10;
566
567 MockRtpPacketSink sink;
568 AddSinkOnlyMid(mid, &sink);
569 RemoveSink(&sink);
570
571 auto packet = CreatePacketWithSsrcMid(ssrc, mid);
572 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
573 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
574}
575
576TEST_F(RtpDemuxerTest, NoCallbackOnMidSinkRemovedAfterFirstPacket) {
577 const std::string mid = "v";
578 constexpr uint32_t ssrc = 10;
579
580 NiceMock<MockRtpPacketSink> sink;
581 AddSinkOnlyMid(mid, &sink);
582
583 auto p1 = CreatePacketWithSsrcMid(ssrc, mid);
584 demuxer_.OnRtpPacket(*p1);
585
586 RemoveSink(&sink);
587
588 auto p2 = CreatePacketWithSsrcMid(ssrc, mid);
589 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
590 EXPECT_FALSE(demuxer_.OnRtpPacket(*p2));
591}
592
593TEST_F(RtpDemuxerTest, NoCallbackOnMidRsidSinkRemovedAfterFirstPacket) {
594 const std::string mid = "v";
595 const std::string rsid = "1";
596 constexpr uint32_t ssrc = 10;
597
598 NiceMock<MockRtpPacketSink> sink;
599 AddSinkBothMidRsid(mid, rsid, &sink);
600
601 auto p1 = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
602 demuxer_.OnRtpPacket(*p1);
603
604 RemoveSink(&sink);
605
606 auto p2 = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
607 EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
608 EXPECT_FALSE(demuxer_.OnRtpPacket(*p2));
609}
610
eladalond0244c22017-06-08 04:19:13 -0700611// The RSID to SSRC mapping should be one-to-one. If we end up receiving
612// two (or more) packets with the same SSRC, but different RSIDs, we guarantee
Steve Anton53c7ba62017-08-18 10:05:47 -0700613// delivery to one of them but not both.
Steve Anton9e0c7422017-08-17 18:59:47 -0700614TEST_F(RtpDemuxerTest, FirstSsrcAssociatedWithAnRsidIsNotForgotten) {
eladalond0244c22017-06-08 04:19:13 -0700615 // Each sink has a distinct RSID.
616 MockRtpPacketSink sink_a;
617 const std::string rsid_a = "a";
Steve Anton9e0c7422017-08-17 18:59:47 -0700618 AddSinkOnlyRsid(rsid_a, &sink_a);
eladalond0244c22017-06-08 04:19:13 -0700619
620 MockRtpPacketSink sink_b;
621 const std::string rsid_b = "b";
Steve Anton9e0c7422017-08-17 18:59:47 -0700622 AddSinkOnlyRsid(rsid_b, &sink_b);
eladalond0244c22017-06-08 04:19:13 -0700623
624 InSequence sequence; // Verify that the order of delivery is unchanged.
625
626 constexpr uint32_t shared_ssrc = 100;
627
Artem Titovea240272021-07-26 12:40:21 +0200628 // First a packet with `rsid_a` is received, and `sink_a` is associated with
eladalond0244c22017-06-08 04:19:13 -0700629 // its SSRC.
Steve Anton9e0c7422017-08-17 18:59:47 -0700630 auto packet_a = CreatePacketWithSsrcRsid(shared_ssrc, rsid_a);
eladalond0244c22017-06-08 04:19:13 -0700631 EXPECT_CALL(sink_a, OnRtpPacket(SamePacketAs(*packet_a))).Times(1);
Steve Anton9e0c7422017-08-17 18:59:47 -0700632 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_a));
eladalond0244c22017-06-08 04:19:13 -0700633
Artem Titovea240272021-07-26 12:40:21 +0200634 // Second, a packet with `rsid_b` is received. We guarantee that `sink_b`
Steve Anton53c7ba62017-08-18 10:05:47 -0700635 // receives it.
Steve Anton9e0c7422017-08-17 18:59:47 -0700636 auto packet_b = CreatePacketWithSsrcRsid(shared_ssrc, rsid_b);
Steve Anton53c7ba62017-08-18 10:05:47 -0700637 EXPECT_CALL(sink_a, OnRtpPacket(_)).Times(0);
638 EXPECT_CALL(sink_b, OnRtpPacket(SamePacketAs(*packet_b))).Times(1);
Steve Anton9e0c7422017-08-17 18:59:47 -0700639 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_b));
eladalond0244c22017-06-08 04:19:13 -0700640
641 // Known edge-case; adding a new RSID association makes us re-examine all
Artem Titovea240272021-07-26 12:40:21 +0200642 // SSRCs. `sink_b` may or may not be associated with the SSRC now; we make
Steve Anton53c7ba62017-08-18 10:05:47 -0700643 // no promises on that. However, since the RSID is specified and it cannot be
644 // found the packet should be dropped.
eladalon9addbeb2017-06-30 06:26:54 -0700645 MockRtpPacketSink sink_c;
646 const std::string rsid_c = "c";
647 constexpr uint32_t some_other_ssrc = shared_ssrc + 1;
Steve Anton9e0c7422017-08-17 18:59:47 -0700648 AddSinkOnlySsrc(some_other_ssrc, &sink_c);
Steve Anton53c7ba62017-08-18 10:05:47 -0700649
650 auto packet_c = CreatePacketWithSsrcMid(shared_ssrc, rsid_c);
651 EXPECT_CALL(sink_a, OnRtpPacket(_)).Times(0);
652 EXPECT_CALL(sink_b, OnRtpPacket(_)).Times(0);
653 EXPECT_CALL(sink_c, OnRtpPacket(_)).Times(0);
654 EXPECT_FALSE(demuxer_.OnRtpPacket(*packet_c));
eladalond0244c22017-06-08 04:19:13 -0700655}
656
Steve Anton9e0c7422017-08-17 18:59:47 -0700657TEST_F(RtpDemuxerTest, MultipleRsidsOnSameSink) {
eladalond0244c22017-06-08 04:19:13 -0700658 MockRtpPacketSink sink;
659 const std::string rsids[] = {"a", "b", "c"};
660
661 for (const std::string& rsid : rsids) {
Steve Anton9e0c7422017-08-17 18:59:47 -0700662 AddSinkOnlyRsid(rsid, &sink);
eladalond0244c22017-06-08 04:19:13 -0700663 }
664
665 InSequence sequence;
666 for (size_t i = 0; i < arraysize(rsids); i++) {
667 // Assign different SSRCs and sequence numbers to all packets.
668 const uint32_t ssrc = 1000 + static_cast<uint32_t>(i);
Steve Anton53c7ba62017-08-18 10:05:47 -0700669 const uint16_t sequence_number = 50 + static_cast<uint16_t>(i);
Steve Anton9e0c7422017-08-17 18:59:47 -0700670 auto packet = CreatePacketWithSsrcRsid(ssrc, rsids[i]);
Steve Anton53c7ba62017-08-18 10:05:47 -0700671 packet->SetSequenceNumber(sequence_number);
eladalond0244c22017-06-08 04:19:13 -0700672 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
Steve Anton9e0c7422017-08-17 18:59:47 -0700673 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalond0244c22017-06-08 04:19:13 -0700674 }
eladalond0244c22017-06-08 04:19:13 -0700675}
676
Steve Anton53c7ba62017-08-18 10:05:47 -0700677// RSIDs are given higher priority than SSRC because we believe senders are less
678// likely to mislabel packets with RSID than mislabel them with SSRCs.
Steve Anton9e0c7422017-08-17 18:59:47 -0700679TEST_F(RtpDemuxerTest, SinkWithBothRsidAndSsrcAssociations) {
Steve Anton53c7ba62017-08-18 10:05:47 -0700680 MockRtpPacketSink sink;
eladalond0244c22017-06-08 04:19:13 -0700681 constexpr uint32_t standalone_ssrc = 10101;
682 constexpr uint32_t rsid_ssrc = 20202;
Steve Anton53c7ba62017-08-18 10:05:47 -0700683 const std::string rsid = "1";
eladalond0244c22017-06-08 04:19:13 -0700684
Steve Anton9e0c7422017-08-17 18:59:47 -0700685 AddSinkOnlySsrc(standalone_ssrc, &sink);
686 AddSinkOnlyRsid(rsid, &sink);
eladalond0244c22017-06-08 04:19:13 -0700687
688 InSequence sequence;
689
Steve Anton9e0c7422017-08-17 18:59:47 -0700690 auto ssrc_packet = CreatePacketWithSsrc(standalone_ssrc);
eladalond0244c22017-06-08 04:19:13 -0700691 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*ssrc_packet))).Times(1);
Steve Anton9e0c7422017-08-17 18:59:47 -0700692 EXPECT_TRUE(demuxer_.OnRtpPacket(*ssrc_packet));
eladalond0244c22017-06-08 04:19:13 -0700693
Steve Anton9e0c7422017-08-17 18:59:47 -0700694 auto rsid_packet = CreatePacketWithSsrcRsid(rsid_ssrc, rsid);
eladalond0244c22017-06-08 04:19:13 -0700695 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*rsid_packet))).Times(1);
Steve Anton9e0c7422017-08-17 18:59:47 -0700696 EXPECT_TRUE(demuxer_.OnRtpPacket(*rsid_packet));
eladalond0244c22017-06-08 04:19:13 -0700697}
698
Steve Anton53c7ba62017-08-18 10:05:47 -0700699// Packets are always guaranteed to be routed to only one sink.
Steve Anton9e0c7422017-08-17 18:59:47 -0700700TEST_F(RtpDemuxerTest, AssociatingByRsidAndBySsrcCannotTriggerDoubleCall) {
eladalond0244c22017-06-08 04:19:13 -0700701 constexpr uint32_t ssrc = 10101;
eladalond0244c22017-06-08 04:19:13 -0700702 const std::string rsid = "a";
eladalond0244c22017-06-08 04:19:13 -0700703
Steve Anton9e0c7422017-08-17 18:59:47 -0700704 MockRtpPacketSink sink;
705 AddSinkOnlySsrc(ssrc, &sink);
706 AddSinkOnlyRsid(rsid, &sink);
707
708 auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
eladalond0244c22017-06-08 04:19:13 -0700709 EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
Steve Anton9e0c7422017-08-17 18:59:47 -0700710 EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
eladalon760a0762017-05-31 09:12:25 -0700711}
712
Steve Anton53c7ba62017-08-18 10:05:47 -0700713
714// 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-17 18:59:47 -0700718TEST_F(RtpDemuxerTest,
Steve Anton53c7ba62017-08-18 10:05:47 -0700719 PacketFittingBothRsidSinkAndSsrcSinkGivenOnlyToRsidSink) {
eladalon5daecca2017-08-04 06:34:54 -0700720 constexpr uint32_t ssrc = 111;
721 MockRtpPacketSink ssrc_sink;
Steve Anton9e0c7422017-08-17 18:59:47 -0700722 AddSinkOnlySsrc(ssrc, &ssrc_sink);
eladalon5daecca2017-08-04 06:34:54 -0700723
724 const std::string rsid = "a";
725 MockRtpPacketSink rsid_sink;
Steve Anton9e0c7422017-08-17 18:59:47 -0700726 AddSinkOnlyRsid(rsid, &rsid_sink);
eladalon5daecca2017-08-04 06:34:54 -0700727
Steve Anton9e0c7422017-08-17 18:59:47 -0700728 auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
eladalon5daecca2017-08-04 06:34:54 -0700729
Steve Anton53c7ba62017-08-18 10:05:47 -0700730 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 06:34:54 -0700733}
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-17 18:59:47 -0700737TEST_F(RtpDemuxerTest,
738 GracefullyHandleRsidBeingMappedToPrevouslyAssociatedSsrc) {
eladalon5daecca2017-08-04 06:34:54 -0700739 constexpr uint32_t ssrc = 111;
740 NiceMock<MockRtpPacketSink> ssrc_sink;
Steve Anton9e0c7422017-08-17 18:59:47 -0700741 AddSinkOnlySsrc(ssrc, &ssrc_sink);
eladalon5daecca2017-08-04 06:34:54 -0700742
743 const std::string rsid = "a";
Steve Anton53c7ba62017-08-18 10:05:47 -0700744 NiceMock<MockRtpPacketSink> rsid_sink;
Steve Anton9e0c7422017-08-17 18:59:47 -0700745 AddSinkOnlyRsid(rsid, &rsid_sink);
eladalon5daecca2017-08-04 06:34:54 -0700746
eladalon5daecca2017-08-04 06:34:54 -0700747 // The SSRC was mapped to an SSRC sink, but was even active (packets flowed
748 // over it).
Steve Anton9e0c7422017-08-17 18:59:47 -0700749 auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
750 demuxer_.OnRtpPacket(*packet);
eladalon5daecca2017-08-04 06:34:54 -0700751
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-17 18:59:47 -0700755 RemoveSink(&ssrc_sink);
eladalon5daecca2017-08-04 06:34:54 -0700756 EXPECT_CALL(rsid_sink, OnRtpPacket(SamePacketAs(*packet))).Times(AtLeast(0));
Steve Anton53c7ba62017-08-18 10:05:47 -0700757 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:46 +0000961 RtpDemuxerCriteria mid1_pt(mid1);
962 mid1_pt.payload_types() = {payload_type};
Steve Anton53c7ba62017-08-18 10:05:47 -0700963 MockRtpPacketSink sink1;
964 AddSink(mid1_pt, &sink1);
965
Tomas Gunnarsson8a5ac162022-01-03 14:16:46 +0000966 RtpDemuxerCriteria mid2_pt(mid2);
967 mid2_pt.payload_types() = {payload_type};
Steve Anton53c7ba62017-08-18 10:05:47 -0700968 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:46 +0000987 RtpDemuxerCriteria mid1_pt(mid1);
988 mid1_pt.payload_types().insert(payload_type);
Steve Anton53c7ba62017-08-18 10:05:47 -0700989 MockRtpPacketSink sink1;
990 AddSink(mid1_pt, &sink1);
991
Tomas Gunnarsson8a5ac162022-01-03 14:16:46 +0000992 RtpDemuxerCriteria mid2_pt(mid2);
993 mid2_pt.payload_types().insert(payload_type);
Steve Anton53c7ba62017-08-18 10:05:47 -0700994 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:46 +00001013 pt.payload_types().insert(payload_type);
Steve Anton53c7ba62017-08-18 10:05:47 -07001014 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:46 +00001100 criteria.payload_types() = {pt1, pt2};
Steve Anton53c7ba62017-08-18 10:05:47 -07001101 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:46 +00001133 RtpDemuxerCriteria criteria(mid, rsid);
1134 criteria.ssrcs().insert(ssrc);
Steve Anton53c7ba62017-08-18 10:05:47 -07001135 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:46 +00001152 criteria.ssrcs().insert(ssrc);
1153 criteria.payload_types().insert(payload_type);
Steve Anton53c7ba62017-08-18 10:05:47 -07001154 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:46 +00001211 RtpDemuxerCriteria criteria(mid, rsid);
1212 criteria.ssrcs().insert(ssrc);
Steve Anton53c7ba62017-08-18 10:05:47 -07001213 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:46 +00001230 RtpDemuxerCriteria criteria(mid, rsid);
1231 criteria.payload_types().insert(payload_type);
Steve Anton53c7ba62017-08-18 10:05:47 -07001232 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:46 +00001241TEST_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 09:12:25 -07001259#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
Steve Anton53c7ba62017-08-18 10:05:47 -07001260
Tommi909f3a52020-05-18 16:47:56 +02001261TEST_F(RtpDemuxerDeathTest, CriteriaMustBeNonEmpty) {
eladalond0244c22017-06-08 04:19:13 -07001262 MockRtpPacketSink sink;
Steve Anton53c7ba62017-08-18 10:05:47 -07001263 RtpDemuxerCriteria criteria;
1264 EXPECT_DEATH(AddSink(criteria, &sink), "");
eladalond0244c22017-06-08 04:19:13 -07001265}
1266
Tommi909f3a52020-05-18 16:47:56 +02001267TEST_F(RtpDemuxerDeathTest, RsidMustBeAlphaNumeric) {
eladalond0244c22017-06-08 04:19:13 -07001268 MockRtpPacketSink sink;
Steve Anton9e0c7422017-08-17 18:59:47 -07001269 EXPECT_DEATH(AddSinkOnlyRsid("a_3", &sink), "");
eladalond0244c22017-06-08 04:19:13 -07001270}
1271
Tommi909f3a52020-05-18 16:47:56 +02001272TEST_F(RtpDemuxerDeathTest, MidMustBeToken) {
Steve Anton53c7ba62017-08-18 10:05:47 -07001273 MockRtpPacketSink sink;
Joachim Bauchd3b7ec22018-08-01 10:12:00 +02001274 EXPECT_DEATH(AddSinkOnlyMid("a(3)", &sink), "");
Steve Anton53c7ba62017-08-18 10:05:47 -07001275}
1276
Tommi909f3a52020-05-18 16:47:56 +02001277TEST_F(RtpDemuxerDeathTest, RsidMustNotExceedMaximumLength) {
eladalond0244c22017-06-08 04:19:13 -07001278 MockRtpPacketSink sink;
Niels Möllerd57efc12019-03-22 14:02:11 +01001279 std::string rsid(BaseRtpStringExtension::kMaxValueSizeBytes + 1, 'a');
Steve Anton9e0c7422017-08-17 18:59:47 -07001280 EXPECT_DEATH(AddSinkOnlyRsid(rsid, &sink), "");
eladalond0244c22017-06-08 04:19:13 -07001281}
1282
eladalon760a0762017-05-31 09:12:25 -07001283#endif
1284
1285} // namespace
1286} // namespace webrtc