Chromium Code Reviews| Index: content/browser/media/audible_metrics_unittest.cc |
| diff --git a/content/browser/media/audible_metrics_unittest.cc b/content/browser/media/audible_metrics_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..7864ba5f537968d256213b52861d367a81a757af |
| --- /dev/null |
| +++ b/content/browser/media/audible_metrics_unittest.cc |
| @@ -0,0 +1,342 @@ |
| +// Copyright 2016 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "content/browser/media/audible_metrics.h" |
| + |
| +#include "base/metrics/histogram_samples.h" |
| +#include "base/test/histogram_tester.h" |
| +#include "base/test/simple_test_clock.h" |
| +#include "testing/gtest/include/gtest/gtest.h" |
| + |
| +namespace content { |
| + |
| +namespace { |
| + |
| +static WebContents* WEB_CONTENTS_0 = reinterpret_cast<WebContents*>(0x00); |
|
whywhat
2016/01/15 19:01:20
nit: perhaps you meant something like "const WebCo
DaleCurtis
2016/01/15 19:02:03
const these if possible
mlamouri (slow - plz ping)
2016/01/19 12:18:43
Switched to const.
|
| +static WebContents* WEB_CONTENTS_1 = reinterpret_cast<WebContents*>(0x01); |
| +static WebContents* WEB_CONTENTS_2 = reinterpret_cast<WebContents*>(0x10); |
| +static WebContents* WEB_CONTENTS_3 = reinterpret_cast<WebContents*>(0x11); |
| + |
| +class AudibleMetricsTest : public testing::Test { |
| + public: |
| + AudibleMetricsTest() = default; |
|
whywhat
2016/01/15 19:01:20
nit: is this needed? won't it have a default ctor
mlamouri (slow - plz ping)
2016/01/19 12:18:43
I need the default ctor.
|
| + |
| + void SetUp() override { |
| + clock_ = new base::SimpleTestClock(); |
| + clock_->SetNow(base::Time::Now()); |
| + audible_metrics_.SetClockForTest( |
| + scoped_ptr<base::SimpleTestClock>(clock_)); |
| + } |
| + |
| + void TearDown() override { |
| + clock_ = nullptr; |
|
whywhat
2016/01/15 19:01:20
nit: this is probably not needed
mlamouri (slow - plz ping)
2016/01/19 12:18:43
|clock_| is owned by |audible_metrics_|, I prefer
|
| + } |
| + |
| + base::SimpleTestClock* clock() { return clock_; } |
| + |
| + AudibleMetrics& audible_metrics() { |
|
DaleCurtis
2016/01/15 19:02:03
Don't return non-const& -- use a pointer instead (
mlamouri (slow - plz ping)
2016/01/19 12:18:43
Switched to a pointer. Might be allowed now but le
|
| + return audible_metrics_; |
| + }; |
| + |
| + scoped_ptr<base::HistogramSamples> GetHistogramSamplesSinceTestStart( |
| + const std::string& name) { |
| + return histogram_tester_.GetHistogramSamplesSinceCreation(name); |
| + } |
| + |
| + private: |
| + base::SimpleTestClock* clock_ = nullptr; |
| + AudibleMetrics audible_metrics_; |
| + base::HistogramTester histogram_tester_; |
| +}; |
|
DaleCurtis
2016/01/15 19:02:03
DISALLOW_COPY_AND_ASSIGN.
mlamouri (slow - plz ping)
2016/01/19 12:18:43
Done.
|
| + |
| +} // anonymous namespace |
| + |
| +TEST_F(AudibleMetricsTest, CreateAndKillDoesNothing) { |
| + { |
| + AudibleMetrics* audible_metrics = new AudibleMetrics(); |
|
DaleCurtis
2016/01/15 19:02:03
Just use a scoped_ptr?
mlamouri (slow - plz ping)
2016/01/19 12:18:43
It looks a bit odd now but why not.
|
| + delete audible_metrics; |
| + } |
| + |
| + { |
| + scoped_ptr<base::HistogramSamples> samples( |
| + GetHistogramSamplesSinceTestStart( |
| + "Media.Audible.ConcurrentTabsWhenStarting")); |
| + EXPECT_EQ(0, samples->TotalCount()); |
| + } |
| + |
| + { |
| + scoped_ptr<base::HistogramSamples> samples( |
| + GetHistogramSamplesSinceTestStart( |
| + "Media.Audible.ConcurrentTabsInSession")); |
| + EXPECT_EQ(0, samples->TotalCount()); |
| + } |
| + |
| + { |
| + scoped_ptr<base::HistogramSamples> samples( |
| + GetHistogramSamplesSinceTestStart("Media.Audible.ConcurrentTabsTime")); |
| + EXPECT_EQ(0, samples->TotalCount()); |
| + } |
| +} |
| + |
| +TEST_F(AudibleMetricsTest, AudibleStart) { |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true); |
| + |
| + { |
| + scoped_ptr<base::HistogramSamples> samples( |
| + GetHistogramSamplesSinceTestStart( |
| + "Media.Audible.ConcurrentTabsWhenStarting")); |
| + EXPECT_EQ(1, samples->TotalCount()); |
| + EXPECT_EQ(1, samples->GetCount(0)); |
| + } |
| + |
| + { |
| + scoped_ptr<base::HistogramSamples> samples( |
| + GetHistogramSamplesSinceTestStart( |
| + "Media.Audible.ConcurrentTabsInSession")); |
| + EXPECT_EQ(1, samples->TotalCount()); |
| + EXPECT_EQ(1, samples->GetCount(1)); |
| + } |
| + |
| + { |
| + scoped_ptr<base::HistogramSamples> samples( |
| + GetHistogramSamplesSinceTestStart("Media.Audible.ConcurrentTabsTime")); |
| + EXPECT_EQ(0, samples->TotalCount()); |
| + } |
| +} |
| + |
| +TEST_F(AudibleMetricsTest, AudibleStartAndStop) { |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, false); |
| + |
| + { |
| + scoped_ptr<base::HistogramSamples> samples( |
| + GetHistogramSamplesSinceTestStart( |
| + "Media.Audible.ConcurrentTabsWhenStarting")); |
|
DaleCurtis
2016/01/15 19:02:03
I think the histogram macros prevent you from usin
mlamouri (slow - plz ping)
2016/01/19 12:18:43
Done.
|
| + EXPECT_EQ(1, samples->TotalCount()); |
| + EXPECT_EQ(1, samples->GetCount(0)); |
| + } |
| + |
| + { |
| + scoped_ptr<base::HistogramSamples> samples( |
| + GetHistogramSamplesSinceTestStart( |
| + "Media.Audible.ConcurrentTabsInSession")); |
| + EXPECT_EQ(1, samples->TotalCount()); |
| + EXPECT_EQ(1, samples->GetCount(1)); |
| + } |
| + |
| + { |
| + scoped_ptr<base::HistogramSamples> samples( |
| + GetHistogramSamplesSinceTestStart("Media.Audible.ConcurrentTabsTime")); |
| + EXPECT_EQ(0, samples->TotalCount()); |
| + } |
| +} |
| + |
| +TEST_F(AudibleMetricsTest, AddSameTabIsNoOp) { |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true); |
| + |
| + { |
| + scoped_ptr<base::HistogramSamples> samples( |
| + GetHistogramSamplesSinceTestStart( |
| + "Media.Audible.ConcurrentTabsWhenStarting")); |
| + EXPECT_EQ(1, samples->TotalCount()); |
| + EXPECT_EQ(1, samples->GetCount(0)); |
| + } |
| + |
| + { |
| + scoped_ptr<base::HistogramSamples> samples( |
| + GetHistogramSamplesSinceTestStart( |
| + "Media.Audible.ConcurrentTabsInSession")); |
| + EXPECT_EQ(1, samples->TotalCount()); |
| + EXPECT_EQ(1, samples->GetCount(1)); |
| + } |
| + |
| + { |
| + scoped_ptr<base::HistogramSamples> samples( |
| + GetHistogramSamplesSinceTestStart("Media.Audible.ConcurrentTabsTime")); |
| + EXPECT_EQ(0, samples->TotalCount()); |
| + } |
| +} |
| + |
| +TEST_F(AudibleMetricsTest, RemoveUnknownTabIsNoOp) { |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, false); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, false); |
| + |
| + EXPECT_EQ(0, GetHistogramSamplesSinceTestStart( |
| + "Media.Audible.ConcurrentTabsWhenStarting")->TotalCount()); |
| + EXPECT_EQ(0, GetHistogramSamplesSinceTestStart( |
| + "Media.Audible.ConcurrentTabsInSession")->TotalCount()); |
| + EXPECT_EQ(0, GetHistogramSamplesSinceTestStart( |
| + "Media.Audible.ConcurrentTabsTime")->TotalCount()); |
| +} |
| + |
| +TEST_F(AudibleMetricsTest, ConcurrentTabsInSessionIsIncremental) { |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_1, true); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_2, true); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_3, true); |
| + |
| + scoped_ptr<base::HistogramSamples> samples(GetHistogramSamplesSinceTestStart( |
| + "Media.Audible.ConcurrentTabsInSession")); |
| + EXPECT_EQ(4, samples->TotalCount()); |
| + EXPECT_EQ(1, samples->GetCount(1)); |
| + EXPECT_EQ(1, samples->GetCount(2)); |
| + EXPECT_EQ(1, samples->GetCount(3)); |
| + EXPECT_EQ(1, samples->GetCount(4)); |
| +} |
| + |
| +TEST_F(AudibleMetricsTest, ConcurrentTabsInSessionKeepTrackOfRemovedTabs) { |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, false); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_1, true); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_2, true); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_1, false); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_2, false); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_3, true); |
| + |
| + scoped_ptr<base::HistogramSamples> samples(GetHistogramSamplesSinceTestStart( |
| + "Media.Audible.ConcurrentTabsInSession")); |
| + EXPECT_EQ(2, samples->TotalCount()); |
| + EXPECT_EQ(1, samples->GetCount(1)); |
| + EXPECT_EQ(1, samples->GetCount(2)); |
| +} |
| + |
| +TEST_F(AudibleMetricsTest, ConcurrentTabsInSessionIsNotCountedTwice) { |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_1, true); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_2, true); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_3, true); |
| + |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, false); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_1, false); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_2, false); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_3, false); |
| + |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_1, true); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_2, true); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_3, true); |
| + |
| + scoped_ptr<base::HistogramSamples> samples(GetHistogramSamplesSinceTestStart( |
| + "Media.Audible.ConcurrentTabsInSession")); |
| + EXPECT_EQ(4, samples->TotalCount()); |
| + EXPECT_EQ(1, samples->GetCount(1)); |
| + EXPECT_EQ(1, samples->GetCount(2)); |
| + EXPECT_EQ(1, samples->GetCount(3)); |
| + EXPECT_EQ(1, samples->GetCount(4)); |
| +} |
| + |
| +TEST_F(AudibleMetricsTest, ConcurrentTabsWhenStartingAddedPerTab) { |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_1, true); |
| + |
| + { |
| + scoped_ptr<base::HistogramSamples> samples( |
| + GetHistogramSamplesSinceTestStart( |
| + "Media.Audible.ConcurrentTabsWhenStarting")); |
| + EXPECT_EQ(2, samples->TotalCount()); |
| + EXPECT_EQ(1, samples->GetCount(0)); |
| + EXPECT_EQ(1, samples->GetCount(1)); |
| + } |
| + |
| + // Added again: ignored. |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_1, true); |
| + |
| + { |
| + scoped_ptr<base::HistogramSamples> samples( |
| + GetHistogramSamplesSinceTestStart( |
| + "Media.Audible.ConcurrentTabsWhenStarting")); |
| + EXPECT_EQ(2, samples->TotalCount()); |
| + EXPECT_EQ(1, samples->GetCount(0)); |
| + EXPECT_EQ(1, samples->GetCount(1)); |
| + } |
| + |
| + // Removing both. |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, false); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_1, false); |
| + |
| + { |
| + scoped_ptr<base::HistogramSamples> samples( |
| + GetHistogramSamplesSinceTestStart( |
| + "Media.Audible.ConcurrentTabsWhenStarting")); |
| + EXPECT_EQ(2, samples->TotalCount()); |
| + EXPECT_EQ(1, samples->GetCount(0)); |
| + EXPECT_EQ(1, samples->GetCount(1)); |
| + } |
| + |
| + // Adding them after removed, it is counted. |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_1, true); |
| + |
| + { |
| + scoped_ptr<base::HistogramSamples> samples( |
| + GetHistogramSamplesSinceTestStart( |
| + "Media.Audible.ConcurrentTabsWhenStarting")); |
| + EXPECT_EQ(4, samples->TotalCount()); |
| + EXPECT_EQ(2, samples->GetCount(0)); |
| + EXPECT_EQ(2, samples->GetCount(1)); |
| + } |
| +} |
| + |
| +TEST_F(AudibleMetricsTest, ConcurrentTabsTimeRequiresTwoAudibleTabs) { |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_1, true); |
| + |
| + clock()->Advance(base::TimeDelta::FromMilliseconds(1000)); |
| + |
| + // No record because concurrent audbile tabs still running. |
|
whywhat
2016/01/15 19:01:20
nit: s/audbile/audible + one more occurrence below
mlamouri (slow - plz ping)
2016/01/19 12:18:43
Done.
|
| + EXPECT_EQ(0, GetHistogramSamplesSinceTestStart( |
| + "Media.Audible.ConcurrentTabsTime")->TotalCount()); |
| + |
| + // No longer concurrent. |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, false); |
| + { |
| + scoped_ptr<base::HistogramSamples> samples( |
| + GetHistogramSamplesSinceTestStart("Media.Audible.ConcurrentTabsTime")); |
| + EXPECT_EQ(1, samples->TotalCount()); |
| + EXPECT_EQ(1, samples->GetCount(1000)); |
| + } |
| + |
| + // Stopping the second tab is a no-op. |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_1, false); |
| + { |
| + scoped_ptr<base::HistogramSamples> samples( |
| + GetHistogramSamplesSinceTestStart("Media.Audible.ConcurrentTabsTime")); |
| + EXPECT_EQ(1, samples->TotalCount()); |
| + EXPECT_EQ(1, samples->GetCount(1000)); |
| + } |
| +} |
| + |
| +TEST_F(AudibleMetricsTest, ConcurrentTabsTimeRunsAsLongAsTwoAudibleTabs) { |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, true); |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_1, true); |
| + |
| + clock()->Advance(base::TimeDelta::FromMilliseconds(1000)); |
| + |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_2, true); |
| + |
| + clock()->Advance(base::TimeDelta::FromMilliseconds(500)); |
| + |
| + // Mutes one of the three audible tabs. |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_1, false); |
| + |
| + // No record because concurrent audbile tabs still running. |
| + EXPECT_EQ(0, GetHistogramSamplesSinceTestStart( |
| + "Media.Audible.ConcurrentTabsTime")->TotalCount()); |
| + |
| + // Mutes the first audible tab. |
| + audible_metrics().UpdateAudibleWebContentsState(WEB_CONTENTS_0, false); |
| + { |
| + scoped_ptr<base::HistogramSamples> samples( |
| + GetHistogramSamplesSinceTestStart("Media.Audible.ConcurrentTabsTime")); |
| + EXPECT_EQ(1, samples->TotalCount()); |
| + EXPECT_EQ(1, samples->GetCount(1500)); |
| + } |
| +} |
| + |
| +} // namespace content |