Chromium Code Reviews| Index: webrtc/api/rtcstatscollector_unittest.cc |
| diff --git a/webrtc/api/rtcstatscollector_unittest.cc b/webrtc/api/rtcstatscollector_unittest.cc |
| index 808668b35c88fe26ccbb30fe7c05ecda7e1cd96d..df9fef6d4e5c802671f17e4517e96324ded6cc88 100644 |
| --- a/webrtc/api/rtcstatscollector_unittest.cc |
| +++ b/webrtc/api/rtcstatscollector_unittest.cc |
| @@ -15,6 +15,8 @@ |
| #include <string> |
| #include <vector> |
| +#include "webrtc/api/mediastream.h" |
| +#include "webrtc/api/mediastreamtrack.h" |
| #include "webrtc/api/jsepsessiondescription.h" |
| #include "webrtc/api/stats/rtcstats_objects.h" |
| #include "webrtc/api/stats/rtcstatsreport.h" |
| @@ -70,6 +72,14 @@ void PrintTo(const RTCPeerConnectionStats& stats, ::std::ostream* os) { |
| *os << stats.ToString(); |
| } |
| +void PrintTo(const RTCMediaStreamStats& stats, ::std::ostream* os) { |
| + *os << stats.ToString(); |
| +} |
| + |
| +void PrintTo(const RTCMediaStreamTrackStats& stats, ::std::ostream* os) { |
| + *os << stats.ToString(); |
| +} |
| + |
| void PrintTo(const RTCInboundRTPStreamStats& stats, ::std::ostream* os) { |
| *os << stats.ToString(); |
| } |
| @@ -150,6 +160,136 @@ std::unique_ptr<cricket::Candidate> CreateFakeCandidate( |
| return candidate; |
| } |
| +class FakeAudioProcessorForStats : public AudioProcessorInterface { |
|
Taylor Brandstetter
2016/11/04 18:19:14
nit: Since these fake objects only exist to return
hbos
2016/11/08 13:43:37
Acknowledged. Leaving as-is.
|
| + public: |
| + static rtc::scoped_refptr<FakeAudioProcessorForStats> Create( |
| + AudioProcessorInterface::AudioProcessorStats stats) { |
| + return rtc::scoped_refptr<FakeAudioProcessorForStats>( |
| + new rtc::RefCountedObject<FakeAudioProcessorForStats>(stats)); |
| + } |
|
Taylor Brandstetter
2016/11/04 18:19:14
nit: The Create methods here seem redundant. Could
hbos
2016/11/08 13:43:37
Done. Did it for FakeVideoTrackSourceForStats too.
|
| + |
| + FakeAudioProcessorForStats( |
| + AudioProcessorInterface::AudioProcessorStats stats) |
| + : stats_(stats) { |
| + } |
| + |
| + void GetStats(AudioProcessorInterface::AudioProcessorStats* stats) override { |
| + *stats = stats_; |
| + } |
| + |
| + private: |
| + AudioProcessorInterface::AudioProcessorStats stats_; |
| +}; |
| + |
| +class FakeAudioTrackForStats |
| + : public MediaStreamTrack<AudioTrackInterface> { |
| + public: |
| + static rtc::scoped_refptr<FakeAudioTrackForStats> Create( |
| + const std::string& id, |
| + MediaStreamTrackInterface::TrackState state, |
| + int signal_level, |
| + rtc::scoped_refptr<FakeAudioProcessorForStats> processor) { |
| + rtc::scoped_refptr<FakeAudioTrackForStats> audio_track_stats( |
| + new rtc::RefCountedObject<FakeAudioTrackForStats>( |
| + id, signal_level, processor)); |
| + audio_track_stats->set_state(state); |
| + return audio_track_stats; |
| + } |
| + |
| + FakeAudioTrackForStats( |
| + const std::string& id, |
| + int signal_level, |
| + rtc::scoped_refptr<FakeAudioProcessorForStats> processor) |
| + : MediaStreamTrack<AudioTrackInterface>(id), |
| + signal_level_(signal_level), |
| + processor_(processor) { |
| + } |
| + |
| + std::string kind() const override { |
| + return MediaStreamTrackInterface::kAudioKind; |
| + } |
| + webrtc::AudioSourceInterface* GetSource() const override { return nullptr; } |
| + void AddSink(webrtc::AudioTrackSinkInterface* sink) override {} |
| + void RemoveSink(webrtc::AudioTrackSinkInterface* sink) override {} |
| + bool GetSignalLevel(int* level) override { |
| + *level = signal_level_; |
| + return true; |
| + } |
| + rtc::scoped_refptr<AudioProcessorInterface> GetAudioProcessor() override { |
| + return processor_; |
| + } |
| + |
| + private: |
| + int signal_level_; |
| + rtc::scoped_refptr<FakeAudioProcessorForStats> processor_; |
| +}; |
| + |
| +class FakeVideoTrackSourceForStats : public VideoTrackSourceInterface { |
| + public: |
| + static rtc::scoped_refptr<FakeVideoTrackSourceForStats> Create( |
| + VideoTrackSourceInterface::Stats stats) { |
| + return rtc::scoped_refptr<FakeVideoTrackSourceForStats>( |
| + new rtc::RefCountedObject<FakeVideoTrackSourceForStats>(stats)); |
| + } |
| + |
| + FakeVideoTrackSourceForStats(VideoTrackSourceInterface::Stats stats) |
| + : stats_(stats) { |
| + } |
| + |
| + MediaSourceInterface::SourceState state() const override { |
| + return MediaSourceInterface::kLive; |
| + } |
| + bool remote() const override { return false; } |
| + void RegisterObserver(ObserverInterface* observer) override {} |
| + void UnregisterObserver(ObserverInterface* observer) override {} |
| + void AddOrUpdateSink(rtc::VideoSinkInterface<cricket::VideoFrame>* sink, |
| + const rtc::VideoSinkWants& wants) override {} |
| + void RemoveSink(rtc::VideoSinkInterface<cricket::VideoFrame>* sink) override { |
| + } |
| + bool is_screencast() const override { return false; } |
| + rtc::Optional<bool> needs_denoising() const override { |
| + return rtc::Optional<bool>(); |
| + } |
| + bool GetStats(VideoTrackSourceInterface::Stats* stats) override { |
| + *stats = stats_; |
| + return true; |
| + } |
| + |
| + private: |
| + VideoTrackSourceInterface::Stats stats_; |
| +}; |
| + |
| +class FakeVideoTrackForStats |
| + : public MediaStreamTrack<VideoTrackInterface> { |
| + public: |
| + static rtc::scoped_refptr<FakeVideoTrackForStats> Create( |
| + const std::string& id, |
| + MediaStreamTrackInterface::TrackState state, |
| + rtc::scoped_refptr<VideoTrackSourceInterface> source) { |
| + rtc::scoped_refptr<FakeVideoTrackForStats> video_track( |
| + new rtc::RefCountedObject<FakeVideoTrackForStats>(id, source)); |
| + video_track->set_state(state); |
| + return video_track; |
| + } |
| + |
| + FakeVideoTrackForStats( |
| + const std::string& id, |
| + rtc::scoped_refptr<VideoTrackSourceInterface> source) |
| + : MediaStreamTrack<VideoTrackInterface>(id), |
| + source_(source) { |
| + } |
| + |
| + std::string kind() const override { |
| + return MediaStreamTrackInterface::kVideoKind; |
| + } |
| + VideoTrackSourceInterface* GetSource() const override { |
| + return source_; |
| + } |
| + |
| + private: |
| + rtc::scoped_refptr<VideoTrackSourceInterface> source_; |
| +}; |
| + |
| class RTCStatsCollectorTestHelper : public SetSessionDescriptionObserver { |
| public: |
| RTCStatsCollectorTestHelper() |
| @@ -168,6 +308,8 @@ class RTCStatsCollectorTestHelper : public SetSessionDescriptionObserver { |
| session_(media_controller_.get()), |
| pc_() { |
| // Default return values for mocks. |
| + EXPECT_CALL(pc_, local_streams()).WillRepeatedly(Return(nullptr)); |
| + EXPECT_CALL(pc_, remote_streams()).WillRepeatedly(Return(nullptr)); |
| EXPECT_CALL(pc_, session()).WillRepeatedly(Return(&session_)); |
| EXPECT_CALL(pc_, sctp_data_channels()).WillRepeatedly( |
| ReturnRef(data_channels_)); |
| @@ -198,12 +340,12 @@ class RTCStatsCollectorTestHelper : public SetSessionDescriptionObserver { |
| private: |
| rtc::ScopedFakeClock fake_clock_; |
| - webrtc::RtcEventLogNullImpl event_log_; |
| + RtcEventLogNullImpl event_log_; |
| rtc::Thread* const worker_thread_; |
| rtc::Thread* const network_thread_; |
| cricket::FakeMediaEngine* media_engine_; |
| std::unique_ptr<cricket::ChannelManager> channel_manager_; |
| - std::unique_ptr<webrtc::MediaControllerInterface> media_controller_; |
| + std::unique_ptr<MediaControllerInterface> media_controller_; |
| MockWebRtcSession session_; |
| MockPeerConnection pc_; |
| @@ -979,6 +1121,196 @@ TEST_F(RTCStatsCollectorTest, CollectRTCPeerConnectionStats) { |
| } |
| } |
| +TEST_F(RTCStatsCollectorTest, |
| + CollectRTCMediaStreamStatsAndRTCMediaStreamTrackStats_Audio) { |
| + rtc::scoped_refptr<StreamCollection> local_streams = |
| + StreamCollection::Create(); |
| + rtc::scoped_refptr<StreamCollection> remote_streams = |
| + StreamCollection::Create(); |
| + EXPECT_CALL(test_->pc(), local_streams()) |
| + .WillRepeatedly(Return(local_streams)); |
| + EXPECT_CALL(test_->pc(), remote_streams()) |
| + .WillRepeatedly(Return(remote_streams)); |
| + |
| + rtc::scoped_refptr<MediaStream> local_stream = |
| + MediaStream::Create("LocalStreamLabel"); |
| + local_streams->AddStream(local_stream); |
| + rtc::scoped_refptr<MediaStream> remote_stream = |
| + MediaStream::Create("RemoteStreamLabel"); |
| + remote_streams->AddStream(remote_stream); |
| + |
| + // Local audio track |
| + AudioProcessorInterface::AudioProcessorStats local_audio_processor_stats; |
| + local_audio_processor_stats.echo_return_loss = 42; |
| + local_audio_processor_stats.echo_return_loss_enhancement = 52; |
| + rtc::scoped_refptr<FakeAudioTrackForStats> local_audio_track = |
| + FakeAudioTrackForStats::Create( |
| + "LocalAudioTrackID", |
| + MediaStreamTrackInterface::TrackState::kEnded, |
| + 32767, |
| + FakeAudioProcessorForStats::Create(local_audio_processor_stats)); |
| + local_stream->AddTrack(local_audio_track); |
| + |
| + // Remote audio track |
| + AudioProcessorInterface::AudioProcessorStats remote_audio_processor_stats; |
| + remote_audio_processor_stats.echo_return_loss = 13; |
| + remote_audio_processor_stats.echo_return_loss_enhancement = 37; |
| + rtc::scoped_refptr<FakeAudioTrackForStats> remote_audio_track = |
| + FakeAudioTrackForStats::Create( |
| + "RemoteAudioTrackID", |
| + MediaStreamTrackInterface::TrackState::kLive, |
| + 0, |
| + FakeAudioProcessorForStats::Create(remote_audio_processor_stats)); |
| + remote_stream->AddTrack(remote_audio_track); |
| + |
| + rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); |
| + |
| + RTCMediaStreamStats expected_local_stream( |
| + "RTCMediaStream_LocalStreamLabel", report->timestamp_us()); |
| + expected_local_stream.stream_identifier = "LocalStreamLabel"; |
| + expected_local_stream.track_ids = std::vector<std::string>(); |
| + expected_local_stream.track_ids->push_back( |
| + "RTCMediaStreamTrack_LocalAudioTrackID"); |
| + EXPECT_TRUE(report->Get(expected_local_stream.id())); |
| + EXPECT_EQ(expected_local_stream, |
| + report->Get(expected_local_stream.id())->cast_to< |
| + RTCMediaStreamStats>()); |
| + |
| + RTCMediaStreamStats expected_remote_stream( |
| + "RTCMediaStream_RemoteStreamLabel", report->timestamp_us()); |
| + expected_remote_stream.stream_identifier = "RemoteStreamLabel"; |
| + expected_remote_stream.track_ids = std::vector<std::string>(); |
| + expected_remote_stream.track_ids->push_back( |
| + "RTCMediaStreamTrack_RemoteAudioTrackID"); |
| + EXPECT_TRUE(report->Get(expected_remote_stream.id())); |
| + EXPECT_EQ(expected_remote_stream, |
| + report->Get(expected_remote_stream.id())->cast_to< |
| + RTCMediaStreamStats>()); |
| + |
| + RTCMediaStreamTrackStats expected_local_audio_track( |
| + "RTCMediaStreamTrack_LocalAudioTrackID", report->timestamp_us()); |
| + expected_local_audio_track.track_identifier = "LocalAudioTrackID"; |
| + expected_local_audio_track.remote_source = false; |
| + expected_local_audio_track.ended = true; |
| + expected_local_audio_track.detached = false; |
| + expected_local_audio_track.audio_level = 1.0; |
| + expected_local_audio_track.echo_return_loss = 42.0; |
| + expected_local_audio_track.echo_return_loss_enhancement = 52.0; |
| + EXPECT_TRUE(report->Get(expected_local_audio_track.id())); |
| + EXPECT_EQ(expected_local_audio_track, |
| + report->Get(expected_local_audio_track.id())->cast_to< |
| + RTCMediaStreamTrackStats>()); |
| + |
| + RTCMediaStreamTrackStats expected_remote_audio_track( |
| + "RTCMediaStreamTrack_RemoteAudioTrackID", report->timestamp_us()); |
| + expected_remote_audio_track.track_identifier = "RemoteAudioTrackID"; |
| + expected_remote_audio_track.remote_source = true; |
| + expected_remote_audio_track.ended = false; |
| + expected_remote_audio_track.detached = false; |
| + expected_remote_audio_track.audio_level = 0.0; |
| + expected_remote_audio_track.echo_return_loss = 13.0; |
| + expected_remote_audio_track.echo_return_loss_enhancement = 37.0; |
| + EXPECT_TRUE(report->Get(expected_remote_audio_track.id())); |
| + EXPECT_EQ(expected_remote_audio_track, |
| + report->Get(expected_remote_audio_track.id())->cast_to< |
| + RTCMediaStreamTrackStats>()); |
| +} |
| + |
| +TEST_F(RTCStatsCollectorTest, |
| + CollectRTCMediaStreamStatsAndRTCMediaStreamTrackStats_Video) { |
| + rtc::scoped_refptr<StreamCollection> local_streams = |
| + StreamCollection::Create(); |
| + rtc::scoped_refptr<StreamCollection> remote_streams = |
| + StreamCollection::Create(); |
| + EXPECT_CALL(test_->pc(), local_streams()) |
| + .WillRepeatedly(Return(local_streams)); |
| + EXPECT_CALL(test_->pc(), remote_streams()) |
| + .WillRepeatedly(Return(remote_streams)); |
| + |
| + rtc::scoped_refptr<MediaStream> local_stream = |
| + MediaStream::Create("LocalStreamLabel"); |
| + local_streams->AddStream(local_stream); |
| + rtc::scoped_refptr<MediaStream> remote_stream = |
| + MediaStream::Create("RemoteStreamLabel"); |
| + remote_streams->AddStream(remote_stream); |
| + |
| + // Local video track |
| + VideoTrackSourceInterface::Stats local_video_track_source_stats; |
| + local_video_track_source_stats.input_width = 1234; |
| + local_video_track_source_stats.input_height = 4321; |
| + rtc::scoped_refptr<FakeVideoTrackSourceForStats> local_video_track_source = |
| + FakeVideoTrackSourceForStats::Create(local_video_track_source_stats); |
| + rtc::scoped_refptr<FakeVideoTrackForStats> local_video_track = |
| + FakeVideoTrackForStats::Create( |
| + "LocalVideoTrackID", |
| + MediaStreamTrackInterface::TrackState::kLive, |
| + local_video_track_source); |
| + local_stream->AddTrack(local_video_track); |
| + |
| + // Remote video track |
| + VideoTrackSourceInterface::Stats remote_video_track_source_stats; |
| + remote_video_track_source_stats.input_width = 1234; |
| + remote_video_track_source_stats.input_height = 4321; |
| + rtc::scoped_refptr<FakeVideoTrackSourceForStats> remote_video_track_source = |
| + FakeVideoTrackSourceForStats::Create(remote_video_track_source_stats); |
| + rtc::scoped_refptr<FakeVideoTrackForStats> remote_video_track = |
| + FakeVideoTrackForStats::Create( |
| + "RemoteVideoTrackID", |
| + MediaStreamTrackInterface::TrackState::kEnded, |
| + remote_video_track_source); |
| + remote_stream->AddTrack(remote_video_track); |
| + |
| + rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); |
| + |
| + RTCMediaStreamStats expected_local_stream( |
| + "RTCMediaStream_LocalStreamLabel", report->timestamp_us()); |
| + expected_local_stream.stream_identifier = "LocalStreamLabel"; |
| + expected_local_stream.track_ids = std::vector<std::string>(); |
| + expected_local_stream.track_ids->push_back( |
| + "RTCMediaStreamTrack_LocalVideoTrackID"); |
| + EXPECT_TRUE(report->Get(expected_local_stream.id())); |
| + EXPECT_EQ(expected_local_stream, |
| + report->Get(expected_local_stream.id())->cast_to< |
| + RTCMediaStreamStats>()); |
| + |
| + RTCMediaStreamStats expected_remote_stream( |
| + "RTCMediaStream_RemoteStreamLabel", report->timestamp_us()); |
| + expected_remote_stream.stream_identifier = "RemoteStreamLabel"; |
| + expected_remote_stream.track_ids = std::vector<std::string>(); |
| + expected_remote_stream.track_ids->push_back( |
| + "RTCMediaStreamTrack_RemoteVideoTrackID"); |
| + EXPECT_TRUE(report->Get(expected_remote_stream.id())); |
| + EXPECT_EQ(expected_remote_stream, |
| + report->Get(expected_remote_stream.id())->cast_to< |
| + RTCMediaStreamStats>()); |
| + |
| + RTCMediaStreamTrackStats expected_local_video_track( |
| + "RTCMediaStreamTrack_LocalVideoTrackID", report->timestamp_us()); |
| + expected_local_video_track.track_identifier = "LocalVideoTrackID"; |
| + expected_local_video_track.remote_source = false; |
| + expected_local_video_track.ended = false; |
| + expected_local_video_track.detached = false; |
| + expected_local_video_track.frame_width = 1234; |
| + expected_local_video_track.frame_height = 4321; |
| + EXPECT_TRUE(report->Get(expected_local_video_track.id())); |
| + EXPECT_EQ(expected_local_video_track, |
| + report->Get(expected_local_video_track.id())->cast_to< |
| + RTCMediaStreamTrackStats>()); |
| + |
| + RTCMediaStreamTrackStats expected_remote_video_track( |
| + "RTCMediaStreamTrack_RemoteVideoTrackID", report->timestamp_us()); |
| + expected_remote_video_track.track_identifier = "RemoteVideoTrackID"; |
|
hta-webrtc
2016/11/08 09:50:22
Would it be clearer to use remote_video_track->id
hbos
2016/11/08 13:43:37
Done, updated all "blah_identifiers" (but not RTCS
|
| + expected_remote_video_track.remote_source = true; |
| + expected_remote_video_track.ended = true; |
| + expected_remote_video_track.detached = false; |
| + expected_remote_video_track.frame_width = 1234; |
| + expected_remote_video_track.frame_height = 4321; |
| + EXPECT_TRUE(report->Get(expected_remote_video_track.id())); |
| + EXPECT_EQ(expected_remote_video_track, |
| + report->Get(expected_remote_video_track.id())->cast_to< |
| + RTCMediaStreamTrackStats>()); |
| +} |
| + |
| TEST_F(RTCStatsCollectorTest, CollectRTCInboundRTPStreamStats_Audio) { |
| MockVoiceMediaChannel* voice_media_channel = new MockVoiceMediaChannel(); |
| cricket::VoiceChannel voice_channel( |