blob: 4f71d3b4c2a2574628375d4f3ec0cfd431016034 [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;
38 encoding_params.ssrc = rtc::Optional<uint32_t>(ssrc);
39 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>());
56 EXPECT_CALL(*sender, track()).WillRepeatedly(testing::Return(track));
57 EXPECT_CALL(*sender, ssrc()).WillRepeatedly(testing::Return(first_ssrc));
deadbeef804c1af2017-02-11 19:07:31 -080058 EXPECT_CALL(*sender, media_type())
59 .WillRepeatedly(testing::Return(media_type));
60 EXPECT_CALL(*sender, GetParameters())
61 .WillRepeatedly(testing::Return(CreateRtpParametersWithSsrcs(ssrcs)));
hbos1f8239c2017-01-16 04:24:10 -080062 return sender;
63}
64
65rtc::scoped_refptr<MockRtpReceiver> CreateMockRtpReceiver(
deadbeef804c1af2017-02-11 19:07:31 -080066 cricket::MediaType media_type,
67 std::initializer_list<uint32_t> ssrcs,
hbos1f8239c2017-01-16 04:24:10 -080068 rtc::scoped_refptr<MediaStreamTrackInterface> track) {
69 rtc::scoped_refptr<MockRtpReceiver> receiver(
70 new rtc::RefCountedObject<MockRtpReceiver>());
71 EXPECT_CALL(*receiver, track()).WillRepeatedly(testing::Return(track));
deadbeef804c1af2017-02-11 19:07:31 -080072 EXPECT_CALL(*receiver, media_type())
73 .WillRepeatedly(testing::Return(media_type));
74 EXPECT_CALL(*receiver, GetParameters())
75 .WillRepeatedly(testing::Return(CreateRtpParametersWithSsrcs(ssrcs)));
hbos1f8239c2017-01-16 04:24:10 -080076 return receiver;
77}
78
79class TrackMediaInfoMapTest : public testing::Test {
80 public:
81 TrackMediaInfoMapTest()
82 : voice_media_info_(new cricket::VoiceMediaInfo()),
83 video_media_info_(new cricket::VideoMediaInfo()),
84 local_audio_track_(AudioTrack::Create("LocalAudioTrack", nullptr)),
85 remote_audio_track_(AudioTrack::Create("RemoteAudioTrack", nullptr)),
86 local_video_track_(
87 VideoTrack::Create("LocalVideoTrack",
perkj773be362017-07-31 23:22:01 -070088 FakeVideoTrackSource::Create(false),
89 rtc::Thread::Current())),
hbos1f8239c2017-01-16 04:24:10 -080090 remote_video_track_(
91 VideoTrack::Create("RemoteVideoTrack",
perkj773be362017-07-31 23:22:01 -070092 FakeVideoTrackSource::Create(false),
93 rtc::Thread::Current())) {}
hbos1f8239c2017-01-16 04:24:10 -080094
95 ~TrackMediaInfoMapTest() {
96 // If we have a map the ownership has been passed to the map, only delete if
97 // |CreateMap| has not been called.
98 if (!map_) {
99 delete voice_media_info_;
100 delete video_media_info_;
101 }
102 }
103
104 void AddRtpSenderWithSsrcs(std::initializer_list<uint32_t> ssrcs,
105 MediaStreamTrackInterface* local_track) {
106 rtc::scoped_refptr<MockRtpSender> rtp_sender = CreateMockRtpSender(
deadbeef804c1af2017-02-11 19:07:31 -0800107 local_track->kind() == MediaStreamTrackInterface::kAudioKind
108 ? cricket::MEDIA_TYPE_AUDIO
109 : cricket::MEDIA_TYPE_VIDEO,
hbos1f8239c2017-01-16 04:24:10 -0800110 ssrcs, local_track);
111 rtp_senders_.push_back(rtp_sender);
112
113 if (local_track->kind() == MediaStreamTrackInterface::kAudioKind) {
114 cricket::VoiceSenderInfo voice_sender_info;
115 size_t i = 0;
116 for (uint32_t ssrc : ssrcs) {
117 voice_sender_info.local_stats.push_back(cricket::SsrcSenderInfo());
118 voice_sender_info.local_stats[i++].ssrc = ssrc;
119 }
120 voice_media_info_->senders.push_back(voice_sender_info);
121 } else {
122 cricket::VideoSenderInfo video_sender_info;
123 size_t i = 0;
124 for (uint32_t ssrc : ssrcs) {
125 video_sender_info.local_stats.push_back(cricket::SsrcSenderInfo());
126 video_sender_info.local_stats[i++].ssrc = ssrc;
127 }
128 video_media_info_->senders.push_back(video_sender_info);
129 }
130 }
131
132 void AddRtpReceiverWithSsrcs(std::initializer_list<uint32_t> ssrcs,
133 MediaStreamTrackInterface* remote_track) {
134 rtc::scoped_refptr<MockRtpReceiver> rtp_receiver = CreateMockRtpReceiver(
deadbeef804c1af2017-02-11 19:07:31 -0800135 remote_track->kind() == MediaStreamTrackInterface::kAudioKind
136 ? cricket::MEDIA_TYPE_AUDIO
137 : cricket::MEDIA_TYPE_VIDEO,
hbos1f8239c2017-01-16 04:24:10 -0800138 ssrcs, remote_track);
139 rtp_receivers_.push_back(rtp_receiver);
140
141 if (remote_track->kind() == MediaStreamTrackInterface::kAudioKind) {
142 cricket::VoiceReceiverInfo voice_receiver_info;
143 size_t i = 0;
144 for (uint32_t ssrc : ssrcs) {
145 voice_receiver_info.local_stats.push_back(cricket::SsrcReceiverInfo());
146 voice_receiver_info.local_stats[i++].ssrc = ssrc;
147 }
148 voice_media_info_->receivers.push_back(voice_receiver_info);
149 } else {
150 cricket::VideoReceiverInfo video_receiver_info;
151 size_t i = 0;
152 for (uint32_t ssrc : ssrcs) {
153 video_receiver_info.local_stats.push_back(cricket::SsrcReceiverInfo());
154 video_receiver_info.local_stats[i++].ssrc = ssrc;
155 }
156 video_media_info_->receivers.push_back(video_receiver_info);
157 }
158 }
159
160 void CreateMap() {
161 RTC_DCHECK(!map_);
162 map_.reset(new TrackMediaInfoMap(
163 std::unique_ptr<cricket::VoiceMediaInfo>(voice_media_info_),
164 std::unique_ptr<cricket::VideoMediaInfo>(video_media_info_),
deadbeef804c1af2017-02-11 19:07:31 -0800165 rtp_senders_, rtp_receivers_));
hbos1f8239c2017-01-16 04:24:10 -0800166 }
167
168 protected:
169 cricket::VoiceMediaInfo* voice_media_info_;
170 cricket::VideoMediaInfo* video_media_info_;
171 std::vector<rtc::scoped_refptr<RtpSenderInterface>> rtp_senders_;
172 std::vector<rtc::scoped_refptr<RtpReceiverInterface>> rtp_receivers_;
173 std::unique_ptr<TrackMediaInfoMap> map_;
174 rtc::scoped_refptr<AudioTrack> local_audio_track_;
175 rtc::scoped_refptr<AudioTrack> remote_audio_track_;
176 rtc::scoped_refptr<VideoTrack> local_video_track_;
177 rtc::scoped_refptr<VideoTrack> remote_video_track_;
178};
179
180} // namespace
181
182TEST_F(TrackMediaInfoMapTest, SingleSenderReceiverPerTrackWithOneSsrc) {
deadbeef804c1af2017-02-11 19:07:31 -0800183 AddRtpSenderWithSsrcs({1}, local_audio_track_);
184 AddRtpReceiverWithSsrcs({2}, remote_audio_track_);
185 AddRtpSenderWithSsrcs({3}, local_video_track_);
186 AddRtpReceiverWithSsrcs({4}, remote_video_track_);
hbos1f8239c2017-01-16 04:24:10 -0800187 CreateMap();
188
189 // Local audio track <-> RTP audio sender
190 ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800191 EXPECT_EQ(
192 *map_->GetVoiceSenderInfos(*local_audio_track_),
193 std::vector<cricket::VoiceSenderInfo*>({&voice_media_info_->senders[0]}));
hbos1f8239c2017-01-16 04:24:10 -0800194 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
195 local_audio_track_.get());
196
197 // Remote audio track <-> RTP audio receiver
198 EXPECT_EQ(map_->GetVoiceReceiverInfo(*remote_audio_track_),
199 &voice_media_info_->receivers[0]);
200 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->receivers[0]),
201 remote_audio_track_.get());
202
203 // Local video track <-> RTP video sender
204 ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800205 EXPECT_EQ(
206 *map_->GetVideoSenderInfos(*local_video_track_),
207 std::vector<cricket::VideoSenderInfo*>({&video_media_info_->senders[0]}));
hbos1f8239c2017-01-16 04:24:10 -0800208 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
209 local_video_track_.get());
210
211 // Remote video track <-> RTP video receiver
212 EXPECT_EQ(map_->GetVideoReceiverInfo(*remote_video_track_),
213 &video_media_info_->receivers[0]);
214 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->receivers[0]),
215 remote_video_track_.get());
216}
217
218TEST_F(TrackMediaInfoMapTest, SingleSenderReceiverPerTrackWithMissingSsrc) {
219 AddRtpSenderWithSsrcs({}, local_audio_track_);
220 AddRtpSenderWithSsrcs({}, local_video_track_);
221 AddRtpReceiverWithSsrcs({}, remote_audio_track_);
222 AddRtpReceiverWithSsrcs({}, remote_video_track_);
223 CreateMap();
224
225 EXPECT_FALSE(map_->GetVoiceSenderInfos(*local_audio_track_));
226 EXPECT_FALSE(map_->GetVideoSenderInfos(*local_video_track_));
227 EXPECT_FALSE(map_->GetVoiceReceiverInfo(*remote_audio_track_));
228 EXPECT_FALSE(map_->GetVideoReceiverInfo(*remote_video_track_));
229}
230
231TEST_F(TrackMediaInfoMapTest,
232 SingleSenderReceiverPerTrackWithAudioAndVideoUseSameSsrc) {
deadbeef804c1af2017-02-11 19:07:31 -0800233 AddRtpSenderWithSsrcs({1}, local_audio_track_);
234 AddRtpReceiverWithSsrcs({2}, remote_audio_track_);
235 AddRtpSenderWithSsrcs({1}, local_video_track_);
236 AddRtpReceiverWithSsrcs({2}, remote_video_track_);
hbos1f8239c2017-01-16 04:24:10 -0800237 CreateMap();
238
239 // Local audio track <-> RTP audio sender
240 ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800241 EXPECT_EQ(
242 *map_->GetVoiceSenderInfos(*local_audio_track_),
243 std::vector<cricket::VoiceSenderInfo*>({&voice_media_info_->senders[0]}));
hbos1f8239c2017-01-16 04:24:10 -0800244 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
245 local_audio_track_.get());
246
247 // Remote audio track <-> RTP audio receiver
248 EXPECT_EQ(map_->GetVoiceReceiverInfo(*remote_audio_track_),
249 &voice_media_info_->receivers[0]);
250 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->receivers[0]),
251 remote_audio_track_.get());
252
253 // Local video track <-> RTP video sender
254 ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800255 EXPECT_EQ(
256 *map_->GetVideoSenderInfos(*local_video_track_),
257 std::vector<cricket::VideoSenderInfo*>({&video_media_info_->senders[0]}));
hbos1f8239c2017-01-16 04:24:10 -0800258 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
259 local_video_track_.get());
260
261 // Remote video track <-> RTP video receiver
262 EXPECT_EQ(map_->GetVideoReceiverInfo(*remote_video_track_),
263 &video_media_info_->receivers[0]);
264 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->receivers[0]),
265 remote_video_track_.get());
266}
267
268TEST_F(TrackMediaInfoMapTest, SingleMultiSsrcSenderPerTrack) {
deadbeef804c1af2017-02-11 19:07:31 -0800269 AddRtpSenderWithSsrcs({1, 2}, local_audio_track_);
270 AddRtpSenderWithSsrcs({3, 4}, local_video_track_);
hbos1f8239c2017-01-16 04:24:10 -0800271 CreateMap();
272
273 // Local audio track <-> RTP audio senders
274 ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800275 EXPECT_EQ(
276 *map_->GetVoiceSenderInfos(*local_audio_track_),
277 std::vector<cricket::VoiceSenderInfo*>({&voice_media_info_->senders[0]}));
hbos1f8239c2017-01-16 04:24:10 -0800278 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
279 local_audio_track_.get());
280
281 // Local video track <-> RTP video senders
282 ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800283 EXPECT_EQ(
284 *map_->GetVideoSenderInfos(*local_video_track_),
285 std::vector<cricket::VideoSenderInfo*>({&video_media_info_->senders[0]}));
hbos1f8239c2017-01-16 04:24:10 -0800286 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
287 local_video_track_.get());
288}
289
290TEST_F(TrackMediaInfoMapTest, MultipleOneSsrcSendersPerTrack) {
deadbeef804c1af2017-02-11 19:07:31 -0800291 AddRtpSenderWithSsrcs({1}, local_audio_track_);
292 AddRtpSenderWithSsrcs({2}, local_audio_track_);
293 AddRtpSenderWithSsrcs({3}, local_video_track_);
294 AddRtpSenderWithSsrcs({4}, local_video_track_);
hbos1f8239c2017-01-16 04:24:10 -0800295 CreateMap();
296
297 // Local audio track <-> RTP audio senders
298 ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800299 EXPECT_EQ(
300 *map_->GetVoiceSenderInfos(*local_audio_track_),
301 std::vector<cricket::VoiceSenderInfo*>(
302 {&voice_media_info_->senders[0], &voice_media_info_->senders[1]}));
hbos1f8239c2017-01-16 04:24:10 -0800303 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
304 local_audio_track_.get());
305 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[1]),
306 local_audio_track_.get());
307
308 // Local video track <-> RTP video senders
309 ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800310 EXPECT_EQ(
311 *map_->GetVideoSenderInfos(*local_video_track_),
312 std::vector<cricket::VideoSenderInfo*>(
313 {&video_media_info_->senders[0], &video_media_info_->senders[1]}));
hbos1f8239c2017-01-16 04:24:10 -0800314 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
315 local_video_track_.get());
316 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[1]),
317 local_video_track_.get());
318}
319
320TEST_F(TrackMediaInfoMapTest, MultipleMultiSsrcSendersPerTrack) {
deadbeef804c1af2017-02-11 19:07:31 -0800321 AddRtpSenderWithSsrcs({1, 2}, local_audio_track_);
322 AddRtpSenderWithSsrcs({3, 4}, local_audio_track_);
323 AddRtpSenderWithSsrcs({5, 6}, local_video_track_);
324 AddRtpSenderWithSsrcs({7, 8}, local_video_track_);
hbos1f8239c2017-01-16 04:24:10 -0800325 CreateMap();
326
327 // Local audio track <-> RTP audio senders
328 ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800329 EXPECT_EQ(
330 *map_->GetVoiceSenderInfos(*local_audio_track_),
331 std::vector<cricket::VoiceSenderInfo*>(
332 {&voice_media_info_->senders[0], &voice_media_info_->senders[1]}));
hbos1f8239c2017-01-16 04:24:10 -0800333 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
334 local_audio_track_.get());
335 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[1]),
336 local_audio_track_.get());
337
338 // Local video track <-> RTP video senders
339 ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
deadbeef804c1af2017-02-11 19:07:31 -0800340 EXPECT_EQ(
341 *map_->GetVideoSenderInfos(*local_video_track_),
342 std::vector<cricket::VideoSenderInfo*>(
343 {&video_media_info_->senders[0], &video_media_info_->senders[1]}));
hbos1f8239c2017-01-16 04:24:10 -0800344 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
345 local_video_track_.get());
346 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[1]),
347 local_video_track_.get());
348}
349
hbosfe90ad12017-02-20 02:05:13 -0800350// SSRCs can be reused for send and receive in loopback.
351TEST_F(TrackMediaInfoMapTest, SingleSenderReceiverPerTrackWithSsrcNotUnique) {
352 AddRtpSenderWithSsrcs({1}, local_audio_track_);
353 AddRtpReceiverWithSsrcs({1}, remote_audio_track_);
354 AddRtpSenderWithSsrcs({2}, local_video_track_);
355 AddRtpReceiverWithSsrcs({2}, remote_video_track_);
356 CreateMap();
357
358 // Local audio track <-> RTP audio senders
359 ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
360 EXPECT_EQ(
361 *map_->GetVoiceSenderInfos(*local_audio_track_),
362 std::vector<cricket::VoiceSenderInfo*>({&voice_media_info_->senders[0]}));
363 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
364 local_audio_track_.get());
365
366 // Remote audio track <-> RTP audio receiver
367 EXPECT_EQ(map_->GetVoiceReceiverInfo(*remote_audio_track_),
368 &voice_media_info_->receivers[0]);
369 EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->receivers[0]),
370 remote_audio_track_.get());
371
372 // Local video track <-> RTP video senders
373 ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
374 EXPECT_EQ(
375 *map_->GetVideoSenderInfos(*local_video_track_),
376 std::vector<cricket::VideoSenderInfo*>({&video_media_info_->senders[0]}));
377 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
378 local_video_track_.get());
379
380 // Remote video track <-> RTP video receiver
381 EXPECT_EQ(map_->GetVideoReceiverInfo(*remote_video_track_),
382 &video_media_info_->receivers[0]);
383 EXPECT_EQ(map_->GetVideoTrack(video_media_info_->receivers[0]),
384 remote_video_track_.get());
385}
386
hbos1f8239c2017-01-16 04:24:10 -0800387// Death tests.
388// Disabled on Android because death tests misbehave on Android, see
389// base/test/gtest_util.h.
390#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
391
deadbeef804c1af2017-02-11 19:07:31 -0800392class TrackMediaInfoMapDeathTest : public TrackMediaInfoMapTest {};
hbos1f8239c2017-01-16 04:24:10 -0800393
394TEST_F(TrackMediaInfoMapDeathTest, MultipleOneSsrcReceiversPerTrack) {
deadbeef804c1af2017-02-11 19:07:31 -0800395 AddRtpReceiverWithSsrcs({1}, remote_audio_track_);
396 AddRtpReceiverWithSsrcs({2}, remote_audio_track_);
397 AddRtpReceiverWithSsrcs({3}, remote_video_track_);
398 AddRtpReceiverWithSsrcs({4}, remote_video_track_);
hbos1f8239c2017-01-16 04:24:10 -0800399 EXPECT_DEATH(CreateMap(), "");
400}
401
402TEST_F(TrackMediaInfoMapDeathTest, MultipleMultiSsrcReceiversPerTrack) {
deadbeef804c1af2017-02-11 19:07:31 -0800403 AddRtpReceiverWithSsrcs({1, 2}, remote_audio_track_);
404 AddRtpReceiverWithSsrcs({3, 4}, remote_audio_track_);
405 AddRtpReceiverWithSsrcs({5, 6}, remote_video_track_);
406 AddRtpReceiverWithSsrcs({7, 8}, remote_video_track_);
hbos1f8239c2017-01-16 04:24:10 -0800407 EXPECT_DEATH(CreateMap(), "");
408}
409
hbos1f8239c2017-01-16 04:24:10 -0800410#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
411
412} // namespace webrtc