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}
diff --git a/pc/statscollector_unittest.cc b/pc/statscollector_unittest.cc
index 74a5b52..4973fd3 100644
--- a/pc/statscollector_unittest.cc
+++ b/pc/statscollector_unittest.cc
@@ -619,6 +619,8 @@
         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 @@
     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 @@
     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 @@
   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 @@
 }
 
 // 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 @@
   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 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 @@
   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 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 @@
   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 @@
 
 // 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 @@
 
 // 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 @@
             new SessionStats(session_stats_));
       }));
 
-  AddOutgoingVideoTrackStats();
-  stats.AddStream(stream_);
+  AddOutgoingVideoTrackStats(&stats);
 
   // Constructs an ssrc stats update.
   cricket::VideoSenderInfo video_sender_info;
@@ -1238,7 +1264,7 @@
   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 @@
 
 // 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 @@
   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 @@
 
 // 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 @@
 
 // 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 @@
   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 @@
 
 // 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 @@
             new SessionStats(session_stats_));
       }));
 
-  AddIncomingVideoTrackStats();
-  stats.AddStream(stream_);
+  AddIncomingVideoTrackStats(&stats);
 
   // Constructs an ssrc stats update.
   cricket::VideoReceiverInfo video_receiver_info;
@@ -1437,7 +1459,7 @@
   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 @@
 
 // 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 @@
   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 @@
   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 @@
   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 @@
   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 @@
 
 // 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 @@
       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 @@
 
 // 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 @@
       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 @@
 
 // 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 @@
       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 @@
 
 // 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 @@
       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 @@
   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 @@
   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 @@
 // 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 @@
       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 @@
 }
 
 // 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 @@
   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 @@
 }
 
 // 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 @@
   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 @@
             ExtractSsrcStatsValue(reports, StatsReport::kStatsValueNameQpSum));
 }
 
+INSTANTIATE_TEST_CASE_P(HasStream, StatsCollectorTrackTest, ::testing::Bool());
+
 }  // namespace webrtc