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:
parent
bb4bbfda1c
commit
75ceef2ab4
@ -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();
|
||||
}
|
||||
|
||||
|
||||
@ -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());
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user