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 |