blob: 583aa89d739eed82db290263a8edada5f2f98cc5 [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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "pc/trackmediainfomap.h"
hbos1f8239c2017-01-16 04:24:10 -080012
13#include <initializer_list>
14#include <memory>
15#include <utility>
16#include <vector>
17
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "api/rtpreceiverinterface.h"
19#include "api/rtpsenderinterface.h"
20#include "api/test/mock_rtpreceiver.h"
21#include "api/test/mock_rtpsender.h"
22#include "media/base/mediachannel.h"
23#include "pc/audiotrack.h"
24#include "pc/test/fakevideotracksource.h"
25#include "pc/videotrack.h"
26#include "rtc_base/refcount.h"
27#include "test/gtest.h"
hbos1f8239c2017-01-16 04:24:10 -080028
29namespace webrtc {
30
31namespace {
32
33RtpParameters CreateRtpParametersWithSsrcs(
34 std::initializer_list<uint32_t> ssrcs) {
35 RtpParameters params;
36 for (uint32_t ssrc : ssrcs) {
37 RtpEncodingParameters encoding_params;
Oskar Sundbom36f8f3e2017-11-16 10:54:27 +010038 encoding_params.ssrc = ssrc;
hbos1f8239c2017-01-16 04:24:10 -080039 params.encodings.push_back(encoding_params);
40 }
41 return params;
42}
43
44rtc::scoped_refptr<MockRtpSender> CreateMockRtpSender(
deadbeef804c1af2017-02-11 19:07:31 -080045 cricket::MediaType media_type,
46 std::initializer_list<uint32_t> ssrcs,
hbos1f8239c2017-01-16 04:24:10 -080047 rtc::scoped_refptr<MediaStreamTrackInterface> track) {
48 uint32_t first_ssrc;
49 if (ssrcs.size()) {
50 first_ssrc = *ssrcs.begin();
51 } else {
52 first_ssrc = 0;
53 }
54 rtc::scoped_refptr<MockRtpSender> sender(
55 new rtc::RefCountedObject<MockRtpSender>());
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +010056 EXPECT_CALL(*sender, track())
57 .WillRepeatedly(testing::Return(std::move(track)));
hbos1f8239c2017-01-16 04:24:10 -080058 EXPECT_CALL(*sender, ssrc()).WillRepeatedly(testing::Return(first_ssrc));
deadbeef804c1af2017-02-11 19:07:31 -080059 EXPECT_CALL(*sender, media_type())
60 .WillRepeatedly(testing::Return(media_type));
61 EXPECT_CALL(*sender, GetParameters())
62 .WillRepeatedly(testing::Return(CreateRtpParametersWithSsrcs(ssrcs)));
Harald Alvestrandc72af932018-01-11 17:18:19 +010063 EXPECT_CALL(*sender, AttachmentId()).WillRepeatedly(testing::Return(1));
hbos1f8239c2017-01-16 04:24:10 -080064 return sender;
65}
66
67rtc::scoped_refptr<MockRtpReceiver> CreateMockRtpReceiver(
deadbeef804c1af2017-02-11 19:07:31 -080068 cricket::MediaType media_type,
69 std::initializer_list<uint32_t> ssrcs,
hbos1f8239c2017-01-16 04:24:10 -080070 rtc::scoped_refptr<MediaStreamTrackInterface> track) {
71 rtc::scoped_refptr<MockRtpReceiver> receiver(
72 new rtc::RefCountedObject<MockRtpReceiver>());
Mirko Bonadeic61ce0d2017-11-21 17:04:20 +010073 EXPECT_CALL(*receiver, track())
74 .WillRepeatedly(testing::Return(std::move(track)));
deadbeef804c1af2017-02-11 19:07:31 -080075 EXPECT_CALL(*receiver, media_type())
76 .WillRepeatedly(testing::Return(media_type));
77 EXPECT_CALL(*receiver, GetParameters())
78 .WillRepeatedly(testing::Return(CreateRtpParametersWithSsrcs(ssrcs)));
Harald Alvestrandc72af932018-01-11 17:18:19 +010079 EXPECT_CALL(*receiver, AttachmentId()).WillRepeatedly(testing::Return(1));
hbos1f8239c2017-01-16 04:24:10 -080080 return receiver;
81}
82
83class TrackMediaInfoMapTest : public testing::Test {
84 public:
85 TrackMediaInfoMapTest()
86 : voice_media_info_(new cricket::VoiceMediaInfo()),
87 video_media_info_(new cricket::VideoMediaInfo()),
88 local_audio_track_(AudioTrack::Create("LocalAudioTrack", nullptr)),
89 remote_audio_track_(AudioTrack::Create("RemoteAudioTrack", nullptr)),
90 local_video_track_(
91 VideoTrack::Create("LocalVideoTrack",
perkj773be362017-07-31 23:22:01 -070092 FakeVideoTrackSource::Create(false),
93 rtc::Thread::Current())),
hbos1f8239c2017-01-16 04:24:10 -080094 remote_video_track_(
95 VideoTrack::Create("RemoteVideoTrack",
perkj773be362017-07-31 23:22:01 -070096 FakeVideoTrackSource::Create(false),
97 rtc::Thread::Current())) {}
hbos1f8239c2017-01-16 04:24:10 -080098
99 ~TrackMediaInfoMapTest() {
100 // If we have a map the ownership has been passed to the map, only delete if
101 // |CreateMap| has not been called.
102 if (!map_) {
103 delete voice_media_info_;
104 delete video_media_info_;
105 }
106 }
107
108 void AddRtpSenderWithSsrcs(std::initializer_list<uint32_t> ssrcs,
109 MediaStreamTrackInterface* local_track) {
110 rtc::scoped_refptr<MockRtpSender> rtp_sender = CreateMockRtpSender(
deadbeef804c1af2017-02-11 19:07:31 -0800111 local_track->kind() == MediaStreamTrackInterface::kAudioKind
112 ? cricket::MEDIA_TYPE_AUDIO
113 : cricket::MEDIA_TYPE_VIDEO,
hbos1f8239c2017-01-16 04:24:10 -0800114 ssrcs, local_track);
115 rtp_senders_.push_back(rtp_sender);
116
117 if (local_track->kind() == MediaStreamTrackInterface::kAudioKind) {
118 cricket::VoiceSenderInfo voice_sender_info;
119 size_t i = 0;
120 for (uint32_t ssrc : ssrcs) {
121 voice_sender_info.local_stats.push_back(cricket::SsrcSenderInfo());
122 voice_sender_info.local_stats[i++].ssrc = ssrc;
123 }
124 voice_media_info_->senders.push_back(voice_sender_info);
125 } else {
126 cricket::VideoSenderInfo video_sender_info;
127 size_t i = 0;
128 for (uint32_t ssrc : ssrcs) {
129 video_sender_info.local_stats.push_back(cricket::SsrcSenderInfo());
130 video_sender_info.local_stats[i++].ssrc = ssrc;
131 }
132 video_media_info_->senders.push_back(video_sender_info);
133 }
134 }
135
136 void AddRtpReceiverWithSsrcs(std::initializer_list<uint32_t> ssrcs,
137 MediaStreamTrackInterface* remote_track) {
138 rtc::scoped_refptr<MockRtpReceiver> rtp_receiver = CreateMockRtpReceiver(
deadbeef804c1af2017-02-11 19:07:31 -0800139 remote_track->kind() == MediaStreamTrackInterface::kAudioKind
140 ? cricket::MEDIA_TYPE_AUDIO
141 : cricket::MEDIA_TYPE_VIDEO,
hbos1f8239c2017-01-16 04:24:10 -0800142 ssrcs, remote_track);
143 rtp_receivers_.push_back(rtp_receiver);
144
145 if (remote_track->kind() == MediaStreamTrackInterface::kAudioKind) {
146 cricket::VoiceReceiverInfo voice_receiver_info;
147 size_t i = 0;
148 for (uint32_t ssrc : ssrcs) {
149 voice_receiver_info.local_stats.push_back(cricket::SsrcReceiverInfo());
150 voice_receiver_info.local_stats[i++].ssrc = ssrc;
151 }
152 voice_media_info_->receivers.push_back(voice_receiver_info);
153 } else {
154 cricket::VideoReceiverInfo video_receiver_info;
155 size_t i = 0;
156 for (uint32_t ssrc : ssrcs) {
157 video_receiver_info.local_stats.push_back(cricket::SsrcReceiverInfo());
158 video_receiver_info.local_stats[i++].ssrc = ssrc;
159 }
160 video_media_info_->receivers.push_back(video_receiver_info);
161 }
162 }
163
164 void CreateMap() {
165 RTC_DCHECK(!map_);
166 map_.reset(new TrackMediaInfoMap(
167 std::unique_ptr<cricket::VoiceMediaInfo>(voice_media_info_),
168 std::unique_ptr<cricket::VideoMediaInfo>(video_media_info_),
deadbeef804c1af2017-02-11 19:07:31 -0800169 rtp_senders_, rtp_receivers_));
hbos1f8239c2017-01-16 04:24:10 -0800170 }
171
172 protected:
173 cricket::VoiceMediaInfo* voice_media_info_;
174 cricket::VideoMediaInfo* video_media_info_;
175 std::vector<rtc::scoped_refptr<RtpSenderInterface>> rtp_senders_;
176 std::vector<rtc::scoped_refptr<RtpReceiverInterface>> rtp_receivers_;
177 std::unique_ptr<TrackMediaInfoMap> map_;
178 rtc::scoped_refptr<AudioTrack> local_audio_track_;
179 rtc::scoped_refptr<AudioTrack> remote_audio_track_;
180 rtc::scoped_refptr<VideoTrack> local_video_track_;
181 rtc::scoped_refptr<VideoTrack> remote_video_track_;
182};
183
184} // namespace
185
186TEST_F(TrackMediaInfoMapTest, SingleSenderReceiverPerTrackWithOneSsrc) {
deadbeef804c1af2017-02-11 19:07:31 -0800187 AddRtpSenderWithSsrcs({1}, local_audio_track_);
188 AddRtpReceiverWithSsrcs({2}, remote_audio_track_);
189 AddRtpSenderWithSsrcs({3}, local_video_track_);
190 AddRtpReceiverWithSsrcs({4}, remote_video_track_);
hbos1f8239c2017-01-16 04:24:10 -0800191 CreateMap();
192
193 // Local audio track <-> RTP audio sender
194 ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800195 EXPECT_EQ(
196 *map_->GetVoiceSenderInfos(*local_audio_track_),
197 std::vector<cricket::VoiceSenderInfo*>({&voice_media_info_->senders[0]}));
hbos1f8239c2017-01-16 04:24:10 -0800198 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
199 local_audio_track_.get());
200
201 // Remote audio track <-> RTP audio receiver
202 EXPECT_EQ(map_->GetVoiceReceiverInfo(*remote_audio_track_),
203 &voice_media_info_->receivers[0]);
204 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->receivers[0]),
205 remote_audio_track_.get());
206
207 // Local video track <-> RTP video sender
208 ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800209 EXPECT_EQ(
210 *map_->GetVideoSenderInfos(*local_video_track_),
211 std::vector<cricket::VideoSenderInfo*>({&video_media_info_->senders[0]}));
hbos1f8239c2017-01-16 04:24:10 -0800212 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
213 local_video_track_.get());
214
215 // Remote video track <-> RTP video receiver
216 EXPECT_EQ(map_->GetVideoReceiverInfo(*remote_video_track_),
217 &video_media_info_->receivers[0]);
218 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->receivers[0]),
219 remote_video_track_.get());
220}
221
222TEST_F(TrackMediaInfoMapTest, SingleSenderReceiverPerTrackWithMissingSsrc) {
223 AddRtpSenderWithSsrcs({}, local_audio_track_);
224 AddRtpSenderWithSsrcs({}, local_video_track_);
225 AddRtpReceiverWithSsrcs({}, remote_audio_track_);
226 AddRtpReceiverWithSsrcs({}, remote_video_track_);
227 CreateMap();
228
229 EXPECT_FALSE(map_->GetVoiceSenderInfos(*local_audio_track_));
230 EXPECT_FALSE(map_->GetVideoSenderInfos(*local_video_track_));
231 EXPECT_FALSE(map_->GetVoiceReceiverInfo(*remote_audio_track_));
232 EXPECT_FALSE(map_->GetVideoReceiverInfo(*remote_video_track_));
233}
234
235TEST_F(TrackMediaInfoMapTest,
236 SingleSenderReceiverPerTrackWithAudioAndVideoUseSameSsrc) {
deadbeef804c1af2017-02-11 19:07:31 -0800237 AddRtpSenderWithSsrcs({1}, local_audio_track_);
238 AddRtpReceiverWithSsrcs({2}, remote_audio_track_);
239 AddRtpSenderWithSsrcs({1}, local_video_track_);
240 AddRtpReceiverWithSsrcs({2}, remote_video_track_);
hbos1f8239c2017-01-16 04:24:10 -0800241 CreateMap();
242
243 // Local audio track <-> RTP audio sender
244 ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800245 EXPECT_EQ(
246 *map_->GetVoiceSenderInfos(*local_audio_track_),
247 std::vector<cricket::VoiceSenderInfo*>({&voice_media_info_->senders[0]}));
hbos1f8239c2017-01-16 04:24:10 -0800248 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
249 local_audio_track_.get());
250
251 // Remote audio track <-> RTP audio receiver
252 EXPECT_EQ(map_->GetVoiceReceiverInfo(*remote_audio_track_),
253 &voice_media_info_->receivers[0]);
254 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->receivers[0]),
255 remote_audio_track_.get());
256
257 // Local video track <-> RTP video sender
258 ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800259 EXPECT_EQ(
260 *map_->GetVideoSenderInfos(*local_video_track_),
261 std::vector<cricket::VideoSenderInfo*>({&video_media_info_->senders[0]}));
hbos1f8239c2017-01-16 04:24:10 -0800262 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
263 local_video_track_.get());
264
265 // Remote video track <-> RTP video receiver
266 EXPECT_EQ(map_->GetVideoReceiverInfo(*remote_video_track_),
267 &video_media_info_->receivers[0]);
268 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->receivers[0]),
269 remote_video_track_.get());
270}
271
272TEST_F(TrackMediaInfoMapTest, SingleMultiSsrcSenderPerTrack) {
deadbeef804c1af2017-02-11 19:07:31 -0800273 AddRtpSenderWithSsrcs({1, 2}, local_audio_track_);
274 AddRtpSenderWithSsrcs({3, 4}, local_video_track_);
hbos1f8239c2017-01-16 04:24:10 -0800275 CreateMap();
276
277 // Local audio track <-> RTP audio senders
278 ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800279 EXPECT_EQ(
280 *map_->GetVoiceSenderInfos(*local_audio_track_),
281 std::vector<cricket::VoiceSenderInfo*>({&voice_media_info_->senders[0]}));
hbos1f8239c2017-01-16 04:24:10 -0800282 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
283 local_audio_track_.get());
284
285 // Local video track <-> RTP video senders
286 ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800287 EXPECT_EQ(
288 *map_->GetVideoSenderInfos(*local_video_track_),
289 std::vector<cricket::VideoSenderInfo*>({&video_media_info_->senders[0]}));
hbos1f8239c2017-01-16 04:24:10 -0800290 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
291 local_video_track_.get());
292}
293
294TEST_F(TrackMediaInfoMapTest, MultipleOneSsrcSendersPerTrack) {
deadbeef804c1af2017-02-11 19:07:31 -0800295 AddRtpSenderWithSsrcs({1}, local_audio_track_);
296 AddRtpSenderWithSsrcs({2}, local_audio_track_);
297 AddRtpSenderWithSsrcs({3}, local_video_track_);
298 AddRtpSenderWithSsrcs({4}, local_video_track_);
hbos1f8239c2017-01-16 04:24:10 -0800299 CreateMap();
300
301 // Local audio track <-> RTP audio senders
302 ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800303 EXPECT_EQ(
304 *map_->GetVoiceSenderInfos(*local_audio_track_),
305 std::vector<cricket::VoiceSenderInfo*>(
306 {&voice_media_info_->senders[0], &voice_media_info_->senders[1]}));
hbos1f8239c2017-01-16 04:24:10 -0800307 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
308 local_audio_track_.get());
309 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[1]),
310 local_audio_track_.get());
311
312 // Local video track <-> RTP video senders
313 ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800314 EXPECT_EQ(
315 *map_->GetVideoSenderInfos(*local_video_track_),
316 std::vector<cricket::VideoSenderInfo*>(
317 {&video_media_info_->senders[0], &video_media_info_->senders[1]}));
hbos1f8239c2017-01-16 04:24:10 -0800318 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
319 local_video_track_.get());
320 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[1]),
321 local_video_track_.get());
322}
323
324TEST_F(TrackMediaInfoMapTest, MultipleMultiSsrcSendersPerTrack) {
deadbeef804c1af2017-02-11 19:07:31 -0800325 AddRtpSenderWithSsrcs({1, 2}, local_audio_track_);
326 AddRtpSenderWithSsrcs({3, 4}, local_audio_track_);
327 AddRtpSenderWithSsrcs({5, 6}, local_video_track_);
328 AddRtpSenderWithSsrcs({7, 8}, local_video_track_);
hbos1f8239c2017-01-16 04:24:10 -0800329 CreateMap();
330
331 // Local audio track <-> RTP audio senders
332 ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800333 EXPECT_EQ(
334 *map_->GetVoiceSenderInfos(*local_audio_track_),
335 std::vector<cricket::VoiceSenderInfo*>(
336 {&voice_media_info_->senders[0], &voice_media_info_->senders[1]}));
hbos1f8239c2017-01-16 04:24:10 -0800337 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
338 local_audio_track_.get());
339 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[1]),
340 local_audio_track_.get());
341
342 // Local video track <-> RTP video senders
343 ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800344 EXPECT_EQ(
345 *map_->GetVideoSenderInfos(*local_video_track_),
346 std::vector<cricket::VideoSenderInfo*>(
347 {&video_media_info_->senders[0], &video_media_info_->senders[1]}));
hbos1f8239c2017-01-16 04:24:10 -0800348 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
349 local_video_track_.get());
350 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[1]),
351 local_video_track_.get());
352}
353
hbosfe90ad12017-02-20 02:05:13 -0800354// SSRCs can be reused for send and receive in loopback.
355TEST_F(TrackMediaInfoMapTest, SingleSenderReceiverPerTrackWithSsrcNotUnique) {
356 AddRtpSenderWithSsrcs({1}, local_audio_track_);
357 AddRtpReceiverWithSsrcs({1}, remote_audio_track_);
358 AddRtpSenderWithSsrcs({2}, local_video_track_);
359 AddRtpReceiverWithSsrcs({2}, remote_video_track_);
360 CreateMap();
361
362 // Local audio track <-> RTP audio senders
363 ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
364 EXPECT_EQ(
365 *map_->GetVoiceSenderInfos(*local_audio_track_),
366 std::vector<cricket::VoiceSenderInfo*>({&voice_media_info_->senders[0]}));
367 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
368 local_audio_track_.get());
369
370 // Remote audio track <-> RTP audio receiver
371 EXPECT_EQ(map_->GetVoiceReceiverInfo(*remote_audio_track_),
372 &voice_media_info_->receivers[0]);
373 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->receivers[0]),
374 remote_audio_track_.get());
375
376 // Local video track <-> RTP video senders
377 ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
378 EXPECT_EQ(
379 *map_->GetVideoSenderInfos(*local_video_track_),
380 std::vector<cricket::VideoSenderInfo*>({&video_media_info_->senders[0]}));
381 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
382 local_video_track_.get());
383
384 // Remote video track <-> RTP video receiver
385 EXPECT_EQ(map_->GetVideoReceiverInfo(*remote_video_track_),
386 &video_media_info_->receivers[0]);
387 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->receivers[0]),
388 remote_video_track_.get());
389}
390
Harald Alvestrand89061872018-01-02 14:08:34 +0100391TEST_F(TrackMediaInfoMapTest, SsrcLookupFunction) {
392 AddRtpSenderWithSsrcs({1}, local_audio_track_);
393 AddRtpReceiverWithSsrcs({2}, remote_audio_track_);
394 AddRtpSenderWithSsrcs({3}, local_video_track_);
395 AddRtpReceiverWithSsrcs({4}, remote_video_track_);
396 CreateMap();
397 EXPECT_TRUE(map_->GetVoiceSenderInfoBySsrc(1));
398 EXPECT_TRUE(map_->GetVoiceReceiverInfoBySsrc(2));
399 EXPECT_TRUE(map_->GetVideoSenderInfoBySsrc(3));
400 EXPECT_TRUE(map_->GetVideoReceiverInfoBySsrc(4));
401 EXPECT_FALSE(map_->GetVoiceSenderInfoBySsrc(2));
402 EXPECT_FALSE(map_->GetVoiceSenderInfoBySsrc(1024));
403}
404
Harald Alvestrandc72af932018-01-11 17:18:19 +0100405TEST_F(TrackMediaInfoMapTest, GetAttachmentIdByTrack) {
406 AddRtpSenderWithSsrcs({1}, local_audio_track_);
407 CreateMap();
408 EXPECT_EQ(rtp_senders_[0]->AttachmentId(),
409 map_->GetAttachmentIdByTrack(local_audio_track_));
410 EXPECT_EQ(rtc::nullopt, map_->GetAttachmentIdByTrack(local_video_track_));
411}
412
hbos1f8239c2017-01-16 04:24:10 -0800413// Death tests.
414// Disabled on Android because death tests misbehave on Android, see
415// base/test/gtest_util.h.
416#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
417
deadbeef804c1af2017-02-11 19:07:31 -0800418class TrackMediaInfoMapDeathTest : public TrackMediaInfoMapTest {};
hbos1f8239c2017-01-16 04:24:10 -0800419
420TEST_F(TrackMediaInfoMapDeathTest, MultipleOneSsrcReceiversPerTrack) {
deadbeef804c1af2017-02-11 19:07:31 -0800421 AddRtpReceiverWithSsrcs({1}, remote_audio_track_);
422 AddRtpReceiverWithSsrcs({2}, remote_audio_track_);
423 AddRtpReceiverWithSsrcs({3}, remote_video_track_);
424 AddRtpReceiverWithSsrcs({4}, remote_video_track_);
hbos1f8239c2017-01-16 04:24:10 -0800425 EXPECT_DEATH(CreateMap(), "");
426}
427
428TEST_F(TrackMediaInfoMapDeathTest, MultipleMultiSsrcReceiversPerTrack) {
deadbeef804c1af2017-02-11 19:07:31 -0800429 AddRtpReceiverWithSsrcs({1, 2}, remote_audio_track_);
430 AddRtpReceiverWithSsrcs({3, 4}, remote_audio_track_);
431 AddRtpReceiverWithSsrcs({5, 6}, remote_video_track_);
432 AddRtpReceiverWithSsrcs({7, 8}, remote_video_track_);
hbos1f8239c2017-01-16 04:24:10 -0800433 EXPECT_DEATH(CreateMap(), "");
434}
435
hbos1f8239c2017-01-16 04:24:10 -0800436#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
437
438} // namespace webrtc