device_settings_test_helper.h revision 6d86b77056ed63eb6871182f42a9fd5f07550f90
19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Copyright (c) 2012 The Chromium Authors. All rights reserved. 29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Use of this source code is governed by a BSD-style license that can be 39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// found in the LICENSE file. 49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef CHROME_BROWSER_CHROMEOS_SETTINGS_DEVICE_SETTINGS_TEST_HELPER_H_ 69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define CHROME_BROWSER_CHROMEOS_SETTINGS_DEVICE_SETTINGS_TEST_HELPER_H_ 79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include <map> 99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include <string> 109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include <vector> 119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "base/basictypes.h" 139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "base/compiler_specific.h" 149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "base/memory/ref_counted.h" 159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "base/memory/scoped_ptr.h" 169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "base/message_loop/message_loop.h" 179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "base/strings/string_util.h" 189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "chrome/browser/chromeos/login/users/fake_user_manager.h" 199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "chrome/browser/chromeos/login/users/user_manager.h" 209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "chrome/browser/chromeos/policy/device_policy_builder.h" 219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "chrome/browser/chromeos/settings/device_settings_service.h" 229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "chrome/browser/chromeos/settings/device_settings_test_helper.h" 239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "chrome/browser/chromeos/settings/mock_owner_key_util.h" 249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "chromeos/dbus/session_manager_client.h" 259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "content/public/test/test_browser_thread_bundle.h" 269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#include "testing/gtest/include/gtest/gtest.h" 279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass TestingProfile; 299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocknamespace chromeos { 319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass FakeDBusThreadManager; 339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// A helper class for tests mocking out session_manager's device settings 359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// interface. The pattern is to initialize DeviceSettingsService with the helper 369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// for the SessionManagerClient pointer. The helper records calls made by 379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// DeviceSettingsService. The test can then verify state, after which it should 389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// call one of the Flush() variants that will resume processing. 399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockclass DeviceSettingsTestHelper : public SessionManagerClient { 409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block public: 419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Wraps a device settings service instance for testing. 429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block DeviceSettingsTestHelper(); 439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block virtual ~DeviceSettingsTestHelper(); 449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Flushes operations on the current message loop and the blocking pool. 469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void FlushLoops(); 479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Runs all pending store callbacks. 499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void FlushStore(); 509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Runs all pending retrieve callbacks. 529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void FlushRetrieve(); 539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Flushes all pending operations. 559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void Flush(); 569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block // Checks whether any asynchronous Store/Retrieve operations are pending. 589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bool HasPendingOperations() const; 599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block bool store_result() { 619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return device_policy_.store_result_; 629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void set_store_result(bool store_result) { 649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block device_policy_.store_result_ = store_result; 659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block 679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block const std::string& policy_blob() { 689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block return device_policy_.policy_blob_; 699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block } 709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block void set_policy_blob(const std::string& policy_blob) { 71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott device_policy_.policy_blob_ = policy_blob; 72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const std::string& device_local_account_policy_blob( 75 const std::string& id) const { 76 const std::map<std::string, PolicyState>::const_iterator entry = 77 device_local_account_policy_.find(id); 78 return entry == device_local_account_policy_.end() ? 79 base::EmptyString() : entry->second.policy_blob_; 80 } 81 82 void set_device_local_account_policy_blob(const std::string& id, 83 const std::string& policy_blob) { 84 device_local_account_policy_[id].policy_blob_ = policy_blob; 85 } 86 87 // SessionManagerClient: 88 virtual void Init(dbus::Bus* bus) OVERRIDE; 89 virtual void SetStubDelegate(SessionManagerClient::StubDelegate* delegate) 90 OVERRIDE; 91 virtual void AddObserver(Observer* observer) OVERRIDE; 92 virtual void RemoveObserver(Observer* observer) OVERRIDE; 93 virtual bool HasObserver(Observer* observer) OVERRIDE; 94 virtual void EmitLoginPromptVisible() OVERRIDE; 95 virtual void RestartJob(int pid, const std::string& command_line) OVERRIDE; 96 virtual void StartSession(const std::string& user_email) OVERRIDE; 97 virtual void StopSession() OVERRIDE; 98 virtual void StartDeviceWipe() OVERRIDE; 99 virtual void RequestLockScreen() OVERRIDE; 100 virtual void NotifyLockScreenShown() OVERRIDE; 101 virtual void NotifyLockScreenDismissed() OVERRIDE; 102 virtual void RetrieveActiveSessions( 103 const ActiveSessionsCallback& callback) OVERRIDE; 104 virtual void RetrieveDevicePolicy( 105 const RetrievePolicyCallback& callback) OVERRIDE; 106 virtual void RetrievePolicyForUser( 107 const std::string& username, 108 const RetrievePolicyCallback& callback) OVERRIDE; 109 virtual std::string BlockingRetrievePolicyForUser( 110 const std::string& username) OVERRIDE; 111 virtual void RetrieveDeviceLocalAccountPolicy( 112 const std::string& account_id, 113 const RetrievePolicyCallback& callback) OVERRIDE; 114 virtual void StoreDevicePolicy(const std::string& policy_blob, 115 const StorePolicyCallback& callback) OVERRIDE; 116 virtual void StorePolicyForUser(const std::string& username, 117 const std::string& policy_blob, 118 const StorePolicyCallback& callback) OVERRIDE; 119 virtual void StoreDeviceLocalAccountPolicy( 120 const std::string& account_id, 121 const std::string& policy_blob, 122 const StorePolicyCallback& callback) OVERRIDE; 123 virtual void SetFlagsForUser( 124 const std::string& account_id, 125 const std::vector<std::string>& flags) OVERRIDE; 126 virtual void GetServerBackedStateKeys( 127 const StateKeysCallback& callback) OVERRIDE; 128 129 private: 130 struct PolicyState { 131 bool store_result_; 132 std::string policy_blob_; 133 std::vector<StorePolicyCallback> store_callbacks_; 134 std::vector<RetrievePolicyCallback> retrieve_callbacks_; 135 136 PolicyState(); 137 ~PolicyState(); 138 139 bool HasPendingOperations() const { 140 return !store_callbacks_.empty() || !retrieve_callbacks_.empty(); 141 } 142 }; 143 144 PolicyState device_policy_; 145 std::map<std::string, PolicyState> device_local_account_policy_; 146 147 DISALLOW_COPY_AND_ASSIGN(DeviceSettingsTestHelper); 148}; 149 150// Wraps the singleton device settings and initializes it to the point where it 151// reports OWNERSHIP_NONE for the ownership status. 152class ScopedDeviceSettingsTestHelper : public DeviceSettingsTestHelper { 153 public: 154 ScopedDeviceSettingsTestHelper(); 155 virtual ~ScopedDeviceSettingsTestHelper(); 156 157 private: 158 DISALLOW_COPY_AND_ASSIGN(ScopedDeviceSettingsTestHelper); 159}; 160 161// A convenience test base class that initializes a DeviceSettingsService 162// instance for testing and allows for straightforward updating of device 163// settings. |device_settings_service_| starts out in uninitialized state, so 164// startup code gets tested as well. 165class DeviceSettingsTestBase : public testing::Test { 166 protected: 167 DeviceSettingsTestBase(); 168 virtual ~DeviceSettingsTestBase(); 169 170 virtual void SetUp() OVERRIDE; 171 virtual void TearDown() OVERRIDE; 172 173 // Flushes any pending device settings operations. 174 void FlushDeviceSettings(); 175 176 // Triggers an owner key and device settings reload on 177 // |device_settings_service_| and flushes the resulting load operation. 178 void ReloadDeviceSettings(); 179 180 void InitOwner(const std::string& user_id, bool tpm_is_ready); 181 182 content::TestBrowserThreadBundle thread_bundle_; 183 184 policy::DevicePolicyBuilder device_policy_; 185 186 DeviceSettingsTestHelper device_settings_test_helper_; 187 FakeUserManager* user_manager_; 188 ScopedUserManagerEnabler user_manager_enabler_; 189 scoped_ptr<TestingProfile> profile_; 190 scoped_refptr<MockOwnerKeyUtil> owner_key_util_; 191 // Local DeviceSettingsService instance for tests. Avoid using in combination 192 // with the global instance (DeviceSettingsService::Get()). 193 DeviceSettingsService device_settings_service_; 194 195 chromeos::FakeDBusThreadManager* fake_dbus_thread_manager_; 196 197 private: 198 DISALLOW_COPY_AND_ASSIGN(DeviceSettingsTestBase); 199}; 200 201} // namespace chromeos 202 203#endif // CHROME_BROWSER_CHROMEOS_SETTINGS_DEVICE_SETTINGS_TEST_HELPER_H_ 204