Pivot old stats generation to iterate senders/receivers

This is the old-style-stats equivalent of CL 34360.

Bug: webrtc:8616
Change-Id: I12573eb305a8f1ecf8134b87ab14e33eaec5ba22
Reviewed-on: https://webrtc-review.googlesource.com/37080
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#21497}
This commit is contained in:
Harald Alvestrand 2018-01-04 15:26:13 +01:00 committed by Commit Bot
parent bb4bbfda1c
commit 75ceef2ab4
4 changed files with 158 additions and 109 deletions

View File

@ -1013,6 +1013,7 @@ rtc::scoped_refptr<RtpSenderInterface> PeerConnection::AddTrack(
if (!sender_or_error.ok()) {
return nullptr;
}
stats_->AddTrack(track);
return sender_or_error.MoveValue();
}

View File

@ -60,15 +60,22 @@ StatsReport* AddTrackReport(StatsCollection* reports,
return report;
}
template <class Track>
void CreateTrackReport(const Track* track,
StatsCollection* reports,
TrackIdMap* track_ids) {
const std::string& track_id = track->id();
StatsReport* report = AddTrackReport(reports, track_id);
RTC_DCHECK(report != nullptr);
(*track_ids)[track_id] = report;
}
template <class TrackVector>
void CreateTrackReports(const TrackVector& tracks,
StatsCollection* reports,
TrackIdMap* track_ids) {
for (const auto& track : tracks) {
const std::string& track_id = track->id();
StatsReport* report = AddTrackReport(reports, track_id);
RTC_DCHECK(report != nullptr);
(*track_ids)[track_id] = report;
CreateTrackReport(track.get(), reports, track_ids);
}
}
@ -454,6 +461,18 @@ void StatsCollector::AddStream(MediaStreamInterface* stream) {
&track_ids_);
}
void StatsCollector::AddTrack(MediaStreamTrackInterface* track) {
if (track->kind() == MediaStreamTrackInterface::kAudioKind) {
CreateTrackReport(static_cast<AudioTrackInterface*>(track), &reports_,
&track_ids_);
} else if (track->kind() == MediaStreamTrackInterface::kVideoKind) {
CreateTrackReport(static_cast<VideoTrackInterface*>(track), &reports_,
&track_ids_);
} else {
RTC_NOTREACHED() << "Illegal track kind";
}
}
void StatsCollector::AddLocalAudioTrack(AudioTrackInterface* audio_track,
uint32_t ssrc) {
RTC_DCHECK(pc_->signaling_thread()->IsCurrent());

View File

@ -49,6 +49,7 @@ class StatsCollector {
// Adds a MediaStream with tracks that can be used as a |selector| in a call
// to GetStats.
void AddStream(MediaStreamInterface* stream);
void AddTrack(MediaStreamTrackInterface* track);
// Adds a local audio track that is used for getting some voice statistics.
void AddLocalAudioTrack(AudioTrackInterface* audio_track, uint32_t ssrc);

View File

@ -619,6 +619,8 @@ class StatsCollectorTest : public testing::Test {
std::vector<rtc::scoped_refptr<RtpSenderInterface>>()));
EXPECT_CALL(pc_, GetReceivers()).WillRepeatedly(Return(
std::vector<rtc::scoped_refptr<RtpReceiverInterface>>()));
// Boring calls
EXPECT_CALL(pc_, GetCallStats()).WillRepeatedly(Return(Call::Stats()));
}
~StatsCollectorTest() {}
@ -638,52 +640,6 @@ class StatsCollectorTest : public testing::Test {
channel->set_transport_name_for_testing(kTransportName);
}
// Adds a outgoing video track with a given SSRC into the stats.
void AddOutgoingVideoTrackStats() {
stream_ = webrtc::MediaStream::Create("streamlabel");
track_ = webrtc::VideoTrack::Create(kLocalTrackId,
webrtc::FakeVideoTrackSource::Create(),
rtc::Thread::Current());
stream_->AddTrack(track_);
EXPECT_CALL(pc_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _))
.WillRepeatedly(DoAll(SetArgPointee<1>(kLocalTrackId), Return(true)));
}
// Adds a incoming video track with a given SSRC into the stats.
void AddIncomingVideoTrackStats() {
stream_ = webrtc::MediaStream::Create("streamlabel");
track_ = webrtc::VideoTrack::Create(kRemoteTrackId,
webrtc::FakeVideoTrackSource::Create(),
rtc::Thread::Current());
stream_->AddTrack(track_);
EXPECT_CALL(pc_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _))
.WillRepeatedly(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true)));
}
// Adds a outgoing audio track with a given SSRC into the stats.
void AddOutgoingAudioTrackStats() {
if (stream_ == NULL)
stream_ = webrtc::MediaStream::Create("streamlabel");
audio_track_ = new rtc::RefCountedObject<FakeAudioTrack>(
kLocalTrackId);
stream_->AddTrack(audio_track_);
EXPECT_CALL(pc_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _))
.WillOnce(DoAll(SetArgPointee<1>(kLocalTrackId), Return(true)));
}
// Adds a incoming audio track with a given SSRC into the stats.
void AddIncomingAudioTrackStats() {
if (stream_ == NULL)
stream_ = webrtc::MediaStream::Create("streamlabel");
audio_track_ = new rtc::RefCountedObject<FakeAudioTrack>(
kRemoteTrackId);
stream_->AddTrack(audio_track_);
EXPECT_CALL(pc_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _))
.WillOnce(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true)));
}
void AddDataChannel(cricket::DataChannelType type,
const std::string& label,
int id) {
@ -769,6 +725,8 @@ class StatsCollectorTest : public testing::Test {
const StatsReport* track_report = FindNthReportByType(
track_reports, StatsReport::kStatsReportTypeSsrc, 1);
EXPECT_TRUE(track_report);
if (!track_report)
return;
EXPECT_EQ(stats->GetTimeNow(), track_report->timestamp());
track_id = ExtractSsrcStatsValue(track_reports,
StatsReport::kStatsValueNameTrackId);
@ -880,10 +838,83 @@ class StatsCollectorTest : public testing::Test {
MockPeerConnection pc_;
FakeDataChannelProvider data_channel_provider_;
SessionStats session_stats_;
std::vector<rtc::scoped_refptr<DataChannel>> data_channels_;
};
class StatsCollectorTrackTest : public StatsCollectorTest,
public ::testing::WithParamInterface<bool> {
public:
// Adds a outgoing video track with a given SSRC into the stats.
// If GetParam() returns true, the track is also inserted into the local
// stream, which is created if necessary.
void AddOutgoingVideoTrackStats(StatsCollectorForTest* stats) {
track_ = webrtc::VideoTrack::Create(kLocalTrackId,
webrtc::FakeVideoTrackSource::Create(),
rtc::Thread::Current());
if (GetParam()) {
if (!stream_)
stream_ = webrtc::MediaStream::Create("streamlabel");
stream_->AddTrack(track_);
stats->AddStream(stream_);
} else {
stats->AddTrack(track_);
}
EXPECT_CALL(pc_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _))
.WillRepeatedly(DoAll(SetArgPointee<1>(kLocalTrackId), Return(true)));
}
// Adds a incoming video track with a given SSRC into the stats.
void AddIncomingVideoTrackStats(StatsCollectorForTest* stats) {
track_ = webrtc::VideoTrack::Create(kRemoteTrackId,
webrtc::FakeVideoTrackSource::Create(),
rtc::Thread::Current());
if (GetParam()) {
stream_ = webrtc::MediaStream::Create("streamlabel");
stream_->AddTrack(track_);
stats->AddStream(stream_);
} else {
stats->AddTrack(track_);
}
EXPECT_CALL(pc_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _))
.WillRepeatedly(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true)));
}
// Adds a outgoing audio track with a given SSRC into the stats,
// and register it into the stats object.
// If GetParam() returns true, the track is also inserted into the local
// stream, which is created if necessary.
void AddOutgoingAudioTrackStats(StatsCollectorForTest* stats) {
audio_track_ = new rtc::RefCountedObject<FakeAudioTrack>(kLocalTrackId);
if (GetParam()) {
if (!stream_)
stream_ = webrtc::MediaStream::Create("streamlabel");
stream_->AddTrack(audio_track_);
stats->AddStream(stream_);
} else {
stats->AddTrack(audio_track_);
}
EXPECT_CALL(pc_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _))
.WillOnce(DoAll(SetArgPointee<1>(kLocalTrackId), Return(true)));
}
// Adds a incoming audio track with a given SSRC into the stats.
void AddIncomingAudioTrackStats(StatsCollectorForTest* stats) {
audio_track_ = new rtc::RefCountedObject<FakeAudioTrack>(kRemoteTrackId);
if (GetParam()) {
if (stream_ == NULL)
stream_ = webrtc::MediaStream::Create("streamlabel");
stream_->AddTrack(audio_track_);
stats->AddStream(stream_);
} else {
stats->AddTrack(audio_track_);
}
EXPECT_CALL(pc_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _))
.WillOnce(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true)));
}
rtc::scoped_refptr<webrtc::MediaStream> stream_;
rtc::scoped_refptr<webrtc::VideoTrack> track_;
rtc::scoped_refptr<FakeAudioTrack> audio_track_;
std::vector<rtc::scoped_refptr<DataChannel>> data_channels_;
};
TEST_F(StatsCollectorTest, FilterOutNegativeDataChannelId) {
@ -948,7 +979,7 @@ TEST_F(StatsCollectorTest, ExtractDataInfo) {
}
// This test verifies that 64-bit counters are passed successfully.
TEST_F(StatsCollectorTest, BytesCounterHandles64Bits) {
TEST_P(StatsCollectorTrackTest, BytesCounterHandles64Bits) {
StatsCollectorForTest stats(&pc_);
EXPECT_CALL(pc_, GetLocalCertificate(_, _)).WillRepeatedly(Return(false));
@ -974,8 +1005,7 @@ TEST_F(StatsCollectorTest, BytesCounterHandles64Bits) {
const int64_t kBytesSent = 12345678901234LL;
const std::string kBytesSentString("12345678901234");
AddOutgoingVideoTrackStats();
stats.AddStream(stream_);
AddOutgoingVideoTrackStats(&stats);
// Construct a stats value to read.
video_sender_info.add_ssrc(1234);
@ -995,7 +1025,7 @@ TEST_F(StatsCollectorTest, BytesCounterHandles64Bits) {
}
// Test that audio BWE information is reported via stats.
TEST_F(StatsCollectorTest, AudioBandwidthEstimationInfoIsReported) {
TEST_P(StatsCollectorTrackTest, AudioBandwidthEstimationInfoIsReported) {
StatsCollectorForTest stats(&pc_);
EXPECT_CALL(pc_, GetLocalCertificate(_, _)).WillRepeatedly(Return(false));
@ -1022,8 +1052,7 @@ TEST_F(StatsCollectorTest, AudioBandwidthEstimationInfoIsReported) {
const int64_t kBytesSent = 12345678901234LL;
const std::string kBytesSentString("12345678901234");
AddOutgoingAudioTrackStats();
stats.AddStream(stream_);
AddOutgoingAudioTrackStats(&stats);
// Construct a stats value to read.
voice_sender_info.add_ssrc(1234);
@ -1060,7 +1089,7 @@ TEST_F(StatsCollectorTest, AudioBandwidthEstimationInfoIsReported) {
}
// Test that video BWE information is reported via stats.
TEST_F(StatsCollectorTest, VideoBandwidthEstimationInfoIsReported) {
TEST_P(StatsCollectorTrackTest, VideoBandwidthEstimationInfoIsReported) {
StatsCollectorForTest stats(&pc_);
EXPECT_CALL(pc_, GetLocalCertificate(_, _)).WillRepeatedly(Return(false));
@ -1087,8 +1116,7 @@ TEST_F(StatsCollectorTest, VideoBandwidthEstimationInfoIsReported) {
const int64_t kBytesSent = 12345678901234LL;
const std::string kBytesSentString("12345678901234");
AddOutgoingVideoTrackStats();
stats.AddStream(stream_);
AddOutgoingVideoTrackStats(&stats);
// Construct a stats value to read.
video_sender_info.add_ssrc(1234);
@ -1156,20 +1184,19 @@ TEST_F(StatsCollectorTest, OnlyOneSessionObjectExists) {
// This test verifies that the empty track report exists in the returned stats
// without calling StatsCollector::UpdateStats.
TEST_F(StatsCollectorTest, TrackObjectExistsWithoutUpdateStats) {
TEST_P(StatsCollectorTrackTest, TrackObjectExistsWithoutUpdateStats) {
StatsCollectorForTest stats(&pc_);
auto* media_channel = new MockVideoMediaChannel();
cricket::VideoChannel video_channel(
worker_thread_, network_thread_, nullptr, rtc::WrapUnique(media_channel),
"video", kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
AddOutgoingVideoTrackStats();
stats.AddStream(stream_);
AddOutgoingVideoTrackStats(&stats);
// Verfies the existence of the track report.
StatsReports reports;
stats.GetStats(NULL, &reports);
EXPECT_EQ((size_t)1, reports.size());
ASSERT_EQ((size_t)1, reports.size());
EXPECT_EQ(StatsReport::kStatsReportTypeTrack, reports[0]->type());
EXPECT_EQ(0, reports[0]->timestamp());
@ -1182,7 +1209,7 @@ TEST_F(StatsCollectorTest, TrackObjectExistsWithoutUpdateStats) {
// This test verifies that the empty track report exists in the returned stats
// when StatsCollector::UpdateStats is called with ssrc stats.
TEST_F(StatsCollectorTest, TrackAndSsrcObjectExistAfterUpdateSsrcStats) {
TEST_P(StatsCollectorTrackTest, TrackAndSsrcObjectExistAfterUpdateSsrcStats) {
StatsCollectorForTest stats(&pc_);
EXPECT_CALL(pc_, GetLocalCertificate(_, _)).WillRepeatedly(Return(false));
@ -1201,8 +1228,7 @@ TEST_F(StatsCollectorTest, TrackAndSsrcObjectExistAfterUpdateSsrcStats) {
new SessionStats(session_stats_));
}));
AddOutgoingVideoTrackStats();
stats.AddStream(stream_);
AddOutgoingVideoTrackStats(&stats);
// Constructs an ssrc stats update.
cricket::VideoSenderInfo video_sender_info;
@ -1238,7 +1264,7 @@ TEST_F(StatsCollectorTest, TrackAndSsrcObjectExistAfterUpdateSsrcStats) {
EXPECT_LE((size_t)3, reports.size());
track_report = FindNthReportByType(
reports, StatsReport::kStatsReportTypeTrack, 1);
EXPECT_TRUE(track_report);
ASSERT_TRUE(track_report);
EXPECT_EQ(stats.GetTimeNow(), track_report->timestamp());
std::string ssrc_id = ExtractSsrcStatsValue(
@ -1256,7 +1282,7 @@ TEST_F(StatsCollectorTest, TrackAndSsrcObjectExistAfterUpdateSsrcStats) {
// This test verifies that an SSRC object has the identifier of a Transport
// stats object, and that this transport stats object exists in stats.
TEST_F(StatsCollectorTest, TransportObjectLinkedFromSsrcObject) {
TEST_P(StatsCollectorTrackTest, TransportObjectLinkedFromSsrcObject) {
StatsCollectorForTest stats(&pc_);
EXPECT_CALL(pc_, GetLocalCertificate(_, _)).WillRepeatedly(Return(false));
@ -1267,8 +1293,7 @@ TEST_F(StatsCollectorTest, TransportObjectLinkedFromSsrcObject) {
cricket::VideoChannel video_channel(
worker_thread_, network_thread_, nullptr, rtc::WrapUnique(media_channel),
"vcname", kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
AddOutgoingVideoTrackStats();
stats.AddStream(stream_);
AddOutgoingVideoTrackStats(&stats);
// Constructs an ssrc stats update.
cricket::VideoSenderInfo video_sender_info;
@ -1319,15 +1344,14 @@ TEST_F(StatsCollectorTest, TransportObjectLinkedFromSsrcObject) {
// This test verifies that a remote stats object will not be created for
// an outgoing SSRC where remote stats are not returned.
TEST_F(StatsCollectorTest, RemoteSsrcInfoIsAbsent) {
TEST_P(StatsCollectorTrackTest, RemoteSsrcInfoIsAbsent) {
StatsCollectorForTest stats(&pc_);
auto* media_channel = new MockVideoMediaChannel();
cricket::VideoChannel video_channel(
worker_thread_, network_thread_, nullptr, rtc::WrapUnique(media_channel),
"vcname", kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
AddOutgoingVideoTrackStats();
stats.AddStream(stream_);
AddOutgoingVideoTrackStats(&stats);
stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
StatsReports reports;
@ -1339,7 +1363,7 @@ TEST_F(StatsCollectorTest, RemoteSsrcInfoIsAbsent) {
// This test verifies that a remote stats object will be created for
// an outgoing SSRC where stats are returned.
TEST_F(StatsCollectorTest, RemoteSsrcInfoIsPresent) {
TEST_P(StatsCollectorTrackTest, RemoteSsrcInfoIsPresent) {
StatsCollectorForTest stats(&pc_);
EXPECT_CALL(pc_, GetLocalCertificate(_, _)).WillRepeatedly(Return(false));
@ -1351,8 +1375,7 @@ TEST_F(StatsCollectorTest, RemoteSsrcInfoIsPresent) {
cricket::VideoChannel video_channel(
worker_thread_, network_thread_, nullptr, rtc::WrapUnique(media_channel),
"vcname", kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
AddOutgoingVideoTrackStats();
stats.AddStream(stream_);
AddOutgoingVideoTrackStats(&stats);
// Instruct the session to return stats containing the transport channel.
InitSessionStats(&video_channel);
@ -1391,7 +1414,7 @@ TEST_F(StatsCollectorTest, RemoteSsrcInfoIsPresent) {
// This test verifies that the empty track report exists in the returned stats
// when StatsCollector::UpdateStats is called with ssrc stats.
TEST_F(StatsCollectorTest, ReportsFromRemoteTrack) {
TEST_P(StatsCollectorTrackTest, ReportsFromRemoteTrack) {
StatsCollectorForTest stats(&pc_);
EXPECT_CALL(pc_, GetLocalCertificate(_, _)).WillRepeatedly(Return(false));
@ -1410,8 +1433,7 @@ TEST_F(StatsCollectorTest, ReportsFromRemoteTrack) {
new SessionStats(session_stats_));
}));
AddIncomingVideoTrackStats();
stats.AddStream(stream_);
AddIncomingVideoTrackStats(&stats);
// Constructs an ssrc stats update.
cricket::VideoReceiverInfo video_receiver_info;
@ -1437,7 +1459,7 @@ TEST_F(StatsCollectorTest, ReportsFromRemoteTrack) {
EXPECT_LE(static_cast<size_t>(3), reports.size());
const StatsReport* track_report = FindNthReportByType(
reports, StatsReport::kStatsReportTypeTrack, 1);
EXPECT_TRUE(track_report);
ASSERT_TRUE(track_report);
EXPECT_EQ(stats.GetTimeNow(), track_report->timestamp());
std::string ssrc_id = ExtractSsrcStatsValue(
@ -1707,9 +1729,12 @@ TEST_F(StatsCollectorTest, UnsupportedDigestIgnored) {
// This test verifies that the audio/video related stats which are -1 initially
// will be filtered out.
TEST_F(StatsCollectorTest, FilterOutNegativeInitialValues) {
TEST_P(StatsCollectorTrackTest, FilterOutNegativeInitialValues) {
StatsCollectorForTest stats(&pc_);
// This test uses streams, but only works for the stream case.
if (!GetParam())
return;
EXPECT_CALL(pc_, GetLocalCertificate(_, _)).WillRepeatedly(Return(false));
EXPECT_CALL(pc_, GetRemoteSSLCertificate_ReturnsRawPointer(_))
.WillRepeatedly(Return(nullptr));
@ -1729,7 +1754,9 @@ TEST_F(StatsCollectorTest, FilterOutNegativeInitialValues) {
stream_->AddTrack(local_track);
EXPECT_CALL(pc_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _))
.WillOnce(DoAll(SetArgPointee<1>(kLocalTrackId), Return(true)));
stats.AddStream(stream_);
if (GetParam()) {
stats.AddStream(stream_);
}
stats.AddLocalAudioTrack(local_track.get(), kSsrcOfTrack);
// Create a remote stream with a remote audio track and adds it to the stats.
@ -1740,7 +1767,9 @@ TEST_F(StatsCollectorTest, FilterOutNegativeInitialValues) {
EXPECT_CALL(pc_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _))
.WillOnce(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true)));
remote_stream->AddTrack(remote_track);
stats.AddStream(remote_stream);
if (GetParam()) {
stats.AddStream(remote_stream);
}
InitSessionStats(&voice_channel);
EXPECT_CALL(pc_, GetSessionStats(_))
@ -1784,7 +1813,7 @@ TEST_F(StatsCollectorTest, FilterOutNegativeInitialValues) {
stats.GetStats(local_track.get(), &reports);
const StatsReport* report =
FindNthReportByType(reports, StatsReport::kStatsReportTypeSsrc, 1);
EXPECT_TRUE(report);
ASSERT_TRUE(report);
// The -1 will not be added to the stats report.
std::string value_in_report;
EXPECT_FALSE(
@ -1802,7 +1831,7 @@ TEST_F(StatsCollectorTest, FilterOutNegativeInitialValues) {
reports.clear();
stats.GetStats(remote_track.get(), &reports);
report = FindNthReportByType(reports, StatsReport::kStatsReportTypeSsrc, 1);
EXPECT_TRUE(report);
ASSERT_TRUE(report);
EXPECT_FALSE(GetValue(report,
StatsReport::kStatsValueNameCaptureStartNtpTimeMs,
&value_in_report));
@ -1812,7 +1841,7 @@ TEST_F(StatsCollectorTest, FilterOutNegativeInitialValues) {
// This test verifies that a local stats object can get statistics via
// AudioTrackInterface::GetStats() method.
TEST_F(StatsCollectorTest, GetStatsFromLocalAudioTrack) {
TEST_P(StatsCollectorTrackTest, GetStatsFromLocalAudioTrack) {
StatsCollectorForTest stats(&pc_);
EXPECT_CALL(pc_, GetLocalCertificate(_, _)).WillRepeatedly(Return(false));
@ -1824,8 +1853,7 @@ TEST_F(StatsCollectorTest, GetStatsFromLocalAudioTrack) {
worker_thread_, network_thread_, nullptr, media_engine_,
rtc::WrapUnique(media_channel), "vcname", kDefaultRtcpMuxRequired,
kDefaultSrtpRequired);
AddOutgoingAudioTrackStats();
stats.AddStream(stream_);
AddOutgoingAudioTrackStats(&stats);
stats.AddLocalAudioTrack(audio_track_, kSsrcOfTrack);
cricket::VoiceSenderInfo voice_sender_info;
@ -1846,7 +1874,7 @@ TEST_F(StatsCollectorTest, GetStatsFromLocalAudioTrack) {
// This test verifies that audio receive streams populate stats reports
// correctly.
TEST_F(StatsCollectorTest, GetStatsFromRemoteStream) {
TEST_P(StatsCollectorTrackTest, GetStatsFromRemoteStream) {
StatsCollectorForTest stats(&pc_);
EXPECT_CALL(pc_, GetLocalCertificate(_, _)).WillRepeatedly(Return(false));
@ -1858,8 +1886,7 @@ TEST_F(StatsCollectorTest, GetStatsFromRemoteStream) {
worker_thread_, network_thread_, nullptr, media_engine_,
rtc::WrapUnique(media_channel), "vcname", kDefaultRtcpMuxRequired,
kDefaultSrtpRequired);
AddIncomingAudioTrackStats();
stats.AddStream(stream_);
AddIncomingAudioTrackStats(&stats);
cricket::VoiceReceiverInfo voice_receiver_info;
InitVoiceReceiverInfo(&voice_receiver_info);
@ -1874,7 +1901,7 @@ TEST_F(StatsCollectorTest, GetStatsFromRemoteStream) {
// This test verifies that a local stats object won't update its statistics
// after a RemoveLocalAudioTrack() call.
TEST_F(StatsCollectorTest, GetStatsAfterRemoveAudioStream) {
TEST_P(StatsCollectorTrackTest, GetStatsAfterRemoveAudioStream) {
StatsCollectorForTest stats(&pc_);
EXPECT_CALL(pc_, GetLocalCertificate(_, _)).WillRepeatedly(Return(false));
@ -1886,8 +1913,7 @@ TEST_F(StatsCollectorTest, GetStatsAfterRemoveAudioStream) {
worker_thread_, network_thread_, nullptr, media_engine_,
rtc::WrapUnique(media_channel), "vcname", kDefaultRtcpMuxRequired,
kDefaultSrtpRequired);
AddOutgoingAudioTrackStats();
stats.AddStream(stream_);
AddOutgoingAudioTrackStats(&stats);
stats.AddLocalAudioTrack(audio_track_.get(), kSsrcOfTrack);
InitSessionStats(&voice_channel);
@ -1935,7 +1961,7 @@ TEST_F(StatsCollectorTest, GetStatsAfterRemoveAudioStream) {
// This test verifies that when ongoing and incoming audio tracks are using
// the same ssrc, they populate stats reports correctly.
TEST_F(StatsCollectorTest, LocalAndRemoteTracksWithSameSsrc) {
TEST_P(StatsCollectorTrackTest, LocalAndRemoteTracksWithSameSsrc) {
StatsCollectorForTest stats(&pc_);
EXPECT_CALL(pc_, GetLocalCertificate(_, _)).WillRepeatedly(Return(false));
@ -1949,8 +1975,7 @@ TEST_F(StatsCollectorTest, LocalAndRemoteTracksWithSameSsrc) {
kDefaultSrtpRequired);
// Create a local stream with a local audio track and adds it to the stats.
AddOutgoingAudioTrackStats();
stats.AddStream(stream_);
AddOutgoingAudioTrackStats(&stats);
stats.AddLocalAudioTrack(audio_track_.get(), kSsrcOfTrack);
// Create a remote stream with a remote audio track and adds it to the stats.
@ -2000,7 +2025,7 @@ TEST_F(StatsCollectorTest, LocalAndRemoteTracksWithSameSsrc) {
stats.GetStats(audio_track_.get(), &reports);
const StatsReport* track_report = FindNthReportByType(
reports, StatsReport::kStatsReportTypeSsrc, 1);
EXPECT_TRUE(track_report);
ASSERT_TRUE(track_report);
EXPECT_EQ(stats.GetTimeNow(), track_report->timestamp());
std::string track_id = ExtractSsrcStatsValue(
reports, StatsReport::kStatsValueNameTrackId);
@ -2012,7 +2037,7 @@ TEST_F(StatsCollectorTest, LocalAndRemoteTracksWithSameSsrc) {
stats.GetStats(remote_track.get(), &reports);
track_report = FindNthReportByType(reports,
StatsReport::kStatsReportTypeSsrc, 1);
EXPECT_TRUE(track_report);
ASSERT_TRUE(track_report);
EXPECT_EQ(stats.GetTimeNow(), track_report->timestamp());
track_id = ExtractSsrcStatsValue(reports,
StatsReport::kStatsValueNameTrackId);
@ -2024,9 +2049,13 @@ TEST_F(StatsCollectorTest, LocalAndRemoteTracksWithSameSsrc) {
// ssrc at different times, they populate stats reports correctly.
// TODO(xians): Figure out if it is possible to encapsulate the setup and
// avoid duplication of code in test cases.
TEST_F(StatsCollectorTest, TwoLocalTracksWithSameSsrc) {
TEST_P(StatsCollectorTrackTest, TwoLocalTracksWithSameSsrc) {
StatsCollectorForTest stats(&pc_);
// This test only makes sense when we're using streams.
if (!GetParam())
return;
EXPECT_CALL(pc_, GetLocalCertificate(_, _)).WillRepeatedly(Return(false));
EXPECT_CALL(pc_, GetRemoteSSLCertificate_ReturnsRawPointer(_))
.WillRepeatedly(Return(nullptr));
@ -2038,8 +2067,7 @@ TEST_F(StatsCollectorTest, TwoLocalTracksWithSameSsrc) {
kDefaultSrtpRequired);
// Create a local stream with a local audio track and adds it to the stats.
AddOutgoingAudioTrackStats();
stats.AddStream(stream_);
AddOutgoingAudioTrackStats(&stats);
stats.AddLocalAudioTrack(audio_track_, kSsrcOfTrack);
cricket::VoiceSenderInfo voice_sender_info;
@ -2076,7 +2104,7 @@ TEST_F(StatsCollectorTest, TwoLocalTracksWithSameSsrc) {
}
// This test verifies that stats are correctly set in video send ssrc stats.
TEST_F(StatsCollectorTest, VerifyVideoSendSsrcStats) {
TEST_P(StatsCollectorTrackTest, VerifyVideoSendSsrcStats) {
StatsCollectorForTest stats(&pc_);
EXPECT_CALL(pc_, GetLocalCertificate(_, _)).WillRepeatedly(Return(false));
@ -2099,8 +2127,7 @@ TEST_F(StatsCollectorTest, VerifyVideoSendSsrcStats) {
cricket::VideoSenderInfo video_sender_info;
cricket::VideoMediaInfo stats_read;
AddOutgoingVideoTrackStats();
stats.AddStream(stream_);
AddOutgoingVideoTrackStats(&stats);
// Construct a stats value to read.
video_sender_info.add_ssrc(1234);
@ -2122,7 +2149,7 @@ TEST_F(StatsCollectorTest, VerifyVideoSendSsrcStats) {
}
// This test verifies that stats are correctly set in video receive ssrc stats.
TEST_F(StatsCollectorTest, VerifyVideoReceiveSsrcStats) {
TEST_P(StatsCollectorTrackTest, VerifyVideoReceiveSsrcStats) {
StatsCollectorForTest stats(&pc_);
EXPECT_CALL(pc_, GetLocalCertificate(_, _)).WillRepeatedly(Return(false));
@ -2145,8 +2172,7 @@ TEST_F(StatsCollectorTest, VerifyVideoReceiveSsrcStats) {
cricket::VideoReceiverInfo video_receiver_info;
cricket::VideoMediaInfo stats_read;
AddIncomingVideoTrackStats();
stats.AddStream(stream_);
AddIncomingVideoTrackStats(&stats);
// Construct a stats value to read.
video_receiver_info.add_ssrc(1234);
@ -2167,4 +2193,6 @@ TEST_F(StatsCollectorTest, VerifyVideoReceiveSsrcStats) {
ExtractSsrcStatsValue(reports, StatsReport::kStatsValueNameQpSum));
}
INSTANTIATE_TEST_CASE_P(HasStream, StatsCollectorTrackTest, ::testing::Bool());
} // namespace webrtc