blob: c5205f2f9b7d69149f28c396b12f278d8c02e017 [file] [log] [blame]
// 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/metrics/histogram_tester.h"
#include "base/test/metrics/user_action_tester.h"
#include "base/test/simple_test_tick_clock.h"
#include "content/browser/media/media_web_contents_observer.h"
#include "content/public/test/test_renderer_host.h"
#include "content/test/test_web_contents.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace content {
namespace {
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* CLOSE_NEWEST_TAB_HISTOGRAM =
"Media.Audible.CloseNewestToExitConcurrentPlayback";
class AudibleMetricsTest : public RenderViewHostTestHarness {
public:
AudibleMetricsTest() = default;
void SetUp() override {
RenderViewHostTestHarness::SetUp();
audible_metrics_ = std::make_unique<AudibleMetrics>();
// 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(&clock_);
}
void TearDown() override {
audible_metrics_.reset();
RenderViewHostTestHarness::TearDown();
}
base::SimpleTestTickClock* clock() { return &clock_; }
AudibleMetrics* audible_metrics() { return audible_metrics_.get(); }
const base::UserActionTester& user_action_tester() const {
return user_action_tester_;
}
std::unique_ptr<base::HistogramSamples> GetHistogramSamplesSinceTestStart(
const std::string& name) {
return histogram_tester_.GetHistogramSamplesSinceCreation(name);
}
std::unique_ptr<TestWebContents> CreateWebContents() {
return TestWebContents::Create(GetBrowserContext(), nullptr);
}
std::unique_ptr<MediaWebContentsObserver> CreateMediaObserver(
TestWebContents* web_contents) {
std::unique_ptr<MediaWebContentsObserver> media_observer =
std::make_unique<MediaWebContentsObserver>(web_contents);
media_observer->SetAudibleMetricsForTest(audible_metrics());
return media_observer;
}
private:
std::unique_ptr<AudibleMetrics> audible_metrics_;
base::SimpleTestTickClock clock_;
base::HistogramTester histogram_tester_;
base::UserActionTester user_action_tester_;
DISALLOW_COPY_AND_ASSIGN(AudibleMetricsTest);
};
} // anonymous namespace
TEST_F(AudibleMetricsTest, CreateAndKillDoesNothing) {
{ std::unique_ptr<AudibleMetrics> audible_metrics(new AudibleMetrics()); }
{
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart(
CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM));
EXPECT_EQ(0, samples->TotalCount());
}
{
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart(
MAX_CONCURRENT_TAB_IN_SESSION_HISTOGRAM));
EXPECT_EQ(0, samples->TotalCount());
}
{
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart(CONCURRENT_TABS_TIME_HISTOGRAM));
EXPECT_EQ(0, samples->TotalCount());
}
}
TEST_F(AudibleMetricsTest, AudibleStart) {
std::unique_ptr<TestWebContents> web_contents = CreateWebContents();
audible_metrics()->UpdateAudibleWebContentsState(web_contents.get(), true);
{
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart(
CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM));
EXPECT_EQ(1, samples->TotalCount());
EXPECT_EQ(1, samples->GetCount(0));
}
{
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart(
MAX_CONCURRENT_TAB_IN_SESSION_HISTOGRAM));
EXPECT_EQ(1, samples->TotalCount());
EXPECT_EQ(1, samples->GetCount(1));
}
{
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart(CONCURRENT_TABS_TIME_HISTOGRAM));
EXPECT_EQ(0, samples->TotalCount());
}
}
TEST_F(AudibleMetricsTest, AudibleStartAndStop) {
std::unique_ptr<TestWebContents> web_contents = CreateWebContents();
audible_metrics()->UpdateAudibleWebContentsState(web_contents.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents.get(), false);
{
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart(
CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM));
EXPECT_EQ(1, samples->TotalCount());
EXPECT_EQ(1, samples->GetCount(0));
}
{
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart(
MAX_CONCURRENT_TAB_IN_SESSION_HISTOGRAM));
EXPECT_EQ(1, samples->TotalCount());
EXPECT_EQ(1, samples->GetCount(1));
}
{
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart(CONCURRENT_TABS_TIME_HISTOGRAM));
EXPECT_EQ(0, samples->TotalCount());
}
}
TEST_F(AudibleMetricsTest, AddSameTabIsNoOp) {
std::unique_ptr<TestWebContents> web_contents = CreateWebContents();
audible_metrics()->UpdateAudibleWebContentsState(web_contents.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents.get(), true);
{
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart(
CONCURRENT_TAB_WHEN_STARTING_HISTOGRAM));
EXPECT_EQ(1, samples->TotalCount());
EXPECT_EQ(1, samples->GetCount(0));
}
{
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart(
MAX_CONCURRENT_TAB_IN_SESSION_HISTOGRAM));
EXPECT_EQ(1, samples->TotalCount());
EXPECT_EQ(1, samples->GetCount(1));
}
{
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart(CONCURRENT_TABS_TIME_HISTOGRAM));
EXPECT_EQ(0, samples->TotalCount());
}
}
TEST_F(AudibleMetricsTest, RemoveUnknownTabIsNoOp) {
std::unique_ptr<TestWebContents> web_contents = CreateWebContents();
audible_metrics()->UpdateAudibleWebContentsState(web_contents.get(), false);
audible_metrics()->UpdateAudibleWebContentsState(web_contents.get(), 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());
}
TEST_F(AudibleMetricsTest, ConcurrentTabsInSessionIsIncremental) {
std::unique_ptr<TestWebContents> web_contents_0 = CreateWebContents();
std::unique_ptr<TestWebContents> web_contents_1 = CreateWebContents();
std::unique_ptr<TestWebContents> web_contents_2 = CreateWebContents();
std::unique_ptr<TestWebContents> web_contents_3 = CreateWebContents();
audible_metrics()->UpdateAudibleWebContentsState(web_contents_0.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_1.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_2.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_3.get(), true);
std::unique_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));
}
TEST_F(AudibleMetricsTest, ConcurrentTabsInSessionKeepTrackOfRemovedTabs) {
std::unique_ptr<TestWebContents> web_contents_0 = CreateWebContents();
std::unique_ptr<TestWebContents> web_contents_1 = CreateWebContents();
std::unique_ptr<TestWebContents> web_contents_2 = CreateWebContents();
std::unique_ptr<TestWebContents> web_contents_3 = CreateWebContents();
audible_metrics()->UpdateAudibleWebContentsState(web_contents_0.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_0.get(), false);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_1.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_2.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_1.get(), false);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_2.get(), false);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_3.get(), true);
std::unique_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));
}
TEST_F(AudibleMetricsTest, ConcurrentTabsInSessionIsNotCountedTwice) {
std::unique_ptr<TestWebContents> web_contents_0 = CreateWebContents();
std::unique_ptr<TestWebContents> web_contents_1 = CreateWebContents();
std::unique_ptr<TestWebContents> web_contents_2 = CreateWebContents();
std::unique_ptr<TestWebContents> web_contents_3 = CreateWebContents();
audible_metrics()->UpdateAudibleWebContentsState(web_contents_0.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_1.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_2.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_3.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_0.get(), false);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_1.get(), false);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_2.get(), false);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_3.get(), false);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_0.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_1.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_2.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_3.get(), true);
std::unique_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));
}
TEST_F(AudibleMetricsTest, ConcurrentTabsWhenStartingAddedPerTab) {
std::unique_ptr<TestWebContents> web_contents_0 = CreateWebContents();
std::unique_ptr<TestWebContents> web_contents_1 = CreateWebContents();
audible_metrics()->UpdateAudibleWebContentsState(web_contents_0.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_1.get(), true);
{
std::unique_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));
}
// Added again: ignored.
audible_metrics()->UpdateAudibleWebContentsState(web_contents_0.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_1.get(), true);
{
std::unique_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));
}
// Removing both.
audible_metrics()->UpdateAudibleWebContentsState(web_contents_0.get(), false);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_1.get(), false);
{
std::unique_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));
}
// Adding them after removed, it is counted.
audible_metrics()->UpdateAudibleWebContentsState(web_contents_0.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_1.get(), true);
{
std::unique_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));
}
}
TEST_F(AudibleMetricsTest, ConcurrentTabsTimeRequiresTwoAudibleTabs) {
std::unique_ptr<TestWebContents> web_contents_0 = CreateWebContents();
std::unique_ptr<TestWebContents> web_contents_1 = CreateWebContents();
audible_metrics()->UpdateAudibleWebContentsState(web_contents_0.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_1.get(), 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.get(), false);
{
std::unique_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.get(), false);
{
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart(CONCURRENT_TABS_TIME_HISTOGRAM));
EXPECT_EQ(1, samples->TotalCount());
EXPECT_EQ(1, samples->GetCount(1000));
}
}
TEST_F(AudibleMetricsTest, ConcurrentTabsTimeRunsAsLongAsTwoAudibleTabs) {
std::unique_ptr<TestWebContents> web_contents_0 = CreateWebContents();
std::unique_ptr<TestWebContents> web_contents_1 = CreateWebContents();
std::unique_ptr<TestWebContents> web_contents_2 = CreateWebContents();
audible_metrics()->UpdateAudibleWebContentsState(web_contents_0.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_1.get(), true);
clock()->Advance(base::TimeDelta::FromMilliseconds(1000));
audible_metrics()->UpdateAudibleWebContentsState(web_contents_2.get(), true);
clock()->Advance(base::TimeDelta::FromMilliseconds(500));
// Mutes one of the three audible tabs.
audible_metrics()->UpdateAudibleWebContentsState(web_contents_1.get(), 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.get(), false);
{
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart(CONCURRENT_TABS_TIME_HISTOGRAM));
EXPECT_EQ(1, samples->TotalCount());
EXPECT_EQ(1, samples->GetCount(1500));
}
}
TEST_F(AudibleMetricsTest, MediaWebContentsObserver_Audible_Muted) {
std::unique_ptr<TestWebContents> web_contents = CreateWebContents();
std::unique_ptr<MediaWebContentsObserver> media_observer =
CreateMediaObserver(web_contents.get());
web_contents->SetAudioMuted(true);
web_contents->audio_stream_monitor()->set_is_currently_audible_for_testing(
true);
EXPECT_TRUE(web_contents->audio_stream_monitor()->IsCurrentlyAudible());
EXPECT_TRUE(web_contents->IsAudioMuted());
EXPECT_EQ(0, audible_metrics()->GetAudibleWebContentsSizeForTest());
media_observer->MaybeUpdateAudibleState();
EXPECT_EQ(0, audible_metrics()->GetAudibleWebContentsSizeForTest());
}
TEST_F(AudibleMetricsTest, MediaWebContentsObserver_Audible_NotMuted) {
std::unique_ptr<TestWebContents> web_contents = CreateWebContents();
std::unique_ptr<MediaWebContentsObserver> media_observer =
CreateMediaObserver(web_contents.get());
web_contents->audio_stream_monitor()->set_is_currently_audible_for_testing(
true);
EXPECT_TRUE(web_contents->audio_stream_monitor()->IsCurrentlyAudible());
EXPECT_FALSE(web_contents->IsAudioMuted());
EXPECT_EQ(0, audible_metrics()->GetAudibleWebContentsSizeForTest());
media_observer->MaybeUpdateAudibleState();
EXPECT_EQ(1, audible_metrics()->GetAudibleWebContentsSizeForTest());
}
TEST_F(AudibleMetricsTest, MediaWebContentsObserver_NotAudible_Muted) {
std::unique_ptr<TestWebContents> web_contents = CreateWebContents();
std::unique_ptr<MediaWebContentsObserver> media_observer =
CreateMediaObserver(web_contents.get());
web_contents->SetAudioMuted(true);
EXPECT_FALSE(web_contents->audio_stream_monitor()->IsCurrentlyAudible());
EXPECT_TRUE(web_contents->IsAudioMuted());
EXPECT_EQ(0, audible_metrics()->GetAudibleWebContentsSizeForTest());
media_observer->MaybeUpdateAudibleState();
EXPECT_EQ(0, audible_metrics()->GetAudibleWebContentsSizeForTest());
}
TEST_F(AudibleMetricsTest, MediaWebContentsObserver_NotAudible_NotMuted) {
std::unique_ptr<TestWebContents> web_contents = CreateWebContents();
std::unique_ptr<MediaWebContentsObserver> media_observer =
CreateMediaObserver(web_contents.get());
EXPECT_FALSE(web_contents->audio_stream_monitor()->IsCurrentlyAudible());
EXPECT_FALSE(web_contents->IsAudioMuted());
EXPECT_EQ(0, audible_metrics()->GetAudibleWebContentsSizeForTest());
media_observer->MaybeUpdateAudibleState();
EXPECT_EQ(0, audible_metrics()->GetAudibleWebContentsSizeForTest());
}
TEST_F(AudibleMetricsTest, MediaWebContentsObserver_Destroyed_RecentlyAudible) {
std::unique_ptr<TestWebContents> web_contents_0 = CreateWebContents();
std::unique_ptr<TestWebContents> web_contents_1 = CreateWebContents();
std::unique_ptr<MediaWebContentsObserver> media_observer_1 =
CreateMediaObserver(web_contents_1.get());
audible_metrics()->UpdateAudibleWebContentsState(web_contents_0.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_1.get(), true);
// Even though |web_contents_1| is no longer audible it was still recently
// audible so we should count metrics from it.
audible_metrics()->UpdateAudibleWebContentsState(web_contents_1.get(), false);
web_contents_1->audio_stream_monitor()->set_was_recently_audible_for_testing(
true);
media_observer_1->WebContentsDestroyed();
{
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart(CLOSE_NEWEST_TAB_HISTOGRAM));
EXPECT_EQ(1, samples->TotalCount());
EXPECT_EQ(
1, samples->GetCount(static_cast<int>(
AudibleMetrics::ExitConcurrentPlaybackContents::kMostRecent)));
}
}
TEST_F(AudibleMetricsTest,
MediaWebContentsObserver_Destroyed_RecentlyAudibleButMuted) {
std::unique_ptr<TestWebContents> web_contents_0 = CreateWebContents();
std::unique_ptr<TestWebContents> web_contents_1 = CreateWebContents();
std::unique_ptr<MediaWebContentsObserver> media_observer_1 =
CreateMediaObserver(web_contents_1.get());
audible_metrics()->UpdateAudibleWebContentsState(web_contents_0.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_1.get(), true);
// Even though |web_contents_1| was recently audible it was also muted so we
// should ignore it.
web_contents_1->SetAudioMuted(true);
web_contents_1->audio_stream_monitor()->set_was_recently_audible_for_testing(
true);
media_observer_1->WebContentsDestroyed();
{
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart(CLOSE_NEWEST_TAB_HISTOGRAM));
EXPECT_EQ(0, samples->TotalCount());
EXPECT_EQ(0, samples->GetCount(0));
}
}
TEST_F(AudibleMetricsTest,
MediaWebContentsObserver_Destroyed_NotRecentlyAudible) {
std::unique_ptr<TestWebContents> web_contents_0 = CreateWebContents();
std::unique_ptr<TestWebContents> web_contents_1 = CreateWebContents();
std::unique_ptr<MediaWebContentsObserver> media_observer_1 =
CreateMediaObserver(web_contents_1.get());
audible_metrics()->UpdateAudibleWebContentsState(web_contents_0.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_1.get(), true);
// |web_contents_1| was not recently audible so no metrics should be recorded.
media_observer_1->WebContentsDestroyed();
{
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart(CLOSE_NEWEST_TAB_HISTOGRAM));
EXPECT_EQ(0, samples->TotalCount());
EXPECT_EQ(0, samples->GetCount(0));
}
}
TEST_F(AudibleMetricsTest, CloseNewestAudibleTabHistogram_IgnoreNotAudible) {
std::unique_ptr<TestWebContents> web_contents = CreateWebContents();
audible_metrics()->UpdateAudibleWebContentsState(web_contents.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents.get(), false);
audible_metrics()->WebContentsDestroyed(web_contents.get(), false);
{
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart(CLOSE_NEWEST_TAB_HISTOGRAM));
EXPECT_EQ(0, samples->TotalCount());
}
}
TEST_F(AudibleMetricsTest, CloseNewestAudibleTabHistogram_Newest) {
std::unique_ptr<TestWebContents> web_contents_0 = CreateWebContents();
std::unique_ptr<TestWebContents> web_contents_1 = CreateWebContents();
std::unique_ptr<TestWebContents> web_contents_2 = CreateWebContents();
audible_metrics()->UpdateAudibleWebContentsState(web_contents_0.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_1.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_2.get(), true);
audible_metrics()->WebContentsDestroyed(web_contents_2.get(), true);
{
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart(CLOSE_NEWEST_TAB_HISTOGRAM));
EXPECT_EQ(0, samples->TotalCount());
EXPECT_EQ(
0, samples->GetCount(static_cast<int>(
AudibleMetrics::ExitConcurrentPlaybackContents::kMostRecent)));
}
audible_metrics()->WebContentsDestroyed(web_contents_1.get(), true);
{
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart(CLOSE_NEWEST_TAB_HISTOGRAM));
EXPECT_EQ(1, samples->TotalCount());
EXPECT_EQ(
1, samples->GetCount(static_cast<int>(
AudibleMetrics::ExitConcurrentPlaybackContents::kMostRecent)));
}
audible_metrics()->WebContentsDestroyed(web_contents_0.get(), true);
{
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart(CLOSE_NEWEST_TAB_HISTOGRAM));
EXPECT_EQ(1, samples->TotalCount());
EXPECT_EQ(
1, samples->GetCount(static_cast<int>(
AudibleMetrics::ExitConcurrentPlaybackContents::kMostRecent)));
}
}
TEST_F(AudibleMetricsTest, CloseNewestAudibleTabHistogram_Old) {
std::unique_ptr<TestWebContents> web_contents_0 = CreateWebContents();
std::unique_ptr<TestWebContents> web_contents_1 = CreateWebContents();
std::unique_ptr<TestWebContents> web_contents_2 = CreateWebContents();
audible_metrics()->UpdateAudibleWebContentsState(web_contents_0.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_1.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_2.get(), true);
audible_metrics()->WebContentsDestroyed(web_contents_1.get(), true);
{
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart(CLOSE_NEWEST_TAB_HISTOGRAM));
EXPECT_EQ(0, samples->TotalCount());
EXPECT_EQ(0, samples->GetCount(0));
EXPECT_EQ(0, samples->GetCount(static_cast<int>(
AudibleMetrics::ExitConcurrentPlaybackContents::kOlder)));
}
audible_metrics()->WebContentsDestroyed(web_contents_0.get(), true);
{
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart(CLOSE_NEWEST_TAB_HISTOGRAM));
EXPECT_EQ(1, samples->TotalCount());
EXPECT_EQ(1, samples->GetCount(static_cast<int>(
AudibleMetrics::ExitConcurrentPlaybackContents::kOlder)));
}
audible_metrics()->WebContentsDestroyed(web_contents_2.get(), true);
{
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart(CLOSE_NEWEST_TAB_HISTOGRAM));
EXPECT_EQ(1, samples->TotalCount());
EXPECT_EQ(1, samples->GetCount(static_cast<int>(
AudibleMetrics::ExitConcurrentPlaybackContents::kOlder)));
}
}
TEST_F(AudibleMetricsTest, CloseNewestAudibleTabHistogram_ToggleAudibility) {
std::unique_ptr<TestWebContents> web_contents_0 = CreateWebContents();
std::unique_ptr<TestWebContents> web_contents_1 = CreateWebContents();
audible_metrics()->UpdateAudibleWebContentsState(web_contents_0.get(), true);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_1.get(), true);
// Toggling audibility should make |web_contents_0| the most recently audible.
audible_metrics()->UpdateAudibleWebContentsState(web_contents_0.get(), false);
audible_metrics()->UpdateAudibleWebContentsState(web_contents_0.get(), true);
audible_metrics()->WebContentsDestroyed(web_contents_0.get(), true);
{
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart(CLOSE_NEWEST_TAB_HISTOGRAM));
EXPECT_EQ(1, samples->TotalCount());
EXPECT_EQ(
1, samples->GetCount(static_cast<int>(
AudibleMetrics::ExitConcurrentPlaybackContents::kMostRecent)));
}
}
} // namespace content