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

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

Issue 1618523003: Merge of "Add metrics regarding concurrent audible tabs in Chromium." (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@2623
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
« no previous file with comments | « content/browser/media/audible_metrics.cc ('k') | content/browser/media/audio_stream_monitor.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..1a6216b64599b056077f6811d190af93ef97e853
--- /dev/null
+++ b/content/browser/media/audible_metrics_unittest.cc
@@ -0,0 +1,397 @@
+// 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_tick_clock.h"
+#include "base/test/user_action_tester.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace content {
+
+namespace {
+
+static const WebContents* WEB_CONTENTS_0 = reinterpret_cast<WebContents*>(0x00);
+static const WebContents* WEB_CONTENTS_1 = reinterpret_cast<WebContents*>(0x01);
+static const WebContents* WEB_CONTENTS_2 = reinterpret_cast<WebContents*>(0x10);
+static const WebContents* WEB_CONTENTS_3 = reinterpret_cast<WebContents*>(0x11);
+
+static const char* CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM =
+ "Media.Audible.ConcurrentTabsWhenStarting";
+static const char* MAX_CONCURRENT_TAB_IN_SESSION_HISTOGRAM =
+ "Media.Audible.MaxConcurrentTabsInSession";
+static const char* CONCURRENT_TABS_TIME_HISTOGRAM =
+ "Media.Audible.ConcurrentTabsTime";
+
+static const char* ADD_TAB_USER_ACTION = "Media.Audible.AddTab";
+static const char* REMOVE_TAB_USER_ACTION = "Media.Audible.RemoveTab";
+
+class AudibleMetricsTest : public testing::Test {
+ public:
+ AudibleMetricsTest() = default;
+
+ void SetUp() override {
+ clock_ = new base::SimpleTestTickClock();
+ // Set the clock to a value different than 0 so the time it gives is
+ // recognized as initialized.
+ clock_->Advance(base::TimeDelta::FromMilliseconds(1));
+ audible_metrics_.SetClockForTest(
+ scoped_ptr<base::SimpleTestTickClock>(clock_));
+ }
+
+ void TearDown() override {
+ clock_ = nullptr;
+ }
+
+ base::SimpleTestTickClock* clock() { return clock_; }
+
+ AudibleMetrics* audible_metrics() {
+ return &audible_metrics_;
+ };
+
+ const base::UserActionTester& user_action_tester() const {
+ return user_action_tester_;
+ }
+
+ scoped_ptr<base::HistogramSamples> GetHistogramSamplesSinceTestStart(
+ const std::string& name) {
+ return histogram_tester_.GetHistogramSamplesSinceCreation(name);
+ }
+
+ private:
+ base::SimpleTestTickClock* clock_ = nullptr;
+ AudibleMetrics audible_metrics_;
+ base::HistogramTester histogram_tester_;
+ base::UserActionTester user_action_tester_;
+
+ DISALLOW_COPY_AND_ASSIGN(AudibleMetricsTest);
+};
+
+} // anonymous namespace
+
+TEST_F(AudibleMetricsTest, CreateAndKillDoesNothing) {
+ {
+ scoped_ptr<AudibleMetrics> audible_metrics(new AudibleMetrics());
+ }
+
+ {
+ scoped_ptr<base::HistogramSamples> samples(
+ GetHistogramSamplesSinceTestStart(
+ CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM));
+ EXPECT_EQ(0, samples->TotalCount());
+ }
+
+ {
+ scoped_ptr<base::HistogramSamples> samples(
+ GetHistogramSamplesSinceTestStart(
+ MAX_CONCURRENT_TAB_IN_SESSION_HISTOGRAM));
+ EXPECT_EQ(0, samples->TotalCount());
+ }
+
+ {
+ scoped_ptr<base::HistogramSamples> samples(
+ GetHistogramSamplesSinceTestStart(CONCURRENT_TABS_TIME_HISTOGRAM));
+ EXPECT_EQ(0, samples->TotalCount());
+ }
+
+ EXPECT_EQ(0, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
+ EXPECT_EQ(0, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
+}
+
+TEST_F(AudibleMetricsTest, AudibleStart) {
+ audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
+
+ {
+ scoped_ptr<base::HistogramSamples> samples(
+ GetHistogramSamplesSinceTestStart(
+ CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM));
+ EXPECT_EQ(1, samples->TotalCount());
+ EXPECT_EQ(1, samples->GetCount(0));
+ }
+
+ {
+ scoped_ptr<base::HistogramSamples> samples(
+ GetHistogramSamplesSinceTestStart(
+ MAX_CONCURRENT_TAB_IN_SESSION_HISTOGRAM));
+ EXPECT_EQ(1, samples->TotalCount());
+ EXPECT_EQ(1, samples->GetCount(1));
+ }
+
+ {
+ scoped_ptr<base::HistogramSamples> samples(
+ GetHistogramSamplesSinceTestStart(CONCURRENT_TABS_TIME_HISTOGRAM));
+ EXPECT_EQ(0, samples->TotalCount());
+ }
+
+ EXPECT_EQ(1, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
+ EXPECT_EQ(0, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
+}
+
+TEST_F(AudibleMetricsTest, AudibleStartAndStop) {
+ audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
+ audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
+
+ {
+ scoped_ptr<base::HistogramSamples> samples(
+ GetHistogramSamplesSinceTestStart(
+ CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM));
+ EXPECT_EQ(1, samples->TotalCount());
+ EXPECT_EQ(1, samples->GetCount(0));
+ }
+
+ {
+ scoped_ptr<base::HistogramSamples> samples(
+ GetHistogramSamplesSinceTestStart(
+ MAX_CONCURRENT_TAB_IN_SESSION_HISTOGRAM));
+ EXPECT_EQ(1, samples->TotalCount());
+ EXPECT_EQ(1, samples->GetCount(1));
+ }
+
+ {
+ scoped_ptr<base::HistogramSamples> samples(
+ GetHistogramSamplesSinceTestStart(CONCURRENT_TABS_TIME_HISTOGRAM));
+ EXPECT_EQ(0, samples->TotalCount());
+ }
+
+ EXPECT_EQ(1, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
+ EXPECT_EQ(1, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
+}
+
+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(
+ CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM));
+ EXPECT_EQ(1, samples->TotalCount());
+ EXPECT_EQ(1, samples->GetCount(0));
+ }
+
+ {
+ scoped_ptr<base::HistogramSamples> samples(
+ GetHistogramSamplesSinceTestStart(
+ MAX_CONCURRENT_TAB_IN_SESSION_HISTOGRAM));
+ EXPECT_EQ(1, samples->TotalCount());
+ EXPECT_EQ(1, samples->GetCount(1));
+ }
+
+ {
+ scoped_ptr<base::HistogramSamples> samples(
+ GetHistogramSamplesSinceTestStart(CONCURRENT_TABS_TIME_HISTOGRAM));
+ EXPECT_EQ(0, samples->TotalCount());
+ }
+
+ EXPECT_EQ(1, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
+ EXPECT_EQ(0, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
+}
+
+TEST_F(AudibleMetricsTest, RemoveUnknownTabIsNoOp) {
+ audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
+ audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
+
+ EXPECT_EQ(0, GetHistogramSamplesSinceTestStart(
+ CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM)->TotalCount());
+ EXPECT_EQ(0, GetHistogramSamplesSinceTestStart(
+ MAX_CONCURRENT_TAB_IN_SESSION_HISTOGRAM)->TotalCount());
+ EXPECT_EQ(0, GetHistogramSamplesSinceTestStart(
+ CONCURRENT_TABS_TIME_HISTOGRAM)->TotalCount());
+
+ EXPECT_EQ(0, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
+ EXPECT_EQ(0, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
+}
+
+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(
+ MAX_CONCURRENT_TAB_IN_SESSION_HISTOGRAM));
+ 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));
+
+ EXPECT_EQ(4, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
+ EXPECT_EQ(0, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
+}
+
+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(
+ MAX_CONCURRENT_TAB_IN_SESSION_HISTOGRAM));
+ EXPECT_EQ(2, samples->TotalCount());
+ EXPECT_EQ(1, samples->GetCount(1));
+ EXPECT_EQ(1, samples->GetCount(2));
+
+ EXPECT_EQ(4, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
+ EXPECT_EQ(3, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
+}
+
+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(
+ MAX_CONCURRENT_TAB_IN_SESSION_HISTOGRAM));
+ 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));
+
+ EXPECT_EQ(8, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
+ EXPECT_EQ(4, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
+}
+
+TEST_F(AudibleMetricsTest, ConcurrentTabsWhenStartingAddedPerTab) {
+ audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
+ audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, true);
+
+ {
+ scoped_ptr<base::HistogramSamples> samples(
+ GetHistogramSamplesSinceTestStart(
+ CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM));
+ EXPECT_EQ(2, samples->TotalCount());
+ EXPECT_EQ(1, samples->GetCount(0));
+ EXPECT_EQ(1, samples->GetCount(1));
+ }
+
+ EXPECT_EQ(2, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
+ EXPECT_EQ(0, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
+
+ // Added again: ignored.
+ audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, true);
+ audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, true);
+
+ {
+ scoped_ptr<base::HistogramSamples> samples(
+ GetHistogramSamplesSinceTestStart(
+ CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM));
+ EXPECT_EQ(2, samples->TotalCount());
+ EXPECT_EQ(1, samples->GetCount(0));
+ EXPECT_EQ(1, samples->GetCount(1));
+ }
+
+ EXPECT_EQ(2, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
+ EXPECT_EQ(0, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
+
+ // Removing both.
+ audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
+ audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_1, false);
+
+ {
+ scoped_ptr<base::HistogramSamples> samples(
+ GetHistogramSamplesSinceTestStart(
+ CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM));
+ EXPECT_EQ(2, samples->TotalCount());
+ EXPECT_EQ(1, samples->GetCount(0));
+ EXPECT_EQ(1, samples->GetCount(1));
+ }
+
+ EXPECT_EQ(2, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
+ EXPECT_EQ(2, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
+
+ // 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(
+ CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM));
+ EXPECT_EQ(4, samples->TotalCount());
+ EXPECT_EQ(2, samples->GetCount(0));
+ EXPECT_EQ(2, samples->GetCount(1));
+ }
+
+ EXPECT_EQ(4, user_action_tester().GetActionCount(ADD_TAB_USER_ACTION));
+ EXPECT_EQ(2, user_action_tester().GetActionCount(REMOVE_TAB_USER_ACTION));
+}
+
+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 audible tabs still running.
+ EXPECT_EQ(0, GetHistogramSamplesSinceTestStart(
+ CONCURRENT_TABS_TIME_HISTOGRAM)->TotalCount());
+
+ // No longer concurrent.
+ audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
+ {
+ scoped_ptr<base::HistogramSamples> samples(
+ GetHistogramSamplesSinceTestStart(CONCURRENT_TABS_TIME_HISTOGRAM));
+ 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(CONCURRENT_TABS_TIME_HISTOGRAM));
+ 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 audible tabs still running.
+ EXPECT_EQ(0, GetHistogramSamplesSinceTestStart(
+ CONCURRENT_TABS_TIME_HISTOGRAM)->TotalCount());
+
+ // Mutes the first audible tab.
+ audible_metrics()->UpdateAudibleWebContentsState(WEB_CONTENTS_0, false);
+ {
+ scoped_ptr<base::HistogramSamples> samples(
+ GetHistogramSamplesSinceTestStart(CONCURRENT_TABS_TIME_HISTOGRAM));
+ EXPECT_EQ(1, samples->TotalCount());
+ EXPECT_EQ(1, samples->GetCount(1500));
+ }
+}
+
+} // namespace content
« no previous file with comments | « content/browser/media/audible_metrics.cc ('k') | content/browser/media/audio_stream_monitor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698