| Index: webrtc/stats/rtcstatscollector_unittest.cc
|
| diff --git a/webrtc/stats/rtcstatscollector_unittest.cc b/webrtc/stats/rtcstatscollector_unittest.cc
|
| deleted file mode 100644
|
| index 1ead77b28d7c94326ddefbcffc6be7b84e07952b..0000000000000000000000000000000000000000
|
| --- a/webrtc/stats/rtcstatscollector_unittest.cc
|
| +++ /dev/null
|
| @@ -1,383 +0,0 @@
|
| -/*
|
| - * Copyright 2016 The WebRTC project authors. All Rights Reserved.
|
| - *
|
| - * Use of this source code is governed by a BSD-style license
|
| - * that can be found in the LICENSE file in the root of the source
|
| - * tree. An additional intellectual property rights grant can be found
|
| - * in the file PATENTS. All contributing project authors may
|
| - * be found in the AUTHORS file in the root of the source tree.
|
| - */
|
| -
|
| -#include "webrtc/stats/rtcstatscollector.h"
|
| -
|
| -#include <memory>
|
| -#include <string>
|
| -#include <vector>
|
| -
|
| -#include "webrtc/api/jsepsessiondescription.h"
|
| -#include "webrtc/api/rtcstats_objects.h"
|
| -#include "webrtc/api/rtcstatsreport.h"
|
| -#include "webrtc/api/test/mock_datachannel.h"
|
| -#include "webrtc/api/test/mock_peerconnection.h"
|
| -#include "webrtc/api/test/mock_webrtcsession.h"
|
| -#include "webrtc/base/checks.h"
|
| -#include "webrtc/base/fakeclock.h"
|
| -#include "webrtc/base/gunit.h"
|
| -#include "webrtc/base/logging.h"
|
| -#include "webrtc/base/thread_checker.h"
|
| -#include "webrtc/base/timedelta.h"
|
| -#include "webrtc/base/timeutils.h"
|
| -#include "webrtc/base/timing.h"
|
| -#include "webrtc/media/base/fakemediaengine.h"
|
| -
|
| -using testing::Return;
|
| -using testing::ReturnRef;
|
| -
|
| -namespace webrtc {
|
| -
|
| -namespace {
|
| -
|
| -const int64_t kGetStatsReportTimeoutMs = 1000;
|
| -
|
| -class RTCStatsCollectorTestHelper : public SetSessionDescriptionObserver {
|
| - public:
|
| - RTCStatsCollectorTestHelper()
|
| - : worker_thread_(rtc::Thread::Current()),
|
| - network_thread_(rtc::Thread::Current()),
|
| - channel_manager_(new cricket::ChannelManager(
|
| - new cricket::FakeMediaEngine(),
|
| - worker_thread_,
|
| - network_thread_)),
|
| - media_controller_(
|
| - MediaControllerInterface::Create(cricket::MediaConfig(),
|
| - worker_thread_,
|
| - channel_manager_.get())),
|
| - session_(media_controller_.get()),
|
| - pc_() {
|
| - EXPECT_CALL(pc_, session()).WillRepeatedly(Return(&session_));
|
| - EXPECT_CALL(pc_, sctp_data_channels()).WillRepeatedly(
|
| - ReturnRef(data_channels_));
|
| - }
|
| -
|
| - MockWebRtcSession& session() { return session_; }
|
| - MockPeerConnection& pc() { return pc_; }
|
| - std::vector<rtc::scoped_refptr<DataChannel>>& data_channels() {
|
| - return data_channels_;
|
| - }
|
| -
|
| - // SetSessionDescriptionObserver overrides.
|
| - void OnSuccess() override {}
|
| - void OnFailure(const std::string& error) override {
|
| - RTC_NOTREACHED() << error;
|
| - }
|
| -
|
| - private:
|
| - rtc::Thread* const worker_thread_;
|
| - rtc::Thread* const network_thread_;
|
| - std::unique_ptr<cricket::ChannelManager> channel_manager_;
|
| - std::unique_ptr<webrtc::MediaControllerInterface> media_controller_;
|
| - MockWebRtcSession session_;
|
| - MockPeerConnection pc_;
|
| -
|
| - std::vector<rtc::scoped_refptr<DataChannel>> data_channels_;
|
| -};
|
| -
|
| -class RTCTestStats : public RTCStats {
|
| - public:
|
| - RTCTestStats(const std::string& id, int64_t timestamp_us)
|
| - : RTCStats(id, timestamp_us),
|
| - dummy_stat("dummyStat") {}
|
| -
|
| - WEBRTC_RTCSTATS_IMPL(RTCStats, RTCTestStats,
|
| - &dummy_stat);
|
| -
|
| - RTCStatsMember<int32_t> dummy_stat;
|
| -};
|
| -
|
| -const char RTCTestStats::kType[] = "test-stats";
|
| -
|
| -// Overrides the stats collection to verify thread usage and that the resulting
|
| -// partial reports are merged.
|
| -class FakeRTCStatsCollector : public RTCStatsCollector,
|
| - public RTCStatsCollectorCallback {
|
| - public:
|
| - static rtc::scoped_refptr<FakeRTCStatsCollector> Create(
|
| - PeerConnection* pc,
|
| - int64_t cache_lifetime_us) {
|
| - return rtc::scoped_refptr<FakeRTCStatsCollector>(
|
| - new rtc::RefCountedObject<FakeRTCStatsCollector>(
|
| - pc, cache_lifetime_us));
|
| - }
|
| -
|
| - // RTCStatsCollectorCallback implementation.
|
| - void OnStatsDelivered(
|
| - const rtc::scoped_refptr<const RTCStatsReport>& report) override {
|
| - EXPECT_TRUE(signaling_thread_->IsCurrent());
|
| - rtc::CritScope cs(&lock_);
|
| - delivered_report_ = report;
|
| - }
|
| -
|
| - void VerifyThreadUsageAndResultsMerging() {
|
| - GetStatsReport(rtc::scoped_refptr<RTCStatsCollectorCallback>(this));
|
| - EXPECT_TRUE_WAIT(HasVerifiedResults(), kGetStatsReportTimeoutMs);
|
| - }
|
| -
|
| - bool HasVerifiedResults() {
|
| - EXPECT_TRUE(signaling_thread_->IsCurrent());
|
| - rtc::CritScope cs(&lock_);
|
| - if (!delivered_report_)
|
| - return false;
|
| - EXPECT_EQ(produced_on_signaling_thread_, 1);
|
| - EXPECT_EQ(produced_on_worker_thread_, 1);
|
| - EXPECT_EQ(produced_on_network_thread_, 1);
|
| -
|
| - EXPECT_TRUE(delivered_report_->Get("SignalingThreadStats"));
|
| - EXPECT_TRUE(delivered_report_->Get("WorkerThreadStats"));
|
| - EXPECT_TRUE(delivered_report_->Get("NetworkThreadStats"));
|
| -
|
| - produced_on_signaling_thread_ = 0;
|
| - produced_on_worker_thread_ = 0;
|
| - produced_on_network_thread_ = 0;
|
| - delivered_report_ = nullptr;
|
| - return true;
|
| - }
|
| -
|
| - protected:
|
| - FakeRTCStatsCollector(
|
| - PeerConnection* pc,
|
| - int64_t cache_lifetime)
|
| - : RTCStatsCollector(pc, cache_lifetime),
|
| - signaling_thread_(pc->session()->signaling_thread()),
|
| - worker_thread_(pc->session()->worker_thread()),
|
| - network_thread_(pc->session()->network_thread()) {
|
| - }
|
| -
|
| - void ProducePartialResultsOnSignalingThread(int64_t timestamp_us) override {
|
| - EXPECT_TRUE(signaling_thread_->IsCurrent());
|
| - {
|
| - rtc::CritScope cs(&lock_);
|
| - EXPECT_FALSE(delivered_report_);
|
| - ++produced_on_signaling_thread_;
|
| - }
|
| -
|
| - rtc::scoped_refptr<RTCStatsReport> signaling_report =
|
| - RTCStatsReport::Create();
|
| - signaling_report->AddStats(std::unique_ptr<const RTCStats>(
|
| - new RTCTestStats("SignalingThreadStats", timestamp_us)));
|
| - AddPartialResults(signaling_report);
|
| - }
|
| - void ProducePartialResultsOnWorkerThread(int64_t timestamp_us) override {
|
| - EXPECT_TRUE(worker_thread_->IsCurrent());
|
| - {
|
| - rtc::CritScope cs(&lock_);
|
| - EXPECT_FALSE(delivered_report_);
|
| - ++produced_on_worker_thread_;
|
| - }
|
| -
|
| - rtc::scoped_refptr<RTCStatsReport> worker_report = RTCStatsReport::Create();
|
| - worker_report->AddStats(std::unique_ptr<const RTCStats>(
|
| - new RTCTestStats("WorkerThreadStats", timestamp_us)));
|
| - AddPartialResults(worker_report);
|
| - }
|
| - void ProducePartialResultsOnNetworkThread(int64_t timestamp_us) override {
|
| - EXPECT_TRUE(network_thread_->IsCurrent());
|
| - {
|
| - rtc::CritScope cs(&lock_);
|
| - EXPECT_FALSE(delivered_report_);
|
| - ++produced_on_network_thread_;
|
| - }
|
| -
|
| - rtc::scoped_refptr<RTCStatsReport> network_report =
|
| - RTCStatsReport::Create();
|
| - network_report->AddStats(std::unique_ptr<const RTCStats>(
|
| - new RTCTestStats("NetworkThreadStats", timestamp_us)));
|
| - AddPartialResults(network_report);
|
| - }
|
| -
|
| - private:
|
| - rtc::Thread* const signaling_thread_;
|
| - rtc::Thread* const worker_thread_;
|
| - rtc::Thread* const network_thread_;
|
| -
|
| - rtc::CriticalSection lock_;
|
| - rtc::scoped_refptr<const RTCStatsReport> delivered_report_;
|
| - int produced_on_signaling_thread_ = 0;
|
| - int produced_on_worker_thread_ = 0;
|
| - int produced_on_network_thread_ = 0;
|
| -};
|
| -
|
| -class StatsCallback : public RTCStatsCollectorCallback {
|
| - public:
|
| - static rtc::scoped_refptr<StatsCallback> Create(
|
| - rtc::scoped_refptr<const RTCStatsReport>* report_ptr = nullptr) {
|
| - return rtc::scoped_refptr<StatsCallback>(
|
| - new rtc::RefCountedObject<StatsCallback>(report_ptr));
|
| - }
|
| -
|
| - void OnStatsDelivered(
|
| - const rtc::scoped_refptr<const RTCStatsReport>& report) override {
|
| - EXPECT_TRUE(thread_checker_.CalledOnValidThread());
|
| - report_ = report;
|
| - if (report_ptr_)
|
| - *report_ptr_ = report_;
|
| - }
|
| -
|
| - rtc::scoped_refptr<const RTCStatsReport> report() const {
|
| - EXPECT_TRUE(thread_checker_.CalledOnValidThread());
|
| - return report_;
|
| - }
|
| -
|
| - protected:
|
| - explicit StatsCallback(rtc::scoped_refptr<const RTCStatsReport>* report_ptr)
|
| - : report_ptr_(report_ptr) {}
|
| -
|
| - private:
|
| - rtc::ThreadChecker thread_checker_;
|
| - rtc::scoped_refptr<const RTCStatsReport> report_;
|
| - rtc::scoped_refptr<const RTCStatsReport>* report_ptr_;
|
| -};
|
| -
|
| -class RTCStatsCollectorTest : public testing::Test {
|
| - public:
|
| - RTCStatsCollectorTest()
|
| - : test_(new rtc::RefCountedObject<RTCStatsCollectorTestHelper>()),
|
| - collector_(RTCStatsCollector::Create(
|
| - &test_->pc(), 50 * rtc::kNumMicrosecsPerMillisec)) {
|
| - }
|
| -
|
| - rtc::scoped_refptr<const RTCStatsReport> GetStatsReport() {
|
| - rtc::scoped_refptr<StatsCallback> callback = StatsCallback::Create();
|
| - collector_->GetStatsReport(callback);
|
| - EXPECT_TRUE_WAIT(callback->report(), kGetStatsReportTimeoutMs);
|
| - return callback->report();
|
| - }
|
| -
|
| - protected:
|
| - rtc::scoped_refptr<RTCStatsCollectorTestHelper> test_;
|
| - rtc::scoped_refptr<RTCStatsCollector> collector_;
|
| -};
|
| -
|
| -TEST_F(RTCStatsCollectorTest, SingleCallback) {
|
| - rtc::scoped_refptr<const RTCStatsReport> result;
|
| - collector_->GetStatsReport(StatsCallback::Create(&result));
|
| - EXPECT_TRUE_WAIT(result, kGetStatsReportTimeoutMs);
|
| -}
|
| -
|
| -TEST_F(RTCStatsCollectorTest, MultipleCallbacks) {
|
| - rtc::scoped_refptr<const RTCStatsReport> a;
|
| - rtc::scoped_refptr<const RTCStatsReport> b;
|
| - rtc::scoped_refptr<const RTCStatsReport> c;
|
| - collector_->GetStatsReport(StatsCallback::Create(&a));
|
| - collector_->GetStatsReport(StatsCallback::Create(&b));
|
| - collector_->GetStatsReport(StatsCallback::Create(&c));
|
| - EXPECT_TRUE_WAIT(a, kGetStatsReportTimeoutMs);
|
| - EXPECT_TRUE_WAIT(b, kGetStatsReportTimeoutMs);
|
| - EXPECT_TRUE_WAIT(c, kGetStatsReportTimeoutMs);
|
| - EXPECT_EQ(a.get(), b.get());
|
| - EXPECT_EQ(b.get(), c.get());
|
| -}
|
| -
|
| -TEST_F(RTCStatsCollectorTest, CachedStatsReports) {
|
| - rtc::ScopedFakeClock fake_clock;
|
| - // Caching should ensure |a| and |b| are the same report.
|
| - rtc::scoped_refptr<const RTCStatsReport> a = GetStatsReport();
|
| - rtc::scoped_refptr<const RTCStatsReport> b = GetStatsReport();
|
| - EXPECT_EQ(a.get(), b.get());
|
| - // Invalidate cache by clearing it.
|
| - collector_->ClearCachedStatsReport();
|
| - rtc::scoped_refptr<const RTCStatsReport> c = GetStatsReport();
|
| - EXPECT_NE(b.get(), c.get());
|
| - // Invalidate cache by advancing time.
|
| - fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(51));
|
| - rtc::scoped_refptr<const RTCStatsReport> d = GetStatsReport();
|
| - EXPECT_TRUE(d);
|
| - EXPECT_NE(c.get(), d.get());
|
| -}
|
| -
|
| -TEST_F(RTCStatsCollectorTest, MultipleCallbacksWithInvalidatedCacheInBetween) {
|
| - rtc::ScopedFakeClock fake_clock;
|
| - rtc::scoped_refptr<const RTCStatsReport> a;
|
| - rtc::scoped_refptr<const RTCStatsReport> b;
|
| - rtc::scoped_refptr<const RTCStatsReport> c;
|
| - collector_->GetStatsReport(StatsCallback::Create(&a));
|
| - collector_->GetStatsReport(StatsCallback::Create(&b));
|
| - // Cache is invalidated after 50 ms.
|
| - fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(51));
|
| - collector_->GetStatsReport(StatsCallback::Create(&c));
|
| - EXPECT_TRUE_WAIT(a, kGetStatsReportTimeoutMs);
|
| - EXPECT_TRUE_WAIT(b, kGetStatsReportTimeoutMs);
|
| - EXPECT_TRUE_WAIT(c, kGetStatsReportTimeoutMs);
|
| - EXPECT_EQ(a.get(), b.get());
|
| - // The act of doing |AdvanceTime| processes all messages. If this was not the
|
| - // case we might not require |c| to be fresher than |b|.
|
| - EXPECT_NE(c.get(), b.get());
|
| -}
|
| -
|
| -TEST_F(RTCStatsCollectorTest, CollectRTCPeerConnectionStats) {
|
| - int64_t before = static_cast<int64_t>(
|
| - rtc::Timing::WallTimeNow() * rtc::kNumMicrosecsPerSec);
|
| - rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
|
| - int64_t after = static_cast<int64_t>(
|
| - rtc::Timing::WallTimeNow() * rtc::kNumMicrosecsPerSec);
|
| - EXPECT_EQ(report->GetStatsOfType<RTCPeerConnectionStats>().size(),
|
| - static_cast<size_t>(1)) << "Expecting 1 RTCPeerConnectionStats.";
|
| - const RTCStats* stats = report->Get("RTCPeerConnection");
|
| - EXPECT_TRUE(stats);
|
| - EXPECT_LE(before, stats->timestamp_us());
|
| - EXPECT_LE(stats->timestamp_us(), after);
|
| - {
|
| - // Expected stats with no data channels
|
| - const RTCPeerConnectionStats& pcstats =
|
| - stats->cast_to<RTCPeerConnectionStats>();
|
| - EXPECT_EQ(*pcstats.data_channels_opened, static_cast<uint32_t>(0));
|
| - EXPECT_EQ(*pcstats.data_channels_closed, static_cast<uint32_t>(0));
|
| - }
|
| -
|
| - test_->data_channels().push_back(
|
| - new MockDataChannel(DataChannelInterface::kConnecting));
|
| - test_->data_channels().push_back(
|
| - new MockDataChannel(DataChannelInterface::kOpen));
|
| - test_->data_channels().push_back(
|
| - new MockDataChannel(DataChannelInterface::kClosing));
|
| - test_->data_channels().push_back(
|
| - new MockDataChannel(DataChannelInterface::kClosed));
|
| -
|
| - collector_->ClearCachedStatsReport();
|
| - report = GetStatsReport();
|
| - EXPECT_EQ(report->GetStatsOfType<RTCPeerConnectionStats>().size(),
|
| - static_cast<size_t>(1)) << "Expecting 1 RTCPeerConnectionStats.";
|
| - stats = report->Get("RTCPeerConnection");
|
| - EXPECT_TRUE(stats);
|
| - {
|
| - // Expected stats with the above four data channels
|
| - // TODO(hbos): When the |RTCPeerConnectionStats| is the number of data
|
| - // channels that have been opened and closed, not the numbers currently
|
| - // open/closed, we would expect opened >= closed and (opened - closed) to be
|
| - // the number currently open. crbug.com/636818.
|
| - const RTCPeerConnectionStats& pcstats =
|
| - stats->cast_to<RTCPeerConnectionStats>();
|
| - EXPECT_EQ(*pcstats.data_channels_opened, static_cast<uint32_t>(1));
|
| - EXPECT_EQ(*pcstats.data_channels_closed, static_cast<uint32_t>(3));
|
| - }
|
| -}
|
| -
|
| -class RTCStatsCollectorTestWithFakeCollector : public testing::Test {
|
| - public:
|
| - RTCStatsCollectorTestWithFakeCollector()
|
| - : test_(new rtc::RefCountedObject<RTCStatsCollectorTestHelper>()),
|
| - collector_(FakeRTCStatsCollector::Create(
|
| - &test_->pc(), 50 * rtc::kNumMicrosecsPerMillisec)) {
|
| - }
|
| -
|
| - protected:
|
| - rtc::scoped_refptr<RTCStatsCollectorTestHelper> test_;
|
| - rtc::scoped_refptr<FakeRTCStatsCollector> collector_;
|
| -};
|
| -
|
| -TEST_F(RTCStatsCollectorTestWithFakeCollector, ThreadUsageAndResultsMerging) {
|
| - collector_->VerifyThreadUsageAndResultsMerging();
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -} // namespace webrtc
|
|
|