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