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