Home | History | Annotate | Download | only in settings
      1 // Copyright (c) 2012 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 #ifndef CHROME_BROWSER_CHROMEOS_SETTINGS_DEVICE_SETTINGS_TEST_HELPER_H_
      6 #define CHROME_BROWSER_CHROMEOS_SETTINGS_DEVICE_SETTINGS_TEST_HELPER_H_
      7 
      8 #include <map>
      9 #include <string>
     10 #include <vector>
     11 
     12 #include "base/basictypes.h"
     13 #include "base/compiler_specific.h"
     14 #include "base/memory/ref_counted.h"
     15 #include "base/message_loop/message_loop.h"
     16 #include "base/strings/string_util.h"
     17 #include "chrome/browser/chromeos/policy/device_policy_builder.h"
     18 #include "chrome/browser/chromeos/settings/device_settings_service.h"
     19 #include "chrome/browser/chromeos/settings/device_settings_test_helper.h"
     20 #include "chrome/browser/chromeos/settings/mock_owner_key_util.h"
     21 #include "chromeos/dbus/session_manager_client.h"
     22 #include "content/public/test/test_browser_thread.h"
     23 #include "testing/gtest/include/gtest/gtest.h"
     24 
     25 namespace chromeos {
     26 
     27 // A helper class for tests mocking out session_manager's device settings
     28 // interface. The pattern is to initialize DeviceSettingsService with the helper
     29 // for the SessionManagerClient pointer. The helper records calls made by
     30 // DeviceSettingsService. The test can then verify state, after which it should
     31 // call one of the Flush() variants that will resume processing.
     32 class DeviceSettingsTestHelper : public SessionManagerClient {
     33  public:
     34   // Wraps a device settings service instance for testing.
     35   DeviceSettingsTestHelper();
     36   virtual ~DeviceSettingsTestHelper();
     37 
     38   // Flushes operations on the current message loop and the blocking pool.
     39   void FlushLoops();
     40 
     41   // Runs all pending store callbacks.
     42   void FlushStore();
     43 
     44   // Runs all pending retrieve callbacks.
     45   void FlushRetrieve();
     46 
     47   // Flushes all pending operations.
     48   void Flush();
     49 
     50   // Checks whether any asynchronous Store/Retrieve operations are pending.
     51   bool HasPendingOperations() const;
     52 
     53   bool store_result() {
     54     return device_policy_.store_result_;
     55   }
     56   void set_store_result(bool store_result) {
     57     device_policy_.store_result_ = store_result;
     58   }
     59 
     60   const std::string& policy_blob() {
     61     return device_policy_.policy_blob_;
     62   }
     63   void set_policy_blob(const std::string& policy_blob) {
     64     device_policy_.policy_blob_ = policy_blob;
     65   }
     66 
     67   const std::string& device_local_account_policy_blob(
     68       const std::string& id) const {
     69     const std::map<std::string, PolicyState>::const_iterator entry =
     70         device_local_account_policy_.find(id);
     71     return entry == device_local_account_policy_.end() ?
     72         EmptyString() : entry->second.policy_blob_;
     73   }
     74 
     75   void set_device_local_account_policy_blob(const std::string& id,
     76                                             const std::string& policy_blob) {
     77     device_local_account_policy_[id].policy_blob_ = policy_blob;
     78   }
     79 
     80   // SessionManagerClient:
     81   virtual void AddObserver(Observer* observer) OVERRIDE;
     82   virtual void RemoveObserver(Observer* observer) OVERRIDE;
     83   virtual bool HasObserver(Observer* observer) OVERRIDE;
     84   virtual void EmitLoginPromptReady() OVERRIDE;
     85   virtual void EmitLoginPromptVisible() OVERRIDE;
     86   virtual void RestartJob(int pid, const std::string& command_line) OVERRIDE;
     87   virtual void RestartEntd() OVERRIDE;
     88   virtual void StartSession(const std::string& user_email) OVERRIDE;
     89   virtual void StopSession() OVERRIDE;
     90   virtual void StartDeviceWipe() OVERRIDE;
     91   virtual void RequestLockScreen() OVERRIDE;
     92   virtual void NotifyLockScreenShown() OVERRIDE;
     93   virtual void RequestUnlockScreen() OVERRIDE;
     94   virtual void NotifyLockScreenDismissed() OVERRIDE;
     95   virtual void RetrieveActiveSessions(
     96       const ActiveSessionsCallback& callback) OVERRIDE;
     97   virtual void RetrieveDevicePolicy(
     98       const RetrievePolicyCallback& callback) OVERRIDE;
     99   virtual void RetrievePolicyForUser(
    100       const std::string& username,
    101       const RetrievePolicyCallback& callback) OVERRIDE;
    102   virtual std::string BlockingRetrievePolicyForUser(
    103       const std::string& username) OVERRIDE;
    104   virtual void RetrieveDeviceLocalAccountPolicy(
    105       const std::string& account_id,
    106       const RetrievePolicyCallback& callback) OVERRIDE;
    107   virtual void StoreDevicePolicy(const std::string& policy_blob,
    108                                  const StorePolicyCallback& callback) OVERRIDE;
    109   virtual void StorePolicyForUser(const std::string& username,
    110                                   const std::string& policy_blob,
    111                                   const std::string& policy_key,
    112                                   const StorePolicyCallback& callback) OVERRIDE;
    113   virtual void StoreDeviceLocalAccountPolicy(
    114       const std::string& account_id,
    115       const std::string& policy_blob,
    116       const StorePolicyCallback& callback) OVERRIDE;
    117   virtual void SetFlagsForUser(
    118       const std::string& account_id,
    119       const std::vector<std::string>& flags) OVERRIDE;
    120 
    121  private:
    122   struct PolicyState {
    123     bool store_result_;
    124     std::string policy_blob_;
    125     std::vector<StorePolicyCallback> store_callbacks_;
    126     std::vector<RetrievePolicyCallback> retrieve_callbacks_;
    127 
    128     PolicyState();
    129     ~PolicyState();
    130 
    131     bool HasPendingOperations() const {
    132       return !store_callbacks_.empty() || !retrieve_callbacks_.empty();
    133     }
    134   };
    135 
    136   PolicyState device_policy_;
    137   std::map<std::string, PolicyState> device_local_account_policy_;
    138 
    139   DISALLOW_COPY_AND_ASSIGN(DeviceSettingsTestHelper);
    140 };
    141 
    142 // Wraps the singleton device settings and initializes it to the point where it
    143 // reports OWNERSHIP_NONE for the ownership status.
    144 class ScopedDeviceSettingsTestHelper : public DeviceSettingsTestHelper {
    145  public:
    146   ScopedDeviceSettingsTestHelper();
    147   virtual ~ScopedDeviceSettingsTestHelper();
    148 
    149  private:
    150   DISALLOW_COPY_AND_ASSIGN(ScopedDeviceSettingsTestHelper);
    151 };
    152 
    153 // A convenience test base class that initializes a DeviceSettingsService
    154 // instance for testing and allows for straightforward updating of device
    155 // settings. |device_settings_service_| starts out in uninitialized state, so
    156 // startup code gets tested as well.
    157 class DeviceSettingsTestBase : public testing::Test {
    158  protected:
    159   DeviceSettingsTestBase();
    160   virtual ~DeviceSettingsTestBase();
    161 
    162   virtual void SetUp() OVERRIDE;
    163   virtual void TearDown() OVERRIDE;
    164 
    165   // Flushes any pending device settings operations.
    166   void FlushDeviceSettings();
    167 
    168   // Triggers an owner key and device settings reload on
    169   // |device_settings_service_| and flushes the resulting load operation.
    170   void ReloadDeviceSettings();
    171 
    172   base::MessageLoop loop_;
    173   content::TestBrowserThread ui_thread_;
    174   content::TestBrowserThread file_thread_;
    175 
    176   policy::DevicePolicyBuilder device_policy_;
    177 
    178   DeviceSettingsTestHelper device_settings_test_helper_;
    179   scoped_refptr<MockOwnerKeyUtil> owner_key_util_;
    180   // Local DeviceSettingsService instance for tests. Avoid using in combination
    181   // with the global instance (DeviceSettingsService::Get()).
    182   DeviceSettingsService device_settings_service_;
    183 
    184  private:
    185   DISALLOW_COPY_AND_ASSIGN(DeviceSettingsTestBase);
    186 };
    187 
    188 }  // namespace chromeos
    189 
    190 #endif  // CHROME_BROWSER_CHROMEOS_SETTINGS_DEVICE_SETTINGS_TEST_HELPER_H_
    191