Home | History | Annotate | Download | only in policy
      1 // Copyright (c) 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 #include <vector>
      7 
      8 #include "base/basictypes.h"
      9 #include "base/bind.h"
     10 #include "base/callback.h"
     11 #include "base/command_line.h"
     12 #include "base/compiler_specific.h"
     13 #include "base/file_util.h"
     14 #include "base/files/file_path.h"
     15 #include "base/location.h"
     16 #include "base/message_loop/message_loop.h"
     17 #include "base/path_service.h"
     18 #include "base/run_loop.h"
     19 #include "chrome/browser/browser_process.h"
     20 #include "chrome/browser/chrome_notification_types.h"
     21 #include "chrome/browser/chromeos/login/user_manager.h"
     22 #include "chrome/browser/chromeos/policy/device_policy_builder.h"
     23 #include "chrome/browser/chromeos/policy/device_policy_cros_browser_test.h"
     24 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
     25 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_factory_chromeos.h"
     26 #include "chrome/browser/chromeos/profiles/profile_helper.h"
     27 #include "chrome/browser/chromeos/settings/device_settings_service.h"
     28 #include "chrome/browser/extensions/api/power/power_api_manager.h"
     29 #include "chrome/browser/lifetime/application_lifetime.h"
     30 #include "chrome/browser/policy/cloud/cloud_policy_core.h"
     31 #include "chrome/browser/policy/cloud/cloud_policy_store.h"
     32 #include "chrome/browser/policy/cloud/policy_builder.h"
     33 #include "chrome/browser/policy/external_data_fetcher.h"
     34 #include "chrome/browser/policy/mock_policy_service.h"
     35 #include "chrome/browser/policy/policy_service.h"
     36 #include "chrome/browser/policy/profile_policy_connector.h"
     37 #include "chrome/browser/policy/profile_policy_connector_factory.h"
     38 #include "chrome/browser/policy/proto/chromeos/chrome_device_policy.pb.h"
     39 #include "chrome/browser/policy/proto/cloud/device_management_backend.pb.h"
     40 #include "chrome/browser/profiles/profile.h"
     41 #include "chrome/browser/profiles/profile_manager.h"
     42 #include "chrome/common/extensions/api/power.h"
     43 #include "chrome/test/base/testing_profile.h"
     44 #include "chromeos/chromeos_paths.h"
     45 #include "chromeos/chromeos_switches.h"
     46 #include "chromeos/dbus/fake_power_manager_client.h"
     47 #include "chromeos/dbus/fake_session_manager_client.h"
     48 #include "chromeos/dbus/mock_dbus_thread_manager_without_gmock.h"
     49 #include "chromeos/dbus/power_manager/policy.pb.h"
     50 #include "chromeos/dbus/power_policy_controller.h"
     51 #include "content/public/browser/notification_details.h"
     52 #include "content/public/browser/notification_service.h"
     53 #include "content/public/browser/notification_source.h"
     54 #include "content/public/test/test_utils.h"
     55 #include "crypto/rsa_private_key.h"
     56 #include "testing/gmock/include/gmock/gmock.h"
     57 #include "testing/gtest/include/gtest/gtest.h"
     58 
     59 namespace em = enterprise_management;
     60 namespace pm = power_manager;
     61 
     62 using ::testing::AnyNumber;
     63 using ::testing::InvokeWithoutArgs;
     64 using ::testing::_;
     65 
     66 namespace policy {
     67 
     68 namespace {
     69 
     70 const char kLoginScreenPowerManagementPolicy[] =
     71     "{"
     72     "  \"AC\": {"
     73     "    \"Delays\": {"
     74     "      \"ScreenDim\": 5000,"
     75     "      \"ScreenOff\": 7000,"
     76     "      \"Idle\": 9000"
     77     "    },"
     78     "    \"IdleAction\": \"DoNothing\""
     79     "  },"
     80     "  \"Battery\": {"
     81     "    \"Delays\": {"
     82     "      \"ScreenDim\": 1000,"
     83     "      \"ScreenOff\": 3000,"
     84     "      \"Idle\": 4000"
     85     "    },"
     86     "    \"IdleAction\": \"DoNothing\""
     87     "  },"
     88     "  \"LidCloseAction\": \"DoNothing\","
     89     "  \"UserActivityScreenDimDelayScale\": 300"
     90     "}";
     91 
     92 }  // namespace
     93 
     94 class PowerPolicyBrowserTestBase : public DevicePolicyCrosBrowserTest {
     95  protected:
     96   PowerPolicyBrowserTestBase();
     97 
     98   // DevicePolicyCrosBrowserTest:
     99   virtual void SetUpInProcessBrowserTestFixture() OVERRIDE;
    100   virtual void SetUpOnMainThread() OVERRIDE;
    101 
    102   void InstallUserKey();
    103   void StoreAndReloadUserPolicy();
    104 
    105   void StoreAndReloadDevicePolicyAndWaitForLoginProfileChange();
    106 
    107   // Returns a string describing |policy|.
    108   std::string GetDebugString(const pm::PowerManagementPolicy& policy);
    109 
    110   UserPolicyBuilder user_policy_;
    111 
    112   chromeos::FakePowerManagerClient* power_manager_client_;
    113 
    114  private:
    115   // Runs |closure| and waits for |profile|'s user policy to be updated as a
    116   // result.
    117   void RunClosureAndWaitForUserPolicyUpdate(const base::Closure& closure,
    118                                             Profile* profile);
    119 
    120   // Reloads user policy for |profile| from session manager client.
    121   void ReloadUserPolicy(Profile* profile);
    122 
    123   DISALLOW_COPY_AND_ASSIGN(PowerPolicyBrowserTestBase);
    124 };
    125 
    126 class PowerPolicyLoginScreenBrowserTest : public PowerPolicyBrowserTestBase {
    127  protected:
    128   PowerPolicyLoginScreenBrowserTest();
    129 
    130   // PowerPolicyBrowserTestBase:
    131   virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE;
    132   virtual void SetUpOnMainThread() OVERRIDE;
    133   virtual void CleanUpOnMainThread() OVERRIDE;
    134 
    135   DISALLOW_COPY_AND_ASSIGN(PowerPolicyLoginScreenBrowserTest);
    136 };
    137 
    138 class PowerPolicyInSessionBrowserTest : public PowerPolicyBrowserTestBase {
    139  protected:
    140   PowerPolicyInSessionBrowserTest();
    141 
    142   // PowerPolicyBrowserTestBase:
    143   virtual void SetUpOnMainThread() OVERRIDE;
    144 
    145   DISALLOW_COPY_AND_ASSIGN(PowerPolicyInSessionBrowserTest);
    146 };
    147 
    148 PowerPolicyBrowserTestBase::PowerPolicyBrowserTestBase()
    149     : power_manager_client_(NULL) {
    150 }
    151 
    152 void PowerPolicyBrowserTestBase::SetUpInProcessBrowserTestFixture() {
    153   DevicePolicyCrosBrowserTest::SetUpInProcessBrowserTestFixture();
    154 
    155   // Initialize device policy.
    156   InstallOwnerKey();
    157   MarkAsEnterpriseOwned();
    158 
    159   power_manager_client_ =
    160       mock_dbus_thread_manager()->fake_power_manager_client();
    161 }
    162 
    163 void PowerPolicyBrowserTestBase::SetUpOnMainThread() {
    164   DevicePolicyCrosBrowserTest::SetUpOnMainThread();
    165 
    166   // Initialize user policy.
    167   InstallUserKey();
    168   user_policy_.policy_data().set_username(chromeos::UserManager::kStubUser);
    169 }
    170 
    171 void PowerPolicyBrowserTestBase::InstallUserKey() {
    172   base::FilePath user_keys_dir;
    173   ASSERT_TRUE(PathService::Get(chromeos::DIR_USER_POLICY_KEYS, &user_keys_dir));
    174   base::FilePath user_key_file =
    175       user_keys_dir.AppendASCII(chromeos::UserManager::kStubUser)
    176                    .AppendASCII("policy.pub");
    177   std::vector<uint8> user_key_bits;
    178   ASSERT_TRUE(user_policy_.GetSigningKey()->ExportPublicKey(&user_key_bits));
    179   ASSERT_TRUE(file_util::CreateDirectory(user_key_file.DirName()));
    180   ASSERT_EQ(file_util::WriteFile(
    181                 user_key_file,
    182                 reinterpret_cast<const char*>(user_key_bits.data()),
    183                 user_key_bits.size()),
    184             static_cast<int>(user_key_bits.size()));
    185 }
    186 
    187 void PowerPolicyBrowserTestBase::StoreAndReloadUserPolicy() {
    188   ProfileManager* profile_manager = g_browser_process->profile_manager();
    189   Profile* profile = profile_manager->GetProfileByPath(
    190       profile_manager->user_data_dir().Append(
    191           TestingProfile::kTestUserProfileDir));
    192   ASSERT_TRUE(profile);
    193 
    194   // Install the new user policy blob in session manager client.
    195   user_policy_.Build();
    196   session_manager_client()->set_user_policy(
    197       user_policy_.policy_data().username(),
    198       user_policy_.GetBlob());
    199 
    200   // Reload user policy from session manager client and wait for the update to
    201   // take effect.
    202   RunClosureAndWaitForUserPolicyUpdate(
    203       base::Bind(&PowerPolicyBrowserTestBase::ReloadUserPolicy, this, profile),
    204       profile);
    205 }
    206 
    207 void PowerPolicyBrowserTestBase::
    208     StoreAndReloadDevicePolicyAndWaitForLoginProfileChange() {
    209   Profile* profile = chromeos::ProfileHelper::GetSigninProfile();
    210   ASSERT_TRUE(profile);
    211 
    212   // Install the new device policy blob in session manager client, reload device
    213   // policy from session manager client and wait for a change in the login
    214   // profile's policy to be observed.
    215   RunClosureAndWaitForUserPolicyUpdate(
    216       base::Bind(&PowerPolicyBrowserTestBase::RefreshDevicePolicy, this),
    217       profile);
    218 }
    219 
    220 std::string PowerPolicyBrowserTestBase::GetDebugString(
    221     const pm::PowerManagementPolicy& policy) {
    222   return chromeos::PowerPolicyController::GetPolicyDebugString(policy);
    223 }
    224 
    225 void PowerPolicyBrowserTestBase::RunClosureAndWaitForUserPolicyUpdate(
    226     const base::Closure& closure,
    227     Profile* profile) {
    228   base::RunLoop run_loop;
    229   MockPolicyServiceObserver observer;
    230   EXPECT_CALL(observer, OnPolicyUpdated(_, _, _))
    231       .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
    232   EXPECT_CALL(observer, OnPolicyServiceInitialized(_)).Times(AnyNumber());
    233   PolicyService* policy_service =
    234       ProfilePolicyConnectorFactory::GetForProfile(profile)->policy_service();
    235   ASSERT_TRUE(policy_service);
    236   policy_service->AddObserver(POLICY_DOMAIN_CHROME, &observer);
    237   closure.Run();
    238   run_loop.Run();
    239   policy_service->RemoveObserver(POLICY_DOMAIN_CHROME, &observer);
    240 }
    241 
    242 void PowerPolicyBrowserTestBase::ReloadUserPolicy(Profile* profile) {
    243   UserCloudPolicyManagerChromeOS* policy_manager =
    244       UserCloudPolicyManagerFactoryChromeOS::GetForProfile(profile);
    245   ASSERT_TRUE(policy_manager);
    246   policy_manager->core()->store()->Load();
    247 }
    248 
    249 PowerPolicyLoginScreenBrowserTest::PowerPolicyLoginScreenBrowserTest() {
    250 }
    251 
    252 void PowerPolicyLoginScreenBrowserTest::SetUpCommandLine(
    253     CommandLine* command_line) {
    254   PowerPolicyBrowserTestBase::SetUpCommandLine(command_line);
    255   command_line->AppendSwitch(chromeos::switches::kLoginManager);
    256   command_line->AppendSwitch(chromeos::switches::kForceLoginManagerInTests);
    257 }
    258 
    259 void PowerPolicyLoginScreenBrowserTest::SetUpOnMainThread() {
    260   PowerPolicyBrowserTestBase::SetUpOnMainThread();
    261 
    262   // Wait for the login screen to be shown.
    263   content::WindowedNotificationObserver(
    264       chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE,
    265       content::NotificationService::AllSources()).Wait();
    266 }
    267 
    268 void PowerPolicyLoginScreenBrowserTest::CleanUpOnMainThread() {
    269   base::MessageLoop::current()->PostTask(FROM_HERE,
    270                                          base::Bind(&chrome::AttemptExit));
    271   base::RunLoop().RunUntilIdle();
    272   PowerPolicyBrowserTestBase::CleanUpOnMainThread();
    273 }
    274 
    275 PowerPolicyInSessionBrowserTest::PowerPolicyInSessionBrowserTest() {
    276 }
    277 
    278 void PowerPolicyInSessionBrowserTest::SetUpOnMainThread() {
    279   PowerPolicyBrowserTestBase::SetUpOnMainThread();
    280 
    281   // Tell the DeviceSettingsService that there is no local owner.
    282   chromeos::DeviceSettingsService::Get()->SetUsername(std::string());
    283 }
    284 
    285 // Verifies that device policy is applied on the login screen.
    286 IN_PROC_BROWSER_TEST_F(PowerPolicyLoginScreenBrowserTest, SetDevicePolicy) {
    287   pm::PowerManagementPolicy power_management_policy =
    288       power_manager_client_->get_policy();
    289   power_management_policy.mutable_ac_delays()->set_screen_dim_ms(5000);
    290   power_management_policy.mutable_ac_delays()->set_screen_off_ms(7000);
    291   power_management_policy.mutable_ac_delays()->set_idle_ms(9000);
    292   power_management_policy.mutable_battery_delays()->set_screen_dim_ms(1000);
    293   power_management_policy.mutable_battery_delays()->set_screen_off_ms(3000);
    294   power_management_policy.mutable_battery_delays()->set_idle_ms(4000);
    295   power_management_policy.set_ac_idle_action(
    296       pm::PowerManagementPolicy::DO_NOTHING);
    297   power_management_policy.set_battery_idle_action(
    298       pm::PowerManagementPolicy::DO_NOTHING);
    299   power_management_policy.set_lid_closed_action(
    300       pm::PowerManagementPolicy::DO_NOTHING);
    301   power_management_policy.set_user_activity_screen_dim_delay_factor(3.0);
    302 
    303   em::ChromeDeviceSettingsProto& proto(device_policy()->payload());
    304   proto.mutable_login_screen_power_management()->
    305       set_login_screen_power_management(kLoginScreenPowerManagementPolicy);
    306   StoreAndReloadDevicePolicyAndWaitForLoginProfileChange();
    307   EXPECT_EQ(GetDebugString(power_management_policy),
    308             GetDebugString(power_manager_client_->get_policy()));
    309 }
    310 
    311 // Verifies that device policy is ignored during a session.
    312 IN_PROC_BROWSER_TEST_F(PowerPolicyInSessionBrowserTest, SetDevicePolicy) {
    313   pm::PowerManagementPolicy power_management_policy =
    314       power_manager_client_->get_policy();
    315 
    316   em::ChromeDeviceSettingsProto& proto(device_policy()->payload());
    317   proto.mutable_login_screen_power_management()->
    318       set_login_screen_power_management(kLoginScreenPowerManagementPolicy);
    319   StoreAndReloadDevicePolicyAndWaitForLoginProfileChange();
    320   EXPECT_EQ(GetDebugString(power_management_policy),
    321             GetDebugString(power_manager_client_->get_policy()));
    322 }
    323 
    324 // Verifies that user policy is applied during a session.
    325 IN_PROC_BROWSER_TEST_F(PowerPolicyInSessionBrowserTest, SetUserPolicy) {
    326   pm::PowerManagementPolicy power_management_policy =
    327       power_manager_client_->get_policy();
    328   power_management_policy.mutable_ac_delays()->set_screen_dim_ms(5000);
    329   power_management_policy.mutable_ac_delays()->set_screen_lock_ms(6000);
    330   power_management_policy.mutable_ac_delays()->set_screen_off_ms(7000);
    331   power_management_policy.mutable_ac_delays()->set_idle_warning_ms(8000);
    332   power_management_policy.mutable_ac_delays()->set_idle_ms(9000);
    333   power_management_policy.mutable_battery_delays()->set_screen_dim_ms(1000);
    334   power_management_policy.mutable_battery_delays()->set_screen_lock_ms(2000);
    335   power_management_policy.mutable_battery_delays()->set_screen_off_ms(3000);
    336   power_management_policy.mutable_battery_delays()->set_idle_warning_ms(4000);
    337   power_management_policy.mutable_battery_delays()->set_idle_ms(5000);
    338   power_management_policy.set_use_audio_activity(false);
    339   power_management_policy.set_use_video_activity(false);
    340   power_management_policy.set_ac_idle_action(
    341       pm::PowerManagementPolicy::STOP_SESSION);
    342   power_management_policy.set_battery_idle_action(
    343       pm::PowerManagementPolicy::STOP_SESSION);
    344   power_management_policy.set_lid_closed_action(
    345       pm::PowerManagementPolicy::STOP_SESSION);
    346   power_management_policy.set_presentation_screen_dim_delay_factor(3.0);
    347   power_management_policy.set_user_activity_screen_dim_delay_factor(3.0);
    348 
    349   user_policy_.payload().mutable_screendimdelayac()->set_value(5000);
    350   user_policy_.payload().mutable_screenlockdelayac()->set_value(6000);
    351   user_policy_.payload().mutable_screenoffdelayac()->set_value(7000);
    352   user_policy_.payload().mutable_idlewarningdelayac()->set_value(8000);
    353   user_policy_.payload().mutable_idledelayac()->set_value(9000);
    354   user_policy_.payload().mutable_screendimdelaybattery()->set_value(1000);
    355   user_policy_.payload().mutable_screenlockdelaybattery()->set_value(2000);
    356   user_policy_.payload().mutable_screenoffdelaybattery()->set_value(3000);
    357   user_policy_.payload().mutable_idlewarningdelaybattery()->set_value(4000);
    358   user_policy_.payload().mutable_idledelaybattery()->set_value(5000);
    359   user_policy_.payload().mutable_powermanagementusesaudioactivity()->set_value(
    360       false);
    361   user_policy_.payload().mutable_powermanagementusesvideoactivity()->set_value(
    362       false);
    363   user_policy_.payload().mutable_idleactionac()->set_value(
    364       chromeos::PowerPolicyController::ACTION_STOP_SESSION);
    365   user_policy_.payload().mutable_idleactionbattery()->set_value(
    366       chromeos::PowerPolicyController::ACTION_STOP_SESSION);
    367   user_policy_.payload().mutable_lidcloseaction()->set_value(
    368       chromeos::PowerPolicyController::ACTION_STOP_SESSION);
    369   user_policy_.payload().mutable_presentationscreendimdelayscale()->set_value(
    370       300);
    371   user_policy_.payload().mutable_useractivityscreendimdelayscale()->set_value(
    372       300);
    373   StoreAndReloadUserPolicy();
    374   EXPECT_EQ(GetDebugString(power_management_policy),
    375             GetDebugString(power_manager_client_->get_policy()));
    376 }
    377 
    378 // Verifies that screen wake locks can be enabled and disabled by extensions and
    379 // user policy during a session.
    380 IN_PROC_BROWSER_TEST_F(PowerPolicyInSessionBrowserTest, AllowScreenWakeLocks) {
    381   pm::PowerManagementPolicy baseline_policy =
    382       power_manager_client_->get_policy();
    383 
    384   // Default settings should have delays.
    385   pm::PowerManagementPolicy power_management_policy = baseline_policy;
    386   EXPECT_NE(0, baseline_policy.ac_delays().screen_dim_ms());
    387   EXPECT_NE(0, baseline_policy.ac_delays().screen_off_ms());
    388   EXPECT_NE(0, baseline_policy.battery_delays().screen_dim_ms());
    389   EXPECT_NE(0, baseline_policy.battery_delays().screen_off_ms());
    390 
    391   // Pretend an extension grabs a screen wake lock.
    392   const char kExtensionId[] = "abcdefghijklmnopabcdefghijlkmnop";
    393   extensions::PowerApiManager::GetInstance()->AddRequest(
    394       kExtensionId, extensions::api::power::LEVEL_DISPLAY);
    395   base::RunLoop().RunUntilIdle();
    396 
    397   // Check that the lock is in effect (ignoring ac_idle_action,
    398   // battery_idle_action and reason).
    399   pm::PowerManagementPolicy policy = baseline_policy;
    400   policy.mutable_ac_delays()->set_screen_dim_ms(0);
    401   policy.mutable_ac_delays()->set_screen_off_ms(0);
    402   policy.mutable_battery_delays()->set_screen_dim_ms(0);
    403   policy.mutable_battery_delays()->set_screen_off_ms(0);
    404   policy.set_ac_idle_action(
    405       power_manager_client_->get_policy().ac_idle_action());
    406   policy.set_battery_idle_action(
    407       power_manager_client_->get_policy().battery_idle_action());
    408   policy.set_reason(power_manager_client_->get_policy().reason());
    409   EXPECT_EQ(GetDebugString(policy),
    410             GetDebugString(power_manager_client_->get_policy()));
    411 
    412   // Engage the user policy and verify that the defaults take effect again.
    413   user_policy_.payload().mutable_allowscreenwakelocks()->set_value(false);
    414   StoreAndReloadUserPolicy();
    415   policy = baseline_policy;
    416   policy.set_ac_idle_action(
    417       power_manager_client_->get_policy().ac_idle_action());
    418   policy.set_battery_idle_action(
    419       power_manager_client_->get_policy().battery_idle_action());
    420   policy.set_reason(power_manager_client_->get_policy().reason());
    421   EXPECT_EQ(GetDebugString(policy),
    422             GetDebugString(power_manager_client_->get_policy()));
    423 }
    424 
    425 }  // namespace policy
    426