Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(89)

Unified Diff: content/browser/media/audible_metrics_unittest.cc

Issue 1591453005: Add metrics regarding concurrent audible tabs in Chromium. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698