blob: ef18ea4cfc449cf4e4b8569c7cbe7dee4cf0f92d [file] [log] [blame]
// Copyright 2022 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 "components/performance_manager/public/metrics/metrics_provider.h"
#include "base/test/metrics/histogram_tester.h"
#include "components/performance_manager/public/user_tuning/prefs.h"
#include "components/prefs/testing_pref_service.h"
#include "testing/gtest/include/gtest/gtest.h"
class PerformanceManagerMetricsProviderTest : public testing::Test {
protected:
PrefService* local_state() { return &local_state_; }
void SetHighEfficiencyEnabled(bool enabled) {
local_state()->SetBoolean(
performance_manager::user_tuning::prefs::kHighEfficiencyModeEnabled,
enabled);
}
void SetBatterySaverEnabled(bool enabled) {
local_state()->SetBoolean(
performance_manager::user_tuning::prefs::kBatterySaverModeEnabled,
enabled);
}
void ExpectSingleUniqueSample(
const base::HistogramTester& tester,
performance_manager::MetricsProvider::EfficiencyMode sample) {
tester.ExpectUniqueSample("PerformanceManager.UserTuning.EfficiencyMode",
sample, 1);
}
private:
void SetUp() override {
performance_manager::user_tuning::prefs::RegisterLocalStatePrefs(
local_state_.registry());
}
TestingPrefServiceSimple local_state_;
};
TEST_F(PerformanceManagerMetricsProviderTest, TestNormalMode) {
base::HistogramTester tester;
performance_manager::MetricsProvider provider(local_state());
provider.ProvideCurrentSessionData(nullptr);
ExpectSingleUniqueSample(
tester, performance_manager::MetricsProvider::EfficiencyMode::kNormal);
}
TEST_F(PerformanceManagerMetricsProviderTest, TestMixedMode) {
performance_manager::MetricsProvider provider(local_state());
{
base::HistogramTester tester;
// Start in normal mode
provider.ProvideCurrentSessionData(nullptr);
ExpectSingleUniqueSample(
tester, performance_manager::MetricsProvider::EfficiencyMode::kNormal);
}
{
base::HistogramTester tester;
// Enabled High-Efficiency Mode, the next reported value should be "mixed"
// because we transitioned from normal to High-Efficiency during the
// interval.
SetHighEfficiencyEnabled(true);
provider.ProvideCurrentSessionData(nullptr);
ExpectSingleUniqueSample(
tester, performance_manager::MetricsProvider::EfficiencyMode::kMixed);
}
{
base::HistogramTester tester;
// If another UMA upload happens without mode changes, this one will report
// High-Efficiency Mode.
provider.ProvideCurrentSessionData(nullptr);
ExpectSingleUniqueSample(
tester,
performance_manager::MetricsProvider::EfficiencyMode::kHighEfficiency);
}
}
TEST_F(PerformanceManagerMetricsProviderTest, TestBothModes) {
SetHighEfficiencyEnabled(true);
SetBatterySaverEnabled(true);
performance_manager::MetricsProvider provider(local_state());
{
base::HistogramTester tester;
// Start with both modes enabled (such as a Chrome startup after having
// enabled both modes in a previous session).
provider.ProvideCurrentSessionData(nullptr);
ExpectSingleUniqueSample(
tester, performance_manager::MetricsProvider::EfficiencyMode::kBoth);
}
{
base::HistogramTester tester;
// Disabling High-Efficiency Mode will cause the next report to be "mixed".
SetHighEfficiencyEnabled(false);
provider.ProvideCurrentSessionData(nullptr);
ExpectSingleUniqueSample(
tester, performance_manager::MetricsProvider::EfficiencyMode::kMixed);
}
{
base::HistogramTester tester;
// No changes until the following report, "Battery saver" is reported
provider.ProvideCurrentSessionData(nullptr);
ExpectSingleUniqueSample(
tester,
performance_manager::MetricsProvider::EfficiencyMode::kBatterySaver);
}
{
base::HistogramTester tester;
// Re-enabling High-Efficiency Mode will cause the next report to indicate
// "mixed".
SetHighEfficiencyEnabled(true);
provider.ProvideCurrentSessionData(nullptr);
ExpectSingleUniqueSample(
tester, performance_manager::MetricsProvider::EfficiencyMode::kMixed);
}
{
base::HistogramTester tester;
// One more report with no changes, this one reports "both" again.
provider.ProvideCurrentSessionData(nullptr);
ExpectSingleUniqueSample(
tester, performance_manager::MetricsProvider::EfficiencyMode::kBoth);
}
}