device_settings_service_unittest.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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_service.h" 6 7#include "base/basictypes.h" 8#include "base/bind.h" 9#include "base/bind_helpers.h" 10#include "base/compiler_specific.h" 11#include "base/memory/ref_counted.h" 12#include "base/message_loop.h" 13#include "chrome/browser/chromeos/settings/device_settings_test_helper.h" 14#include "chrome/browser/chromeos/settings/mock_owner_key_util.h" 15#include "chrome/browser/policy/policy_builder.h" 16#include "chrome/browser/policy/proto/chrome_device_policy.pb.h" 17#include "chrome/browser/policy/proto/device_management_backend.pb.h" 18#include "content/public/test/test_browser_thread.h" 19#include "testing/gmock/include/gmock/gmock.h" 20#include "testing/gtest/include/gtest/gtest.h" 21 22namespace em = enterprise_management; 23 24using ::testing::Mock; 25 26namespace chromeos { 27 28namespace { 29 30class MockDeviceSettingsObserver : public DeviceSettingsService::Observer { 31 public: 32 virtual ~MockDeviceSettingsObserver() {} 33 34 MOCK_METHOD0(OwnershipStatusChanged, void()); 35 MOCK_METHOD0(DeviceSettingsUpdated, void()); 36}; 37 38} // namespace 39 40class DeviceSettingsServiceTest : public testing::Test { 41 public: 42 void SetOperationCompleted() { 43 operation_completed_ = true; 44 } 45 46 void SetOwnershipStatus( 47 DeviceSettingsService::OwnershipStatus ownership_status, 48 bool is_owner) { 49 is_owner_ = is_owner; 50 ownership_status_ = ownership_status; 51 } 52 53 protected: 54 DeviceSettingsServiceTest() 55 : owner_key_util_(new chromeos::MockOwnerKeyUtil()), 56 message_loop_(MessageLoop::TYPE_UI), 57 ui_thread_(content::BrowserThread::UI, &message_loop_), 58 file_thread_(content::BrowserThread::FILE, &message_loop_), 59 operation_completed_(false), 60 is_owner_(true), 61 ownership_status_(DeviceSettingsService::OWNERSHIP_UNKNOWN) {} 62 63 virtual void SetUp() OVERRIDE { 64 policy_.payload().mutable_device_policy_refresh_rate()-> 65 set_device_policy_refresh_rate(120); 66 policy_.Build(); 67 device_settings_test_helper_.set_policy_blob(policy_.GetBlob()); 68 69 device_settings_service_.Initialize(&device_settings_test_helper_, 70 owner_key_util_); 71 } 72 73 virtual void TearDown() OVERRIDE { 74 device_settings_test_helper_.Flush(); 75 device_settings_service_.Shutdown(); 76 } 77 78 void CheckPolicy() { 79 ASSERT_TRUE(device_settings_service_.policy_data()); 80 EXPECT_EQ(policy_.policy_data().SerializeAsString(), 81 device_settings_service_.policy_data()->SerializeAsString()); 82 ASSERT_TRUE(device_settings_service_.device_settings()); 83 EXPECT_EQ(policy_.payload().SerializeAsString(), 84 device_settings_service_.device_settings()->SerializeAsString()); 85 } 86 87 policy::DevicePolicyBuilder policy_; 88 scoped_refptr<MockOwnerKeyUtil> owner_key_util_; 89 90 DeviceSettingsTestHelper device_settings_test_helper_; 91 DeviceSettingsService device_settings_service_; 92 93 MessageLoop message_loop_; 94 content::TestBrowserThread ui_thread_; 95 content::TestBrowserThread file_thread_; 96 97 bool operation_completed_; 98 bool is_owner_; 99 DeviceSettingsService::OwnershipStatus ownership_status_; 100 101 private: 102 DISALLOW_COPY_AND_ASSIGN(DeviceSettingsServiceTest); 103}; 104 105TEST_F(DeviceSettingsServiceTest, LoadNoKey) { 106 device_settings_service_.Load(); 107 device_settings_test_helper_.Flush(); 108 109 EXPECT_EQ(DeviceSettingsService::STORE_KEY_UNAVAILABLE, 110 device_settings_service_.status()); 111 EXPECT_FALSE(device_settings_service_.policy_data()); 112 EXPECT_FALSE(device_settings_service_.device_settings()); 113} 114 115TEST_F(DeviceSettingsServiceTest, LoadNoPolicy) { 116 device_settings_test_helper_.set_policy_blob(std::string()); 117 owner_key_util_->SetPublicKeyFromPrivateKey(policy_.signing_key()); 118 device_settings_service_.Load(); 119 device_settings_test_helper_.Flush(); 120 121 EXPECT_EQ(DeviceSettingsService::STORE_NO_POLICY, 122 device_settings_service_.status()); 123 EXPECT_FALSE(device_settings_service_.policy_data()); 124 EXPECT_FALSE(device_settings_service_.device_settings()); 125} 126 127TEST_F(DeviceSettingsServiceTest, LoadValidationError) { 128 policy_.policy().set_policy_data_signature("bad"); 129 device_settings_test_helper_.set_policy_blob(policy_.GetBlob()); 130 owner_key_util_->SetPublicKeyFromPrivateKey(policy_.signing_key()); 131 device_settings_service_.Load(); 132 device_settings_test_helper_.Flush(); 133 134 EXPECT_EQ(DeviceSettingsService::STORE_VALIDATION_ERROR, 135 device_settings_service_.status()); 136 EXPECT_FALSE(device_settings_service_.policy_data()); 137 EXPECT_FALSE(device_settings_service_.device_settings()); 138} 139 140TEST_F(DeviceSettingsServiceTest, LoadValidationErrorFutureTimestamp) { 141 base::Time timestamp(base::Time::NowFromSystemTime() + 142 base::TimeDelta::FromDays(5000)); 143 policy_.policy_data().set_timestamp( 144 (timestamp - base::Time::UnixEpoch()).InMilliseconds()); 145 policy_.Build(); 146 device_settings_test_helper_.set_policy_blob(policy_.GetBlob()); 147 owner_key_util_->SetPublicKeyFromPrivateKey(policy_.signing_key()); 148 device_settings_service_.Load(); 149 device_settings_test_helper_.Flush(); 150 151 EXPECT_EQ(DeviceSettingsService::STORE_TEMP_VALIDATION_ERROR, 152 device_settings_service_.status()); 153 EXPECT_FALSE(device_settings_service_.policy_data()); 154 EXPECT_FALSE(device_settings_service_.device_settings()); 155} 156 157TEST_F(DeviceSettingsServiceTest, LoadSuccess) { 158 owner_key_util_->SetPublicKeyFromPrivateKey(policy_.signing_key()); 159 device_settings_service_.Load(); 160 device_settings_test_helper_.Flush(); 161 162 EXPECT_EQ(DeviceSettingsService::STORE_SUCCESS, 163 device_settings_service_.status()); 164 CheckPolicy(); 165} 166 167TEST_F(DeviceSettingsServiceTest, SignAndStoreNoKey) { 168 owner_key_util_->SetPublicKeyFromPrivateKey(policy_.signing_key()); 169 device_settings_service_.Load(); 170 device_settings_test_helper_.Flush(); 171 EXPECT_EQ(DeviceSettingsService::STORE_SUCCESS, 172 device_settings_service_.status()); 173 174 scoped_ptr<em::ChromeDeviceSettingsProto> new_device_settings( 175 new em::ChromeDeviceSettingsProto(policy_.payload())); 176 new_device_settings->mutable_device_policy_refresh_rate()-> 177 set_device_policy_refresh_rate(300); 178 device_settings_service_.SignAndStore( 179 new_device_settings.Pass(), 180 base::Bind(&DeviceSettingsServiceTest::SetOperationCompleted, 181 base::Unretained(this))); 182 device_settings_test_helper_.Flush(); 183 EXPECT_TRUE(operation_completed_); 184 EXPECT_EQ(DeviceSettingsService::STORE_KEY_UNAVAILABLE, 185 device_settings_service_.status()); 186 CheckPolicy(); 187} 188 189TEST_F(DeviceSettingsServiceTest, SignAndStoreFailure) { 190 owner_key_util_->SetPublicKeyFromPrivateKey(policy_.signing_key()); 191 device_settings_service_.Load(); 192 device_settings_test_helper_.Flush(); 193 EXPECT_EQ(DeviceSettingsService::STORE_SUCCESS, 194 device_settings_service_.status()); 195 196 owner_key_util_->SetPrivateKey(policy_.signing_key()); 197 device_settings_service_.SetUsername(policy_.policy_data().username()); 198 device_settings_test_helper_.Flush(); 199 200 scoped_ptr<em::ChromeDeviceSettingsProto> new_device_settings( 201 new em::ChromeDeviceSettingsProto(policy_.payload())); 202 new_device_settings->mutable_device_policy_refresh_rate()-> 203 set_device_policy_refresh_rate(300); 204 device_settings_test_helper_.set_store_result(false); 205 device_settings_service_.SignAndStore( 206 new_device_settings.Pass(), 207 base::Bind(&DeviceSettingsServiceTest::SetOperationCompleted, 208 base::Unretained(this))); 209 device_settings_test_helper_.Flush(); 210 EXPECT_TRUE(operation_completed_); 211 EXPECT_EQ(DeviceSettingsService::STORE_OPERATION_FAILED, 212 device_settings_service_.status()); 213 CheckPolicy(); 214} 215 216TEST_F(DeviceSettingsServiceTest, SignAndStoreSuccess) { 217 owner_key_util_->SetPublicKeyFromPrivateKey(policy_.signing_key()); 218 device_settings_service_.Load(); 219 device_settings_test_helper_.Flush(); 220 EXPECT_EQ(DeviceSettingsService::STORE_SUCCESS, 221 device_settings_service_.status()); 222 223 owner_key_util_->SetPrivateKey(policy_.signing_key()); 224 device_settings_service_.SetUsername(policy_.policy_data().username()); 225 device_settings_test_helper_.Flush(); 226 227 policy_.payload().mutable_device_policy_refresh_rate()-> 228 set_device_policy_refresh_rate(300); 229 policy_.Build(); 230 device_settings_service_.SignAndStore( 231 scoped_ptr<em::ChromeDeviceSettingsProto>( 232 new em::ChromeDeviceSettingsProto(policy_.payload())), 233 base::Bind(&DeviceSettingsServiceTest::SetOperationCompleted, 234 base::Unretained(this))); 235 device_settings_test_helper_.Flush(); 236 EXPECT_TRUE(operation_completed_); 237 EXPECT_EQ(DeviceSettingsService::STORE_SUCCESS, 238 device_settings_service_.status()); 239 ASSERT_TRUE(device_settings_service_.device_settings()); 240 EXPECT_EQ(policy_.payload().SerializeAsString(), 241 device_settings_service_.device_settings()->SerializeAsString()); 242} 243 244TEST_F(DeviceSettingsServiceTest, StoreFailure) { 245 device_settings_test_helper_.set_policy_blob(std::string()); 246 device_settings_service_.Load(); 247 device_settings_test_helper_.Flush(); 248 EXPECT_EQ(DeviceSettingsService::STORE_KEY_UNAVAILABLE, 249 device_settings_service_.status()); 250 251 device_settings_test_helper_.set_store_result(false); 252 device_settings_service_.Store( 253 policy_.GetCopy(), 254 base::Bind(&DeviceSettingsServiceTest::SetOperationCompleted, 255 base::Unretained(this))); 256 device_settings_test_helper_.Flush(); 257 EXPECT_TRUE(operation_completed_); 258 EXPECT_EQ(DeviceSettingsService::STORE_OPERATION_FAILED, 259 device_settings_service_.status()); 260} 261 262TEST_F(DeviceSettingsServiceTest, StoreSuccess) { 263 device_settings_test_helper_.set_policy_blob(std::string()); 264 device_settings_service_.Load(); 265 device_settings_test_helper_.Flush(); 266 EXPECT_EQ(DeviceSettingsService::STORE_KEY_UNAVAILABLE, 267 device_settings_service_.status()); 268 269 owner_key_util_->SetPublicKeyFromPrivateKey(policy_.signing_key()); 270 device_settings_service_.Store( 271 policy_.GetCopy(), 272 base::Bind(&DeviceSettingsServiceTest::SetOperationCompleted, 273 base::Unretained(this))); 274 device_settings_test_helper_.Flush(); 275 EXPECT_TRUE(operation_completed_); 276 EXPECT_EQ(DeviceSettingsService::STORE_SUCCESS, 277 device_settings_service_.status()); 278 CheckPolicy(); 279} 280 281TEST_F(DeviceSettingsServiceTest, StoreRotation) { 282 owner_key_util_->SetPublicKeyFromPrivateKey(policy_.signing_key()); 283 device_settings_service_.Load(); 284 device_settings_test_helper_.Flush(); 285 EXPECT_EQ(DeviceSettingsService::STORE_SUCCESS, 286 device_settings_service_.status()); 287 288 policy_.payload().mutable_device_policy_refresh_rate()-> 289 set_device_policy_refresh_rate(300); 290 policy_.set_new_signing_key(policy::PolicyBuilder::CreateTestNewSigningKey()); 291 policy_.Build(); 292 device_settings_service_.Store(policy_.GetCopy(), base::Closure()); 293 device_settings_test_helper_.FlushStore(); 294 owner_key_util_->SetPublicKeyFromPrivateKey(policy_.new_signing_key()); 295 device_settings_service_.OwnerKeySet(true); 296 device_settings_test_helper_.Flush(); 297 EXPECT_EQ(DeviceSettingsService::STORE_SUCCESS, 298 device_settings_service_.status()); 299 CheckPolicy(); 300 301 // Check the new key has been loaded. 302 std::vector<uint8> key; 303 ASSERT_TRUE(policy_.new_signing_key()->ExportPublicKey(&key)); 304 EXPECT_EQ(*device_settings_service_.GetOwnerKey()->public_key(), key); 305} 306 307TEST_F(DeviceSettingsServiceTest, OwnershipStatus) { 308 EXPECT_FALSE(device_settings_service_.HasPrivateOwnerKey()); 309 EXPECT_FALSE(device_settings_service_.GetOwnerKey()); 310 EXPECT_EQ(DeviceSettingsService::OWNERSHIP_UNKNOWN, 311 device_settings_service_.GetOwnershipStatus()); 312 313 device_settings_service_.GetOwnershipStatusAsync( 314 base::Bind(&DeviceSettingsServiceTest::SetOwnershipStatus, 315 base::Unretained(this))); 316 device_settings_test_helper_.Flush(); 317 EXPECT_FALSE(device_settings_service_.HasPrivateOwnerKey()); 318 ASSERT_TRUE(device_settings_service_.GetOwnerKey()); 319 EXPECT_FALSE(device_settings_service_.GetOwnerKey()->public_key()); 320 EXPECT_FALSE(device_settings_service_.GetOwnerKey()->private_key()); 321 EXPECT_EQ(DeviceSettingsService::OWNERSHIP_NONE, 322 device_settings_service_.GetOwnershipStatus()); 323 EXPECT_FALSE(is_owner_); 324 EXPECT_EQ(DeviceSettingsService::OWNERSHIP_NONE, ownership_status_); 325 326 owner_key_util_->SetPublicKeyFromPrivateKey(policy_.signing_key()); 327 device_settings_service_.Load(); 328 device_settings_test_helper_.Flush(); 329 device_settings_service_.GetOwnershipStatusAsync( 330 base::Bind(&DeviceSettingsServiceTest::SetOwnershipStatus, 331 base::Unretained(this))); 332 device_settings_test_helper_.Flush(); 333 EXPECT_FALSE(device_settings_service_.HasPrivateOwnerKey()); 334 ASSERT_TRUE(device_settings_service_.GetOwnerKey()); 335 ASSERT_TRUE(device_settings_service_.GetOwnerKey()->public_key()); 336 std::vector<uint8> key; 337 ASSERT_TRUE(policy_.signing_key()->ExportPublicKey(&key)); 338 EXPECT_EQ(*device_settings_service_.GetOwnerKey()->public_key(), key); 339 EXPECT_FALSE(device_settings_service_.GetOwnerKey()->private_key()); 340 EXPECT_EQ(DeviceSettingsService::OWNERSHIP_TAKEN, 341 device_settings_service_.GetOwnershipStatus()); 342 EXPECT_FALSE(is_owner_); 343 EXPECT_EQ(DeviceSettingsService::OWNERSHIP_TAKEN, ownership_status_); 344 345 owner_key_util_->SetPrivateKey(policy_.signing_key()); 346 device_settings_service_.SetUsername(policy_.policy_data().username()); 347 device_settings_service_.GetOwnershipStatusAsync( 348 base::Bind(&DeviceSettingsServiceTest::SetOwnershipStatus, 349 base::Unretained(this))); 350 device_settings_test_helper_.Flush(); 351 EXPECT_TRUE(device_settings_service_.HasPrivateOwnerKey()); 352 ASSERT_TRUE(device_settings_service_.GetOwnerKey()); 353 ASSERT_TRUE(device_settings_service_.GetOwnerKey()->public_key()); 354 ASSERT_TRUE(policy_.signing_key()->ExportPublicKey(&key)); 355 EXPECT_EQ(*device_settings_service_.GetOwnerKey()->public_key(), key); 356 EXPECT_TRUE(device_settings_service_.GetOwnerKey()->private_key()); 357 EXPECT_EQ(DeviceSettingsService::OWNERSHIP_TAKEN, 358 device_settings_service_.GetOwnershipStatus()); 359 EXPECT_TRUE(is_owner_); 360 EXPECT_EQ(DeviceSettingsService::OWNERSHIP_TAKEN, ownership_status_); 361} 362 363TEST_F(DeviceSettingsServiceTest, Observer) { 364 MockDeviceSettingsObserver observer_; 365 device_settings_service_.AddObserver(&observer_); 366 367 EXPECT_CALL(observer_, OwnershipStatusChanged()).Times(1); 368 EXPECT_CALL(observer_, DeviceSettingsUpdated()).Times(1); 369 device_settings_service_.Load(); 370 device_settings_test_helper_.Flush(); 371 Mock::VerifyAndClearExpectations(&observer_); 372 373 EXPECT_CALL(observer_, OwnershipStatusChanged()).Times(1); 374 EXPECT_CALL(observer_, DeviceSettingsUpdated()).Times(1); 375 owner_key_util_->SetPublicKeyFromPrivateKey(policy_.signing_key()); 376 device_settings_service_.OwnerKeySet(true); 377 device_settings_test_helper_.Flush(); 378 Mock::VerifyAndClearExpectations(&observer_); 379 380 EXPECT_CALL(observer_, OwnershipStatusChanged()).Times(0); 381 EXPECT_CALL(observer_, DeviceSettingsUpdated()).Times(1); 382 device_settings_service_.Store(policy_.GetCopy(), base::Closure()); 383 device_settings_test_helper_.Flush(); 384 Mock::VerifyAndClearExpectations(&observer_); 385 386 EXPECT_CALL(observer_, OwnershipStatusChanged()).Times(0); 387 EXPECT_CALL(observer_, DeviceSettingsUpdated()).Times(1); 388 device_settings_service_.PropertyChangeComplete(true); 389 device_settings_test_helper_.Flush(); 390 Mock::VerifyAndClearExpectations(&observer_); 391 392 device_settings_service_.RemoveObserver(&observer_); 393} 394 395} // namespace chromeos 396