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 #include "chrome/browser/chromeos/settings/device_settings_test_helper.h" 6 7 #include "base/message_loop/message_loop.h" 8 #include "base/run_loop.h" 9 #include "base/threading/sequenced_worker_pool.h" 10 #include "chrome/browser/chromeos/policy/proto/chrome_device_policy.pb.h" 11 #include "chrome/browser/chromeos/settings/device_settings_service.h" 12 #include "chrome/browser/chromeos/settings/mock_owner_key_util.h" 13 #include "chromeos/dbus/dbus_thread_manager.h" 14 #include "chromeos/network/network_handler.h" 15 #include "content/public/browser/browser_thread.h" 16 17 namespace chromeos { 18 19 DeviceSettingsTestHelper::DeviceSettingsTestHelper() {} 20 21 DeviceSettingsTestHelper::~DeviceSettingsTestHelper() {} 22 23 void DeviceSettingsTestHelper::FlushLoops() { 24 // DeviceSettingsService may trigger operations that hop back and forth 25 // between the message loop and the blocking pool. 2 iterations are currently 26 // sufficient (key loading, signing). 27 for (int i = 0; i < 2; ++i) { 28 base::MessageLoop::current()->RunUntilIdle(); 29 content::BrowserThread::GetBlockingPool()->FlushForTesting(); 30 } 31 base::MessageLoop::current()->RunUntilIdle(); 32 } 33 34 void DeviceSettingsTestHelper::FlushStore() { 35 std::vector<StorePolicyCallback> callbacks; 36 callbacks.swap(device_policy_.store_callbacks_); 37 for (std::vector<StorePolicyCallback>::iterator cb(callbacks.begin()); 38 cb != callbacks.end(); ++cb) { 39 cb->Run(device_policy_.store_result_); 40 } 41 42 std::map<std::string, PolicyState>::iterator device_local_account_state; 43 for (device_local_account_state = device_local_account_policy_.begin(); 44 device_local_account_state != device_local_account_policy_.end(); 45 ++device_local_account_state) { 46 callbacks.swap(device_local_account_state->second.store_callbacks_); 47 for (std::vector<StorePolicyCallback>::iterator cb(callbacks.begin()); 48 cb != callbacks.end(); ++cb) { 49 cb->Run(device_local_account_state->second.store_result_); 50 } 51 } 52 } 53 54 void DeviceSettingsTestHelper::FlushRetrieve() { 55 std::vector<RetrievePolicyCallback> callbacks; 56 callbacks.swap(device_policy_.retrieve_callbacks_); 57 for (std::vector<RetrievePolicyCallback>::iterator cb(callbacks.begin()); 58 cb != callbacks.end(); ++cb) { 59 cb->Run(device_policy_.policy_blob_); 60 } 61 62 std::map<std::string, PolicyState>::iterator device_local_account_state; 63 for (device_local_account_state = device_local_account_policy_.begin(); 64 device_local_account_state != device_local_account_policy_.end(); 65 ++device_local_account_state) { 66 std::vector<RetrievePolicyCallback> callbacks; 67 callbacks.swap(device_local_account_state->second.retrieve_callbacks_); 68 for (std::vector<RetrievePolicyCallback>::iterator cb(callbacks.begin()); 69 cb != callbacks.end(); ++cb) { 70 cb->Run(device_local_account_state->second.policy_blob_); 71 } 72 } 73 } 74 75 void DeviceSettingsTestHelper::Flush() { 76 do { 77 FlushLoops(); 78 FlushStore(); 79 FlushLoops(); 80 FlushRetrieve(); 81 FlushLoops(); 82 } while (HasPendingOperations()); 83 } 84 85 bool DeviceSettingsTestHelper::HasPendingOperations() const { 86 if (device_policy_.HasPendingOperations()) 87 return true; 88 89 std::map<std::string, PolicyState>::const_iterator device_local_account_state; 90 for (device_local_account_state = device_local_account_policy_.begin(); 91 device_local_account_state != device_local_account_policy_.end(); 92 ++device_local_account_state) { 93 if (device_local_account_state->second.HasPendingOperations()) 94 return true; 95 } 96 97 return false; 98 } 99 100 void DeviceSettingsTestHelper::Init(dbus::Bus* bus) {} 101 102 void DeviceSettingsTestHelper::AddObserver(Observer* observer) {} 103 104 void DeviceSettingsTestHelper::RemoveObserver(Observer* observer) {} 105 106 bool DeviceSettingsTestHelper::HasObserver(Observer* observer) { 107 return false; 108 } 109 110 void DeviceSettingsTestHelper::EmitLoginPromptReady() {} 111 112 void DeviceSettingsTestHelper::EmitLoginPromptVisible() {} 113 114 void DeviceSettingsTestHelper::RestartJob(int pid, 115 const std::string& command_line) {} 116 117 void DeviceSettingsTestHelper::StartSession(const std::string& user_email) {} 118 119 void DeviceSettingsTestHelper::StopSession() {} 120 121 void DeviceSettingsTestHelper::StartDeviceWipe() {} 122 123 void DeviceSettingsTestHelper::RequestLockScreen() {} 124 125 void DeviceSettingsTestHelper::NotifyLockScreenShown() {} 126 127 void DeviceSettingsTestHelper::NotifyLockScreenDismissed() {} 128 129 void DeviceSettingsTestHelper::RetrieveActiveSessions( 130 const ActiveSessionsCallback& callback) {} 131 132 void DeviceSettingsTestHelper::RetrieveDevicePolicy( 133 const RetrievePolicyCallback& callback) { 134 device_policy_.retrieve_callbacks_.push_back(callback); 135 } 136 137 void DeviceSettingsTestHelper::RetrievePolicyForUser( 138 const std::string& username, 139 const RetrievePolicyCallback& callback) { 140 } 141 142 std::string DeviceSettingsTestHelper::BlockingRetrievePolicyForUser( 143 const std::string& username) { 144 return ""; 145 } 146 147 void DeviceSettingsTestHelper::RetrieveDeviceLocalAccountPolicy( 148 const std::string& account_id, 149 const RetrievePolicyCallback& callback) { 150 device_local_account_policy_[account_id].retrieve_callbacks_.push_back( 151 callback); 152 } 153 154 void DeviceSettingsTestHelper::StoreDevicePolicy( 155 const std::string& policy_blob, 156 const StorePolicyCallback& callback) { 157 device_policy_.policy_blob_ = policy_blob; 158 device_policy_.store_callbacks_.push_back(callback); 159 } 160 161 void DeviceSettingsTestHelper::StorePolicyForUser( 162 const std::string& username, 163 const std::string& policy_blob, 164 const std::string& policy_key, 165 const StorePolicyCallback& callback) { 166 } 167 168 void DeviceSettingsTestHelper::StoreDeviceLocalAccountPolicy( 169 const std::string& account_id, 170 const std::string& policy_blob, 171 const StorePolicyCallback& callback) { 172 device_local_account_policy_[account_id].policy_blob_ = policy_blob; 173 device_local_account_policy_[account_id].store_callbacks_.push_back(callback); 174 } 175 176 void DeviceSettingsTestHelper::SetFlagsForUser( 177 const std::string& account_id, 178 const std::vector<std::string>& flags) {} 179 180 DeviceSettingsTestHelper::PolicyState::PolicyState() 181 : store_result_(true) {} 182 183 DeviceSettingsTestHelper::PolicyState::~PolicyState() {} 184 185 ScopedDeviceSettingsTestHelper::ScopedDeviceSettingsTestHelper() { 186 DeviceSettingsService::Initialize(); 187 DeviceSettingsService::Get()->SetSessionManager(this, new MockOwnerKeyUtil()); 188 DeviceSettingsService::Get()->Load(); 189 Flush(); 190 } 191 192 ScopedDeviceSettingsTestHelper::~ScopedDeviceSettingsTestHelper() { 193 Flush(); 194 DeviceSettingsService::Get()->UnsetSessionManager(); 195 DeviceSettingsService::Shutdown(); 196 } 197 198 DeviceSettingsTestBase::DeviceSettingsTestBase() 199 : loop_(base::MessageLoop::TYPE_UI), 200 ui_thread_(content::BrowserThread::UI, &loop_), 201 file_thread_(content::BrowserThread::FILE, &loop_), 202 owner_key_util_(new MockOwnerKeyUtil()) {} 203 204 DeviceSettingsTestBase::~DeviceSettingsTestBase() { 205 base::RunLoop().RunUntilIdle(); 206 } 207 208 void DeviceSettingsTestBase::SetUp() { 209 // Initialize DBusThreadManager with a stub implementation. 210 DBusThreadManager::InitializeWithStub(); 211 NetworkHandler::Initialize(); 212 loop_.RunUntilIdle(); 213 214 device_policy_.payload().mutable_metrics_enabled()->set_metrics_enabled( 215 false); 216 owner_key_util_->SetPublicKeyFromPrivateKey(*device_policy_.GetSigningKey()); 217 device_policy_.Build(); 218 device_settings_test_helper_.set_policy_blob(device_policy_.GetBlob()); 219 device_settings_service_.SetSessionManager(&device_settings_test_helper_, 220 owner_key_util_); 221 } 222 223 void DeviceSettingsTestBase::TearDown() { 224 FlushDeviceSettings(); 225 device_settings_service_.UnsetSessionManager(); 226 NetworkHandler::Shutdown(); 227 DBusThreadManager::Shutdown(); 228 } 229 230 void DeviceSettingsTestBase::FlushDeviceSettings() { 231 device_settings_test_helper_.Flush(); 232 } 233 234 void DeviceSettingsTestBase::ReloadDeviceSettings() { 235 device_settings_service_.OwnerKeySet(true); 236 FlushDeviceSettings(); 237 } 238 239 } // namespace chromeos 240