blob: bc5a2d1f0a7c3400b2a49aa68bf80480aff3329f [file] [log] [blame]
// Copyright 2015 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/session/media_session_uma_helper.h"
#include "base/metrics/histogram_samples.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/simple_test_tick_clock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace content {
using MediaSessionSuspendedSource =
MediaSessionUmaHelper::MediaSessionSuspendedSource;
namespace {
class MediaSessionUmaHelperTest : public testing::Test {
public:
MediaSessionUmaHelperTest() = default;
void SetUp() override {
clock_.SetNowTicks(base::TimeTicks::Now());
media_session_uma_helper_.SetClockForTest(&clock_);
}
base::SimpleTestTickClock* clock() { return &clock_; }
MediaSessionUmaHelper& media_session_uma_helper() {
return media_session_uma_helper_;
}
std::unique_ptr<base::HistogramSamples> GetHistogramSamplesSinceTestStart(
const std::string& name) {
return histogram_tester_.GetHistogramSamplesSinceCreation(name);
}
private:
base::SimpleTestTickClock clock_;
MediaSessionUmaHelper media_session_uma_helper_;
base::HistogramTester histogram_tester_;
};
} // anonymous namespace
TEST_F(MediaSessionUmaHelperTest, CreateAndKillDoesNothing) {
{
MediaSessionUmaHelper* uma_helper = new MediaSessionUmaHelper();
delete uma_helper;
}
{
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart("Media.Session.Suspended"));
EXPECT_EQ(0, samples->TotalCount());
}
{
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime"));
EXPECT_EQ(0, samples->TotalCount());
}
}
TEST_F(MediaSessionUmaHelperTest, SuspendRegisterImmediately) {
media_session_uma_helper().RecordSessionSuspended(
MediaSessionSuspendedSource::SystemTransient);
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart("Media.Session.Suspended"));
EXPECT_EQ(1, samples->TotalCount());
EXPECT_EQ(1, samples->GetCount(0)); // System Transient
EXPECT_EQ(0, samples->GetCount(1)); // System Permanent
EXPECT_EQ(0, samples->GetCount(2)); // UI
}
TEST_F(MediaSessionUmaHelperTest, MultipleSuspend) {
media_session_uma_helper().RecordSessionSuspended(
MediaSessionSuspendedSource::SystemTransient);
media_session_uma_helper().RecordSessionSuspended(
MediaSessionSuspendedSource::SystemPermanent);
media_session_uma_helper().RecordSessionSuspended(
MediaSessionSuspendedSource::UI);
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart("Media.Session.Suspended"));
EXPECT_EQ(3, samples->TotalCount());
EXPECT_EQ(1, samples->GetCount(0)); // System Transient
EXPECT_EQ(1, samples->GetCount(1)); // System Permanent
EXPECT_EQ(1, samples->GetCount(2)); // UI
}
TEST_F(MediaSessionUmaHelperTest, MultipleSuspendSame) {
media_session_uma_helper().RecordSessionSuspended(
MediaSessionSuspendedSource::SystemPermanent);
media_session_uma_helper().RecordSessionSuspended(
MediaSessionSuspendedSource::SystemTransient);
media_session_uma_helper().RecordSessionSuspended(
MediaSessionSuspendedSource::UI);
media_session_uma_helper().RecordSessionSuspended(
MediaSessionSuspendedSource::SystemTransient);
media_session_uma_helper().RecordSessionSuspended(
MediaSessionSuspendedSource::SystemPermanent);
media_session_uma_helper().RecordSessionSuspended(
MediaSessionSuspendedSource::UI);
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart("Media.Session.Suspended"));
EXPECT_EQ(6, samples->TotalCount());
EXPECT_EQ(2, samples->GetCount(0)); // System Transient
EXPECT_EQ(2, samples->GetCount(1)); // System Permanent
EXPECT_EQ(2, samples->GetCount(2)); // UI
}
TEST_F(MediaSessionUmaHelperTest, ActivationNotTerminatedDoesNotCommit) {
media_session_uma_helper().OnSessionActive();
clock()->Advance(base::TimeDelta::FromMilliseconds(1000));
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime"));
EXPECT_EQ(0, samples->TotalCount());
}
TEST_F(MediaSessionUmaHelperTest, SuspendActivationNotTerminatedDoesNotCommit) {
media_session_uma_helper().OnSessionActive();
clock()->Advance(base::TimeDelta::FromMilliseconds(1000));
media_session_uma_helper().OnSessionSuspended();
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime"));
EXPECT_EQ(0, samples->TotalCount());
}
TEST_F(MediaSessionUmaHelperTest, FullActivation) {
media_session_uma_helper().OnSessionActive();
clock()->Advance(base::TimeDelta::FromMilliseconds(1000));
media_session_uma_helper().OnSessionInactive();
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime"));
EXPECT_EQ(1, samples->TotalCount());
EXPECT_EQ(1, samples->GetCount(1000));
}
TEST_F(MediaSessionUmaHelperTest, ActivationCycleWithSuspend) {
media_session_uma_helper().OnSessionActive();
clock()->Advance(base::TimeDelta::FromMilliseconds(1000));
media_session_uma_helper().OnSessionSuspended();
clock()->Advance(base::TimeDelta::FromMilliseconds(2000));
media_session_uma_helper().OnSessionActive();
clock()->Advance(base::TimeDelta::FromMilliseconds(1000));
media_session_uma_helper().OnSessionInactive();
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime"));
EXPECT_EQ(1, samples->TotalCount());
EXPECT_EQ(1, samples->GetCount(2000));
}
TEST_F(MediaSessionUmaHelperTest, ActivationCycleWithMultipleSuspend) {
media_session_uma_helper().OnSessionActive();
clock()->Advance(base::TimeDelta::FromMilliseconds(1000));
media_session_uma_helper().OnSessionSuspended();
clock()->Advance(base::TimeDelta::FromMilliseconds(2000));
media_session_uma_helper().OnSessionActive();
clock()->Advance(base::TimeDelta::FromMilliseconds(1000));
media_session_uma_helper().OnSessionSuspended();
clock()->Advance(base::TimeDelta::FromMilliseconds(2000));
media_session_uma_helper().OnSessionActive();
clock()->Advance(base::TimeDelta::FromMilliseconds(1000));
media_session_uma_helper().OnSessionInactive();
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime"));
EXPECT_EQ(1, samples->TotalCount());
EXPECT_EQ(1, samples->GetCount(3000));
}
TEST_F(MediaSessionUmaHelperTest, MultipleActivations) {
media_session_uma_helper().OnSessionActive();
clock()->Advance(base::TimeDelta::FromMilliseconds(1000));
media_session_uma_helper().OnSessionSuspended();
clock()->Advance(base::TimeDelta::FromMilliseconds(2000));
media_session_uma_helper().OnSessionActive();
clock()->Advance(base::TimeDelta::FromMilliseconds(1000));
media_session_uma_helper().OnSessionInactive();
media_session_uma_helper().OnSessionActive();
clock()->Advance(base::TimeDelta::FromMilliseconds(1000));
media_session_uma_helper().OnSessionSuspended();
clock()->Advance(base::TimeDelta::FromMilliseconds(2000));
media_session_uma_helper().OnSessionActive();
clock()->Advance(base::TimeDelta::FromMilliseconds(1000));
media_session_uma_helper().OnSessionSuspended();
clock()->Advance(base::TimeDelta::FromMilliseconds(2000));
media_session_uma_helper().OnSessionActive();
clock()->Advance(base::TimeDelta::FromMilliseconds(1000));
media_session_uma_helper().OnSessionInactive();
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime"));
EXPECT_EQ(2, samples->TotalCount());
EXPECT_EQ(1, samples->GetCount(2000));
EXPECT_EQ(1, samples->GetCount(3000));
}
TEST_F(MediaSessionUmaHelperTest, MultipleActivationCalls) {
media_session_uma_helper().OnSessionActive();
clock()->Advance(base::TimeDelta::FromMilliseconds(1000));
media_session_uma_helper().OnSessionActive();
clock()->Advance(base::TimeDelta::FromMilliseconds(2000));
media_session_uma_helper().OnSessionActive();
clock()->Advance(base::TimeDelta::FromMilliseconds(500));
media_session_uma_helper().OnSessionInactive();
// Calling OnSessionActive() multiple times reset the start time of the
// session.
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime"));
EXPECT_EQ(1, samples->TotalCount());
EXPECT_EQ(1, samples->GetCount(500));
}
TEST_F(MediaSessionUmaHelperTest, MultipleSuspendCalls_WhileSuspended) {
media_session_uma_helper().OnSessionActive();
clock()->Advance(base::TimeDelta::FromMilliseconds(1000));
media_session_uma_helper().OnSessionSuspended();
clock()->Advance(base::TimeDelta::FromMilliseconds(2000));
media_session_uma_helper().OnSessionSuspended();
clock()->Advance(base::TimeDelta::FromMilliseconds(500));
media_session_uma_helper().OnSessionSuspended();
media_session_uma_helper().OnSessionInactive();
// If the session is already suspended, OnSessionSuspended() calls are
// ignored.
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime"));
EXPECT_EQ(1, samples->TotalCount());
EXPECT_EQ(1, samples->GetCount(1000));
}
TEST_F(MediaSessionUmaHelperTest, MultipleSuspendCalls_WhileInactive) {
media_session_uma_helper().OnSessionActive();
clock()->Advance(base::TimeDelta::FromMilliseconds(1000));
media_session_uma_helper().OnSessionInactive();
clock()->Advance(base::TimeDelta::FromMilliseconds(2000));
media_session_uma_helper().OnSessionSuspended();
clock()->Advance(base::TimeDelta::FromMilliseconds(500));
media_session_uma_helper().OnSessionSuspended();
media_session_uma_helper().OnSessionInactive();
// If the session is already inactive, OnSessionSuspended() calls are
// ignored.
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime"));
EXPECT_EQ(1, samples->TotalCount());
EXPECT_EQ(1, samples->GetCount(1000));
}
TEST_F(MediaSessionUmaHelperTest, MultipleInactiveCalls) {
media_session_uma_helper().OnSessionActive();
clock()->Advance(base::TimeDelta::FromMilliseconds(3000));
media_session_uma_helper().OnSessionInactive();
clock()->Advance(base::TimeDelta::FromMilliseconds(2000));
media_session_uma_helper().OnSessionInactive();
clock()->Advance(base::TimeDelta::FromMilliseconds(500));
media_session_uma_helper().OnSessionInactive();
// If the session is already inactive, OnSessionInactive() calls are ignored.
std::unique_ptr<base::HistogramSamples> samples(
GetHistogramSamplesSinceTestStart("Media.Session.ActiveTime"));
EXPECT_EQ(1, samples->TotalCount());
EXPECT_EQ(1, samples->GetCount(3000));
}
} // namespace content