blob: e9428ca1304f97260cd482806608fe2c90cb8d9d [file] [log] [blame]
hbos1f8239c2017-01-16 04:24:10 -08001/*
2 * Copyright 2016 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
Steve Anton10542f22019-01-11 09:11:00 -080011#include "pc/track_media_info_map.h"
hbos1f8239c2017-01-16 04:24:10 -080012
Harald Alvestrandc24a2182022-02-23 13:44:59 +000013#include <stddef.h>
14
15#include <cstdint>
hbos1f8239c2017-01-16 04:24:10 -080016#include <initializer_list>
Steve Anton5dfde182018-02-06 10:34:40 -080017#include <string>
Harald Alvestrandc24a2182022-02-23 13:44:59 +000018#include <type_traits>
hbos1f8239c2017-01-16 04:24:10 -080019#include <utility>
20#include <vector>
21
Harald Alvestrandc24a2182022-02-23 13:44:59 +000022#include "api/media_types.h"
23#include "api/rtp_parameters.h"
Florent Castelli63cc46c2021-07-17 01:32:40 +020024#include "api/test/mock_video_track.h"
Steve Anton10542f22019-01-11 09:11:00 -080025#include "media/base/media_channel.h"
26#include "pc/audio_track.h"
27#include "pc/test/fake_video_track_source.h"
28#include "pc/test/mock_rtp_receiver_internal.h"
29#include "pc/test/mock_rtp_sender_internal.h"
30#include "pc/video_track.h"
Harald Alvestrandc24a2182022-02-23 13:44:59 +000031#include "rtc_base/checks.h"
32#include "rtc_base/ref_counted_object.h"
33#include "rtc_base/thread.h"
34#include "test/gmock.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020035#include "test/gtest.h"
hbos1f8239c2017-01-16 04:24:10 -080036
37namespace webrtc {
38
39namespace {
40
41RtpParameters CreateRtpParametersWithSsrcs(
42 std::initializer_list<uint32_t> ssrcs) {
43 RtpParameters params;
44 for (uint32_t ssrc : ssrcs) {
45 RtpEncodingParameters encoding_params;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +010046 encoding_params.ssrc = ssrc;
hbos1f8239c2017-01-16 04:24:10 -080047 params.encodings.push_back(encoding_params);
48 }
49 return params;
50}
51
Steve Anton57858b32018-02-15 15:19:50 -080052rtc::scoped_refptr<MockRtpSenderInternal> CreateMockRtpSender(
deadbeef804c1af2017-02-11 19:07:31 -080053 cricket::MediaType media_type,
54 std::initializer_list<uint32_t> ssrcs,
hbos1f8239c2017-01-16 04:24:10 -080055 rtc::scoped_refptr<MediaStreamTrackInterface> track) {
56 uint32_t first_ssrc;
57 if (ssrcs.size()) {
58 first_ssrc = *ssrcs.begin();
59 } else {
60 first_ssrc = 0;
61 }
Tommi87f70902021-04-27 14:43:08 +020062 auto sender = rtc::make_ref_counted<MockRtpSenderInternal>();
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +010063 EXPECT_CALL(*sender, track())
Mirko Bonadei6a489f22019-04-09 15:11:12 +020064 .WillRepeatedly(::testing::Return(std::move(track)));
65 EXPECT_CALL(*sender, ssrc()).WillRepeatedly(::testing::Return(first_ssrc));
deadbeef804c1af2017-02-11 19:07:31 -080066 EXPECT_CALL(*sender, media_type())
Mirko Bonadei6a489f22019-04-09 15:11:12 +020067 .WillRepeatedly(::testing::Return(media_type));
deadbeef804c1af2017-02-11 19:07:31 -080068 EXPECT_CALL(*sender, GetParameters())
Mirko Bonadei6a489f22019-04-09 15:11:12 +020069 .WillRepeatedly(::testing::Return(CreateRtpParametersWithSsrcs(ssrcs)));
70 EXPECT_CALL(*sender, AttachmentId()).WillRepeatedly(::testing::Return(1));
hbos1f8239c2017-01-16 04:24:10 -080071 return sender;
72}
73
Steve Anton57858b32018-02-15 15:19:50 -080074rtc::scoped_refptr<MockRtpReceiverInternal> CreateMockRtpReceiver(
deadbeef804c1af2017-02-11 19:07:31 -080075 cricket::MediaType media_type,
76 std::initializer_list<uint32_t> ssrcs,
hbos1f8239c2017-01-16 04:24:10 -080077 rtc::scoped_refptr<MediaStreamTrackInterface> track) {
Tommi87f70902021-04-27 14:43:08 +020078 auto receiver = rtc::make_ref_counted<MockRtpReceiverInternal>();
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +010079 EXPECT_CALL(*receiver, track())
Mirko Bonadei6a489f22019-04-09 15:11:12 +020080 .WillRepeatedly(::testing::Return(std::move(track)));
deadbeef804c1af2017-02-11 19:07:31 -080081 EXPECT_CALL(*receiver, media_type())
Mirko Bonadei6a489f22019-04-09 15:11:12 +020082 .WillRepeatedly(::testing::Return(media_type));
deadbeef804c1af2017-02-11 19:07:31 -080083 EXPECT_CALL(*receiver, GetParameters())
Mirko Bonadei6a489f22019-04-09 15:11:12 +020084 .WillRepeatedly(::testing::Return(CreateRtpParametersWithSsrcs(ssrcs)));
85 EXPECT_CALL(*receiver, AttachmentId()).WillRepeatedly(::testing::Return(1));
hbos1f8239c2017-01-16 04:24:10 -080086 return receiver;
87}
88
Tommi816134a2021-05-24 16:54:41 +020089rtc::scoped_refptr<VideoTrackInterface> CreateVideoTrack(
90 const std::string& id) {
91 return VideoTrack::Create(id, FakeVideoTrackSource::Create(false),
92 rtc::Thread::Current());
93}
94
95rtc::scoped_refptr<VideoTrackInterface> CreateMockVideoTrack(
96 const std::string& id) {
Florent Castelli63cc46c2021-07-17 01:32:40 +020097 auto track = MockVideoTrack::Create();
Tommi816134a2021-05-24 16:54:41 +020098 EXPECT_CALL(*track, kind())
99 .WillRepeatedly(::testing::Return(VideoTrack::kVideoKind));
100 return track;
101}
102
Mirko Bonadei6a489f22019-04-09 15:11:12 +0200103class TrackMediaInfoMapTest : public ::testing::Test {
hbos1f8239c2017-01-16 04:24:10 -0800104 public:
Tommiec3ba732020-05-17 14:33:40 +0200105 TrackMediaInfoMapTest() : TrackMediaInfoMapTest(true) {}
106
Tommi816134a2021-05-24 16:54:41 +0200107 explicit TrackMediaInfoMapTest(bool use_real_video_track)
hbos1f8239c2017-01-16 04:24:10 -0800108 : voice_media_info_(new cricket::VoiceMediaInfo()),
109 video_media_info_(new cricket::VideoMediaInfo()),
110 local_audio_track_(AudioTrack::Create("LocalAudioTrack", nullptr)),
111 remote_audio_track_(AudioTrack::Create("RemoteAudioTrack", nullptr)),
Tommi816134a2021-05-24 16:54:41 +0200112 local_video_track_(use_real_video_track
113 ? CreateVideoTrack("LocalVideoTrack")
114 : CreateMockVideoTrack("LocalVideoTrack")),
115 remote_video_track_(use_real_video_track
116 ? CreateVideoTrack("RemoteVideoTrack")
117 : CreateMockVideoTrack("LocalVideoTrack")) {}
hbos1f8239c2017-01-16 04:24:10 -0800118
119 ~TrackMediaInfoMapTest() {
120 // If we have a map the ownership has been passed to the map, only delete if
Artem Titov880fa812021-07-30 22:30:23 +0200121 // `CreateMap` has not been called.
hbos1f8239c2017-01-16 04:24:10 -0800122 if (!map_) {
123 delete voice_media_info_;
124 delete video_media_info_;
125 }
126 }
127
128 void AddRtpSenderWithSsrcs(std::initializer_list<uint32_t> ssrcs,
129 MediaStreamTrackInterface* local_track) {
Steve Anton57858b32018-02-15 15:19:50 -0800130 rtc::scoped_refptr<MockRtpSenderInternal> rtp_sender = CreateMockRtpSender(
deadbeef804c1af2017-02-11 19:07:31 -0800131 local_track->kind() == MediaStreamTrackInterface::kAudioKind
132 ? cricket::MEDIA_TYPE_AUDIO
133 : cricket::MEDIA_TYPE_VIDEO,
Niels Möllere7cc8832022-01-04 15:20:03 +0100134 ssrcs, rtc::scoped_refptr<MediaStreamTrackInterface>(local_track));
hbos1f8239c2017-01-16 04:24:10 -0800135 rtp_senders_.push_back(rtp_sender);
136
137 if (local_track->kind() == MediaStreamTrackInterface::kAudioKind) {
138 cricket::VoiceSenderInfo voice_sender_info;
139 size_t i = 0;
140 for (uint32_t ssrc : ssrcs) {
141 voice_sender_info.local_stats.push_back(cricket::SsrcSenderInfo());
142 voice_sender_info.local_stats[i++].ssrc = ssrc;
143 }
144 voice_media_info_->senders.push_back(voice_sender_info);
145 } else {
146 cricket::VideoSenderInfo video_sender_info;
147 size_t i = 0;
148 for (uint32_t ssrc : ssrcs) {
149 video_sender_info.local_stats.push_back(cricket::SsrcSenderInfo());
150 video_sender_info.local_stats[i++].ssrc = ssrc;
151 }
152 video_media_info_->senders.push_back(video_sender_info);
Henrik Boströma0ff50c2020-05-05 15:54:46 +0200153 video_media_info_->aggregated_senders.push_back(video_sender_info);
hbos1f8239c2017-01-16 04:24:10 -0800154 }
155 }
156
157 void AddRtpReceiverWithSsrcs(std::initializer_list<uint32_t> ssrcs,
158 MediaStreamTrackInterface* remote_track) {
Steve Anton57858b32018-02-15 15:19:50 -0800159 auto rtp_receiver = CreateMockRtpReceiver(
deadbeef804c1af2017-02-11 19:07:31 -0800160 remote_track->kind() == MediaStreamTrackInterface::kAudioKind
161 ? cricket::MEDIA_TYPE_AUDIO
162 : cricket::MEDIA_TYPE_VIDEO,
Niels Möllere7cc8832022-01-04 15:20:03 +0100163 ssrcs, rtc::scoped_refptr<MediaStreamTrackInterface>(remote_track));
hbos1f8239c2017-01-16 04:24:10 -0800164 rtp_receivers_.push_back(rtp_receiver);
165
166 if (remote_track->kind() == MediaStreamTrackInterface::kAudioKind) {
167 cricket::VoiceReceiverInfo voice_receiver_info;
168 size_t i = 0;
169 for (uint32_t ssrc : ssrcs) {
170 voice_receiver_info.local_stats.push_back(cricket::SsrcReceiverInfo());
171 voice_receiver_info.local_stats[i++].ssrc = ssrc;
172 }
173 voice_media_info_->receivers.push_back(voice_receiver_info);
174 } else {
175 cricket::VideoReceiverInfo video_receiver_info;
176 size_t i = 0;
177 for (uint32_t ssrc : ssrcs) {
178 video_receiver_info.local_stats.push_back(cricket::SsrcReceiverInfo());
179 video_receiver_info.local_stats[i++].ssrc = ssrc;
180 }
181 video_media_info_->receivers.push_back(video_receiver_info);
182 }
183 }
184
185 void CreateMap() {
186 RTC_DCHECK(!map_);
187 map_.reset(new TrackMediaInfoMap(
188 std::unique_ptr<cricket::VoiceMediaInfo>(voice_media_info_),
189 std::unique_ptr<cricket::VideoMediaInfo>(video_media_info_),
deadbeef804c1af2017-02-11 19:07:31 -0800190 rtp_senders_, rtp_receivers_));
hbos1f8239c2017-01-16 04:24:10 -0800191 }
192
193 protected:
194 cricket::VoiceMediaInfo* voice_media_info_;
195 cricket::VideoMediaInfo* video_media_info_;
Steve Anton57858b32018-02-15 15:19:50 -0800196 std::vector<rtc::scoped_refptr<RtpSenderInternal>> rtp_senders_;
197 std::vector<rtc::scoped_refptr<RtpReceiverInternal>> rtp_receivers_;
hbos1f8239c2017-01-16 04:24:10 -0800198 std::unique_ptr<TrackMediaInfoMap> map_;
199 rtc::scoped_refptr<AudioTrack> local_audio_track_;
200 rtc::scoped_refptr<AudioTrack> remote_audio_track_;
Tommi816134a2021-05-24 16:54:41 +0200201 rtc::scoped_refptr<VideoTrackInterface> local_video_track_;
202 rtc::scoped_refptr<VideoTrackInterface> remote_video_track_;
hbos1f8239c2017-01-16 04:24:10 -0800203};
204
205} // namespace
206
207TEST_F(TrackMediaInfoMapTest, SingleSenderReceiverPerTrackWithOneSsrc) {
Niels Möllerafb246b2022-04-20 14:26:50 +0200208 AddRtpSenderWithSsrcs({1}, local_audio_track_.get());
209 AddRtpReceiverWithSsrcs({2}, remote_audio_track_.get());
210 AddRtpSenderWithSsrcs({3}, local_video_track_.get());
211 AddRtpReceiverWithSsrcs({4}, remote_video_track_.get());
hbos1f8239c2017-01-16 04:24:10 -0800212 CreateMap();
213
214 // Local audio track <-> RTP audio sender
215 ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800216 EXPECT_EQ(
217 *map_->GetVoiceSenderInfos(*local_audio_track_),
218 std::vector<cricket::VoiceSenderInfo*>({&voice_media_info_->senders[0]}));
hbos1f8239c2017-01-16 04:24:10 -0800219 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
220 local_audio_track_.get());
221
222 // Remote audio track <-> RTP audio receiver
223 EXPECT_EQ(map_->GetVoiceReceiverInfo(*remote_audio_track_),
224 &voice_media_info_->receivers[0]);
225 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->receivers[0]),
226 remote_audio_track_.get());
227
228 // Local video track <-> RTP video sender
229 ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800230 EXPECT_EQ(
231 *map_->GetVideoSenderInfos(*local_video_track_),
232 std::vector<cricket::VideoSenderInfo*>({&video_media_info_->senders[0]}));
hbos1f8239c2017-01-16 04:24:10 -0800233 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
234 local_video_track_.get());
235
236 // Remote video track <-> RTP video receiver
237 EXPECT_EQ(map_->GetVideoReceiverInfo(*remote_video_track_),
238 &video_media_info_->receivers[0]);
239 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->receivers[0]),
240 remote_video_track_.get());
241}
242
243TEST_F(TrackMediaInfoMapTest, SingleSenderReceiverPerTrackWithMissingSsrc) {
Niels Möllerafb246b2022-04-20 14:26:50 +0200244 AddRtpSenderWithSsrcs({}, local_audio_track_.get());
245 AddRtpSenderWithSsrcs({}, local_video_track_.get());
246 AddRtpReceiverWithSsrcs({}, remote_audio_track_.get());
247 AddRtpReceiverWithSsrcs({}, remote_video_track_.get());
hbos1f8239c2017-01-16 04:24:10 -0800248 CreateMap();
249
250 EXPECT_FALSE(map_->GetVoiceSenderInfos(*local_audio_track_));
251 EXPECT_FALSE(map_->GetVideoSenderInfos(*local_video_track_));
252 EXPECT_FALSE(map_->GetVoiceReceiverInfo(*remote_audio_track_));
253 EXPECT_FALSE(map_->GetVideoReceiverInfo(*remote_video_track_));
254}
255
256TEST_F(TrackMediaInfoMapTest,
257 SingleSenderReceiverPerTrackWithAudioAndVideoUseSameSsrc) {
Niels Möllerafb246b2022-04-20 14:26:50 +0200258 AddRtpSenderWithSsrcs({1}, local_audio_track_.get());
259 AddRtpReceiverWithSsrcs({2}, remote_audio_track_.get());
260 AddRtpSenderWithSsrcs({1}, local_video_track_.get());
261 AddRtpReceiverWithSsrcs({2}, remote_video_track_.get());
hbos1f8239c2017-01-16 04:24:10 -0800262 CreateMap();
263
264 // Local audio track <-> RTP audio sender
265 ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800266 EXPECT_EQ(
267 *map_->GetVoiceSenderInfos(*local_audio_track_),
268 std::vector<cricket::VoiceSenderInfo*>({&voice_media_info_->senders[0]}));
hbos1f8239c2017-01-16 04:24:10 -0800269 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
270 local_audio_track_.get());
271
272 // Remote audio track <-> RTP audio receiver
273 EXPECT_EQ(map_->GetVoiceReceiverInfo(*remote_audio_track_),
274 &voice_media_info_->receivers[0]);
275 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->receivers[0]),
276 remote_audio_track_.get());
277
278 // Local video track <-> RTP video sender
279 ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800280 EXPECT_EQ(
281 *map_->GetVideoSenderInfos(*local_video_track_),
282 std::vector<cricket::VideoSenderInfo*>({&video_media_info_->senders[0]}));
hbos1f8239c2017-01-16 04:24:10 -0800283 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
284 local_video_track_.get());
285
286 // Remote video track <-> RTP video receiver
287 EXPECT_EQ(map_->GetVideoReceiverInfo(*remote_video_track_),
288 &video_media_info_->receivers[0]);
289 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->receivers[0]),
290 remote_video_track_.get());
291}
292
293TEST_F(TrackMediaInfoMapTest, SingleMultiSsrcSenderPerTrack) {
Niels Möllerafb246b2022-04-20 14:26:50 +0200294 AddRtpSenderWithSsrcs({1, 2}, local_audio_track_.get());
295 AddRtpSenderWithSsrcs({3, 4}, local_video_track_.get());
hbos1f8239c2017-01-16 04:24:10 -0800296 CreateMap();
297
298 // Local audio track <-> RTP audio senders
299 ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800300 EXPECT_EQ(
301 *map_->GetVoiceSenderInfos(*local_audio_track_),
302 std::vector<cricket::VoiceSenderInfo*>({&voice_media_info_->senders[0]}));
hbos1f8239c2017-01-16 04:24:10 -0800303 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
304 local_audio_track_.get());
305
306 // Local video track <-> RTP video senders
307 ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800308 EXPECT_EQ(
309 *map_->GetVideoSenderInfos(*local_video_track_),
310 std::vector<cricket::VideoSenderInfo*>({&video_media_info_->senders[0]}));
hbos1f8239c2017-01-16 04:24:10 -0800311 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
312 local_video_track_.get());
313}
314
315TEST_F(TrackMediaInfoMapTest, MultipleOneSsrcSendersPerTrack) {
Niels Möllerafb246b2022-04-20 14:26:50 +0200316 AddRtpSenderWithSsrcs({1}, local_audio_track_.get());
317 AddRtpSenderWithSsrcs({2}, local_audio_track_.get());
318 AddRtpSenderWithSsrcs({3}, local_video_track_.get());
319 AddRtpSenderWithSsrcs({4}, local_video_track_.get());
hbos1f8239c2017-01-16 04:24:10 -0800320 CreateMap();
321
322 // Local audio track <-> RTP audio senders
323 ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800324 EXPECT_EQ(
325 *map_->GetVoiceSenderInfos(*local_audio_track_),
326 std::vector<cricket::VoiceSenderInfo*>(
327 {&voice_media_info_->senders[0], &voice_media_info_->senders[1]}));
hbos1f8239c2017-01-16 04:24:10 -0800328 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
329 local_audio_track_.get());
330 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[1]),
331 local_audio_track_.get());
332
333 // Local video track <-> RTP video senders
334 ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800335 EXPECT_EQ(
336 *map_->GetVideoSenderInfos(*local_video_track_),
337 std::vector<cricket::VideoSenderInfo*>(
338 {&video_media_info_->senders[0], &video_media_info_->senders[1]}));
hbos1f8239c2017-01-16 04:24:10 -0800339 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
340 local_video_track_.get());
341 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[1]),
342 local_video_track_.get());
343}
344
345TEST_F(TrackMediaInfoMapTest, MultipleMultiSsrcSendersPerTrack) {
Niels Möllerafb246b2022-04-20 14:26:50 +0200346 AddRtpSenderWithSsrcs({1, 2}, local_audio_track_.get());
347 AddRtpSenderWithSsrcs({3, 4}, local_audio_track_.get());
348 AddRtpSenderWithSsrcs({5, 6}, local_video_track_.get());
349 AddRtpSenderWithSsrcs({7, 8}, local_video_track_.get());
hbos1f8239c2017-01-16 04:24:10 -0800350 CreateMap();
351
352 // Local audio track <-> RTP audio senders
353 ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800354 EXPECT_EQ(
355 *map_->GetVoiceSenderInfos(*local_audio_track_),
356 std::vector<cricket::VoiceSenderInfo*>(
357 {&voice_media_info_->senders[0], &voice_media_info_->senders[1]}));
hbos1f8239c2017-01-16 04:24:10 -0800358 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
359 local_audio_track_.get());
360 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[1]),
361 local_audio_track_.get());
362
363 // Local video track <-> RTP video senders
364 ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800365 EXPECT_EQ(
366 *map_->GetVideoSenderInfos(*local_video_track_),
367 std::vector<cricket::VideoSenderInfo*>(
368 {&video_media_info_->senders[0], &video_media_info_->senders[1]}));
hbos1f8239c2017-01-16 04:24:10 -0800369 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
370 local_video_track_.get());
371 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[1]),
372 local_video_track_.get());
373}
374
hbosfe90ad12017-02-20 02:05:13 -0800375// SSRCs can be reused for send and receive in loopback.
376TEST_F(TrackMediaInfoMapTest, SingleSenderReceiverPerTrackWithSsrcNotUnique) {
Niels Möllerafb246b2022-04-20 14:26:50 +0200377 AddRtpSenderWithSsrcs({1}, local_audio_track_.get());
378 AddRtpReceiverWithSsrcs({1}, remote_audio_track_.get());
379 AddRtpSenderWithSsrcs({2}, local_video_track_.get());
380 AddRtpReceiverWithSsrcs({2}, remote_video_track_.get());
hbosfe90ad12017-02-20 02:05:13 -0800381 CreateMap();
382
383 // Local audio track <-> RTP audio senders
384 ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
385 EXPECT_EQ(
386 *map_->GetVoiceSenderInfos(*local_audio_track_),
387 std::vector<cricket::VoiceSenderInfo*>({&voice_media_info_->senders[0]}));
388 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
389 local_audio_track_.get());
390
391 // Remote audio track <-> RTP audio receiver
392 EXPECT_EQ(map_->GetVoiceReceiverInfo(*remote_audio_track_),
393 &voice_media_info_->receivers[0]);
394 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->receivers[0]),
395 remote_audio_track_.get());
396
397 // Local video track <-> RTP video senders
398 ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
399 EXPECT_EQ(
400 *map_->GetVideoSenderInfos(*local_video_track_),
401 std::vector<cricket::VideoSenderInfo*>({&video_media_info_->senders[0]}));
402 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
403 local_video_track_.get());
404
405 // Remote video track <-> RTP video receiver
406 EXPECT_EQ(map_->GetVideoReceiverInfo(*remote_video_track_),
407 &video_media_info_->receivers[0]);
408 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->receivers[0]),
409 remote_video_track_.get());
410}
411
Harald Alvestrand89061872018-01-02 14:08:34 +0100412TEST_F(TrackMediaInfoMapTest, SsrcLookupFunction) {
Niels Möllerafb246b2022-04-20 14:26:50 +0200413 AddRtpSenderWithSsrcs({1}, local_audio_track_.get());
414 AddRtpReceiverWithSsrcs({2}, remote_audio_track_.get());
415 AddRtpSenderWithSsrcs({3}, local_video_track_.get());
416 AddRtpReceiverWithSsrcs({4}, remote_video_track_.get());
Harald Alvestrand89061872018-01-02 14:08:34 +0100417 CreateMap();
418 EXPECT_TRUE(map_->GetVoiceSenderInfoBySsrc(1));
419 EXPECT_TRUE(map_->GetVoiceReceiverInfoBySsrc(2));
420 EXPECT_TRUE(map_->GetVideoSenderInfoBySsrc(3));
421 EXPECT_TRUE(map_->GetVideoReceiverInfoBySsrc(4));
422 EXPECT_FALSE(map_->GetVoiceSenderInfoBySsrc(2));
423 EXPECT_FALSE(map_->GetVoiceSenderInfoBySsrc(1024));
424}
425
Harald Alvestrandc72af932018-01-11 17:18:19 +0100426TEST_F(TrackMediaInfoMapTest, GetAttachmentIdByTrack) {
Niels Möllerafb246b2022-04-20 14:26:50 +0200427 AddRtpSenderWithSsrcs({1}, local_audio_track_.get());
Harald Alvestrandc72af932018-01-11 17:18:19 +0100428 CreateMap();
429 EXPECT_EQ(rtp_senders_[0]->AttachmentId(),
Niels Möllerafb246b2022-04-20 14:26:50 +0200430 map_->GetAttachmentIdByTrack(local_audio_track_.get()));
431 EXPECT_EQ(absl::nullopt,
432 map_->GetAttachmentIdByTrack(local_video_track_.get()));
Harald Alvestrandc72af932018-01-11 17:18:19 +0100433}
434
hbos1f8239c2017-01-16 04:24:10 -0800435// Death tests.
436// Disabled on Android because death tests misbehave on Android, see
437// base/test/gtest_util.h.
438#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
439
Tommiec3ba732020-05-17 14:33:40 +0200440class TrackMediaInfoMapDeathTest : public TrackMediaInfoMapTest {
441 public:
442 TrackMediaInfoMapDeathTest() : TrackMediaInfoMapTest(false) {}
443};
hbos1f8239c2017-01-16 04:24:10 -0800444
445TEST_F(TrackMediaInfoMapDeathTest, MultipleOneSsrcReceiversPerTrack) {
Niels Möllerafb246b2022-04-20 14:26:50 +0200446 AddRtpReceiverWithSsrcs({1}, remote_audio_track_.get());
447 AddRtpReceiverWithSsrcs({2}, remote_audio_track_.get());
448 AddRtpReceiverWithSsrcs({3}, remote_video_track_.get());
449 AddRtpReceiverWithSsrcs({4}, remote_video_track_.get());
hbos1f8239c2017-01-16 04:24:10 -0800450 EXPECT_DEATH(CreateMap(), "");
451}
452
453TEST_F(TrackMediaInfoMapDeathTest, MultipleMultiSsrcReceiversPerTrack) {
Niels Möllerafb246b2022-04-20 14:26:50 +0200454 AddRtpReceiverWithSsrcs({1, 2}, remote_audio_track_.get());
455 AddRtpReceiverWithSsrcs({3, 4}, remote_audio_track_.get());
456 AddRtpReceiverWithSsrcs({5, 6}, remote_video_track_.get());
457 AddRtpReceiverWithSsrcs({7, 8}, remote_video_track_.get());
hbos1f8239c2017-01-16 04:24:10 -0800458 EXPECT_DEATH(CreateMap(), "");
459}
460
hbos1f8239c2017-01-16 04:24:10 -0800461#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
462
463} // namespace webrtc