blob: 808364acc5e8434674bc1b29f405ce7f72ace76a [file] [log] [blame]
eladalona52722f2017-06-26 11:23:54 -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/rtcp_demuxer.h"
eladalona52722f2017-06-26 11:23:54 -070012
13#include <memory>
Steve Anton80183062017-08-18 11:10:12 -070014#include <set>
eladalona52722f2017-06-26 11:23:54 -070015
Karl Wiberg918f50c2018-07-05 11:40:33 +020016#include "absl/memory/memory.h"
Patrik Höglund3e113432017-12-15 14:40:10 +010017#include "api/rtp_headers.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "call/rtcp_packet_sink_interface.h"
Mirko Bonadei71207422017-09-15 13:58:09 +020019#include "common_types.h" // NOLINT(build/include)
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020020#include "modules/rtp_rtcp/source/rtcp_packet/bye.h"
21#include "rtc_base/arraysize.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020022#include "rtc_base/checks.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020023#include "test/gmock.h"
24#include "test/gtest.h"
eladalona52722f2017-06-26 11:23:54 -070025
26namespace webrtc {
27
28namespace {
29
30using ::testing::_;
31using ::testing::AtLeast;
32using ::testing::ElementsAreArray;
33using ::testing::InSequence;
Steve Anton80183062017-08-18 11:10:12 -070034using ::testing::Matcher;
eladalona52722f2017-06-26 11:23:54 -070035using ::testing::NiceMock;
36
37class MockRtcpPacketSink : public RtcpPacketSinkInterface {
38 public:
39 MOCK_METHOD1(OnRtcpPacket, void(rtc::ArrayView<const uint8_t>));
40};
41
Steve Anton80183062017-08-18 11:10:12 -070042class RtcpDemuxerTest : public testing::Test {
43 protected:
44 ~RtcpDemuxerTest() {
45 for (auto* sink : sinks_to_tear_down_) {
46 demuxer_.RemoveSink(sink);
47 }
48 for (auto* sink : broadcast_sinks_to_tear_down_) {
49 demuxer_.RemoveBroadcastSink(sink);
50 }
51 }
52
53 void AddSsrcSink(uint32_t ssrc, RtcpPacketSinkInterface* sink) {
54 demuxer_.AddSink(ssrc, sink);
55 sinks_to_tear_down_.insert(sink);
56 }
57
58 void AddRsidSink(const std::string& rsid, RtcpPacketSinkInterface* sink) {
59 demuxer_.AddSink(rsid, sink);
60 sinks_to_tear_down_.insert(sink);
61 }
62
63 void RemoveSink(RtcpPacketSinkInterface* sink) {
64 sinks_to_tear_down_.erase(sink);
65 demuxer_.RemoveSink(sink);
66 }
67
68 void AddBroadcastSink(RtcpPacketSinkInterface* sink) {
69 demuxer_.AddBroadcastSink(sink);
70 broadcast_sinks_to_tear_down_.insert(sink);
71 }
72
73 void RemoveBroadcastSink(RtcpPacketSinkInterface* sink) {
74 broadcast_sinks_to_tear_down_.erase(sink);
75 demuxer_.RemoveBroadcastSink(sink);
76 }
77
78 RtcpDemuxer demuxer_;
79 std::set<RtcpPacketSinkInterface*> sinks_to_tear_down_;
80 std::set<RtcpPacketSinkInterface*> broadcast_sinks_to_tear_down_;
81};
82
eladalona52722f2017-06-26 11:23:54 -070083// Produces a packet buffer representing an RTCP packet with a given SSRC,
84// as it would look when sent over the wire.
85// |distinguishing_string| allows different RTCP packets with the same SSRC
86// to be distinguished. How this is set into the actual packet is
87// unimportant, and depends on which RTCP message we choose to use.
88rtc::Buffer CreateRtcpPacket(uint32_t ssrc,
89 const std::string& distinguishing_string = "") {
90 rtcp::Bye packet;
91 packet.SetSenderSsrc(ssrc);
92 if (distinguishing_string != "") {
93 // Actual way we use |distinguishing_string| is unimportant, so long
94 // as it ends up in the packet.
95 packet.SetReason(distinguishing_string);
96 }
97 return packet.Build();
98}
99
Steve Anton80183062017-08-18 11:10:12 -0700100static Matcher<rtc::ArrayView<const uint8_t>> SamePacketAs(
101 const rtc::Buffer& other) {
102 return ElementsAreArray(other.cbegin(), other.cend());
103}
104
eladalona52722f2017-06-26 11:23:54 -0700105} // namespace
106
Steve Anton80183062017-08-18 11:10:12 -0700107TEST_F(RtcpDemuxerTest, OnRtcpPacketCalledOnCorrectSinkBySsrc) {
eladalona52722f2017-06-26 11:23:54 -0700108 constexpr uint32_t ssrcs[] = {101, 202, 303};
109 MockRtcpPacketSink sinks[arraysize(ssrcs)];
110 for (size_t i = 0; i < arraysize(ssrcs); i++) {
Steve Anton80183062017-08-18 11:10:12 -0700111 AddSsrcSink(ssrcs[i], &sinks[i]);
eladalona52722f2017-06-26 11:23:54 -0700112 }
113
114 for (size_t i = 0; i < arraysize(ssrcs); i++) {
115 auto packet = CreateRtcpPacket(ssrcs[i]);
Steve Anton80183062017-08-18 11:10:12 -0700116 EXPECT_CALL(sinks[i], OnRtcpPacket(SamePacketAs(packet))).Times(1);
117 demuxer_.OnRtcpPacket(packet);
eladalona52722f2017-06-26 11:23:54 -0700118 }
119}
120
Steve Anton80183062017-08-18 11:10:12 -0700121TEST_F(RtcpDemuxerTest, OnRtcpPacketCalledOnResolvedRsidSink) {
eladalona52722f2017-06-26 11:23:54 -0700122 // Set up some RSID sinks.
123 const std::string rsids[] = {"a", "b", "c"};
124 MockRtcpPacketSink sinks[arraysize(rsids)];
125 for (size_t i = 0; i < arraysize(rsids); i++) {
Steve Anton80183062017-08-18 11:10:12 -0700126 AddRsidSink(rsids[i], &sinks[i]);
eladalona52722f2017-06-26 11:23:54 -0700127 }
128
129 // Only resolve one of the sinks.
130 constexpr size_t resolved_sink_index = 0;
131 constexpr uint32_t ssrc = 345;
Steve Anton80183062017-08-18 11:10:12 -0700132 demuxer_.OnSsrcBoundToRsid(rsids[resolved_sink_index], ssrc);
eladalona52722f2017-06-26 11:23:54 -0700133
134 // The resolved sink gets notifications of RTCP messages with its SSRC.
135 auto packet = CreateRtcpPacket(ssrc);
Steve Anton80183062017-08-18 11:10:12 -0700136 EXPECT_CALL(sinks[resolved_sink_index], OnRtcpPacket(SamePacketAs(packet)))
eladalona52722f2017-06-26 11:23:54 -0700137 .Times(1);
138
139 // RTCP received; expected calls triggered.
Steve Anton80183062017-08-18 11:10:12 -0700140 demuxer_.OnRtcpPacket(packet);
eladalona52722f2017-06-26 11:23:54 -0700141}
142
Steve Anton80183062017-08-18 11:10:12 -0700143TEST_F(RtcpDemuxerTest,
144 SingleCallbackAfterResolutionOfAnRsidToAlreadyRegisteredSsrc) {
eladalona52722f2017-06-26 11:23:54 -0700145 // Associate a sink with an SSRC.
146 MockRtcpPacketSink sink;
147 constexpr uint32_t ssrc = 999;
Steve Anton80183062017-08-18 11:10:12 -0700148 AddSsrcSink(ssrc, &sink);
eladalona52722f2017-06-26 11:23:54 -0700149
150 // Associate the same sink with an RSID.
151 const std::string rsid = "r";
Steve Anton80183062017-08-18 11:10:12 -0700152 AddRsidSink(rsid, &sink);
eladalona52722f2017-06-26 11:23:54 -0700153
154 // Resolve the RSID to the aforementioned SSRC.
Steve Anton80183062017-08-18 11:10:12 -0700155 demuxer_.OnSsrcBoundToRsid(rsid, ssrc);
eladalona52722f2017-06-26 11:23:54 -0700156
157 // OnRtcpPacket still called only a single time for messages with this SSRC.
158 auto packet = CreateRtcpPacket(ssrc);
Steve Anton80183062017-08-18 11:10:12 -0700159 EXPECT_CALL(sink, OnRtcpPacket(SamePacketAs(packet))).Times(1);
160 demuxer_.OnRtcpPacket(packet);
eladalona52722f2017-06-26 11:23:54 -0700161}
162
Steve Anton80183062017-08-18 11:10:12 -0700163TEST_F(RtcpDemuxerTest,
164 OnRtcpPacketCalledOnAllBroadcastSinksForAllRtcpPackets) {
eladalona52722f2017-06-26 11:23:54 -0700165 MockRtcpPacketSink sinks[3];
166 for (MockRtcpPacketSink& sink : sinks) {
Steve Anton80183062017-08-18 11:10:12 -0700167 AddBroadcastSink(&sink);
eladalona52722f2017-06-26 11:23:54 -0700168 }
169
170 constexpr uint32_t ssrc = 747;
171 auto packet = CreateRtcpPacket(ssrc);
172
173 for (MockRtcpPacketSink& sink : sinks) {
Steve Anton80183062017-08-18 11:10:12 -0700174 EXPECT_CALL(sink, OnRtcpPacket(SamePacketAs(packet))).Times(1);
eladalona52722f2017-06-26 11:23:54 -0700175 }
176
177 // RTCP received; expected calls triggered.
Steve Anton80183062017-08-18 11:10:12 -0700178 demuxer_.OnRtcpPacket(packet);
eladalona52722f2017-06-26 11:23:54 -0700179}
180
Steve Anton80183062017-08-18 11:10:12 -0700181TEST_F(RtcpDemuxerTest, PacketsDeliveredInRightOrderToNonBroadcastSink) {
eladalona52722f2017-06-26 11:23:54 -0700182 constexpr uint32_t ssrc = 101;
183 MockRtcpPacketSink sink;
Steve Anton80183062017-08-18 11:10:12 -0700184 AddSsrcSink(ssrc, &sink);
eladalona52722f2017-06-26 11:23:54 -0700185
186 std::vector<rtc::Buffer> packets;
187 for (size_t i = 0; i < 5; i++) {
188 packets.push_back(CreateRtcpPacket(ssrc, std::to_string(i)));
189 }
190
191 InSequence sequence;
192 for (const auto& packet : packets) {
Steve Anton80183062017-08-18 11:10:12 -0700193 EXPECT_CALL(sink, OnRtcpPacket(SamePacketAs(packet))).Times(1);
eladalona52722f2017-06-26 11:23:54 -0700194 }
195
196 for (const auto& packet : packets) {
Steve Anton80183062017-08-18 11:10:12 -0700197 demuxer_.OnRtcpPacket(packet);
eladalona52722f2017-06-26 11:23:54 -0700198 }
eladalona52722f2017-06-26 11:23:54 -0700199}
200
Steve Anton80183062017-08-18 11:10:12 -0700201TEST_F(RtcpDemuxerTest, PacketsDeliveredInRightOrderToBroadcastSink) {
eladalona52722f2017-06-26 11:23:54 -0700202 MockRtcpPacketSink sink;
Steve Anton80183062017-08-18 11:10:12 -0700203 AddBroadcastSink(&sink);
eladalona52722f2017-06-26 11:23:54 -0700204
205 std::vector<rtc::Buffer> packets;
206 for (size_t i = 0; i < 5; i++) {
207 constexpr uint32_t ssrc = 101;
208 packets.push_back(CreateRtcpPacket(ssrc, std::to_string(i)));
209 }
210
211 InSequence sequence;
212 for (const auto& packet : packets) {
Steve Anton80183062017-08-18 11:10:12 -0700213 EXPECT_CALL(sink, OnRtcpPacket(SamePacketAs(packet))).Times(1);
eladalona52722f2017-06-26 11:23:54 -0700214 }
215
216 for (const auto& packet : packets) {
Steve Anton80183062017-08-18 11:10:12 -0700217 demuxer_.OnRtcpPacket(packet);
eladalona52722f2017-06-26 11:23:54 -0700218 }
eladalona52722f2017-06-26 11:23:54 -0700219}
220
Steve Anton80183062017-08-18 11:10:12 -0700221TEST_F(RtcpDemuxerTest, MultipleSinksMappedToSameSsrc) {
eladalona52722f2017-06-26 11:23:54 -0700222 MockRtcpPacketSink sinks[3];
223 constexpr uint32_t ssrc = 404;
224 for (auto& sink : sinks) {
Steve Anton80183062017-08-18 11:10:12 -0700225 AddSsrcSink(ssrc, &sink);
eladalona52722f2017-06-26 11:23:54 -0700226 }
227
228 // Reception of an RTCP packet associated with the shared SSRC triggers the
229 // callback on all of the sinks associated with it.
230 auto packet = CreateRtcpPacket(ssrc);
231 for (auto& sink : sinks) {
Steve Anton80183062017-08-18 11:10:12 -0700232 EXPECT_CALL(sink, OnRtcpPacket(SamePacketAs(packet)));
eladalona52722f2017-06-26 11:23:54 -0700233 }
eladalona52722f2017-06-26 11:23:54 -0700234
Steve Anton80183062017-08-18 11:10:12 -0700235 demuxer_.OnRtcpPacket(packet);
eladalona52722f2017-06-26 11:23:54 -0700236}
237
Steve Anton80183062017-08-18 11:10:12 -0700238TEST_F(RtcpDemuxerTest, SinkMappedToMultipleSsrcs) {
eladalona52722f2017-06-26 11:23:54 -0700239 constexpr uint32_t ssrcs[] = {404, 505, 606};
240 MockRtcpPacketSink sink;
241 for (uint32_t ssrc : ssrcs) {
Steve Anton80183062017-08-18 11:10:12 -0700242 AddSsrcSink(ssrc, &sink);
eladalona52722f2017-06-26 11:23:54 -0700243 }
244
245 // The sink which is associated with multiple SSRCs gets the callback
246 // triggered for each of those SSRCs.
247 for (uint32_t ssrc : ssrcs) {
248 auto packet = CreateRtcpPacket(ssrc);
Steve Anton80183062017-08-18 11:10:12 -0700249 EXPECT_CALL(sink, OnRtcpPacket(SamePacketAs(packet)));
250 demuxer_.OnRtcpPacket(packet);
eladalona52722f2017-06-26 11:23:54 -0700251 }
eladalona52722f2017-06-26 11:23:54 -0700252}
253
Steve Anton80183062017-08-18 11:10:12 -0700254TEST_F(RtcpDemuxerTest, MultipleRsidsOnSameSink) {
eladalona52722f2017-06-26 11:23:54 -0700255 // Sink associated with multiple sinks.
256 MockRtcpPacketSink sink;
257 const std::string rsids[] = {"a", "b", "c"};
258 for (const auto& rsid : rsids) {
Steve Anton80183062017-08-18 11:10:12 -0700259 AddRsidSink(rsid, &sink);
eladalona52722f2017-06-26 11:23:54 -0700260 }
261
262 // RSIDs resolved to SSRCs.
263 uint32_t ssrcs[arraysize(rsids)];
264 for (size_t i = 0; i < arraysize(rsids); i++) {
265 ssrcs[i] = 1000 + static_cast<uint32_t>(i);
Steve Anton80183062017-08-18 11:10:12 -0700266 demuxer_.OnSsrcBoundToRsid(rsids[i], ssrcs[i]);
eladalona52722f2017-06-26 11:23:54 -0700267 }
268
269 // Set up packets to match those RSIDs/SSRCs.
270 std::vector<rtc::Buffer> packets;
271 for (size_t i = 0; i < arraysize(rsids); i++) {
272 packets.push_back(CreateRtcpPacket(ssrcs[i]));
273 }
274
275 // The sink expects to receive all of the packets.
276 for (const auto& packet : packets) {
Steve Anton80183062017-08-18 11:10:12 -0700277 EXPECT_CALL(sink, OnRtcpPacket(SamePacketAs(packet))).Times(1);
eladalona52722f2017-06-26 11:23:54 -0700278 }
279
280 // Packet demuxed correctly; OnRtcpPacket() triggered on sink.
281 for (const auto& packet : packets) {
Steve Anton80183062017-08-18 11:10:12 -0700282 demuxer_.OnRtcpPacket(packet);
eladalona52722f2017-06-26 11:23:54 -0700283 }
eladalona52722f2017-06-26 11:23:54 -0700284}
285
Steve Anton80183062017-08-18 11:10:12 -0700286TEST_F(RtcpDemuxerTest, RsidUsedByMultipleSinks) {
eladalona52722f2017-06-26 11:23:54 -0700287 MockRtcpPacketSink sinks[3];
288 const std::string shared_rsid = "a";
289
290 for (MockRtcpPacketSink& sink : sinks) {
Steve Anton80183062017-08-18 11:10:12 -0700291 AddRsidSink(shared_rsid, &sink);
eladalona52722f2017-06-26 11:23:54 -0700292 }
293
294 constexpr uint32_t shared_ssrc = 888;
Steve Anton80183062017-08-18 11:10:12 -0700295 demuxer_.OnSsrcBoundToRsid(shared_rsid, shared_ssrc);
eladalona52722f2017-06-26 11:23:54 -0700296
297 auto packet = CreateRtcpPacket(shared_ssrc);
298
299 for (MockRtcpPacketSink& sink : sinks) {
Steve Anton80183062017-08-18 11:10:12 -0700300 EXPECT_CALL(sink, OnRtcpPacket(SamePacketAs(packet))).Times(1);
eladalona52722f2017-06-26 11:23:54 -0700301 }
302
Steve Anton80183062017-08-18 11:10:12 -0700303 demuxer_.OnRtcpPacket(packet);
eladalona52722f2017-06-26 11:23:54 -0700304}
305
Steve Anton80183062017-08-18 11:10:12 -0700306TEST_F(RtcpDemuxerTest, NoCallbackOnSsrcSinkRemovedBeforeFirstPacket) {
eladalona52722f2017-06-26 11:23:54 -0700307 constexpr uint32_t ssrc = 404;
308 MockRtcpPacketSink sink;
Steve Anton80183062017-08-18 11:10:12 -0700309 AddSsrcSink(ssrc, &sink);
eladalona52722f2017-06-26 11:23:54 -0700310
Steve Anton80183062017-08-18 11:10:12 -0700311 RemoveSink(&sink);
eladalona52722f2017-06-26 11:23:54 -0700312
313 // The removed sink does not get callbacks.
314 auto packet = CreateRtcpPacket(ssrc);
315 EXPECT_CALL(sink, OnRtcpPacket(_)).Times(0); // Not called.
Steve Anton80183062017-08-18 11:10:12 -0700316 demuxer_.OnRtcpPacket(packet);
eladalona52722f2017-06-26 11:23:54 -0700317}
318
Steve Anton80183062017-08-18 11:10:12 -0700319TEST_F(RtcpDemuxerTest, NoCallbackOnSsrcSinkRemovedAfterFirstPacket) {
eladalona52722f2017-06-26 11:23:54 -0700320 constexpr uint32_t ssrc = 404;
321 NiceMock<MockRtcpPacketSink> sink;
Steve Anton80183062017-08-18 11:10:12 -0700322 AddSsrcSink(ssrc, &sink);
eladalona52722f2017-06-26 11:23:54 -0700323
324 auto before_packet = CreateRtcpPacket(ssrc);
Steve Anton80183062017-08-18 11:10:12 -0700325 demuxer_.OnRtcpPacket(before_packet);
eladalona52722f2017-06-26 11:23:54 -0700326
Steve Anton80183062017-08-18 11:10:12 -0700327 RemoveSink(&sink);
eladalona52722f2017-06-26 11:23:54 -0700328
329 // The removed sink does not get callbacks.
330 auto after_packet = CreateRtcpPacket(ssrc);
331 EXPECT_CALL(sink, OnRtcpPacket(_)).Times(0); // Not called.
Steve Anton80183062017-08-18 11:10:12 -0700332 demuxer_.OnRtcpPacket(after_packet);
eladalona52722f2017-06-26 11:23:54 -0700333}
334
Steve Anton80183062017-08-18 11:10:12 -0700335TEST_F(RtcpDemuxerTest, NoCallbackOnRsidSinkRemovedBeforeRsidResolution) {
eladalona52722f2017-06-26 11:23:54 -0700336 const std::string rsid = "a";
337 constexpr uint32_t ssrc = 404;
338 MockRtcpPacketSink sink;
Steve Anton80183062017-08-18 11:10:12 -0700339 AddRsidSink(rsid, &sink);
eladalona52722f2017-06-26 11:23:54 -0700340
341 // Removal before resolution.
Steve Anton80183062017-08-18 11:10:12 -0700342 RemoveSink(&sink);
343 demuxer_.OnSsrcBoundToRsid(rsid, ssrc);
eladalona52722f2017-06-26 11:23:54 -0700344
345 // The removed sink does not get callbacks.
346 auto packet = CreateRtcpPacket(ssrc);
347 EXPECT_CALL(sink, OnRtcpPacket(_)).Times(0); // Not called.
Steve Anton80183062017-08-18 11:10:12 -0700348 demuxer_.OnRtcpPacket(packet);
eladalona52722f2017-06-26 11:23:54 -0700349}
350
Steve Anton80183062017-08-18 11:10:12 -0700351TEST_F(RtcpDemuxerTest, NoCallbackOnRsidSinkRemovedAfterRsidResolution) {
eladalona52722f2017-06-26 11:23:54 -0700352 const std::string rsid = "a";
353 constexpr uint32_t ssrc = 404;
354 MockRtcpPacketSink sink;
Steve Anton80183062017-08-18 11:10:12 -0700355 AddRsidSink(rsid, &sink);
eladalona52722f2017-06-26 11:23:54 -0700356
357 // Removal after resolution.
Steve Anton80183062017-08-18 11:10:12 -0700358 demuxer_.OnSsrcBoundToRsid(rsid, ssrc);
359 RemoveSink(&sink);
eladalona52722f2017-06-26 11:23:54 -0700360
361 // The removed sink does not get callbacks.
362 auto packet = CreateRtcpPacket(ssrc);
363 EXPECT_CALL(sink, OnRtcpPacket(_)).Times(0); // Not called.
Steve Anton80183062017-08-18 11:10:12 -0700364 demuxer_.OnRtcpPacket(packet);
eladalona52722f2017-06-26 11:23:54 -0700365}
366
Steve Anton80183062017-08-18 11:10:12 -0700367TEST_F(RtcpDemuxerTest, NoCallbackOnBroadcastSinkRemovedBeforeFirstPacket) {
eladalona52722f2017-06-26 11:23:54 -0700368 MockRtcpPacketSink sink;
Steve Anton80183062017-08-18 11:10:12 -0700369 AddBroadcastSink(&sink);
eladalona52722f2017-06-26 11:23:54 -0700370
Steve Anton80183062017-08-18 11:10:12 -0700371 RemoveBroadcastSink(&sink);
eladalona52722f2017-06-26 11:23:54 -0700372
373 // The removed sink does not get callbacks.
374 constexpr uint32_t ssrc = 404;
375 auto packet = CreateRtcpPacket(ssrc);
376 EXPECT_CALL(sink, OnRtcpPacket(_)).Times(0); // Not called.
Steve Anton80183062017-08-18 11:10:12 -0700377 demuxer_.OnRtcpPacket(packet);
eladalona52722f2017-06-26 11:23:54 -0700378}
379
Steve Anton80183062017-08-18 11:10:12 -0700380TEST_F(RtcpDemuxerTest, NoCallbackOnBroadcastSinkRemovedAfterFirstPacket) {
eladalona52722f2017-06-26 11:23:54 -0700381 NiceMock<MockRtcpPacketSink> sink;
Steve Anton80183062017-08-18 11:10:12 -0700382 AddBroadcastSink(&sink);
eladalona52722f2017-06-26 11:23:54 -0700383
384 constexpr uint32_t ssrc = 404;
385 auto before_packet = CreateRtcpPacket(ssrc);
Steve Anton80183062017-08-18 11:10:12 -0700386 demuxer_.OnRtcpPacket(before_packet);
eladalona52722f2017-06-26 11:23:54 -0700387
Steve Anton80183062017-08-18 11:10:12 -0700388 RemoveBroadcastSink(&sink);
eladalona52722f2017-06-26 11:23:54 -0700389
390 // The removed sink does not get callbacks.
391 auto after_packet = CreateRtcpPacket(ssrc);
392 EXPECT_CALL(sink, OnRtcpPacket(_)).Times(0); // Not called.
Steve Anton80183062017-08-18 11:10:12 -0700393 demuxer_.OnRtcpPacket(after_packet);
eladalona52722f2017-06-26 11:23:54 -0700394}
395
396// The RSID to SSRC mapping should be one-to-one. If we end up receiving
397// two (or more) packets with the same SSRC, but different RSIDs, we guarantee
398// remembering the first one; no guarantees are made about further associations.
Steve Anton80183062017-08-18 11:10:12 -0700399TEST_F(RtcpDemuxerTest, FirstResolutionOfRsidNotForgotten) {
eladalona52722f2017-06-26 11:23:54 -0700400 MockRtcpPacketSink sink;
eladalona52722f2017-06-26 11:23:54 -0700401 const std::string rsid = "a";
Steve Anton80183062017-08-18 11:10:12 -0700402 AddRsidSink(rsid, &sink);
eladalona52722f2017-06-26 11:23:54 -0700403
404 constexpr uint32_t ssrc_a = 111; // First resolution - guaranteed effective.
Steve Anton80183062017-08-18 11:10:12 -0700405 demuxer_.OnSsrcBoundToRsid(rsid, ssrc_a);
eladalona52722f2017-06-26 11:23:54 -0700406
407 constexpr uint32_t ssrc_b = 222; // Second resolution - no guarantees.
Steve Anton80183062017-08-18 11:10:12 -0700408 demuxer_.OnSsrcBoundToRsid(rsid, ssrc_b);
eladalona52722f2017-06-26 11:23:54 -0700409
410 auto packet_a = CreateRtcpPacket(ssrc_a);
Steve Anton80183062017-08-18 11:10:12 -0700411 EXPECT_CALL(sink, OnRtcpPacket(SamePacketAs(packet_a))).Times(1);
412 demuxer_.OnRtcpPacket(packet_a);
eladalona52722f2017-06-26 11:23:54 -0700413
414 auto packet_b = CreateRtcpPacket(ssrc_b);
Steve Anton80183062017-08-18 11:10:12 -0700415 EXPECT_CALL(sink, OnRtcpPacket(SamePacketAs(packet_b))).Times(AtLeast(0));
416 demuxer_.OnRtcpPacket(packet_b);
eladalona52722f2017-06-26 11:23:54 -0700417}
418
419#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
Steve Anton80183062017-08-18 11:10:12 -0700420
421TEST_F(RtcpDemuxerTest, RepeatedSsrcToSinkAssociationsDisallowed) {
eladalona52722f2017-06-26 11:23:54 -0700422 MockRtcpPacketSink sink;
423
424 constexpr uint32_t ssrc = 101;
Steve Anton80183062017-08-18 11:10:12 -0700425 AddSsrcSink(ssrc, &sink);
426 EXPECT_DEATH(AddSsrcSink(ssrc, &sink), "");
eladalona52722f2017-06-26 11:23:54 -0700427}
428
Steve Anton80183062017-08-18 11:10:12 -0700429TEST_F(RtcpDemuxerTest, RepeatedRsidToSinkAssociationsDisallowed) {
eladalona52722f2017-06-26 11:23:54 -0700430 MockRtcpPacketSink sink;
431
432 const std::string rsid = "z";
Steve Anton80183062017-08-18 11:10:12 -0700433 AddRsidSink(rsid, &sink);
434 EXPECT_DEATH(AddRsidSink(rsid, &sink), "");
eladalona52722f2017-06-26 11:23:54 -0700435}
436
Steve Anton80183062017-08-18 11:10:12 -0700437TEST_F(RtcpDemuxerTest, RepeatedBroadcastSinkRegistrationDisallowed) {
eladalona52722f2017-06-26 11:23:54 -0700438 MockRtcpPacketSink sink;
439
Steve Anton80183062017-08-18 11:10:12 -0700440 AddBroadcastSink(&sink);
441 EXPECT_DEATH(AddBroadcastSink(&sink), "");
eladalona52722f2017-06-26 11:23:54 -0700442}
443
Steve Anton80183062017-08-18 11:10:12 -0700444TEST_F(RtcpDemuxerTest, SsrcSinkCannotAlsoBeRegisteredAsBroadcast) {
eladalona52722f2017-06-26 11:23:54 -0700445 MockRtcpPacketSink sink;
446
447 constexpr uint32_t ssrc = 101;
Steve Anton80183062017-08-18 11:10:12 -0700448 AddSsrcSink(ssrc, &sink);
449 EXPECT_DEATH(AddBroadcastSink(&sink), "");
eladalona52722f2017-06-26 11:23:54 -0700450}
451
Steve Anton80183062017-08-18 11:10:12 -0700452TEST_F(RtcpDemuxerTest, RsidSinkCannotAlsoBeRegisteredAsBroadcast) {
eladalona52722f2017-06-26 11:23:54 -0700453 MockRtcpPacketSink sink;
454
455 const std::string rsid = "z";
Steve Anton80183062017-08-18 11:10:12 -0700456 AddRsidSink(rsid, &sink);
457 EXPECT_DEATH(AddBroadcastSink(&sink), "");
eladalona52722f2017-06-26 11:23:54 -0700458}
459
Steve Anton80183062017-08-18 11:10:12 -0700460TEST_F(RtcpDemuxerTest, BroadcastSinkCannotAlsoBeRegisteredAsSsrcSink) {
eladalona52722f2017-06-26 11:23:54 -0700461 MockRtcpPacketSink sink;
462
Steve Anton80183062017-08-18 11:10:12 -0700463 AddBroadcastSink(&sink);
eladalona52722f2017-06-26 11:23:54 -0700464 constexpr uint32_t ssrc = 101;
Steve Anton80183062017-08-18 11:10:12 -0700465 EXPECT_DEATH(AddSsrcSink(ssrc, &sink), "");
eladalona52722f2017-06-26 11:23:54 -0700466}
467
Steve Anton80183062017-08-18 11:10:12 -0700468TEST_F(RtcpDemuxerTest, BroadcastSinkCannotAlsoBeRegisteredAsRsidSink) {
eladalona52722f2017-06-26 11:23:54 -0700469 MockRtcpPacketSink sink;
470
Steve Anton80183062017-08-18 11:10:12 -0700471 AddBroadcastSink(&sink);
eladalona52722f2017-06-26 11:23:54 -0700472 const std::string rsid = "j";
Steve Anton80183062017-08-18 11:10:12 -0700473 EXPECT_DEATH(AddRsidSink(rsid, &sink), "");
eladalona52722f2017-06-26 11:23:54 -0700474}
475
Steve Anton80183062017-08-18 11:10:12 -0700476TEST_F(RtcpDemuxerTest, MayNotCallRemoveSinkOnNeverAddedSink) {
eladalona52722f2017-06-26 11:23:54 -0700477 MockRtcpPacketSink sink;
Steve Anton80183062017-08-18 11:10:12 -0700478 EXPECT_DEATH(RemoveSink(&sink), "");
eladalona52722f2017-06-26 11:23:54 -0700479}
480
Steve Anton80183062017-08-18 11:10:12 -0700481TEST_F(RtcpDemuxerTest, MayNotCallRemoveBroadcastSinkOnNeverAddedSink) {
eladalona52722f2017-06-26 11:23:54 -0700482 MockRtcpPacketSink sink;
Steve Anton80183062017-08-18 11:10:12 -0700483 EXPECT_DEATH(RemoveBroadcastSink(&sink), "");
eladalona52722f2017-06-26 11:23:54 -0700484}
485
Steve Anton80183062017-08-18 11:10:12 -0700486TEST_F(RtcpDemuxerTest, RsidMustBeNonEmpty) {
eladalona52722f2017-06-26 11:23:54 -0700487 MockRtcpPacketSink sink;
Steve Anton80183062017-08-18 11:10:12 -0700488 EXPECT_DEATH(AddRsidSink("", &sink), "");
eladalona52722f2017-06-26 11:23:54 -0700489}
490
Steve Anton80183062017-08-18 11:10:12 -0700491TEST_F(RtcpDemuxerTest, RsidMustBeAlphaNumeric) {
eladalona52722f2017-06-26 11:23:54 -0700492 MockRtcpPacketSink sink;
Steve Anton80183062017-08-18 11:10:12 -0700493 EXPECT_DEATH(AddRsidSink("a_3", &sink), "");
eladalona52722f2017-06-26 11:23:54 -0700494}
495
Steve Anton80183062017-08-18 11:10:12 -0700496TEST_F(RtcpDemuxerTest, RsidMustNotExceedMaximumLength) {
eladalona52722f2017-06-26 11:23:54 -0700497 MockRtcpPacketSink sink;
498 std::string rsid(StreamId::kMaxSize + 1, 'a');
Steve Anton80183062017-08-18 11:10:12 -0700499 EXPECT_DEATH(AddRsidSink(rsid, &sink), "");
eladalona52722f2017-06-26 11:23:54 -0700500}
Steve Anton80183062017-08-18 11:10:12 -0700501
eladalona52722f2017-06-26 11:23:54 -0700502#endif
Steve Anton80183062017-08-18 11:10:12 -0700503
eladalona52722f2017-06-26 11:23:54 -0700504} // namespace webrtc