Index: chrome/browser/ui/webui/settings/chromeos/device_power_handler_unittest.cc |
diff --git a/chrome/browser/ui/webui/settings/chromeos/device_power_handler_unittest.cc b/chrome/browser/ui/webui/settings/chromeos/device_power_handler_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..51305c08f15620c1562544002d063d1df5cd7fb8 |
--- /dev/null |
+++ b/chrome/browser/ui/webui/settings/chromeos/device_power_handler_unittest.cc |
@@ -0,0 +1,313 @@ |
+// Copyright 2017 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/ui/webui/settings/chromeos/device_power_handler.h" |
+ |
+#include <memory> |
+ |
+#include "ash/system/power/power_status.h" |
+#include "base/json/json_writer.h" |
+#include "base/macros.h" |
+#include "base/memory/ptr_util.h" |
+#include "base/run_loop.h" |
+#include "base/test/scoped_task_environment.h" |
+#include "base/values.h" |
+#include "chrome/browser/chromeos/power/power_prefs.h" |
+#include "chrome/common/pref_names.h" |
+#include "chromeos/dbus/dbus_thread_manager.h" |
+#include "chromeos/dbus/fake_power_manager_client.h" |
+#include "chromeos/dbus/power_policy_controller.h" |
+#include "components/sync_preferences/testing_pref_service_syncable.h" |
+#include "content/public/test/test_web_ui.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace chromeos { |
+namespace settings { |
+ |
+class TestPowerHandler : public PowerHandler { |
+ public: |
+ explicit TestPowerHandler(PrefService* prefs) : PowerHandler(prefs) {} |
+ |
+ // Pull WebUIMessageHandler::set_web_ui() into public so tests can call it. |
+ using PowerHandler::set_web_ui; |
+}; |
+ |
+class PowerHandlerTest : public testing::Test { |
+ public: |
+ PowerHandlerTest() { |
+ // This initializes chromeos::DBusThreadManager. |
+ std::unique_ptr<chromeos::DBusThreadManagerSetter> dbus_setter = |
+ chromeos::DBusThreadManager::GetSetterForTesting(); |
+ dbus_setter->SetPowerManagerClient( |
+ base::MakeUnique<chromeos::FakePowerManagerClient>()); |
+ power_manager_client_ = static_cast<chromeos::FakePowerManagerClient*>( |
+ chromeos::DBusThreadManager::Get()->GetPowerManagerClient()); |
+ ash::PowerStatus::Initialize(); |
+ |
+ chromeos::PowerPrefs::RegisterUserProfilePrefs(prefs_.registry()); |
+ |
+ handler_ = base::MakeUnique<TestPowerHandler>(&prefs_); |
+ test_api_ = base::MakeUnique<PowerHandler::TestAPI>(handler_.get()); |
+ handler_->set_web_ui(&web_ui_); |
+ handler_->RegisterMessages(); |
+ handler_->AllowJavascriptForTesting(); |
+ base::RunLoop().RunUntilIdle(); |
+ } |
+ |
+ ~PowerHandlerTest() override { |
+ handler_.reset(); |
+ ash::PowerStatus::Shutdown(); |
+ chromeos::DBusThreadManager::Shutdown(); |
+ } |
+ |
+ protected: |
+ // Returns a JSON representation of the contents of the last message sent to |
+ // WebUI about settings being changed. |
+ std::string GetLastSettingsChangedMessage() WARN_UNUSED_RESULT { |
+ for (auto it = web_ui_.call_data().rbegin(); |
+ it != web_ui_.call_data().rend(); ++it) { |
+ const content::TestWebUI::CallData* data = it->get(); |
+ std::string name; |
+ const base::DictionaryValue* dict = nullptr; |
+ data->arg1()->GetAsString(&name); |
+ if (data->function_name() != "cr.webUIListenerCallback" || |
+ !data->arg1()->GetAsString(&name) || |
+ name != PowerHandler::kPowerManagementSettingsChangedName) { |
+ continue; |
+ } |
+ if (!data->arg2()->GetAsDictionary(&dict)) { |
+ ADD_FAILURE() << "Failed to get dict from " << name << " message"; |
+ continue; |
+ } |
+ std::string out; |
+ EXPECT_TRUE(base::JSONWriter::Write(*dict, &out)); |
+ return out; |
+ } |
+ |
+ ADD_FAILURE() << PowerHandler::kPowerManagementSettingsChangedName |
+ << " message was not sent"; |
+ return std::string(); |
+ } |
+ |
+ // Returns a string for the given settings that can be compared against the |
+ // output of GetLastSettingsChangedMessage(). |
+ std::string CreateSettingsChangedString( |
+ PowerHandler::IdleBehavior idle_behavior, |
+ bool idle_controlled, |
+ PowerPolicyController::Action lid_closed_behavior, |
+ bool lid_closed_controlled, |
+ bool has_lid) { |
+ base::DictionaryValue dict; |
+ dict.SetInteger(PowerHandler::kIdleBehaviorKey, |
+ static_cast<int>(idle_behavior)); |
+ dict.SetBoolean(PowerHandler::kIdleControlledKey, idle_controlled); |
+ dict.SetInteger(PowerHandler::kLidClosedBehaviorKey, lid_closed_behavior); |
+ dict.SetBoolean(PowerHandler::kLidClosedControlledKey, |
+ lid_closed_controlled); |
+ dict.SetBoolean(PowerHandler::kHasLidKey, has_lid); |
+ |
+ std::string out; |
+ EXPECT_TRUE(base::JSONWriter::Write(dict, &out)); |
+ return out; |
+ } |
+ |
+ // Returns the user-set value of the integer pref identified by |name| or -1 |
+ // if the pref is unset. |
+ int GetIntPref(const std::string& name) { |
+ const base::Value* value = prefs_.GetUserPref(name); |
+ return value ? value->GetInt() : -1; |
+ } |
+ |
+ base::test::ScopedTaskEnvironment scoped_task_environment_; |
+ sync_preferences::TestingPrefServiceSyncable prefs_; |
+ content::TestWebUI web_ui_; |
+ |
+ // Owned by chromeos::DBusThreadManager. |
+ chromeos::FakePowerManagerClient* power_manager_client_; |
+ |
+ std::unique_ptr<TestPowerHandler> handler_; |
+ std::unique_ptr<TestPowerHandler::TestAPI> test_api_; |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(PowerHandlerTest); |
+}; |
+ |
+// Verifies that settings are sent to WebUI when requested. |
+TEST_F(PowerHandlerTest, SendInitialSettings) { |
+ test_api_->RequestPowerManagementSettings(); |
+ EXPECT_EQ( |
+ CreateSettingsChangedString( |
+ PowerHandler::IdleBehavior::DISPLAY_OFF_SLEEP, |
+ false /* idle_controlled */, PowerPolicyController::ACTION_SUSPEND, |
+ false /* lid_closed_controlled */, true /* has_lid */), |
+ GetLastSettingsChangedMessage()); |
+} |
+ |
+// Verifies that WebUI receives updated settings when the lid state changes. |
+TEST_F(PowerHandlerTest, SendSettingsForLidStateChanges) { |
+ power_manager_client_->SetLidState(PowerManagerClient::LidState::NOT_PRESENT, |
+ base::TimeTicks()); |
+ EXPECT_EQ( |
+ CreateSettingsChangedString( |
+ PowerHandler::IdleBehavior::DISPLAY_OFF_SLEEP, |
+ false /* idle_controlled */, PowerPolicyController::ACTION_SUSPEND, |
+ false /* lid_closed_controlled */, false /* has_lid */), |
+ GetLastSettingsChangedMessage()); |
+ |
+ power_manager_client_->SetLidState(PowerManagerClient::LidState::OPEN, |
+ base::TimeTicks()); |
+ EXPECT_EQ( |
+ CreateSettingsChangedString( |
+ PowerHandler::IdleBehavior::DISPLAY_OFF_SLEEP, |
+ false /* idle_controlled */, PowerPolicyController::ACTION_SUSPEND, |
+ false /* lid_closed_controlled */, true /* has_lid */), |
+ GetLastSettingsChangedMessage()); |
+} |
+ |
+// Verifies that when various prefs are controlled, the corresponding settings |
+// are reported as controlled to WebUI. |
+TEST_F(PowerHandlerTest, SendSettingsForControlledPrefs) { |
+ // Making an arbitrary delay pref managed should result in the idle setting |
+ // being reported as controlled. |
+ prefs_.SetManagedPref(prefs::kPowerAcScreenDimDelayMs, |
+ base::MakeUnique<base::Value>(10000)); |
+ EXPECT_EQ( |
+ CreateSettingsChangedString( |
+ PowerHandler::IdleBehavior::DISPLAY_OFF_SLEEP, |
+ true /* idle_controlled */, PowerPolicyController::ACTION_SUSPEND, |
+ false /* lid_closed_controlled */, true /* has_lid */), |
+ GetLastSettingsChangedMessage()); |
+ |
+ // Ditto for making the lid action pref managed. |
+ prefs_.SetManagedPref( |
+ prefs::kPowerLidClosedAction, |
+ base::MakeUnique<base::Value>(PowerPolicyController::ACTION_SUSPEND)); |
+ EXPECT_EQ( |
+ CreateSettingsChangedString( |
+ PowerHandler::IdleBehavior::DISPLAY_OFF_SLEEP, |
+ true /* idle_controlled */, PowerPolicyController::ACTION_SUSPEND, |
+ true /* lid_closed_controlled */, true /* has_lid */), |
+ GetLastSettingsChangedMessage()); |
+} |
+ |
+// Verifies that idle-related prefs are distilled into the proper WebUI |
+// settings. |
+TEST_F(PowerHandlerTest, SendIdleSettingForPrefChanges) { |
+ // Set a do-nothing idle action and a nonzero screen-off delay. |
+ prefs_.SetUserPref( |
+ prefs::kPowerAcIdleAction, |
+ base::MakeUnique<base::Value>(PowerPolicyController::ACTION_DO_NOTHING)); |
+ prefs_.SetUserPref(prefs::kPowerAcScreenOffDelayMs, |
+ base::MakeUnique<base::Value>(10000)); |
+ EXPECT_EQ( |
+ CreateSettingsChangedString( |
+ PowerHandler::IdleBehavior::DISPLAY_OFF_STAY_AWAKE, |
+ false /* idle_controlled */, PowerPolicyController::ACTION_SUSPEND, |
+ false /* lid_closed_controlled */, true /* has_lid */), |
+ GetLastSettingsChangedMessage()); |
+ |
+ // Now set the delay to zero and check that the setting goes to "display on". |
+ prefs_.SetUserPref(prefs::kPowerAcScreenOffDelayMs, |
+ base::MakeUnique<base::Value>(0)); |
+ EXPECT_EQ(CreateSettingsChangedString(PowerHandler::IdleBehavior::DISPLAY_ON, |
+ false /* idle_controlled */, |
+ PowerPolicyController::ACTION_SUSPEND, |
+ false /* lid_closed_controlled */, |
+ true /* has_lid */), |
+ GetLastSettingsChangedMessage()); |
+ |
+ // Other idle actions should result in an "other" setting. |
+ prefs_.SetUserPref(prefs::kPowerAcIdleAction, |
+ base::MakeUnique<base::Value>( |
+ PowerPolicyController::ACTION_STOP_SESSION)); |
+ EXPECT_EQ(CreateSettingsChangedString( |
+ PowerHandler::IdleBehavior::OTHER, false /* idle_controlled */, |
+ PowerPolicyController::ACTION_SUSPEND, |
+ false /* lid_closed_controlled */, true /* has_lid */), |
+ GetLastSettingsChangedMessage()); |
+} |
+ |
+// Verifies that the lid-closed pref's value is sent directly to WebUI. |
+TEST_F(PowerHandlerTest, SendLidSettingForPrefChanges) { |
+ prefs_.SetUserPref( |
+ prefs::kPowerLidClosedAction, |
+ base::MakeUnique<base::Value>(PowerPolicyController::ACTION_SHUT_DOWN)); |
+ EXPECT_EQ( |
+ CreateSettingsChangedString( |
+ PowerHandler::IdleBehavior::DISPLAY_OFF_SLEEP, |
+ false /* idle_controlled */, PowerPolicyController::ACTION_SHUT_DOWN, |
+ false /* lid_closed_controlled */, true /* has_lid */), |
+ GetLastSettingsChangedMessage()); |
+ |
+ prefs_.SetUserPref(prefs::kPowerLidClosedAction, |
+ base::MakeUnique<base::Value>( |
+ PowerPolicyController::ACTION_STOP_SESSION)); |
+ EXPECT_EQ(CreateSettingsChangedString( |
+ PowerHandler::IdleBehavior::DISPLAY_OFF_SLEEP, |
+ false /* idle_controlled */, |
+ PowerPolicyController::ACTION_STOP_SESSION, |
+ false /* lid_closed_controlled */, true /* has_lid */), |
+ GetLastSettingsChangedMessage()); |
+} |
+ |
+// Verifies that requests from WebUI to update the idle behavior update prefs |
+// appropriately. |
+TEST_F(PowerHandlerTest, SetIdleBehavior) { |
+ // Request the "display on" setting and check that prefs are set |
+ // appropriately. |
+ test_api_->SetIdleBehavior(PowerHandler::IdleBehavior::DISPLAY_ON); |
+ EXPECT_EQ(PowerPolicyController::ACTION_DO_NOTHING, |
+ GetIntPref(prefs::kPowerAcIdleAction)); |
+ EXPECT_EQ(0, GetIntPref(prefs::kPowerAcScreenDimDelayMs)); |
+ EXPECT_EQ(0, GetIntPref(prefs::kPowerAcScreenOffDelayMs)); |
+ EXPECT_EQ(0, GetIntPref(prefs::kPowerAcScreenLockDelayMs)); |
+ EXPECT_EQ(PowerPolicyController::ACTION_DO_NOTHING, |
+ GetIntPref(prefs::kPowerBatteryIdleAction)); |
+ EXPECT_EQ(0, GetIntPref(prefs::kPowerBatteryScreenDimDelayMs)); |
+ EXPECT_EQ(0, GetIntPref(prefs::kPowerBatteryScreenOffDelayMs)); |
+ EXPECT_EQ(0, GetIntPref(prefs::kPowerBatteryScreenLockDelayMs)); |
+ |
+ // "Turn the display off but stay awake" should set the idle prefs but clear |
+ // the screen delays. |
+ test_api_->SetIdleBehavior( |
+ PowerHandler::IdleBehavior::DISPLAY_OFF_STAY_AWAKE); |
+ EXPECT_EQ(PowerPolicyController::ACTION_DO_NOTHING, |
+ GetIntPref(prefs::kPowerAcIdleAction)); |
+ EXPECT_EQ(-1, GetIntPref(prefs::kPowerAcScreenDimDelayMs)); |
+ EXPECT_EQ(-1, GetIntPref(prefs::kPowerAcScreenOffDelayMs)); |
+ EXPECT_EQ(-1, GetIntPref(prefs::kPowerAcScreenLockDelayMs)); |
+ EXPECT_EQ(PowerPolicyController::ACTION_DO_NOTHING, |
+ GetIntPref(prefs::kPowerBatteryIdleAction)); |
+ EXPECT_EQ(-1, GetIntPref(prefs::kPowerBatteryScreenDimDelayMs)); |
+ EXPECT_EQ(-1, GetIntPref(prefs::kPowerBatteryScreenOffDelayMs)); |
+ EXPECT_EQ(-1, GetIntPref(prefs::kPowerBatteryScreenLockDelayMs)); |
+ |
+ // Now switch to the "display on" setting (to set the prefs again) and check |
+ // that the "sleep" setting clears all the prefs. |
+ test_api_->SetIdleBehavior(PowerHandler::IdleBehavior::DISPLAY_ON); |
+ test_api_->SetIdleBehavior(PowerHandler::IdleBehavior::DISPLAY_OFF_SLEEP); |
+ EXPECT_EQ(-1, GetIntPref(prefs::kPowerAcIdleAction)); |
+ EXPECT_EQ(-1, GetIntPref(prefs::kPowerAcScreenDimDelayMs)); |
+ EXPECT_EQ(-1, GetIntPref(prefs::kPowerAcScreenOffDelayMs)); |
+ EXPECT_EQ(-1, GetIntPref(prefs::kPowerAcScreenLockDelayMs)); |
+ EXPECT_EQ(-1, GetIntPref(prefs::kPowerBatteryIdleAction)); |
+ EXPECT_EQ(-1, GetIntPref(prefs::kPowerBatteryScreenDimDelayMs)); |
+ EXPECT_EQ(-1, GetIntPref(prefs::kPowerBatteryScreenOffDelayMs)); |
+ EXPECT_EQ(-1, GetIntPref(prefs::kPowerBatteryScreenLockDelayMs)); |
+} |
+ |
+// Verifies that requests from WebUI to change the lid behavior update the pref. |
+TEST_F(PowerHandlerTest, SetLidBehavior) { |
+ // The "do nothing" setting should update the pref. |
+ test_api_->SetLidClosedBehavior(PowerPolicyController::ACTION_DO_NOTHING); |
+ EXPECT_EQ(PowerPolicyController::ACTION_DO_NOTHING, |
+ GetIntPref(prefs::kPowerLidClosedAction)); |
+ |
+ // Selecting the "suspend" setting should just clear the pref. |
+ test_api_->SetLidClosedBehavior(PowerPolicyController::ACTION_SUSPEND); |
+ EXPECT_EQ(-1, GetIntPref(prefs::kPowerLidClosedAction)); |
+} |
+ |
+} // namespace settings |
+} // namespace chromeos |