blob: 0e8a4da542ad4f58938f3d747eef54bbe6612460 [file] [log] [blame]
// Copyright 2019 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 "chrome/browser/chromeos/scheduler_configuration_manager.h"
#include <memory>
#include "base/command_line.h"
#include "base/test/scoped_command_line.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/task_environment.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/pref_names.h"
#include "chromeos/dbus/debug_daemon/fake_debug_daemon_client.h"
#include "components/prefs/testing_pref_service.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/cros_system_api/dbus/debugd/dbus-constants.h"
namespace chromeos {
class SchedulerConfigurationManagerTest
: public testing::Test,
public SchedulerConfigurationManagerBase::Observer {
public:
SchedulerConfigurationManagerTest() {
SchedulerConfigurationManager::RegisterLocalStatePrefs(
local_state_.registry());
}
// SchedulerConfigurationManagerBase::Observer:
void OnConfigurationSet(bool success, size_t num_cores_disabled) override {
++configuration_set_count_;
}
base::test::TaskEnvironment task_environment_;
FakeDebugDaemonClient debug_daemon_client_;
TestingPrefServiceSimple local_state_;
size_t configuration_set_count_ = 0;
};
TEST_F(SchedulerConfigurationManagerTest, Startup) {
local_state_.SetString(prefs::kSchedulerConfiguration, "initial");
debug_daemon_client_.SetServiceIsAvailable(false);
// Manager waits on initialization for service to be available.
SchedulerConfigurationManager manager(&debug_daemon_client_, &local_state_);
manager.AddObserver(this);
task_environment_.RunUntilIdle();
EXPECT_EQ("", debug_daemon_client_.scheduler_configuration_name());
EXPECT_EQ(0u, configuration_set_count_);
// Config changes don't lead to updates while debugd isn't ready.
local_state_.SetString(prefs::kSchedulerConfiguration, "config");
task_environment_.RunUntilIdle();
EXPECT_EQ("", debug_daemon_client_.scheduler_configuration_name());
EXPECT_EQ(0u, configuration_set_count_);
// Once the debugd service becomes available, the config gets set.
debug_daemon_client_.SetServiceIsAvailable(true);
task_environment_.RunUntilIdle();
EXPECT_EQ("config", debug_daemon_client_.scheduler_configuration_name());
EXPECT_EQ(1u, configuration_set_count_);
}
TEST_F(SchedulerConfigurationManagerTest, CommandLineDefault) {
// In real usage the command line is set before Chrome launches, so set it as
// such here.
base::test::ScopedCommandLine scoped_command_line;
base::CommandLine* cmd_line = scoped_command_line.GetProcessCommandLine();
cmd_line->AppendSwitchASCII("scheduler-configuration-default",
"cmd-line-default");
// Correct default is used when the command line is setup.
SchedulerConfigurationManager manager(&debug_daemon_client_, &local_state_);
manager.AddObserver(this);
task_environment_.RunUntilIdle();
EXPECT_EQ("cmd-line-default",
debug_daemon_client_.scheduler_configuration_name());
EXPECT_EQ(1u, configuration_set_count_);
// Change user pref, which should trigger a config change.
local_state_.SetUserPref(prefs::kSchedulerConfiguration,
std::make_unique<base::Value>("user"));
task_environment_.RunUntilIdle();
EXPECT_EQ("user", debug_daemon_client_.scheduler_configuration_name());
EXPECT_EQ(2u, configuration_set_count_);
// Set a policy, which should override the user setting
local_state_.SetManagedPref(prefs::kSchedulerConfiguration,
std::make_unique<base::Value>("policy"));
task_environment_.RunUntilIdle();
EXPECT_EQ("policy", debug_daemon_client_.scheduler_configuration_name());
EXPECT_EQ(3u, configuration_set_count_);
// Dropping the user pref doesn't change anything.
local_state_.RemoveUserPref(prefs::kSchedulerConfiguration);
task_environment_.RunUntilIdle();
EXPECT_EQ("policy", debug_daemon_client_.scheduler_configuration_name());
EXPECT_EQ(4u, configuration_set_count_);
// Dropping the policy as well reverts to the cmdline default.
local_state_.RemoveManagedPref(prefs::kSchedulerConfiguration);
task_environment_.RunUntilIdle();
EXPECT_EQ("cmd-line-default",
debug_daemon_client_.scheduler_configuration_name());
EXPECT_EQ(5u, configuration_set_count_);
}
TEST_F(SchedulerConfigurationManagerTest, ConfigChange) {
// Correct default is used when there is no configured value.
SchedulerConfigurationManager manager(&debug_daemon_client_, &local_state_);
manager.AddObserver(this);
task_environment_.RunUntilIdle();
EXPECT_EQ(debugd::scheduler_configuration::kConservativeScheduler,
debug_daemon_client_.scheduler_configuration_name());
EXPECT_EQ(1u, configuration_set_count_);
// Change user pref, which should trigger a config change.
local_state_.SetUserPref(prefs::kSchedulerConfiguration,
std::make_unique<base::Value>("user"));
task_environment_.RunUntilIdle();
EXPECT_EQ("user", debug_daemon_client_.scheduler_configuration_name());
EXPECT_EQ(2u, configuration_set_count_);
// Set a policy, which should override the user setting
local_state_.SetManagedPref(prefs::kSchedulerConfiguration,
std::make_unique<base::Value>("policy"));
task_environment_.RunUntilIdle();
EXPECT_EQ("policy", debug_daemon_client_.scheduler_configuration_name());
EXPECT_EQ(3u, configuration_set_count_);
// Dropping the user pref doesn't change anything.
local_state_.RemoveUserPref(prefs::kSchedulerConfiguration);
task_environment_.RunUntilIdle();
EXPECT_EQ("policy", debug_daemon_client_.scheduler_configuration_name());
EXPECT_EQ(4u, configuration_set_count_);
// Dropping the policy as well reverts to the default configuration.
local_state_.RemoveManagedPref(prefs::kSchedulerConfiguration);
task_environment_.RunUntilIdle();
EXPECT_EQ(debugd::scheduler_configuration::kConservativeScheduler,
debug_daemon_client_.scheduler_configuration_name());
EXPECT_EQ(5u, configuration_set_count_);
}
TEST_F(SchedulerConfigurationManagerTest, FinchDefault) {
auto feature_list = std::make_unique<base::test::ScopedFeatureList>();
feature_list->InitAndEnableFeatureWithParameters(
features::kSchedulerConfiguration, {{"config", "finch"}});
// Finch parameter selects the default.
SchedulerConfigurationManager manager(&debug_daemon_client_, &local_state_);
task_environment_.RunUntilIdle();
EXPECT_EQ("finch", debug_daemon_client_.scheduler_configuration_name());
// Config values override finch default.
local_state_.SetString(prefs::kSchedulerConfiguration, "config");
task_environment_.RunUntilIdle();
EXPECT_EQ("config", debug_daemon_client_.scheduler_configuration_name());
}
} // namespace chromeos