diff --git a/pc/peerconnection.cc b/pc/peerconnection.cc index 1d96a7f1af..91cc2ff1a6 100644 --- a/pc/peerconnection.cc +++ b/pc/peerconnection.cc @@ -1013,6 +1013,7 @@ rtc::scoped_refptr PeerConnection::AddTrack( if (!sender_or_error.ok()) { return nullptr; } + stats_->AddTrack(track); return sender_or_error.MoveValue(); } diff --git a/pc/statscollector.cc b/pc/statscollector.cc index 16a012b50c..a8d187ee16 100644 --- a/pc/statscollector.cc +++ b/pc/statscollector.cc @@ -60,15 +60,22 @@ StatsReport* AddTrackReport(StatsCollection* reports, return report; } +template +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 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(track), &reports_, + &track_ids_); + } else if (track->kind() == MediaStreamTrackInterface::kVideoKind) { + CreateTrackReport(static_cast(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()); diff --git a/pc/statscollector.h b/pc/statscollector.h index bfa55b22c6..1a3abfc9aa 100644 --- a/pc/statscollector.h +++ b/pc/statscollector.h @@ -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); diff --git a/pc/statscollector_unittest.cc b/pc/statscollector_unittest.cc index 74a5b52745..4973fd3f73 100644 --- a/pc/statscollector_unittest.cc +++ b/pc/statscollector_unittest.cc @@ -619,6 +619,8 @@ class StatsCollectorTest : public testing::Test { std::vector>())); EXPECT_CALL(pc_, GetReceivers()).WillRepeatedly(Return( std::vector>())); + // 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( - 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( - 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> data_channels_; +}; + +class StatsCollectorTrackTest : public StatsCollectorTest, + public ::testing::WithParamInterface { + 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(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(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 stream_; rtc::scoped_refptr track_; rtc::scoped_refptr audio_track_; - std::vector> 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(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