blob: 4fa8a4ae03ff043e5cdddad655fb63d8632b55d6 [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
13#include <initializer_list>
14#include <memory>
Steve Anton5dfde182018-02-06 10:34:40 -080015#include <string>
hbos1f8239c2017-01-16 04:24:10 -080016#include <utility>
17#include <vector>
18
Steve Anton10542f22019-01-11 09:11:00 -080019#include "api/rtp_sender_interface.h"
Niels Möllera8370302019-09-02 15:16:49 +020020#include "api/transport/rtp/rtp_source.h"
Steve Anton10542f22019-01-11 09:11:00 -080021#include "media/base/media_channel.h"
22#include "pc/audio_track.h"
23#include "pc/test/fake_video_track_source.h"
24#include "pc/test/mock_rtp_receiver_internal.h"
25#include "pc/test/mock_rtp_sender_internal.h"
26#include "pc/video_track.h"
27#include "rtc_base/ref_count.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020028#include "test/gtest.h"
hbos1f8239c2017-01-16 04:24:10 -080029
30namespace webrtc {
31
32namespace {
33
34RtpParameters CreateRtpParametersWithSsrcs(
35 std::initializer_list<uint32_t> ssrcs) {
36 RtpParameters params;
37 for (uint32_t ssrc : ssrcs) {
38 RtpEncodingParameters encoding_params;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +010039 encoding_params.ssrc = ssrc;
hbos1f8239c2017-01-16 04:24:10 -080040 params.encodings.push_back(encoding_params);
41 }
42 return params;
43}
44
Steve Anton57858b32018-02-15 15:19:50 -080045rtc::scoped_refptr<MockRtpSenderInternal> CreateMockRtpSender(
deadbeef804c1af2017-02-11 19:07:31 -080046 cricket::MediaType media_type,
47 std::initializer_list<uint32_t> ssrcs,
hbos1f8239c2017-01-16 04:24:10 -080048 rtc::scoped_refptr<MediaStreamTrackInterface> track) {
49 uint32_t first_ssrc;
50 if (ssrcs.size()) {
51 first_ssrc = *ssrcs.begin();
52 } else {
53 first_ssrc = 0;
54 }
Steve Anton57858b32018-02-15 15:19:50 -080055 rtc::scoped_refptr<MockRtpSenderInternal> sender(
56 new rtc::RefCountedObject<MockRtpSenderInternal>());
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +010057 EXPECT_CALL(*sender, track())
Mirko Bonadei6a489f22019-04-09 15:11:12 +020058 .WillRepeatedly(::testing::Return(std::move(track)));
59 EXPECT_CALL(*sender, ssrc()).WillRepeatedly(::testing::Return(first_ssrc));
deadbeef804c1af2017-02-11 19:07:31 -080060 EXPECT_CALL(*sender, media_type())
Mirko Bonadei6a489f22019-04-09 15:11:12 +020061 .WillRepeatedly(::testing::Return(media_type));
deadbeef804c1af2017-02-11 19:07:31 -080062 EXPECT_CALL(*sender, GetParameters())
Mirko Bonadei6a489f22019-04-09 15:11:12 +020063 .WillRepeatedly(::testing::Return(CreateRtpParametersWithSsrcs(ssrcs)));
64 EXPECT_CALL(*sender, AttachmentId()).WillRepeatedly(::testing::Return(1));
hbos1f8239c2017-01-16 04:24:10 -080065 return sender;
66}
67
Steve Anton57858b32018-02-15 15:19:50 -080068rtc::scoped_refptr<MockRtpReceiverInternal> CreateMockRtpReceiver(
deadbeef804c1af2017-02-11 19:07:31 -080069 cricket::MediaType media_type,
70 std::initializer_list<uint32_t> ssrcs,
hbos1f8239c2017-01-16 04:24:10 -080071 rtc::scoped_refptr<MediaStreamTrackInterface> track) {
Steve Anton57858b32018-02-15 15:19:50 -080072 rtc::scoped_refptr<MockRtpReceiverInternal> receiver(
73 new rtc::RefCountedObject<MockRtpReceiverInternal>());
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +010074 EXPECT_CALL(*receiver, track())
Mirko Bonadei6a489f22019-04-09 15:11:12 +020075 .WillRepeatedly(::testing::Return(std::move(track)));
deadbeef804c1af2017-02-11 19:07:31 -080076 EXPECT_CALL(*receiver, media_type())
Mirko Bonadei6a489f22019-04-09 15:11:12 +020077 .WillRepeatedly(::testing::Return(media_type));
deadbeef804c1af2017-02-11 19:07:31 -080078 EXPECT_CALL(*receiver, GetParameters())
Mirko Bonadei6a489f22019-04-09 15:11:12 +020079 .WillRepeatedly(::testing::Return(CreateRtpParametersWithSsrcs(ssrcs)));
80 EXPECT_CALL(*receiver, AttachmentId()).WillRepeatedly(::testing::Return(1));
hbos1f8239c2017-01-16 04:24:10 -080081 return receiver;
82}
83
Mirko Bonadei6a489f22019-04-09 15:11:12 +020084class TrackMediaInfoMapTest : public ::testing::Test {
hbos1f8239c2017-01-16 04:24:10 -080085 public:
86 TrackMediaInfoMapTest()
87 : voice_media_info_(new cricket::VoiceMediaInfo()),
88 video_media_info_(new cricket::VideoMediaInfo()),
89 local_audio_track_(AudioTrack::Create("LocalAudioTrack", nullptr)),
90 remote_audio_track_(AudioTrack::Create("RemoteAudioTrack", nullptr)),
91 local_video_track_(
92 VideoTrack::Create("LocalVideoTrack",
perkj773be362017-07-31 23:22:01 -070093 FakeVideoTrackSource::Create(false),
94 rtc::Thread::Current())),
hbos1f8239c2017-01-16 04:24:10 -080095 remote_video_track_(
96 VideoTrack::Create("RemoteVideoTrack",
perkj773be362017-07-31 23:22:01 -070097 FakeVideoTrackSource::Create(false),
98 rtc::Thread::Current())) {}
hbos1f8239c2017-01-16 04:24:10 -080099
100 ~TrackMediaInfoMapTest() {
101 // If we have a map the ownership has been passed to the map, only delete if
102 // |CreateMap| has not been called.
103 if (!map_) {
104 delete voice_media_info_;
105 delete video_media_info_;
106 }
107 }
108
109 void AddRtpSenderWithSsrcs(std::initializer_list<uint32_t> ssrcs,
110 MediaStreamTrackInterface* local_track) {
Steve Anton57858b32018-02-15 15:19:50 -0800111 rtc::scoped_refptr<MockRtpSenderInternal> rtp_sender = CreateMockRtpSender(
deadbeef804c1af2017-02-11 19:07:31 -0800112 local_track->kind() == MediaStreamTrackInterface::kAudioKind
113 ? cricket::MEDIA_TYPE_AUDIO
114 : cricket::MEDIA_TYPE_VIDEO,
hbos1f8239c2017-01-16 04:24:10 -0800115 ssrcs, local_track);
116 rtp_senders_.push_back(rtp_sender);
117
118 if (local_track->kind() == MediaStreamTrackInterface::kAudioKind) {
119 cricket::VoiceSenderInfo voice_sender_info;
120 size_t i = 0;
121 for (uint32_t ssrc : ssrcs) {
122 voice_sender_info.local_stats.push_back(cricket::SsrcSenderInfo());
123 voice_sender_info.local_stats[i++].ssrc = ssrc;
124 }
125 voice_media_info_->senders.push_back(voice_sender_info);
126 } else {
127 cricket::VideoSenderInfo video_sender_info;
128 size_t i = 0;
129 for (uint32_t ssrc : ssrcs) {
130 video_sender_info.local_stats.push_back(cricket::SsrcSenderInfo());
131 video_sender_info.local_stats[i++].ssrc = ssrc;
132 }
133 video_media_info_->senders.push_back(video_sender_info);
134 }
135 }
136
137 void AddRtpReceiverWithSsrcs(std::initializer_list<uint32_t> ssrcs,
138 MediaStreamTrackInterface* remote_track) {
Steve Anton57858b32018-02-15 15:19:50 -0800139 auto rtp_receiver = CreateMockRtpReceiver(
deadbeef804c1af2017-02-11 19:07:31 -0800140 remote_track->kind() == MediaStreamTrackInterface::kAudioKind
141 ? cricket::MEDIA_TYPE_AUDIO
142 : cricket::MEDIA_TYPE_VIDEO,
hbos1f8239c2017-01-16 04:24:10 -0800143 ssrcs, remote_track);
144 rtp_receivers_.push_back(rtp_receiver);
145
146 if (remote_track->kind() == MediaStreamTrackInterface::kAudioKind) {
147 cricket::VoiceReceiverInfo voice_receiver_info;
148 size_t i = 0;
149 for (uint32_t ssrc : ssrcs) {
150 voice_receiver_info.local_stats.push_back(cricket::SsrcReceiverInfo());
151 voice_receiver_info.local_stats[i++].ssrc = ssrc;
152 }
153 voice_media_info_->receivers.push_back(voice_receiver_info);
154 } else {
155 cricket::VideoReceiverInfo video_receiver_info;
156 size_t i = 0;
157 for (uint32_t ssrc : ssrcs) {
158 video_receiver_info.local_stats.push_back(cricket::SsrcReceiverInfo());
159 video_receiver_info.local_stats[i++].ssrc = ssrc;
160 }
161 video_media_info_->receivers.push_back(video_receiver_info);
162 }
163 }
164
165 void CreateMap() {
166 RTC_DCHECK(!map_);
167 map_.reset(new TrackMediaInfoMap(
168 std::unique_ptr<cricket::VoiceMediaInfo>(voice_media_info_),
169 std::unique_ptr<cricket::VideoMediaInfo>(video_media_info_),
deadbeef804c1af2017-02-11 19:07:31 -0800170 rtp_senders_, rtp_receivers_));
hbos1f8239c2017-01-16 04:24:10 -0800171 }
172
173 protected:
174 cricket::VoiceMediaInfo* voice_media_info_;
175 cricket::VideoMediaInfo* video_media_info_;
Steve Anton57858b32018-02-15 15:19:50 -0800176 std::vector<rtc::scoped_refptr<RtpSenderInternal>> rtp_senders_;
177 std::vector<rtc::scoped_refptr<RtpReceiverInternal>> rtp_receivers_;
hbos1f8239c2017-01-16 04:24:10 -0800178 std::unique_ptr<TrackMediaInfoMap> map_;
179 rtc::scoped_refptr<AudioTrack> local_audio_track_;
180 rtc::scoped_refptr<AudioTrack> remote_audio_track_;
181 rtc::scoped_refptr<VideoTrack> local_video_track_;
182 rtc::scoped_refptr<VideoTrack> remote_video_track_;
183};
184
185} // namespace
186
187TEST_F(TrackMediaInfoMapTest, SingleSenderReceiverPerTrackWithOneSsrc) {
deadbeef804c1af2017-02-11 19:07:31 -0800188 AddRtpSenderWithSsrcs({1}, local_audio_track_);
189 AddRtpReceiverWithSsrcs({2}, remote_audio_track_);
190 AddRtpSenderWithSsrcs({3}, local_video_track_);
191 AddRtpReceiverWithSsrcs({4}, remote_video_track_);
hbos1f8239c2017-01-16 04:24:10 -0800192 CreateMap();
193
194 // Local audio track <-> RTP audio sender
195 ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800196 EXPECT_EQ(
197 *map_->GetVoiceSenderInfos(*local_audio_track_),
198 std::vector<cricket::VoiceSenderInfo*>({&voice_media_info_->senders[0]}));
hbos1f8239c2017-01-16 04:24:10 -0800199 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
200 local_audio_track_.get());
201
202 // Remote audio track <-> RTP audio receiver
203 EXPECT_EQ(map_->GetVoiceReceiverInfo(*remote_audio_track_),
204 &voice_media_info_->receivers[0]);
205 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->receivers[0]),
206 remote_audio_track_.get());
207
208 // Local video track <-> RTP video sender
209 ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800210 EXPECT_EQ(
211 *map_->GetVideoSenderInfos(*local_video_track_),
212 std::vector<cricket::VideoSenderInfo*>({&video_media_info_->senders[0]}));
hbos1f8239c2017-01-16 04:24:10 -0800213 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
214 local_video_track_.get());
215
216 // Remote video track <-> RTP video receiver
217 EXPECT_EQ(map_->GetVideoReceiverInfo(*remote_video_track_),
218 &video_media_info_->receivers[0]);
219 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->receivers[0]),
220 remote_video_track_.get());
221}
222
223TEST_F(TrackMediaInfoMapTest, SingleSenderReceiverPerTrackWithMissingSsrc) {
224 AddRtpSenderWithSsrcs({}, local_audio_track_);
225 AddRtpSenderWithSsrcs({}, local_video_track_);
226 AddRtpReceiverWithSsrcs({}, remote_audio_track_);
227 AddRtpReceiverWithSsrcs({}, remote_video_track_);
228 CreateMap();
229
230 EXPECT_FALSE(map_->GetVoiceSenderInfos(*local_audio_track_));
231 EXPECT_FALSE(map_->GetVideoSenderInfos(*local_video_track_));
232 EXPECT_FALSE(map_->GetVoiceReceiverInfo(*remote_audio_track_));
233 EXPECT_FALSE(map_->GetVideoReceiverInfo(*remote_video_track_));
234}
235
236TEST_F(TrackMediaInfoMapTest,
237 SingleSenderReceiverPerTrackWithAudioAndVideoUseSameSsrc) {
deadbeef804c1af2017-02-11 19:07:31 -0800238 AddRtpSenderWithSsrcs({1}, local_audio_track_);
239 AddRtpReceiverWithSsrcs({2}, remote_audio_track_);
240 AddRtpSenderWithSsrcs({1}, local_video_track_);
241 AddRtpReceiverWithSsrcs({2}, remote_video_track_);
hbos1f8239c2017-01-16 04:24:10 -0800242 CreateMap();
243
244 // Local audio track <-> RTP audio sender
245 ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800246 EXPECT_EQ(
247 *map_->GetVoiceSenderInfos(*local_audio_track_),
248 std::vector<cricket::VoiceSenderInfo*>({&voice_media_info_->senders[0]}));
hbos1f8239c2017-01-16 04:24:10 -0800249 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
250 local_audio_track_.get());
251
252 // Remote audio track <-> RTP audio receiver
253 EXPECT_EQ(map_->GetVoiceReceiverInfo(*remote_audio_track_),
254 &voice_media_info_->receivers[0]);
255 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->receivers[0]),
256 remote_audio_track_.get());
257
258 // Local video track <-> RTP video sender
259 ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800260 EXPECT_EQ(
261 *map_->GetVideoSenderInfos(*local_video_track_),
262 std::vector<cricket::VideoSenderInfo*>({&video_media_info_->senders[0]}));
hbos1f8239c2017-01-16 04:24:10 -0800263 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
264 local_video_track_.get());
265
266 // Remote video track <-> RTP video receiver
267 EXPECT_EQ(map_->GetVideoReceiverInfo(*remote_video_track_),
268 &video_media_info_->receivers[0]);
269 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->receivers[0]),
270 remote_video_track_.get());
271}
272
273TEST_F(TrackMediaInfoMapTest, SingleMultiSsrcSenderPerTrack) {
deadbeef804c1af2017-02-11 19:07:31 -0800274 AddRtpSenderWithSsrcs({1, 2}, local_audio_track_);
275 AddRtpSenderWithSsrcs({3, 4}, local_video_track_);
hbos1f8239c2017-01-16 04:24:10 -0800276 CreateMap();
277
278 // Local audio track <-> RTP audio senders
279 ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800280 EXPECT_EQ(
281 *map_->GetVoiceSenderInfos(*local_audio_track_),
282 std::vector<cricket::VoiceSenderInfo*>({&voice_media_info_->senders[0]}));
hbos1f8239c2017-01-16 04:24:10 -0800283 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
284 local_audio_track_.get());
285
286 // Local video track <-> RTP video senders
287 ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800288 EXPECT_EQ(
289 *map_->GetVideoSenderInfos(*local_video_track_),
290 std::vector<cricket::VideoSenderInfo*>({&video_media_info_->senders[0]}));
hbos1f8239c2017-01-16 04:24:10 -0800291 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
292 local_video_track_.get());
293}
294
295TEST_F(TrackMediaInfoMapTest, MultipleOneSsrcSendersPerTrack) {
deadbeef804c1af2017-02-11 19:07:31 -0800296 AddRtpSenderWithSsrcs({1}, local_audio_track_);
297 AddRtpSenderWithSsrcs({2}, local_audio_track_);
298 AddRtpSenderWithSsrcs({3}, local_video_track_);
299 AddRtpSenderWithSsrcs({4}, local_video_track_);
hbos1f8239c2017-01-16 04:24:10 -0800300 CreateMap();
301
302 // Local audio track <-> RTP audio senders
303 ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800304 EXPECT_EQ(
305 *map_->GetVoiceSenderInfos(*local_audio_track_),
306 std::vector<cricket::VoiceSenderInfo*>(
307 {&voice_media_info_->senders[0], &voice_media_info_->senders[1]}));
hbos1f8239c2017-01-16 04:24:10 -0800308 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
309 local_audio_track_.get());
310 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[1]),
311 local_audio_track_.get());
312
313 // Local video track <-> RTP video senders
314 ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800315 EXPECT_EQ(
316 *map_->GetVideoSenderInfos(*local_video_track_),
317 std::vector<cricket::VideoSenderInfo*>(
318 {&video_media_info_->senders[0], &video_media_info_->senders[1]}));
hbos1f8239c2017-01-16 04:24:10 -0800319 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
320 local_video_track_.get());
321 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[1]),
322 local_video_track_.get());
323}
324
325TEST_F(TrackMediaInfoMapTest, MultipleMultiSsrcSendersPerTrack) {
deadbeef804c1af2017-02-11 19:07:31 -0800326 AddRtpSenderWithSsrcs({1, 2}, local_audio_track_);
327 AddRtpSenderWithSsrcs({3, 4}, local_audio_track_);
328 AddRtpSenderWithSsrcs({5, 6}, local_video_track_);
329 AddRtpSenderWithSsrcs({7, 8}, local_video_track_);
hbos1f8239c2017-01-16 04:24:10 -0800330 CreateMap();
331
332 // Local audio track <-> RTP audio senders
333 ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800334 EXPECT_EQ(
335 *map_->GetVoiceSenderInfos(*local_audio_track_),
336 std::vector<cricket::VoiceSenderInfo*>(
337 {&voice_media_info_->senders[0], &voice_media_info_->senders[1]}));
hbos1f8239c2017-01-16 04:24:10 -0800338 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
339 local_audio_track_.get());
340 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[1]),
341 local_audio_track_.get());
342
343 // Local video track <-> RTP video senders
344 ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800345 EXPECT_EQ(
346 *map_->GetVideoSenderInfos(*local_video_track_),
347 std::vector<cricket::VideoSenderInfo*>(
348 {&video_media_info_->senders[0], &video_media_info_->senders[1]}));
hbos1f8239c2017-01-16 04:24:10 -0800349 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
350 local_video_track_.get());
351 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[1]),
352 local_video_track_.get());
353}
354
hbosfe90ad12017-02-20 02:05:13 -0800355// SSRCs can be reused for send and receive in loopback.
356TEST_F(TrackMediaInfoMapTest, SingleSenderReceiverPerTrackWithSsrcNotUnique) {
357 AddRtpSenderWithSsrcs({1}, local_audio_track_);
358 AddRtpReceiverWithSsrcs({1}, remote_audio_track_);
359 AddRtpSenderWithSsrcs({2}, local_video_track_);
360 AddRtpReceiverWithSsrcs({2}, remote_video_track_);
361 CreateMap();
362
363 // Local audio track <-> RTP audio senders
364 ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
365 EXPECT_EQ(
366 *map_->GetVoiceSenderInfos(*local_audio_track_),
367 std::vector<cricket::VoiceSenderInfo*>({&voice_media_info_->senders[0]}));
368 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
369 local_audio_track_.get());
370
371 // Remote audio track <-> RTP audio receiver
372 EXPECT_EQ(map_->GetVoiceReceiverInfo(*remote_audio_track_),
373 &voice_media_info_->receivers[0]);
374 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->receivers[0]),
375 remote_audio_track_.get());
376
377 // Local video track <-> RTP video senders
378 ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
379 EXPECT_EQ(
380 *map_->GetVideoSenderInfos(*local_video_track_),
381 std::vector<cricket::VideoSenderInfo*>({&video_media_info_->senders[0]}));
382 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
383 local_video_track_.get());
384
385 // Remote video track <-> RTP video receiver
386 EXPECT_EQ(map_->GetVideoReceiverInfo(*remote_video_track_),
387 &video_media_info_->receivers[0]);
388 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->receivers[0]),
389 remote_video_track_.get());
390}
391
Harald Alvestrand89061872018-01-02 14:08:34 +0100392TEST_F(TrackMediaInfoMapTest, SsrcLookupFunction) {
393 AddRtpSenderWithSsrcs({1}, local_audio_track_);
394 AddRtpReceiverWithSsrcs({2}, remote_audio_track_);
395 AddRtpSenderWithSsrcs({3}, local_video_track_);
396 AddRtpReceiverWithSsrcs({4}, remote_video_track_);
397 CreateMap();
398 EXPECT_TRUE(map_->GetVoiceSenderInfoBySsrc(1));
399 EXPECT_TRUE(map_->GetVoiceReceiverInfoBySsrc(2));
400 EXPECT_TRUE(map_->GetVideoSenderInfoBySsrc(3));
401 EXPECT_TRUE(map_->GetVideoReceiverInfoBySsrc(4));
402 EXPECT_FALSE(map_->GetVoiceSenderInfoBySsrc(2));
403 EXPECT_FALSE(map_->GetVoiceSenderInfoBySsrc(1024));
404}
405
Harald Alvestrandc72af932018-01-11 17:18:19 +0100406TEST_F(TrackMediaInfoMapTest, GetAttachmentIdByTrack) {
407 AddRtpSenderWithSsrcs({1}, local_audio_track_);
408 CreateMap();
409 EXPECT_EQ(rtp_senders_[0]->AttachmentId(),
410 map_->GetAttachmentIdByTrack(local_audio_track_));
Danil Chapovalov66cadcc2018-06-19 16:47:43 +0200411 EXPECT_EQ(absl::nullopt, map_->GetAttachmentIdByTrack(local_video_track_));
Harald Alvestrandc72af932018-01-11 17:18:19 +0100412}
413
hbos1f8239c2017-01-16 04:24:10 -0800414// Death tests.
415// Disabled on Android because death tests misbehave on Android, see
416// base/test/gtest_util.h.
417#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
418
deadbeef804c1af2017-02-11 19:07:31 -0800419class TrackMediaInfoMapDeathTest : public TrackMediaInfoMapTest {};
hbos1f8239c2017-01-16 04:24:10 -0800420
421TEST_F(TrackMediaInfoMapDeathTest, MultipleOneSsrcReceiversPerTrack) {
deadbeef804c1af2017-02-11 19:07:31 -0800422 AddRtpReceiverWithSsrcs({1}, remote_audio_track_);
423 AddRtpReceiverWithSsrcs({2}, remote_audio_track_);
424 AddRtpReceiverWithSsrcs({3}, remote_video_track_);
425 AddRtpReceiverWithSsrcs({4}, remote_video_track_);
hbos1f8239c2017-01-16 04:24:10 -0800426 EXPECT_DEATH(CreateMap(), "");
427}
428
429TEST_F(TrackMediaInfoMapDeathTest, MultipleMultiSsrcReceiversPerTrack) {
deadbeef804c1af2017-02-11 19:07:31 -0800430 AddRtpReceiverWithSsrcs({1, 2}, remote_audio_track_);
431 AddRtpReceiverWithSsrcs({3, 4}, remote_audio_track_);
432 AddRtpReceiverWithSsrcs({5, 6}, remote_video_track_);
433 AddRtpReceiverWithSsrcs({7, 8}, remote_video_track_);
hbos1f8239c2017-01-16 04:24:10 -0800434 EXPECT_DEATH(CreateMap(), "");
435}
436
hbos1f8239c2017-01-16 04:24:10 -0800437#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
438
439} // namespace webrtc