Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(236)

Side by Side Diff: webrtc/api/rtcstatscollector_unittest.cc

Issue 2641763003: RTCMediaStreamTrackStats collected on a per-attachment basis. (Closed)
Patch Set: Added comments Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/api/rtcstatscollector.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2016 The WebRTC project authors. All Rights Reserved. 2 * Copyright 2016 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include "webrtc/api/rtcstatscollector.h" 11 #include "webrtc/api/rtcstatscollector.h"
12 12
13 #include <initializer_list>
13 #include <memory> 14 #include <memory>
14 #include <ostream> 15 #include <ostream>
15 #include <string> 16 #include <string>
16 #include <vector> 17 #include <vector>
17 18
18 #include "webrtc/api/jsepsessiondescription.h" 19 #include "webrtc/api/jsepsessiondescription.h"
19 #include "webrtc/api/mediastream.h" 20 #include "webrtc/api/mediastream.h"
20 #include "webrtc/api/mediastreamtrack.h" 21 #include "webrtc/api/mediastreamtrack.h"
21 #include "webrtc/api/rtpparameters.h" 22 #include "webrtc/api/rtpparameters.h"
22 #include "webrtc/api/stats/rtcstats_objects.h" 23 #include "webrtc/api/stats/rtcstats_objects.h"
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 const std::string& candidate_type, 164 const std::string& candidate_type,
164 uint32_t priority) { 165 uint32_t priority) {
165 std::unique_ptr<cricket::Candidate> candidate(new cricket::Candidate()); 166 std::unique_ptr<cricket::Candidate> candidate(new cricket::Candidate());
166 candidate->set_address(rtc::SocketAddress(hostname, port)); 167 candidate->set_address(rtc::SocketAddress(hostname, port));
167 candidate->set_protocol(protocol); 168 candidate->set_protocol(protocol);
168 candidate->set_type(candidate_type); 169 candidate->set_type(candidate_type);
169 candidate->set_priority(priority); 170 candidate->set_priority(priority);
170 return candidate; 171 return candidate;
171 } 172 }
172 173
173 class FakeAudioProcessorForStats
174 : public rtc::RefCountedObject<AudioProcessorInterface> {
175 public:
176 FakeAudioProcessorForStats(
177 AudioProcessorInterface::AudioProcessorStats stats)
178 : stats_(stats) {
179 }
180
181 void GetStats(AudioProcessorInterface::AudioProcessorStats* stats) override {
182 *stats = stats_;
183 }
184
185 private:
186 AudioProcessorInterface::AudioProcessorStats stats_;
187 };
188
189 class FakeAudioTrackForStats 174 class FakeAudioTrackForStats
190 : public MediaStreamTrack<AudioTrackInterface> { 175 : public MediaStreamTrack<AudioTrackInterface> {
191 public: 176 public:
192 static rtc::scoped_refptr<FakeAudioTrackForStats> Create( 177 static rtc::scoped_refptr<FakeAudioTrackForStats> Create(
193 const std::string& id, 178 const std::string& id,
194 MediaStreamTrackInterface::TrackState state, 179 MediaStreamTrackInterface::TrackState state) {
195 int signal_level,
196 rtc::scoped_refptr<FakeAudioProcessorForStats> processor) {
197 rtc::scoped_refptr<FakeAudioTrackForStats> audio_track_stats( 180 rtc::scoped_refptr<FakeAudioTrackForStats> audio_track_stats(
198 new rtc::RefCountedObject<FakeAudioTrackForStats>( 181 new rtc::RefCountedObject<FakeAudioTrackForStats>(id));
199 id, signal_level, processor));
200 audio_track_stats->set_state(state); 182 audio_track_stats->set_state(state);
201 return audio_track_stats; 183 return audio_track_stats;
202 } 184 }
203 185
204 FakeAudioTrackForStats( 186 FakeAudioTrackForStats(const std::string& id)
205 const std::string& id, 187 : MediaStreamTrack<AudioTrackInterface>(id) {
206 int signal_level,
207 rtc::scoped_refptr<FakeAudioProcessorForStats> processor)
208 : MediaStreamTrack<AudioTrackInterface>(id),
209 signal_level_(signal_level),
210 processor_(processor) {
211 } 188 }
212 189
213 std::string kind() const override { 190 std::string kind() const override {
214 return MediaStreamTrackInterface::kAudioKind; 191 return MediaStreamTrackInterface::kAudioKind;
215 } 192 }
216 webrtc::AudioSourceInterface* GetSource() const override { return nullptr; } 193 webrtc::AudioSourceInterface* GetSource() const override { return nullptr; }
217 void AddSink(webrtc::AudioTrackSinkInterface* sink) override {} 194 void AddSink(webrtc::AudioTrackSinkInterface* sink) override {}
218 void RemoveSink(webrtc::AudioTrackSinkInterface* sink) override {} 195 void RemoveSink(webrtc::AudioTrackSinkInterface* sink) override {}
219 bool GetSignalLevel(int* level) override { 196 bool GetSignalLevel(int* level) override { return false; }
220 *level = signal_level_; 197 rtc::scoped_refptr<AudioProcessorInterface> GetAudioProcessor() override {
221 return true; 198 return nullptr;
222 } 199 }
223 rtc::scoped_refptr<AudioProcessorInterface> GetAudioProcessor() override {
224 return processor_;
225 }
226
227 private:
228 int signal_level_;
229 rtc::scoped_refptr<FakeAudioProcessorForStats> processor_;
230 };
231
232 class FakeVideoTrackSourceForStats
233 : public rtc::RefCountedObject<VideoTrackSourceInterface> {
234 public:
235 FakeVideoTrackSourceForStats(VideoTrackSourceInterface::Stats stats)
236 : stats_(stats) {
237 }
238
239 MediaSourceInterface::SourceState state() const override {
240 return MediaSourceInterface::kLive;
241 }
242 bool remote() const override { return false; }
243 void RegisterObserver(ObserverInterface* observer) override {}
244 void UnregisterObserver(ObserverInterface* observer) override {}
245 void AddOrUpdateSink(rtc::VideoSinkInterface<webrtc::VideoFrame>* sink,
246 const rtc::VideoSinkWants& wants) override {}
247 void RemoveSink(rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) override {
248 }
249 bool is_screencast() const override { return false; }
250 rtc::Optional<bool> needs_denoising() const override {
251 return rtc::Optional<bool>();
252 }
253 bool GetStats(VideoTrackSourceInterface::Stats* stats) override {
254 *stats = stats_;
255 return true;
256 }
257
258 private:
259 VideoTrackSourceInterface::Stats stats_;
260 }; 200 };
261 201
262 class FakeVideoTrackForStats 202 class FakeVideoTrackForStats
263 : public MediaStreamTrack<VideoTrackInterface> { 203 : public MediaStreamTrack<VideoTrackInterface> {
264 public: 204 public:
265 static rtc::scoped_refptr<FakeVideoTrackForStats> Create( 205 static rtc::scoped_refptr<FakeVideoTrackForStats> Create(
266 const std::string& id, 206 const std::string& id,
267 MediaStreamTrackInterface::TrackState state, 207 MediaStreamTrackInterface::TrackState state) {
268 rtc::scoped_refptr<VideoTrackSourceInterface> source) {
269 rtc::scoped_refptr<FakeVideoTrackForStats> video_track( 208 rtc::scoped_refptr<FakeVideoTrackForStats> video_track(
270 new rtc::RefCountedObject<FakeVideoTrackForStats>(id, source)); 209 new rtc::RefCountedObject<FakeVideoTrackForStats>(id));
271 video_track->set_state(state); 210 video_track->set_state(state);
272 return video_track; 211 return video_track;
273 } 212 }
274 213
275 FakeVideoTrackForStats( 214 FakeVideoTrackForStats(const std::string& id)
276 const std::string& id, 215 : MediaStreamTrack<VideoTrackInterface>(id) {
277 rtc::scoped_refptr<VideoTrackSourceInterface> source)
278 : MediaStreamTrack<VideoTrackInterface>(id),
279 source_(source) {
280 } 216 }
281 217
282 std::string kind() const override { 218 std::string kind() const override {
283 return MediaStreamTrackInterface::kVideoKind; 219 return MediaStreamTrackInterface::kVideoKind;
284 } 220 }
285 VideoTrackSourceInterface* GetSource() const override { 221 VideoTrackSourceInterface* GetSource() const override { return nullptr; }
286 return source_;
287 }
288
289 private:
290 rtc::scoped_refptr<VideoTrackSourceInterface> source_;
291 }; 222 };
292 223
293 rtc::scoped_refptr<MediaStreamTrackInterface> CreateFakeTrack( 224 rtc::scoped_refptr<MediaStreamTrackInterface> CreateFakeTrack(
294 cricket::MediaType media_type, 225 cricket::MediaType media_type,
295 const std::string& track_id) { 226 const std::string& track_id,
227 MediaStreamTrackInterface::TrackState track_state) {
296 if (media_type == cricket::MEDIA_TYPE_AUDIO) { 228 if (media_type == cricket::MEDIA_TYPE_AUDIO) {
297 return FakeAudioTrackForStats::Create( 229 return FakeAudioTrackForStats::Create(track_id, track_state);
298 track_id,
299 MediaStreamTrackInterface::TrackState::kLive,
300 32767,
301 new FakeAudioProcessorForStats(
302 AudioProcessorInterface::AudioProcessorStats()));
303 } else { 230 } else {
304 RTC_DCHECK_EQ(media_type, cricket::MEDIA_TYPE_VIDEO); 231 RTC_DCHECK_EQ(media_type, cricket::MEDIA_TYPE_VIDEO);
305 return FakeVideoTrackForStats::Create( 232 return FakeVideoTrackForStats::Create(track_id, track_state);
306 track_id,
307 MediaStreamTrackInterface::TrackState::kLive,
308 new FakeVideoTrackSourceForStats(
309 VideoTrackSourceInterface::Stats()));
310 } 233 }
311 } 234 }
312 235
236 rtc::scoped_refptr<MockRtpSender> CreateMockSender(
237 rtc::scoped_refptr<MediaStreamTrackInterface> track, uint32_t ssrc) {
238 rtc::scoped_refptr<MockRtpSender> sender(
239 new rtc::RefCountedObject<MockRtpSender>());
240 EXPECT_CALL(*sender, track()).WillRepeatedly(Return(track));
241 EXPECT_CALL(*sender, ssrc()).WillRepeatedly(Return(ssrc));
242 EXPECT_CALL(*sender, media_type()).WillRepeatedly(Return(
243 track->kind() == MediaStreamTrackInterface::kAudioKind
244 ? cricket::MEDIA_TYPE_AUDIO : cricket::MEDIA_TYPE_VIDEO));
245 EXPECT_CALL(*sender, GetParameters()).WillRepeatedly(Invoke(
246 [ssrc]() {
247 RtpParameters params;
248 params.encodings.push_back(RtpEncodingParameters());
249 params.encodings[0].ssrc = rtc::Optional<uint32_t>(ssrc);
250 return params;
251 }));
252 return sender;
253 }
254
255 rtc::scoped_refptr<MockRtpReceiver> CreateMockReceiver(
256 rtc::scoped_refptr<MediaStreamTrackInterface> track, uint32_t ssrc) {
257 rtc::scoped_refptr<MockRtpReceiver> receiver(
258 new rtc::RefCountedObject<MockRtpReceiver>());
259 EXPECT_CALL(*receiver, track()).WillRepeatedly(Return(track));
260 EXPECT_CALL(*receiver, media_type()).WillRepeatedly(Return(
261 track->kind() == MediaStreamTrackInterface::kAudioKind
262 ? cricket::MEDIA_TYPE_AUDIO : cricket::MEDIA_TYPE_VIDEO));
263 EXPECT_CALL(*receiver, GetParameters()).WillRepeatedly(Invoke(
264 [ssrc]() {
265 RtpParameters params;
266 params.encodings.push_back(RtpEncodingParameters());
267 params.encodings[0].ssrc = rtc::Optional<uint32_t>(ssrc);
268 return params;
269 }));
270 return receiver;
271 }
272
313 class RTCStatsCollectorTestHelper : public SetSessionDescriptionObserver { 273 class RTCStatsCollectorTestHelper : public SetSessionDescriptionObserver {
314 public: 274 public:
315 RTCStatsCollectorTestHelper() 275 RTCStatsCollectorTestHelper()
316 : worker_thread_(rtc::Thread::Current()), 276 : worker_thread_(rtc::Thread::Current()),
317 network_thread_(rtc::Thread::Current()), 277 network_thread_(rtc::Thread::Current()),
318 signaling_thread_(rtc::Thread::Current()), 278 signaling_thread_(rtc::Thread::Current()),
319 media_engine_(new cricket::FakeMediaEngine()), 279 media_engine_(new cricket::FakeMediaEngine()),
320 channel_manager_(new cricket::ChannelManager(media_engine_, 280 channel_manager_(new cricket::ChannelManager(media_engine_,
321 worker_thread_, 281 worker_thread_,
322 network_thread_)), 282 network_thread_)),
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 StreamCollection::Create(); 330 StreamCollection::Create();
371 EXPECT_CALL(pc_, local_streams()) 331 EXPECT_CALL(pc_, local_streams())
372 .WillRepeatedly(Return(local_streams)); 332 .WillRepeatedly(Return(local_streams));
373 333
374 rtc::scoped_refptr<MediaStream> local_stream = 334 rtc::scoped_refptr<MediaStream> local_stream =
375 MediaStream::Create("LocalStreamLabel"); 335 MediaStream::Create("LocalStreamLabel");
376 local_streams->AddStream(local_stream); 336 local_streams->AddStream(local_stream);
377 337
378 rtc::scoped_refptr<MediaStreamTrackInterface> track; 338 rtc::scoped_refptr<MediaStreamTrackInterface> track;
379 if (media_type == cricket::MEDIA_TYPE_AUDIO) { 339 if (media_type == cricket::MEDIA_TYPE_AUDIO) {
380 track = CreateFakeTrack(media_type, track_id); 340 track = CreateFakeTrack(media_type, track_id,
341 MediaStreamTrackInterface::kLive);
381 local_stream->AddTrack(static_cast<AudioTrackInterface*>(track.get())); 342 local_stream->AddTrack(static_cast<AudioTrackInterface*>(track.get()));
382 } else { 343 } else {
383 track = CreateFakeTrack(media_type, track_id); 344 track = CreateFakeTrack(media_type, track_id,
345 MediaStreamTrackInterface::kLive);
384 local_stream->AddTrack(static_cast<VideoTrackInterface*>(track.get())); 346 local_stream->AddTrack(static_cast<VideoTrackInterface*>(track.get()));
385 } 347 }
386 348
387 rtc::scoped_refptr<MockRtpSender> sender( 349 rtc::scoped_refptr<MockRtpSender> sender = CreateMockSender(track, ssrc);
388 new rtc::RefCountedObject<MockRtpSender>());
389 EXPECT_CALL(*sender, track()).WillRepeatedly(Return(track));
390 EXPECT_CALL(*sender, ssrc()).WillRepeatedly(Return(ssrc));
391 EXPECT_CALL(*sender, media_type()).WillRepeatedly(Return(media_type));
392 EXPECT_CALL(*sender, GetParameters()).WillRepeatedly(Invoke(
393 [ssrc]() {
394 RtpParameters params;
395 params.encodings.push_back(RtpEncodingParameters());
396 params.encodings[0].ssrc = rtc::Optional<uint32_t>(ssrc);
397 return params;
398 }));
399 EXPECT_CALL(pc_, GetSenders()).WillRepeatedly(Return( 350 EXPECT_CALL(pc_, GetSenders()).WillRepeatedly(Return(
400 std::vector<rtc::scoped_refptr<RtpSenderInterface>>({ 351 std::vector<rtc::scoped_refptr<RtpSenderInterface>>({
401 rtc::scoped_refptr<RtpSenderInterface>(sender.get()) }))); 352 rtc::scoped_refptr<RtpSenderInterface>(sender.get()) })));
402 } 353 }
403 354
404 void SetupRemoteTrackAndReceiver(cricket::MediaType media_type, 355 void SetupRemoteTrackAndReceiver(cricket::MediaType media_type,
405 const std::string& track_id, 356 const std::string& track_id,
406 uint32_t ssrc) { 357 uint32_t ssrc) {
407 rtc::scoped_refptr<StreamCollection> remote_streams = 358 rtc::scoped_refptr<StreamCollection> remote_streams =
408 StreamCollection::Create(); 359 StreamCollection::Create();
409 EXPECT_CALL(pc_, remote_streams()) 360 EXPECT_CALL(pc_, remote_streams())
410 .WillRepeatedly(Return(remote_streams)); 361 .WillRepeatedly(Return(remote_streams));
411 362
412 rtc::scoped_refptr<MediaStream> remote_stream = 363 rtc::scoped_refptr<MediaStream> remote_stream =
413 MediaStream::Create("RemoteStreamLabel"); 364 MediaStream::Create("RemoteStreamLabel");
414 remote_streams->AddStream(remote_stream); 365 remote_streams->AddStream(remote_stream);
415 366
416 rtc::scoped_refptr<MediaStreamTrackInterface> track; 367 rtc::scoped_refptr<MediaStreamTrackInterface> track;
417 if (media_type == cricket::MEDIA_TYPE_AUDIO) { 368 if (media_type == cricket::MEDIA_TYPE_AUDIO) {
418 track = CreateFakeTrack(media_type, track_id); 369 track = CreateFakeTrack(media_type, track_id,
370 MediaStreamTrackInterface::kLive);
419 remote_stream->AddTrack(static_cast<AudioTrackInterface*>(track.get())); 371 remote_stream->AddTrack(static_cast<AudioTrackInterface*>(track.get()));
420 } else { 372 } else {
421 track = CreateFakeTrack(media_type, track_id); 373 track = CreateFakeTrack(media_type, track_id,
374 MediaStreamTrackInterface::kLive);
422 remote_stream->AddTrack(static_cast<VideoTrackInterface*>(track.get())); 375 remote_stream->AddTrack(static_cast<VideoTrackInterface*>(track.get()));
423 } 376 }
424 377
425 rtc::scoped_refptr<MockRtpReceiver> receiver( 378 rtc::scoped_refptr<MockRtpReceiver> receiver =
426 new rtc::RefCountedObject<MockRtpReceiver>()); 379 CreateMockReceiver(track, ssrc);
427 EXPECT_CALL(*receiver, track()).WillRepeatedly(Return(track));
428 EXPECT_CALL(*receiver, media_type()).WillRepeatedly(Return(media_type));
429 EXPECT_CALL(*receiver, GetParameters()).WillRepeatedly(Invoke(
430 [ssrc]() {
431 RtpParameters params;
432 params.encodings.push_back(RtpEncodingParameters());
433 params.encodings[0].ssrc = rtc::Optional<uint32_t>(ssrc);
434 return params;
435 }));
436 EXPECT_CALL(pc_, GetReceivers()).WillRepeatedly(Return( 380 EXPECT_CALL(pc_, GetReceivers()).WillRepeatedly(Return(
437 std::vector<rtc::scoped_refptr<RtpReceiverInterface>>({ 381 std::vector<rtc::scoped_refptr<RtpReceiverInterface>>({
438 rtc::scoped_refptr<RtpReceiverInterface>(receiver.get()) }))); 382 rtc::scoped_refptr<RtpReceiverInterface>(receiver.get()) })));
439 } 383 }
440 384
385 // Attaches tracks to peer connections by configuring RTP senders and RTP
386 // receivers according to the tracks' pairings with
387 // |[Voice/Video][Sender/Receiver]Info| and their SSRCs. Local tracks can be
388 // associated with multiple |[Voice/Video]SenderInfo|s, remote tracks can only
389 // be associated with one |[Voice/Video]ReceiverInfo|.
390 void CreateMockRtpSendersReceiversAndChannels(
391 std::initializer_list<std::pair<MediaStreamTrackInterface*,
392 cricket::VoiceSenderInfo>> local_audio_track_info_pairs,
393 std::initializer_list<std::pair<MediaStreamTrackInterface*,
394 cricket::VoiceReceiverInfo>> remote_audio_track_info_pairs,
395 std::initializer_list<std::pair<MediaStreamTrackInterface*,
396 cricket::VideoSenderInfo>> local_video_track_info_pairs,
397 std::initializer_list<std::pair<MediaStreamTrackInterface*,
398 cricket::VideoReceiverInfo>> remote_video_track_info_pairs) {
399 voice_media_info_.reset(new cricket::VoiceMediaInfo());
400 video_media_info_.reset(new cricket::VideoMediaInfo());
401 rtp_senders_.clear();
402 rtp_receivers_.clear();
403 // Local audio tracks and voice sender infos
404 for (auto& pair : local_audio_track_info_pairs) {
405 MediaStreamTrackInterface* local_audio_track = pair.first;
406 const cricket::VoiceSenderInfo& voice_sender_info = pair.second;
407 RTC_DCHECK_EQ(local_audio_track->kind(),
408 MediaStreamTrackInterface::kAudioKind);
409
410 voice_media_info_->senders.push_back(voice_sender_info);
411 rtc::scoped_refptr<MockRtpSender> rtp_sender =
412 CreateMockSender(rtc::scoped_refptr<MediaStreamTrackInterface>(
413 local_audio_track),
414 voice_sender_info.local_stats[0].ssrc);
415 rtp_senders_.push_back(rtc::scoped_refptr<RtpSenderInterface>(
416 rtp_sender.get()));
417 }
418 // Remote audio tracks and voice receiver infos
419 for (auto& pair : remote_audio_track_info_pairs) {
420 MediaStreamTrackInterface* remote_audio_track = pair.first;
421 const cricket::VoiceReceiverInfo& voice_receiver_info = pair.second;
422 RTC_DCHECK_EQ(remote_audio_track->kind(),
423 MediaStreamTrackInterface::kAudioKind);
424
425 voice_media_info_->receivers.push_back(voice_receiver_info);
426 rtc::scoped_refptr<MockRtpReceiver> rtp_receiver =
427 CreateMockReceiver(rtc::scoped_refptr<MediaStreamTrackInterface>(
428 remote_audio_track),
429 voice_receiver_info.local_stats[0].ssrc);
430 rtp_receivers_.push_back(rtc::scoped_refptr<RtpReceiverInterface>(
431 rtp_receiver.get()));
432 }
433 // Local video tracks and video sender infos
434 for (auto& pair : local_video_track_info_pairs) {
435 MediaStreamTrackInterface* local_video_track = pair.first;
436 const cricket::VideoSenderInfo& video_sender_info = pair.second;
437 RTC_DCHECK_EQ(local_video_track->kind(),
438 MediaStreamTrackInterface::kVideoKind);
439
440 video_media_info_->senders.push_back(video_sender_info);
441 rtc::scoped_refptr<MockRtpSender> rtp_sender =
442 CreateMockSender(rtc::scoped_refptr<MediaStreamTrackInterface>(
443 local_video_track),
444 video_sender_info.local_stats[0].ssrc);
445 rtp_senders_.push_back(rtc::scoped_refptr<RtpSenderInterface>(
446 rtp_sender.get()));
447 }
448 // Remote video tracks and video receiver infos
449 for (auto& pair : remote_video_track_info_pairs) {
450 MediaStreamTrackInterface* remote_video_track = pair.first;
451 const cricket::VideoReceiverInfo& video_receiver_info = pair.second;
452 RTC_DCHECK_EQ(remote_video_track->kind(),
453 MediaStreamTrackInterface::kVideoKind);
454
455 video_media_info_->receivers.push_back(video_receiver_info);
456 rtc::scoped_refptr<MockRtpReceiver> rtp_receiver =
457 CreateMockReceiver(rtc::scoped_refptr<MediaStreamTrackInterface>(
458 remote_video_track),
459 video_receiver_info.local_stats[0].ssrc);
460 rtp_receivers_.push_back(rtc::scoped_refptr<RtpReceiverInterface>(
461 rtp_receiver.get()));
462 }
463 EXPECT_CALL(pc_, GetSenders()).WillRepeatedly(Return(rtp_senders_));
464 EXPECT_CALL(pc_, GetReceivers()).WillRepeatedly(Return(rtp_receivers_));
465
466 MockVoiceMediaChannel* voice_media_channel = new MockVoiceMediaChannel();
467 voice_channel_.reset(new cricket::VoiceChannel(
468 worker_thread_, network_thread_, nullptr, media_engine_,
469 voice_media_channel, "VoiceContentName", kDefaultRtcpMuxRequired,
470 kDefaultSrtpRequired));
471 EXPECT_CALL(session_, voice_channel())
472 .WillRepeatedly(Return(voice_channel_.get()));
473 EXPECT_CALL(*voice_media_channel, GetStats(_))
474 .WillOnce(DoAll(SetArgPointee<0>(*voice_media_info_), Return(true)));
475
476 MockVideoMediaChannel* video_media_channel = new MockVideoMediaChannel();
477 video_channel_.reset(new cricket::VideoChannel(
478 worker_thread_, network_thread_, nullptr, video_media_channel,
479 "VideoContentName", kDefaultRtcpMuxRequired, kDefaultSrtpRequired));
480 EXPECT_CALL(session_, video_channel())
481 .WillRepeatedly(Return(video_channel_.get()));
482 EXPECT_CALL(*video_media_channel, GetStats(_))
483 .WillOnce(DoAll(SetArgPointee<0>(*video_media_info_), Return(true)));
484 }
485
441 private: 486 private:
442 rtc::ScopedFakeClock fake_clock_; 487 rtc::ScopedFakeClock fake_clock_;
443 RtcEventLogNullImpl event_log_; 488 RtcEventLogNullImpl event_log_;
444 rtc::Thread* const worker_thread_; 489 rtc::Thread* const worker_thread_;
445 rtc::Thread* const network_thread_; 490 rtc::Thread* const network_thread_;
446 rtc::Thread* const signaling_thread_; 491 rtc::Thread* const signaling_thread_;
447 cricket::FakeMediaEngine* media_engine_; 492 cricket::FakeMediaEngine* media_engine_;
448 std::unique_ptr<cricket::ChannelManager> channel_manager_; 493 std::unique_ptr<cricket::ChannelManager> channel_manager_;
449 std::unique_ptr<MediaControllerInterface> media_controller_; 494 std::unique_ptr<MediaControllerInterface> media_controller_;
450 MockWebRtcSession session_; 495 MockWebRtcSession session_;
451 MockPeerConnection pc_; 496 MockPeerConnection pc_;
452 497
453 std::vector<rtc::scoped_refptr<DataChannel>> data_channels_; 498 std::vector<rtc::scoped_refptr<DataChannel>> data_channels_;
499 std::unique_ptr<cricket::VoiceChannel> voice_channel_;
500 std::unique_ptr<cricket::VideoChannel> video_channel_;
501 std::unique_ptr<cricket::VoiceMediaInfo> voice_media_info_;
502 std::unique_ptr<cricket::VideoMediaInfo> video_media_info_;
503 std::vector<rtc::scoped_refptr<RtpSenderInterface>> rtp_senders_;
504 std::vector<rtc::scoped_refptr<RtpReceiverInterface>> rtp_receivers_;
454 }; 505 };
455 506
456 class RTCTestStats : public RTCStats { 507 class RTCTestStats : public RTCStats {
457 public: 508 public:
458 WEBRTC_RTCSTATS_DECL(); 509 WEBRTC_RTCSTATS_DECL();
459 510
460 RTCTestStats(const std::string& id, int64_t timestamp_us) 511 RTCTestStats(const std::string& id, int64_t timestamp_us)
461 : RTCStats(id, timestamp_us), 512 : RTCStats(id, timestamp_us),
462 dummy_stat("dummyStat") {} 513 dummy_stat("dummyStat") {}
463 514
(...skipping 862 matching lines...) Expand 10 before | Expand all | Expand 10 after
1326 .WillRepeatedly(Return(remote_streams)); 1377 .WillRepeatedly(Return(remote_streams));
1327 1378
1328 rtc::scoped_refptr<MediaStream> local_stream = 1379 rtc::scoped_refptr<MediaStream> local_stream =
1329 MediaStream::Create("LocalStreamLabel"); 1380 MediaStream::Create("LocalStreamLabel");
1330 local_streams->AddStream(local_stream); 1381 local_streams->AddStream(local_stream);
1331 rtc::scoped_refptr<MediaStream> remote_stream = 1382 rtc::scoped_refptr<MediaStream> remote_stream =
1332 MediaStream::Create("RemoteStreamLabel"); 1383 MediaStream::Create("RemoteStreamLabel");
1333 remote_streams->AddStream(remote_stream); 1384 remote_streams->AddStream(remote_stream);
1334 1385
1335 // Local audio track 1386 // Local audio track
1336 AudioProcessorInterface::AudioProcessorStats local_audio_processor_stats; 1387 rtc::scoped_refptr<MediaStreamTrackInterface> local_audio_track =
1337 local_audio_processor_stats.echo_return_loss = 42; 1388 CreateFakeTrack(cricket::MEDIA_TYPE_AUDIO, "LocalAudioTrackID",
1338 local_audio_processor_stats.echo_return_loss_enhancement = 52; 1389 MediaStreamTrackInterface::kEnded);
1339 rtc::scoped_refptr<FakeAudioTrackForStats> local_audio_track = 1390 local_stream->AddTrack(static_cast<AudioTrackInterface*>(
1340 FakeAudioTrackForStats::Create( 1391 local_audio_track.get()));
1341 "LocalAudioTrackID", 1392
1342 MediaStreamTrackInterface::TrackState::kEnded, 1393 cricket::VoiceSenderInfo voice_sender_info_ssrc1;
1343 32767, 1394 voice_sender_info_ssrc1.local_stats.push_back(cricket::SsrcSenderInfo());
1344 new FakeAudioProcessorForStats(local_audio_processor_stats)); 1395 voice_sender_info_ssrc1.local_stats[0].ssrc = 1;
1345 local_stream->AddTrack(local_audio_track); 1396 voice_sender_info_ssrc1.audio_level = 32767;
1397 voice_sender_info_ssrc1.echo_return_loss = 42;
1398 voice_sender_info_ssrc1.echo_return_loss_enhancement = 52;
1399
1400 // Uses default values, the corresponding stats object should contain
1401 // undefined members.
1402 cricket::VoiceSenderInfo voice_sender_info_ssrc2;
1403 voice_sender_info_ssrc2.local_stats.push_back(cricket::SsrcSenderInfo());
1404 voice_sender_info_ssrc2.local_stats[0].ssrc = 2;
1405 voice_sender_info_ssrc2.audio_level = 0;
1406 voice_sender_info_ssrc2.echo_return_loss = -100;
1407 voice_sender_info_ssrc2.echo_return_loss_enhancement = -100;
1346 1408
1347 // Remote audio track 1409 // Remote audio track
1348 AudioProcessorInterface::AudioProcessorStats remote_audio_processor_stats; 1410 rtc::scoped_refptr<MediaStreamTrackInterface> remote_audio_track =
1349 remote_audio_processor_stats.echo_return_loss = 13; 1411 CreateFakeTrack(cricket::MEDIA_TYPE_AUDIO, "RemoteAudioTrackID",
1350 remote_audio_processor_stats.echo_return_loss_enhancement = 37; 1412 MediaStreamTrackInterface::kLive);
1351 rtc::scoped_refptr<FakeAudioTrackForStats> remote_audio_track = 1413 remote_stream->AddTrack(static_cast<AudioTrackInterface*>(
1352 FakeAudioTrackForStats::Create( 1414 remote_audio_track.get()));
1353 "RemoteAudioTrackID", 1415
1354 MediaStreamTrackInterface::TrackState::kLive, 1416 cricket::VoiceReceiverInfo voice_receiver_info;
1355 0, 1417 voice_receiver_info.local_stats.push_back(cricket::SsrcReceiverInfo());
1356 new FakeAudioProcessorForStats(remote_audio_processor_stats)); 1418 voice_receiver_info.local_stats[0].ssrc = 3;
1357 remote_stream->AddTrack(remote_audio_track); 1419 voice_receiver_info.audio_level = 16383;
1420
1421 test_->CreateMockRtpSendersReceiversAndChannels(
1422 { std::make_pair(local_audio_track.get(), voice_sender_info_ssrc1),
1423 std::make_pair(local_audio_track.get(), voice_sender_info_ssrc2) },
1424 { std::make_pair(remote_audio_track.get(), voice_receiver_info) },
1425 {}, {});
1358 1426
1359 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); 1427 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
1360 1428
1361 RTCMediaStreamStats expected_local_stream( 1429 RTCMediaStreamStats expected_local_stream(
1362 "RTCMediaStream_local_LocalStreamLabel", report->timestamp_us()); 1430 "RTCMediaStream_local_LocalStreamLabel", report->timestamp_us());
1363 expected_local_stream.stream_identifier = local_stream->label(); 1431 expected_local_stream.stream_identifier = local_stream->label();
1364 expected_local_stream.track_ids = std::vector<std::string>(); 1432 expected_local_stream.track_ids = std::vector<std::string>(
1365 expected_local_stream.track_ids->push_back( 1433 { "RTCMediaStreamTrack_local_audio_LocalAudioTrackID_1",
1366 "RTCMediaStreamTrack_local_LocalAudioTrackID"); 1434 "RTCMediaStreamTrack_local_audio_LocalAudioTrackID_2" });
1367 ASSERT_TRUE(report->Get(expected_local_stream.id())); 1435 ASSERT_TRUE(report->Get(expected_local_stream.id()));
1368 EXPECT_EQ(expected_local_stream, 1436 EXPECT_EQ(expected_local_stream,
1369 report->Get(expected_local_stream.id())->cast_to< 1437 report->Get(expected_local_stream.id())->cast_to<
1370 RTCMediaStreamStats>()); 1438 RTCMediaStreamStats>());
1371 1439
1372 RTCMediaStreamStats expected_remote_stream( 1440 RTCMediaStreamStats expected_remote_stream(
1373 "RTCMediaStream_remote_RemoteStreamLabel", report->timestamp_us()); 1441 "RTCMediaStream_remote_RemoteStreamLabel", report->timestamp_us());
1374 expected_remote_stream.stream_identifier = remote_stream->label(); 1442 expected_remote_stream.stream_identifier = remote_stream->label();
1375 expected_remote_stream.track_ids = std::vector<std::string>(); 1443 expected_remote_stream.track_ids = std::vector<std::string>({
1376 expected_remote_stream.track_ids->push_back( 1444 "RTCMediaStreamTrack_remote_audio_RemoteAudioTrackID_3" });
1377 "RTCMediaStreamTrack_remote_RemoteAudioTrackID");
1378 ASSERT_TRUE(report->Get(expected_remote_stream.id())); 1445 ASSERT_TRUE(report->Get(expected_remote_stream.id()));
1379 EXPECT_EQ(expected_remote_stream, 1446 EXPECT_EQ(expected_remote_stream,
1380 report->Get(expected_remote_stream.id())->cast_to< 1447 report->Get(expected_remote_stream.id())->cast_to<
1381 RTCMediaStreamStats>()); 1448 RTCMediaStreamStats>());
1382 1449
1383 RTCMediaStreamTrackStats expected_local_audio_track( 1450 RTCMediaStreamTrackStats expected_local_audio_track_ssrc1(
1384 "RTCMediaStreamTrack_local_LocalAudioTrackID", report->timestamp_us(), 1451 "RTCMediaStreamTrack_local_audio_LocalAudioTrackID_1",
1385 RTCMediaStreamTrackKind::kAudio); 1452 report->timestamp_us(), RTCMediaStreamTrackKind::kAudio);
1386 expected_local_audio_track.track_identifier = local_audio_track->id(); 1453 expected_local_audio_track_ssrc1.track_identifier = local_audio_track->id();
1387 expected_local_audio_track.remote_source = false; 1454 expected_local_audio_track_ssrc1.remote_source = false;
1388 expected_local_audio_track.ended = true; 1455 expected_local_audio_track_ssrc1.ended = true;
1389 expected_local_audio_track.detached = false; 1456 expected_local_audio_track_ssrc1.detached = false;
1390 expected_local_audio_track.audio_level = 1.0; 1457 expected_local_audio_track_ssrc1.audio_level = 1.0;
1391 expected_local_audio_track.echo_return_loss = 42.0; 1458 expected_local_audio_track_ssrc1.echo_return_loss = 42.0;
1392 expected_local_audio_track.echo_return_loss_enhancement = 52.0; 1459 expected_local_audio_track_ssrc1.echo_return_loss_enhancement = 52.0;
1393 ASSERT_TRUE(report->Get(expected_local_audio_track.id())); 1460 ASSERT_TRUE(report->Get(expected_local_audio_track_ssrc1.id()));
1394 EXPECT_EQ(expected_local_audio_track, 1461 EXPECT_EQ(expected_local_audio_track_ssrc1,
1395 report->Get(expected_local_audio_track.id())->cast_to< 1462 report->Get(expected_local_audio_track_ssrc1.id())->cast_to<
1463 RTCMediaStreamTrackStats>());
1464
1465 RTCMediaStreamTrackStats expected_local_audio_track_ssrc2(
1466 "RTCMediaStreamTrack_local_audio_LocalAudioTrackID_2",
1467 report->timestamp_us(), RTCMediaStreamTrackKind::kAudio);
1468 expected_local_audio_track_ssrc2.track_identifier = local_audio_track->id();
1469 expected_local_audio_track_ssrc2.remote_source = false;
1470 expected_local_audio_track_ssrc2.ended = true;
1471 expected_local_audio_track_ssrc2.detached = false;
1472 expected_local_audio_track_ssrc2.audio_level = 0.0;
1473 // Should be undefined: |expected_local_audio_track_ssrc2.echo_return_loss|
1474 // and |expected_local_audio_track_ssrc2.echo_return_loss_enhancement|.
1475 ASSERT_TRUE(report->Get(expected_local_audio_track_ssrc2.id()));
1476 EXPECT_EQ(expected_local_audio_track_ssrc2,
1477 report->Get(expected_local_audio_track_ssrc2.id())->cast_to<
1396 RTCMediaStreamTrackStats>()); 1478 RTCMediaStreamTrackStats>());
1397 1479
1398 RTCMediaStreamTrackStats expected_remote_audio_track( 1480 RTCMediaStreamTrackStats expected_remote_audio_track(
1399 "RTCMediaStreamTrack_remote_RemoteAudioTrackID", report->timestamp_us(), 1481 "RTCMediaStreamTrack_remote_audio_RemoteAudioTrackID_3",
1400 RTCMediaStreamTrackKind::kAudio); 1482 report->timestamp_us(), RTCMediaStreamTrackKind::kAudio);
1401 expected_remote_audio_track.track_identifier = remote_audio_track->id(); 1483 expected_remote_audio_track.track_identifier = remote_audio_track->id();
1402 expected_remote_audio_track.remote_source = true; 1484 expected_remote_audio_track.remote_source = true;
1403 expected_remote_audio_track.ended = false; 1485 expected_remote_audio_track.ended = false;
1404 expected_remote_audio_track.detached = false; 1486 expected_remote_audio_track.detached = false;
1405 expected_remote_audio_track.audio_level = 0.0; 1487 expected_remote_audio_track.audio_level = 16383.0 / 32767.0;
1406 expected_remote_audio_track.echo_return_loss = 13.0;
1407 expected_remote_audio_track.echo_return_loss_enhancement = 37.0;
1408 ASSERT_TRUE(report->Get(expected_remote_audio_track.id())); 1488 ASSERT_TRUE(report->Get(expected_remote_audio_track.id()));
1409 EXPECT_EQ(expected_remote_audio_track, 1489 EXPECT_EQ(expected_remote_audio_track,
1410 report->Get(expected_remote_audio_track.id())->cast_to< 1490 report->Get(expected_remote_audio_track.id())->cast_to<
1411 RTCMediaStreamTrackStats>()); 1491 RTCMediaStreamTrackStats>());
1412 } 1492 }
1413 1493
1414 TEST_F(RTCStatsCollectorTest, 1494 TEST_F(RTCStatsCollectorTest,
1415 CollectRTCMediaStreamStatsAndRTCMediaStreamTrackStats_Audio_Defaults) {
1416 rtc::scoped_refptr<StreamCollection> local_streams =
1417 StreamCollection::Create();
1418 EXPECT_CALL(test_->pc(), local_streams())
1419 .WillRepeatedly(Return(local_streams));
1420
1421 rtc::scoped_refptr<MediaStream> local_stream =
1422 MediaStream::Create("LocalStreamLabel");
1423 local_streams->AddStream(local_stream);
1424
1425 // Local audio track
1426 AudioProcessorInterface::AudioProcessorStats local_audio_processor_stats;
1427 local_audio_processor_stats.echo_return_loss = -100;
1428 local_audio_processor_stats.echo_return_loss_enhancement = -100;
1429 rtc::scoped_refptr<FakeAudioTrackForStats> local_audio_track =
1430 FakeAudioTrackForStats::Create(
1431 "LocalAudioTrackID",
1432 MediaStreamTrackInterface::TrackState::kEnded,
1433 32767,
1434 new FakeAudioProcessorForStats(local_audio_processor_stats));
1435 local_stream->AddTrack(local_audio_track);
1436
1437 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
1438
1439 RTCMediaStreamTrackStats expected_local_audio_track(
1440 "RTCMediaStreamTrack_local_LocalAudioTrackID", report->timestamp_us(),
1441 RTCMediaStreamTrackKind::kAudio);
1442 expected_local_audio_track.track_identifier = local_audio_track->id();
1443 expected_local_audio_track.remote_source = false;
1444 expected_local_audio_track.ended = true;
1445 expected_local_audio_track.detached = false;
1446 expected_local_audio_track.audio_level = 1.0;
1447 // Should be undefined: |expected_local_audio_track.echo_return_loss| and
1448 // |expected_local_audio_track.echo_return_loss_enhancement|.
1449 ASSERT_TRUE(report->Get(expected_local_audio_track.id()));
1450 EXPECT_EQ(expected_local_audio_track,
1451 report->Get(expected_local_audio_track.id())->cast_to<
1452 RTCMediaStreamTrackStats>());
1453 }
1454
1455 TEST_F(RTCStatsCollectorTest,
1456 CollectRTCMediaStreamStatsAndRTCMediaStreamTrackStats_Video) { 1495 CollectRTCMediaStreamStatsAndRTCMediaStreamTrackStats_Video) {
1457 rtc::scoped_refptr<StreamCollection> local_streams = 1496 rtc::scoped_refptr<StreamCollection> local_streams =
1458 StreamCollection::Create(); 1497 StreamCollection::Create();
1459 rtc::scoped_refptr<StreamCollection> remote_streams = 1498 rtc::scoped_refptr<StreamCollection> remote_streams =
1460 StreamCollection::Create(); 1499 StreamCollection::Create();
1461 EXPECT_CALL(test_->pc(), local_streams()) 1500 EXPECT_CALL(test_->pc(), local_streams())
1462 .WillRepeatedly(Return(local_streams)); 1501 .WillRepeatedly(Return(local_streams));
1463 EXPECT_CALL(test_->pc(), remote_streams()) 1502 EXPECT_CALL(test_->pc(), remote_streams())
1464 .WillRepeatedly(Return(remote_streams)); 1503 .WillRepeatedly(Return(remote_streams));
1465 1504
1466 rtc::scoped_refptr<MediaStream> local_stream = 1505 rtc::scoped_refptr<MediaStream> local_stream =
1467 MediaStream::Create("LocalStreamLabel"); 1506 MediaStream::Create("LocalStreamLabel");
1468 local_streams->AddStream(local_stream); 1507 local_streams->AddStream(local_stream);
1469 rtc::scoped_refptr<MediaStream> remote_stream = 1508 rtc::scoped_refptr<MediaStream> remote_stream =
1470 MediaStream::Create("RemoteStreamLabel"); 1509 MediaStream::Create("RemoteStreamLabel");
1471 remote_streams->AddStream(remote_stream); 1510 remote_streams->AddStream(remote_stream);
1472 1511
1473 // Local video track 1512 // Local video track
1474 VideoTrackSourceInterface::Stats local_video_track_source_stats; 1513 rtc::scoped_refptr<MediaStreamTrackInterface> local_video_track =
1475 local_video_track_source_stats.input_width = 1234; 1514 CreateFakeTrack(cricket::MEDIA_TYPE_VIDEO, "LocalVideoTrackID",
1476 local_video_track_source_stats.input_height = 4321; 1515 MediaStreamTrackInterface::kLive);
1477 rtc::scoped_refptr<FakeVideoTrackSourceForStats> local_video_track_source = 1516 local_stream->AddTrack(static_cast<VideoTrackInterface*>(
1478 new FakeVideoTrackSourceForStats(local_video_track_source_stats); 1517 local_video_track.get()));
1479 rtc::scoped_refptr<FakeVideoTrackForStats> local_video_track =
1480 FakeVideoTrackForStats::Create(
1481 "LocalVideoTrackID",
1482 MediaStreamTrackInterface::TrackState::kLive,
1483 local_video_track_source);
1484 local_stream->AddTrack(local_video_track);
1485 1518
1486 // Remote video track 1519 cricket::VideoSenderInfo video_sender_info_ssrc1;
1487 VideoTrackSourceInterface::Stats remote_video_track_source_stats; 1520 video_sender_info_ssrc1.local_stats.push_back(cricket::SsrcSenderInfo());
1488 remote_video_track_source_stats.input_width = 1234; 1521 video_sender_info_ssrc1.local_stats[0].ssrc = 1;
1489 remote_video_track_source_stats.input_height = 4321; 1522 video_sender_info_ssrc1.send_frame_width = 1234;
1490 rtc::scoped_refptr<FakeVideoTrackSourceForStats> remote_video_track_source = 1523 video_sender_info_ssrc1.send_frame_height = 4321;
1491 new FakeVideoTrackSourceForStats(remote_video_track_source_stats); 1524
1492 rtc::scoped_refptr<FakeVideoTrackForStats> remote_video_track = 1525 cricket::VideoSenderInfo video_sender_info_ssrc2;
1493 FakeVideoTrackForStats::Create( 1526 video_sender_info_ssrc2.local_stats.push_back(cricket::SsrcSenderInfo());
1494 "RemoteVideoTrackID", 1527 video_sender_info_ssrc2.local_stats[0].ssrc = 2;
1495 MediaStreamTrackInterface::TrackState::kEnded, 1528 video_sender_info_ssrc2.send_frame_width = 4321;
1496 remote_video_track_source); 1529 video_sender_info_ssrc2.send_frame_height = 1234;
1497 remote_stream->AddTrack(remote_video_track); 1530
1531 // Remote video track with values
1532 rtc::scoped_refptr<MediaStreamTrackInterface> remote_video_track_ssrc3 =
1533 CreateFakeTrack(cricket::MEDIA_TYPE_VIDEO, "RemoteVideoTrackID3",
1534 MediaStreamTrackInterface::kEnded);
1535 remote_stream->AddTrack(static_cast<VideoTrackInterface*>(
1536 remote_video_track_ssrc3.get()));
1537
1538 cricket::VideoReceiverInfo video_receiver_info_ssrc3;
1539 video_receiver_info_ssrc3.local_stats.push_back(cricket::SsrcReceiverInfo());
1540 video_receiver_info_ssrc3.local_stats[0].ssrc = 3;
1541 video_receiver_info_ssrc3.frame_width = 6789;
1542 video_receiver_info_ssrc3.frame_height = 9876;
1543
1544 // Remote video track with undefined (default) values
1545 rtc::scoped_refptr<MediaStreamTrackInterface> remote_video_track_ssrc4 =
1546 CreateFakeTrack(cricket::MEDIA_TYPE_VIDEO, "RemoteVideoTrackID4",
1547 MediaStreamTrackInterface::kLive);
1548 remote_stream->AddTrack(static_cast<VideoTrackInterface*>(
1549 remote_video_track_ssrc4.get()));
1550
1551 cricket::VideoReceiverInfo video_receiver_info_ssrc4;
1552 video_receiver_info_ssrc4.local_stats.push_back(cricket::SsrcReceiverInfo());
1553 video_receiver_info_ssrc4.local_stats[0].ssrc = 4;
1554 video_receiver_info_ssrc4.frame_width = 0;
1555 video_receiver_info_ssrc4.frame_height = 0;
1556
1557 test_->CreateMockRtpSendersReceiversAndChannels(
1558 {}, {},
1559 { std::make_pair(local_video_track.get(), video_sender_info_ssrc1),
1560 std::make_pair(local_video_track.get(), video_sender_info_ssrc2) },
1561 { std::make_pair(remote_video_track_ssrc3.get(),
1562 video_receiver_info_ssrc3),
1563 std::make_pair(remote_video_track_ssrc4.get(),
1564 video_receiver_info_ssrc4) });
1498 1565
1499 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); 1566 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
1500 1567
1501 RTCMediaStreamStats expected_local_stream( 1568 RTCMediaStreamStats expected_local_stream(
1502 "RTCMediaStream_local_LocalStreamLabel", report->timestamp_us()); 1569 "RTCMediaStream_local_LocalStreamLabel", report->timestamp_us());
1503 expected_local_stream.stream_identifier = local_stream->label(); 1570 expected_local_stream.stream_identifier = local_stream->label();
1504 expected_local_stream.track_ids = std::vector<std::string>(); 1571 expected_local_stream.track_ids = std::vector<std::string>({
1505 expected_local_stream.track_ids->push_back( 1572 "RTCMediaStreamTrack_local_video_LocalVideoTrackID_1",
1506 "RTCMediaStreamTrack_local_LocalVideoTrackID"); 1573 "RTCMediaStreamTrack_local_video_LocalVideoTrackID_2" });
1507 ASSERT_TRUE(report->Get(expected_local_stream.id())); 1574 ASSERT_TRUE(report->Get(expected_local_stream.id()));
1508 EXPECT_EQ(expected_local_stream, 1575 EXPECT_EQ(expected_local_stream,
1509 report->Get(expected_local_stream.id())->cast_to< 1576 report->Get(expected_local_stream.id())->cast_to<
1510 RTCMediaStreamStats>()); 1577 RTCMediaStreamStats>());
1511 1578
1512 RTCMediaStreamStats expected_remote_stream( 1579 RTCMediaStreamStats expected_remote_stream(
1513 "RTCMediaStream_remote_RemoteStreamLabel", report->timestamp_us()); 1580 "RTCMediaStream_remote_RemoteStreamLabel", report->timestamp_us());
1514 expected_remote_stream.stream_identifier = remote_stream->label(); 1581 expected_remote_stream.stream_identifier = remote_stream->label();
1515 expected_remote_stream.track_ids = std::vector<std::string>(); 1582 expected_remote_stream.track_ids = std::vector<std::string>({
1516 expected_remote_stream.track_ids->push_back( 1583 "RTCMediaStreamTrack_remote_video_RemoteVideoTrackID3_3",
1517 "RTCMediaStreamTrack_remote_RemoteVideoTrackID"); 1584 "RTCMediaStreamTrack_remote_video_RemoteVideoTrackID4_4" });
1518 ASSERT_TRUE(report->Get(expected_remote_stream.id())); 1585 ASSERT_TRUE(report->Get(expected_remote_stream.id()));
1519 EXPECT_EQ(expected_remote_stream, 1586 EXPECT_EQ(expected_remote_stream,
1520 report->Get(expected_remote_stream.id())->cast_to< 1587 report->Get(expected_remote_stream.id())->cast_to<
1521 RTCMediaStreamStats>()); 1588 RTCMediaStreamStats>());
1522 1589
1523 RTCMediaStreamTrackStats expected_local_video_track( 1590 RTCMediaStreamTrackStats expected_local_video_track_ssrc1(
1524 "RTCMediaStreamTrack_local_LocalVideoTrackID", report->timestamp_us(), 1591 "RTCMediaStreamTrack_local_video_LocalVideoTrackID_1",
1525 RTCMediaStreamTrackKind::kVideo); 1592 report->timestamp_us(), RTCMediaStreamTrackKind::kVideo);
1526 expected_local_video_track.track_identifier = local_video_track->id(); 1593 expected_local_video_track_ssrc1.track_identifier = local_video_track->id();
1527 expected_local_video_track.remote_source = false; 1594 expected_local_video_track_ssrc1.remote_source = false;
1528 expected_local_video_track.ended = false; 1595 expected_local_video_track_ssrc1.ended = false;
1529 expected_local_video_track.detached = false; 1596 expected_local_video_track_ssrc1.detached = false;
1530 expected_local_video_track.frame_width = 1234; 1597 expected_local_video_track_ssrc1.frame_width = 1234;
1531 expected_local_video_track.frame_height = 4321; 1598 expected_local_video_track_ssrc1.frame_height = 4321;
1532 ASSERT_TRUE(report->Get(expected_local_video_track.id())); 1599 ASSERT_TRUE(report->Get(expected_local_video_track_ssrc1.id()));
1533 EXPECT_EQ(expected_local_video_track, 1600 EXPECT_EQ(expected_local_video_track_ssrc1,
1534 report->Get(expected_local_video_track.id())->cast_to< 1601 report->Get(expected_local_video_track_ssrc1.id())->cast_to<
1535 RTCMediaStreamTrackStats>()); 1602 RTCMediaStreamTrackStats>());
1536 1603
1537 RTCMediaStreamTrackStats expected_remote_video_track( 1604 RTCMediaStreamTrackStats expected_local_video_track_ssrc2(
1538 "RTCMediaStreamTrack_remote_RemoteVideoTrackID", report->timestamp_us(), 1605 "RTCMediaStreamTrack_local_video_LocalVideoTrackID_2",
1539 RTCMediaStreamTrackKind::kVideo); 1606 report->timestamp_us(), RTCMediaStreamTrackKind::kVideo);
1540 expected_remote_video_track.track_identifier = remote_video_track->id(); 1607 expected_local_video_track_ssrc2.track_identifier = local_video_track->id();
1541 expected_remote_video_track.remote_source = true; 1608 expected_local_video_track_ssrc2.remote_source = false;
1542 expected_remote_video_track.ended = true; 1609 expected_local_video_track_ssrc2.ended = false;
1543 expected_remote_video_track.detached = false; 1610 expected_local_video_track_ssrc2.detached = false;
1544 expected_remote_video_track.frame_width = 1234; 1611 expected_local_video_track_ssrc2.frame_width = 4321;
1545 expected_remote_video_track.frame_height = 4321; 1612 expected_local_video_track_ssrc2.frame_height = 1234;
1546 ASSERT_TRUE(report->Get(expected_remote_video_track.id())); 1613 ASSERT_TRUE(report->Get(expected_local_video_track_ssrc2.id()));
1547 EXPECT_EQ(expected_remote_video_track, 1614 EXPECT_EQ(expected_local_video_track_ssrc2,
1548 report->Get(expected_remote_video_track.id())->cast_to< 1615 report->Get(expected_local_video_track_ssrc2.id())->cast_to<
1616 RTCMediaStreamTrackStats>());
1617
1618 RTCMediaStreamTrackStats expected_remote_video_track_ssrc3(
1619 "RTCMediaStreamTrack_remote_video_RemoteVideoTrackID3_3",
1620 report->timestamp_us(), RTCMediaStreamTrackKind::kVideo);
1621 expected_remote_video_track_ssrc3.track_identifier =
1622 remote_video_track_ssrc3->id();
1623 expected_remote_video_track_ssrc3.remote_source = true;
1624 expected_remote_video_track_ssrc3.ended = true;
1625 expected_remote_video_track_ssrc3.detached = false;
1626 expected_remote_video_track_ssrc3.frame_width = 6789;
1627 expected_remote_video_track_ssrc3.frame_height = 9876;
1628 ASSERT_TRUE(report->Get(expected_remote_video_track_ssrc3.id()));
1629 EXPECT_EQ(expected_remote_video_track_ssrc3,
1630 report->Get(expected_remote_video_track_ssrc3.id())->cast_to<
1631 RTCMediaStreamTrackStats>());
1632
1633 RTCMediaStreamTrackStats expected_remote_video_track_ssrc4(
1634 "RTCMediaStreamTrack_remote_video_RemoteVideoTrackID4_4",
1635 report->timestamp_us(), RTCMediaStreamTrackKind::kVideo);
1636 expected_remote_video_track_ssrc4.track_identifier =
1637 remote_video_track_ssrc4->id();
1638 expected_remote_video_track_ssrc4.remote_source = true;
1639 expected_remote_video_track_ssrc4.ended = false;
1640 expected_remote_video_track_ssrc4.detached = false;
1641 // Should be undefined: |expected_remote_video_track_ssrc4.frame_width| and
1642 // |expected_remote_video_track_ssrc4.frame_height|.
1643 ASSERT_TRUE(report->Get(expected_remote_video_track_ssrc4.id()));
1644 EXPECT_EQ(expected_remote_video_track_ssrc4,
1645 report->Get(expected_remote_video_track_ssrc4.id())->cast_to<
1549 RTCMediaStreamTrackStats>()); 1646 RTCMediaStreamTrackStats>());
1550 } 1647 }
1551 1648
1552 TEST_F(RTCStatsCollectorTest, CollectRTCInboundRTPStreamStats_Audio) { 1649 TEST_F(RTCStatsCollectorTest, CollectRTCInboundRTPStreamStats_Audio) {
1553 MockVoiceMediaChannel* voice_media_channel = new MockVoiceMediaChannel(); 1650 MockVoiceMediaChannel* voice_media_channel = new MockVoiceMediaChannel();
1554 cricket::VoiceChannel voice_channel( 1651 cricket::VoiceChannel voice_channel(
1555 test_->worker_thread(), test_->network_thread(), 1652 test_->worker_thread(), test_->network_thread(),
1556 test_->signaling_thread(), test_->media_engine(), voice_media_channel, 1653 test_->signaling_thread(), test_->media_engine(), voice_media_channel,
1557 "VoiceContentName", kDefaultRtcpMuxRequired, kDefaultSrtpRequired); 1654 "VoiceContentName", kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
1558 1655
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1601 .WillRepeatedly(Return(&voice_channel)); 1698 .WillRepeatedly(Return(&voice_channel));
1602 1699
1603 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); 1700 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
1604 1701
1605 RTCInboundRTPStreamStats expected_audio( 1702 RTCInboundRTPStreamStats expected_audio(
1606 "RTCInboundRTPAudioStream_1", report->timestamp_us()); 1703 "RTCInboundRTPAudioStream_1", report->timestamp_us());
1607 expected_audio.ssrc = "1"; 1704 expected_audio.ssrc = "1";
1608 expected_audio.is_remote = false; 1705 expected_audio.is_remote = false;
1609 expected_audio.media_type = "audio"; 1706 expected_audio.media_type = "audio";
1610 expected_audio.media_track_id = 1707 expected_audio.media_track_id =
1611 "RTCMediaStreamTrack_remote_RemoteAudioTrackID"; 1708 "RTCMediaStreamTrack_remote_audio_RemoteAudioTrackID_1";
1612 expected_audio.transport_id = "RTCTransport_TransportName_" + 1709 expected_audio.transport_id = "RTCTransport_TransportName_" +
1613 rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP); 1710 rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP);
1614 expected_audio.codec_id = "RTCCodec_InboundAudio_42"; 1711 expected_audio.codec_id = "RTCCodec_InboundAudio_42";
1615 expected_audio.packets_received = 2; 1712 expected_audio.packets_received = 2;
1616 expected_audio.bytes_received = 3; 1713 expected_audio.bytes_received = 3;
1617 expected_audio.packets_lost = 42; 1714 expected_audio.packets_lost = 42;
1618 expected_audio.jitter = 4.5; 1715 expected_audio.jitter = 4.5;
1619 expected_audio.fraction_lost = 5.5; 1716 expected_audio.fraction_lost = 5.5;
1620 1717
1621 ASSERT(report->Get(expected_audio.id())); 1718 ASSERT(report->Get(expected_audio.id()));
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1683 .WillRepeatedly(Return(&video_channel)); 1780 .WillRepeatedly(Return(&video_channel));
1684 1781
1685 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); 1782 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
1686 1783
1687 RTCInboundRTPStreamStats expected_video( 1784 RTCInboundRTPStreamStats expected_video(
1688 "RTCInboundRTPVideoStream_1", report->timestamp_us()); 1785 "RTCInboundRTPVideoStream_1", report->timestamp_us());
1689 expected_video.ssrc = "1"; 1786 expected_video.ssrc = "1";
1690 expected_video.is_remote = false; 1787 expected_video.is_remote = false;
1691 expected_video.media_type = "video"; 1788 expected_video.media_type = "video";
1692 expected_video.media_track_id = 1789 expected_video.media_track_id =
1693 "RTCMediaStreamTrack_remote_RemoteVideoTrackID"; 1790 "RTCMediaStreamTrack_remote_video_RemoteVideoTrackID_1";
1694 expected_video.transport_id = "RTCTransport_TransportName_" + 1791 expected_video.transport_id = "RTCTransport_TransportName_" +
1695 rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP); 1792 rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP);
1696 expected_video.codec_id = "RTCCodec_InboundVideo_42"; 1793 expected_video.codec_id = "RTCCodec_InboundVideo_42";
1697 expected_video.fir_count = 5; 1794 expected_video.fir_count = 5;
1698 expected_video.pli_count = 6; 1795 expected_video.pli_count = 6;
1699 expected_video.nack_count = 7; 1796 expected_video.nack_count = 7;
1700 expected_video.packets_received = 2; 1797 expected_video.packets_received = 2;
1701 expected_video.bytes_received = 3; 1798 expected_video.bytes_received = 3;
1702 expected_video.packets_lost = 42; 1799 expected_video.packets_lost = 42;
1703 expected_video.fraction_lost = 4.5; 1800 expected_video.fraction_lost = 4.5;
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1761 EXPECT_CALL(test_->session(), voice_channel()) 1858 EXPECT_CALL(test_->session(), voice_channel())
1762 .WillRepeatedly(Return(&voice_channel)); 1859 .WillRepeatedly(Return(&voice_channel));
1763 1860
1764 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); 1861 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
1765 1862
1766 RTCOutboundRTPStreamStats expected_audio( 1863 RTCOutboundRTPStreamStats expected_audio(
1767 "RTCOutboundRTPAudioStream_1", report->timestamp_us()); 1864 "RTCOutboundRTPAudioStream_1", report->timestamp_us());
1768 expected_audio.ssrc = "1"; 1865 expected_audio.ssrc = "1";
1769 expected_audio.is_remote = false; 1866 expected_audio.is_remote = false;
1770 expected_audio.media_type = "audio"; 1867 expected_audio.media_type = "audio";
1771 expected_audio.media_track_id = "RTCMediaStreamTrack_local_LocalAudioTrackID"; 1868 expected_audio.media_track_id =
1869 "RTCMediaStreamTrack_local_audio_LocalAudioTrackID_1";
1772 expected_audio.transport_id = "RTCTransport_TransportName_" + 1870 expected_audio.transport_id = "RTCTransport_TransportName_" +
1773 rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP); 1871 rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP);
1774 expected_audio.codec_id = "RTCCodec_OutboundAudio_42"; 1872 expected_audio.codec_id = "RTCCodec_OutboundAudio_42";
1775 expected_audio.packets_sent = 2; 1873 expected_audio.packets_sent = 2;
1776 expected_audio.bytes_sent = 3; 1874 expected_audio.bytes_sent = 3;
1777 expected_audio.round_trip_time = 4.5; 1875 expected_audio.round_trip_time = 4.5;
1778 1876
1779 ASSERT(report->Get(expected_audio.id())); 1877 ASSERT(report->Get(expected_audio.id()));
1780 const RTCOutboundRTPStreamStats& audio = report->Get( 1878 const RTCOutboundRTPStreamStats& audio = report->Get(
1781 expected_audio.id())->cast_to<RTCOutboundRTPStreamStats>(); 1879 expected_audio.id())->cast_to<RTCOutboundRTPStreamStats>();
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1839 EXPECT_CALL(test_->session(), video_channel()) 1937 EXPECT_CALL(test_->session(), video_channel())
1840 .WillRepeatedly(Return(&video_channel)); 1938 .WillRepeatedly(Return(&video_channel));
1841 1939
1842 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); 1940 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
1843 1941
1844 RTCOutboundRTPStreamStats expected_video( 1942 RTCOutboundRTPStreamStats expected_video(
1845 "RTCOutboundRTPVideoStream_1", report->timestamp_us()); 1943 "RTCOutboundRTPVideoStream_1", report->timestamp_us());
1846 expected_video.ssrc = "1"; 1944 expected_video.ssrc = "1";
1847 expected_video.is_remote = false; 1945 expected_video.is_remote = false;
1848 expected_video.media_type = "video"; 1946 expected_video.media_type = "video";
1849 expected_video.media_track_id = "RTCMediaStreamTrack_local_LocalVideoTrackID"; 1947 expected_video.media_track_id =
1948 "RTCMediaStreamTrack_local_video_LocalVideoTrackID_1";
1850 expected_video.transport_id = "RTCTransport_TransportName_" + 1949 expected_video.transport_id = "RTCTransport_TransportName_" +
1851 rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP); 1950 rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP);
1852 expected_video.codec_id = "RTCCodec_OutboundVideo_42"; 1951 expected_video.codec_id = "RTCCodec_OutboundVideo_42";
1853 expected_video.fir_count = 2; 1952 expected_video.fir_count = 2;
1854 expected_video.pli_count = 3; 1953 expected_video.pli_count = 3;
1855 expected_video.nack_count = 4; 1954 expected_video.nack_count = 4;
1856 expected_video.packets_sent = 5; 1955 expected_video.packets_sent = 5;
1857 expected_video.bytes_sent = 6; 1956 expected_video.bytes_sent = 6;
1858 expected_video.round_trip_time = 7.5; 1957 expected_video.round_trip_time = 7.5;
1859 expected_video.frames_encoded = 8; 1958 expected_video.frames_encoded = 8;
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
2142 rtc::scoped_refptr<FakeRTCStatsCollector> collector_; 2241 rtc::scoped_refptr<FakeRTCStatsCollector> collector_;
2143 }; 2242 };
2144 2243
2145 TEST_F(RTCStatsCollectorTestWithFakeCollector, ThreadUsageAndResultsMerging) { 2244 TEST_F(RTCStatsCollectorTestWithFakeCollector, ThreadUsageAndResultsMerging) {
2146 collector_->VerifyThreadUsageAndResultsMerging(); 2245 collector_->VerifyThreadUsageAndResultsMerging();
2147 } 2246 }
2148 2247
2149 } // namespace 2248 } // namespace
2150 2249
2151 } // namespace webrtc 2250 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/api/rtcstatscollector.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698