login_screen_default_policy_browsertest.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
1// Copyright 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include <string> 6 7#include "ash/magnifier/magnifier_constants.h" 8#include "base/basictypes.h" 9#include "base/bind.h" 10#include "base/bind_helpers.h" 11#include "base/command_line.h" 12#include "base/compiler_specific.h" 13#include "base/location.h" 14#include "base/message_loop.h" 15#include "base/prefs/pref_change_registrar.h" 16#include "base/prefs/pref_service.h" 17#include "base/run_loop.h" 18#include "base/values.h" 19#include "chrome/browser/chromeos/accessibility/accessibility_manager.h" 20#include "chrome/browser/chromeos/accessibility/magnification_manager.h" 21#include "chrome/browser/chromeos/policy/device_policy_builder.h" 22#include "chrome/browser/chromeos/policy/device_policy_cros_browser_test.h" 23#include "chrome/browser/chromeos/profiles/profile_helper.h" 24#include "chrome/browser/chromeos/settings/device_settings_service.h" 25#include "chrome/browser/lifetime/application_lifetime.h" 26#include "chrome/browser/policy/proto/chromeos/chrome_device_policy.pb.h" 27#include "chrome/browser/profiles/profile.h" 28#include "chrome/browser/profiles/profile_manager.h" 29#include "chrome/common/pref_names.h" 30#include "chromeos/chromeos_switches.h" 31#include "testing/gtest/include/gtest/gtest.h" 32 33namespace em = enterprise_management; 34 35namespace policy { 36 37namespace { 38 39const em::AccessibilitySettingsProto_ScreenMagnifierType kFullScreenMagnifier = 40 em::AccessibilitySettingsProto_ScreenMagnifierType_SCREEN_MAGNIFIER_TYPE_FULL; 41 42// Spins the loop until a notification is received from |prefs| that the value 43// of |pref_name| has changed. If the notification is received before Wait() 44// has been called, Wait() returns immediately and no loop is spun. 45class PrefChangeWatcher { 46 public: 47 PrefChangeWatcher(const char* pref_name, PrefService* prefs); 48 49 void Wait(); 50 51 void OnPrefChange(); 52 53 private: 54 bool pref_changed_; 55 56 base::RunLoop run_loop_; 57 PrefChangeRegistrar registrar_; 58 59 DISALLOW_COPY_AND_ASSIGN(PrefChangeWatcher); 60}; 61 62PrefChangeWatcher::PrefChangeWatcher(const char* pref_name, 63 PrefService* prefs) 64 : pref_changed_(false) { 65 registrar_.Init(prefs); 66 registrar_.Add(pref_name, base::Bind(&PrefChangeWatcher::OnPrefChange, 67 base::Unretained(this))); 68} 69 70void PrefChangeWatcher::Wait() { 71 if (!pref_changed_) 72 run_loop_.Run(); 73} 74 75void PrefChangeWatcher::OnPrefChange() { 76 pref_changed_ = true; 77 run_loop_.Quit(); 78} 79 80} // namespace 81 82class LoginScreenDefaultPolicyBrowsertestBase 83 : public DevicePolicyCrosBrowserTest { 84 protected: 85 LoginScreenDefaultPolicyBrowsertestBase(); 86 virtual ~LoginScreenDefaultPolicyBrowsertestBase(); 87 88 // DevicePolicyCrosBrowserTest: 89 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE; 90 virtual void SetUpOnMainThread() OVERRIDE; 91 92 void RefreshDevicePolicyAndWaitForPrefChange(const char* pref_name); 93 94 Profile* login_profile_; 95 96 private: 97 DISALLOW_COPY_AND_ASSIGN(LoginScreenDefaultPolicyBrowsertestBase); 98}; 99 100class LoginScreenDefaultPolicyLoginScreenBrowsertest 101 : public LoginScreenDefaultPolicyBrowsertestBase { 102 protected: 103 LoginScreenDefaultPolicyLoginScreenBrowsertest(); 104 virtual ~LoginScreenDefaultPolicyLoginScreenBrowsertest(); 105 106 // LoginScreenDefaultPolicyBrowsertestBase: 107 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE; 108 virtual void SetUpOnMainThread() OVERRIDE; 109 virtual void CleanUpOnMainThread() OVERRIDE; 110 111 void VerifyPrefFollowsRecommendation(const char* pref_name, 112 const base::Value& recommended_value); 113 114 private: 115 DISALLOW_COPY_AND_ASSIGN(LoginScreenDefaultPolicyLoginScreenBrowsertest); 116}; 117 118class LoginScreenDefaultPolicyInSessionBrowsertest 119 : public LoginScreenDefaultPolicyBrowsertestBase { 120 protected: 121 LoginScreenDefaultPolicyInSessionBrowsertest(); 122 virtual ~LoginScreenDefaultPolicyInSessionBrowsertest(); 123 124 // LoginScreenDefaultPolicyBrowsertestBase: 125 virtual void SetUpOnMainThread() OVERRIDE; 126 127 void VerifyPrefFollowsDefault(const char* pref_name); 128 129 private: 130 DISALLOW_COPY_AND_ASSIGN(LoginScreenDefaultPolicyInSessionBrowsertest); 131}; 132 133LoginScreenDefaultPolicyBrowsertestBase:: 134 LoginScreenDefaultPolicyBrowsertestBase() : login_profile_(NULL) { 135} 136 137LoginScreenDefaultPolicyBrowsertestBase:: 138 ~LoginScreenDefaultPolicyBrowsertestBase() { 139} 140 141void LoginScreenDefaultPolicyBrowsertestBase:: 142 SetUpInProcessBrowserTestFixture() { 143 InstallOwnerKey(); 144 MarkAsEnterpriseOwned(); 145 DevicePolicyCrosBrowserTest::SetUpInProcessBrowserTestFixture(); 146} 147 148void LoginScreenDefaultPolicyBrowsertestBase::SetUpOnMainThread() { 149 DevicePolicyCrosBrowserTest::SetUpOnMainThread(); 150 login_profile_ = chromeos::ProfileHelper::GetSigninProfile(); 151 ASSERT_TRUE(login_profile_); 152} 153 154void LoginScreenDefaultPolicyBrowsertestBase:: 155 RefreshDevicePolicyAndWaitForPrefChange(const char* pref_name) { 156 PrefChangeWatcher watcher(pref_name, login_profile_->GetPrefs()); 157 RefreshDevicePolicy(); 158 watcher.Wait(); 159} 160 161LoginScreenDefaultPolicyLoginScreenBrowsertest:: 162 LoginScreenDefaultPolicyLoginScreenBrowsertest() { 163} 164 165LoginScreenDefaultPolicyLoginScreenBrowsertest:: 166 ~LoginScreenDefaultPolicyLoginScreenBrowsertest() { 167} 168 169void LoginScreenDefaultPolicyLoginScreenBrowsertest::SetUpCommandLine( 170 CommandLine* command_line) { 171 LoginScreenDefaultPolicyBrowsertestBase::SetUpCommandLine(command_line); 172 command_line->AppendSwitch(chromeos::switches::kLoginManager); 173 command_line->AppendSwitch(chromeos::switches::kForceLoginManagerInTests); 174} 175 176void LoginScreenDefaultPolicyLoginScreenBrowsertest::SetUpOnMainThread() { 177 LoginScreenDefaultPolicyBrowsertestBase::SetUpOnMainThread(); 178 179 // Set the login screen profile. 180 chromeos::AccessibilityManager* accessibility_manager = 181 chromeos::AccessibilityManager::Get(); 182 ASSERT_TRUE(accessibility_manager); 183 accessibility_manager->SetProfileForTest( 184 chromeos::ProfileHelper::GetSigninProfile()); 185 186 chromeos::MagnificationManager* magnification_manager = 187 chromeos::MagnificationManager::Get(); 188 ASSERT_TRUE(magnification_manager); 189 magnification_manager->SetProfileForTest( 190 chromeos::ProfileHelper::GetSigninProfile()); 191} 192 193void LoginScreenDefaultPolicyLoginScreenBrowsertest::CleanUpOnMainThread() { 194 base::MessageLoop::current()->PostTask(FROM_HERE, 195 base::Bind(&chrome::AttemptExit)); 196 base::RunLoop().RunUntilIdle(); 197 LoginScreenDefaultPolicyBrowsertestBase::CleanUpOnMainThread(); 198} 199 200void LoginScreenDefaultPolicyLoginScreenBrowsertest:: 201 VerifyPrefFollowsRecommendation(const char* pref_name, 202 const base::Value& recommended_value) { 203 const PrefService::Preference* pref = 204 login_profile_->GetPrefs()->FindPreference(pref_name); 205 ASSERT_TRUE(pref); 206 EXPECT_FALSE(pref->IsManaged()); 207 EXPECT_FALSE(pref->IsDefaultValue()); 208 EXPECT_TRUE(base::Value::Equals(&recommended_value, pref->GetValue())); 209 EXPECT_TRUE(base::Value::Equals(&recommended_value, 210 pref->GetRecommendedValue())); 211} 212 213LoginScreenDefaultPolicyInSessionBrowsertest:: 214 LoginScreenDefaultPolicyInSessionBrowsertest() { 215} 216 217LoginScreenDefaultPolicyInSessionBrowsertest:: 218 ~LoginScreenDefaultPolicyInSessionBrowsertest() { 219} 220 221void LoginScreenDefaultPolicyInSessionBrowsertest::SetUpOnMainThread() { 222 LoginScreenDefaultPolicyBrowsertestBase::SetUpOnMainThread(); 223 224 // Tell the DeviceSettingsService that there is no local owner. 225 chromeos::DeviceSettingsService::Get()->SetUsername(std::string()); 226} 227 228void LoginScreenDefaultPolicyInSessionBrowsertest::VerifyPrefFollowsDefault( 229 const char* pref_name) { 230 Profile* profile = ProfileManager::GetDefaultProfile(); 231 ASSERT_TRUE(profile); 232 const PrefService::Preference* pref = 233 profile->GetPrefs()->FindPreference(pref_name); 234 ASSERT_TRUE(pref); 235 EXPECT_FALSE(pref->IsManaged()); 236 EXPECT_TRUE(pref->IsDefaultValue()); 237 EXPECT_FALSE(pref->GetRecommendedValue()); 238} 239 240IN_PROC_BROWSER_TEST_F(LoginScreenDefaultPolicyLoginScreenBrowsertest, 241 DeviceLoginScreenDefaultLargeCursorEnabled) { 242 // Verifies that the default state of the large cursor accessibility feature 243 // on the login screen can be controlled through device policy. 244 245 // Enable the large cursor through device policy and wait for the change to 246 // take effect. 247 em::ChromeDeviceSettingsProto& proto(device_policy()->payload()); 248 proto.mutable_accessibility_settings()-> 249 set_login_screen_default_large_cursor_enabled(true); 250 RefreshDevicePolicyAndWaitForPrefChange(prefs::kLargeCursorEnabled); 251 252 // Verify that the pref which controls the large cursor in the login profile 253 // has changed to the policy-supplied default. 254 VerifyPrefFollowsRecommendation(prefs::kLargeCursorEnabled, 255 base::FundamentalValue(true)); 256 257 // Verify that the large cursor is enabled. 258 chromeos::AccessibilityManager* accessibility_manager = 259 chromeos::AccessibilityManager::Get(); 260 ASSERT_TRUE(accessibility_manager); 261 EXPECT_TRUE(accessibility_manager->IsLargeCursorEnabled()); 262} 263 264IN_PROC_BROWSER_TEST_F(LoginScreenDefaultPolicyLoginScreenBrowsertest, 265 DeviceLoginScreenDefaultSpokenFeedbackEnabled) { 266 // Verifies that the default state of the spoken feedback accessibility 267 // feature on the login screen can be controlled through device policy. 268 269 // Enable spoken feedback through device policy and wait for the change to 270 // take effect. 271 em::ChromeDeviceSettingsProto& proto(device_policy()->payload()); 272 proto.mutable_accessibility_settings()-> 273 set_login_screen_default_spoken_feedback_enabled(true); 274 RefreshDevicePolicyAndWaitForPrefChange(prefs::kSpokenFeedbackEnabled); 275 276 // Verify that the pref which controls spoken feedback in the login profile 277 // has changed to the policy-supplied default. 278 VerifyPrefFollowsRecommendation(prefs::kSpokenFeedbackEnabled, 279 base::FundamentalValue(true)); 280 281 // Verify that spoken feedback is enabled. 282 chromeos::AccessibilityManager* accessibility_manager = 283 chromeos::AccessibilityManager::Get(); 284 ASSERT_TRUE(accessibility_manager); 285 EXPECT_TRUE(accessibility_manager->IsSpokenFeedbackEnabled()); 286} 287 288IN_PROC_BROWSER_TEST_F(LoginScreenDefaultPolicyLoginScreenBrowsertest, 289 DeviceLoginScreenDefaultHighContrastEnabled) { 290 // Verifies that the default state of the high contrast mode accessibility 291 // feature on the login screen can be controlled through device policy. 292 293 // Enable high contrast mode through device policy and wait for the change to 294 // take effect. 295 em::ChromeDeviceSettingsProto& proto(device_policy()->payload()); 296 proto.mutable_accessibility_settings()-> 297 set_login_screen_default_high_contrast_enabled(true); 298 RefreshDevicePolicyAndWaitForPrefChange(prefs::kHighContrastEnabled); 299 300 // Verify that the pref which controls high contrast mode in the login profile 301 // has changed to the policy-supplied default. 302 VerifyPrefFollowsRecommendation(prefs::kHighContrastEnabled, 303 base::FundamentalValue(true)); 304 305 // Verify that high contrast mode is enabled. 306 chromeos::AccessibilityManager* accessibility_manager = 307 chromeos::AccessibilityManager::Get(); 308 ASSERT_TRUE(accessibility_manager); 309 EXPECT_TRUE(accessibility_manager->IsHighContrastEnabled()); 310} 311 312IN_PROC_BROWSER_TEST_F(LoginScreenDefaultPolicyLoginScreenBrowsertest, 313 DeviceLoginScreenDefaultScreenMagnifierType) { 314 // Verifies that the default screen magnifier type enabled on the login screen 315 // can be controlled through device policy. 316 317 // Set the screen magnifier type through device policy and wait for the change 318 // to take effect. 319 em::ChromeDeviceSettingsProto& proto(device_policy()->payload()); 320 proto.mutable_accessibility_settings()-> 321 set_login_screen_default_screen_magnifier_type(kFullScreenMagnifier); 322 RefreshDevicePolicyAndWaitForPrefChange(prefs::kScreenMagnifierType); 323 324 // Verify that the prefs which control the screen magnifier type have changed 325 // to the policy-supplied default. 326 VerifyPrefFollowsRecommendation(prefs::kScreenMagnifierEnabled, 327 base::FundamentalValue(true)); 328 VerifyPrefFollowsRecommendation(prefs::kScreenMagnifierType, 329 base::FundamentalValue(ash::MAGNIFIER_FULL)); 330 331 // Verify that the full-screen magnifier is enabled. 332 chromeos::MagnificationManager* magnification_manager = 333 chromeos::MagnificationManager::Get(); 334 ASSERT_TRUE(magnification_manager); 335 EXPECT_TRUE(magnification_manager->IsMagnifierEnabled()); 336 EXPECT_EQ(ash::MAGNIFIER_FULL, magnification_manager->GetMagnifierType()); 337} 338 339IN_PROC_BROWSER_TEST_F(LoginScreenDefaultPolicyInSessionBrowsertest, 340 DeviceLoginScreenDefaultLargeCursorEnabled) { 341 // Verifies that changing the default state of the large cursor accessibility 342 // feature on the login screen through policy does not affect its state in a 343 // session. 344 345 // Enable the large cursor through device policy and wait for the change to 346 // take effect. 347 em::ChromeDeviceSettingsProto& proto(device_policy()->payload()); 348 proto.mutable_accessibility_settings()-> 349 set_login_screen_default_large_cursor_enabled(true); 350 RefreshDevicePolicyAndWaitForPrefChange(prefs::kLargeCursorEnabled); 351 352 // Verify that the pref which controls the large cursor in the session is 353 // unchanged. 354 VerifyPrefFollowsDefault(prefs::kLargeCursorEnabled); 355 356 // Verify that the large cursor is disabled. 357 chromeos::AccessibilityManager* accessibility_manager = 358 chromeos::AccessibilityManager::Get(); 359 ASSERT_TRUE(accessibility_manager); 360 EXPECT_FALSE(accessibility_manager->IsLargeCursorEnabled()); 361} 362 363IN_PROC_BROWSER_TEST_F(LoginScreenDefaultPolicyInSessionBrowsertest, 364 DeviceLoginScreenDefaultSpokenFeedbackEnabled) { 365 // Verifies that changing the default state of the spoken feedback 366 // accessibility feature on the login screen through policy does not affect 367 // its state in a session. 368 369 // Enable spoken feedback through device policy and wait for the change to 370 // take effect. 371 em::ChromeDeviceSettingsProto& proto(device_policy()->payload()); 372 proto.mutable_accessibility_settings()-> 373 set_login_screen_default_spoken_feedback_enabled(true); 374 RefreshDevicePolicyAndWaitForPrefChange(prefs::kSpokenFeedbackEnabled); 375 376 // Verify that the pref which controls the spoken feedback in the session is 377 // unchanged. 378 VerifyPrefFollowsDefault(prefs::kSpokenFeedbackEnabled); 379 380 // Verify that spoken feedback is disabled. 381 chromeos::AccessibilityManager* accessibility_manager = 382 chromeos::AccessibilityManager::Get(); 383 ASSERT_TRUE(accessibility_manager); 384 EXPECT_FALSE(accessibility_manager->IsSpokenFeedbackEnabled()); 385} 386 387IN_PROC_BROWSER_TEST_F(LoginScreenDefaultPolicyInSessionBrowsertest, 388 DeviceLoginScreenDefaultHighContrastEnabled) { 389 // Verifies that changing the default state of the high contrast mode 390 // accessibility feature on the login screen through policy does not affect 391 // its state in a session. 392 393 // Enable high contrast mode through device policy and wait for the change to 394 // take effect. 395 em::ChromeDeviceSettingsProto& proto(device_policy()->payload()); 396 proto.mutable_accessibility_settings()-> 397 set_login_screen_default_high_contrast_enabled(true); 398 RefreshDevicePolicyAndWaitForPrefChange(prefs::kHighContrastEnabled); 399 400 // Verify that the pref which controls high contrast mode in the session is 401 // unchanged. 402 VerifyPrefFollowsDefault(prefs::kHighContrastEnabled); 403 404 // Verify that high contrast mode is disabled. 405 chromeos::AccessibilityManager* accessibility_manager = 406 chromeos::AccessibilityManager::Get(); 407 ASSERT_TRUE(accessibility_manager); 408 EXPECT_FALSE(accessibility_manager->IsHighContrastEnabled()); 409} 410 411IN_PROC_BROWSER_TEST_F(LoginScreenDefaultPolicyInSessionBrowsertest, 412 DeviceLoginScreenDefaultScreenMagnifierType) { 413 // Verifies that changing the default screen magnifier type enabled on the 414 // login screen through policy does not affect its state in a session. 415 416 // Set the screen magnifier type through device policy and wait for the change 417 // to take effect. 418 em::ChromeDeviceSettingsProto& proto(device_policy()->payload()); 419 proto.mutable_accessibility_settings()-> 420 set_login_screen_default_screen_magnifier_type(kFullScreenMagnifier); 421 RefreshDevicePolicyAndWaitForPrefChange(prefs::kScreenMagnifierType); 422 423 // Verify that the prefs which control the screen magnifier in the session are 424 // unchanged. 425 VerifyPrefFollowsDefault(prefs::kScreenMagnifierEnabled); 426 VerifyPrefFollowsDefault(prefs::kScreenMagnifierType); 427 428 // Verify that the screen magnifier is disabled. 429 chromeos::MagnificationManager* magnification_manager = 430 chromeos::MagnificationManager::Get(); 431 ASSERT_TRUE(magnification_manager); 432 EXPECT_FALSE(magnification_manager->IsMagnifierEnabled()); 433 EXPECT_EQ(ash::kDefaultMagnifierType, 434 magnification_manager->GetMagnifierType()); 435} 436 437} // namespace policy 438