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

Unified Diff: webrtc/api/rtcstatscollector_unittest.cc

Issue 2467873005: RTCMediaStream[Track]Stats added. (Closed)
Patch Set: Addressed some of hta's comments Created 4 years, 1 month 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 side-by-side diff with in-line comments
Download patch
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(

Powered by Google App Engine
This is Rietveld 408576698