| OLD | NEW |
| (Empty) | |
| 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 |
| 22 namespace em = enterprise_management; |
| 23 |
| 24 using ::testing::Mock; |
| 25 |
| 26 namespace chromeos { |
| 27 |
| 28 namespace { |
| 29 |
| 30 class 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 |
| 40 class 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 |
| 105 TEST_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 |
| 115 TEST_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 |
| 127 TEST_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 |
| 140 TEST_F(DeviceSettingsServiceTest, LoadSuccess) { |
| 141 owner_key_util_->SetPublicKeyFromPrivateKey(policy_.signing_key()); |
| 142 device_settings_service_.Load(); |
| 143 device_settings_test_helper_.Flush(); |
| 144 |
| 145 EXPECT_EQ(DeviceSettingsService::STORE_SUCCESS, |
| 146 device_settings_service_.status()); |
| 147 CheckPolicy(); |
| 148 } |
| 149 |
| 150 TEST_F(DeviceSettingsServiceTest, SignAndStoreNoKey) { |
| 151 owner_key_util_->SetPublicKeyFromPrivateKey(policy_.signing_key()); |
| 152 device_settings_service_.Load(); |
| 153 device_settings_test_helper_.Flush(); |
| 154 EXPECT_EQ(DeviceSettingsService::STORE_SUCCESS, |
| 155 device_settings_service_.status()); |
| 156 |
| 157 scoped_ptr<em::ChromeDeviceSettingsProto> new_device_settings( |
| 158 new em::ChromeDeviceSettingsProto(policy_.payload())); |
| 159 new_device_settings->mutable_device_policy_refresh_rate()-> |
| 160 set_device_policy_refresh_rate(300); |
| 161 device_settings_service_.SignAndStore( |
| 162 new_device_settings.Pass(), |
| 163 base::Bind(&DeviceSettingsServiceTest::SetOperationCompleted, |
| 164 base::Unretained(this))); |
| 165 device_settings_test_helper_.Flush(); |
| 166 EXPECT_TRUE(operation_completed_); |
| 167 EXPECT_EQ(DeviceSettingsService::STORE_KEY_UNAVAILABLE, |
| 168 device_settings_service_.status()); |
| 169 CheckPolicy(); |
| 170 } |
| 171 |
| 172 TEST_F(DeviceSettingsServiceTest, SignAndStoreFailure) { |
| 173 owner_key_util_->SetPublicKeyFromPrivateKey(policy_.signing_key()); |
| 174 device_settings_service_.Load(); |
| 175 device_settings_test_helper_.Flush(); |
| 176 EXPECT_EQ(DeviceSettingsService::STORE_SUCCESS, |
| 177 device_settings_service_.status()); |
| 178 |
| 179 owner_key_util_->SetPrivateKey(policy_.signing_key()); |
| 180 device_settings_service_.SetUsername(policy_.policy_data().username()); |
| 181 device_settings_test_helper_.Flush(); |
| 182 |
| 183 scoped_ptr<em::ChromeDeviceSettingsProto> new_device_settings( |
| 184 new em::ChromeDeviceSettingsProto(policy_.payload())); |
| 185 new_device_settings->mutable_device_policy_refresh_rate()-> |
| 186 set_device_policy_refresh_rate(300); |
| 187 device_settings_test_helper_.set_store_result(false); |
| 188 device_settings_service_.SignAndStore( |
| 189 new_device_settings.Pass(), |
| 190 base::Bind(&DeviceSettingsServiceTest::SetOperationCompleted, |
| 191 base::Unretained(this))); |
| 192 device_settings_test_helper_.Flush(); |
| 193 EXPECT_TRUE(operation_completed_); |
| 194 EXPECT_EQ(DeviceSettingsService::STORE_OPERATION_FAILED, |
| 195 device_settings_service_.status()); |
| 196 CheckPolicy(); |
| 197 } |
| 198 |
| 199 TEST_F(DeviceSettingsServiceTest, SignAndStoreSuccess) { |
| 200 owner_key_util_->SetPublicKeyFromPrivateKey(policy_.signing_key()); |
| 201 device_settings_service_.Load(); |
| 202 device_settings_test_helper_.Flush(); |
| 203 EXPECT_EQ(DeviceSettingsService::STORE_SUCCESS, |
| 204 device_settings_service_.status()); |
| 205 |
| 206 owner_key_util_->SetPrivateKey(policy_.signing_key()); |
| 207 device_settings_service_.SetUsername(policy_.policy_data().username()); |
| 208 device_settings_test_helper_.Flush(); |
| 209 |
| 210 policy_.payload().mutable_device_policy_refresh_rate()-> |
| 211 set_device_policy_refresh_rate(300); |
| 212 policy_.Build(); |
| 213 device_settings_service_.SignAndStore( |
| 214 scoped_ptr<em::ChromeDeviceSettingsProto>( |
| 215 new em::ChromeDeviceSettingsProto(policy_.payload())), |
| 216 base::Bind(&DeviceSettingsServiceTest::SetOperationCompleted, |
| 217 base::Unretained(this))); |
| 218 device_settings_test_helper_.Flush(); |
| 219 EXPECT_TRUE(operation_completed_); |
| 220 EXPECT_EQ(DeviceSettingsService::STORE_SUCCESS, |
| 221 device_settings_service_.status()); |
| 222 ASSERT_TRUE(device_settings_service_.device_settings()); |
| 223 EXPECT_EQ(policy_.payload().SerializeAsString(), |
| 224 device_settings_service_.device_settings()->SerializeAsString()); |
| 225 } |
| 226 |
| 227 TEST_F(DeviceSettingsServiceTest, StoreFailure) { |
| 228 device_settings_test_helper_.set_policy_blob(std::string()); |
| 229 device_settings_service_.Load(); |
| 230 device_settings_test_helper_.Flush(); |
| 231 EXPECT_EQ(DeviceSettingsService::STORE_KEY_UNAVAILABLE, |
| 232 device_settings_service_.status()); |
| 233 |
| 234 device_settings_test_helper_.set_store_result(false); |
| 235 device_settings_service_.Store( |
| 236 policy_.GetBlob(), |
| 237 base::Bind(&DeviceSettingsServiceTest::SetOperationCompleted, |
| 238 base::Unretained(this))); |
| 239 device_settings_test_helper_.Flush(); |
| 240 EXPECT_TRUE(operation_completed_); |
| 241 EXPECT_EQ(DeviceSettingsService::STORE_OPERATION_FAILED, |
| 242 device_settings_service_.status()); |
| 243 } |
| 244 |
| 245 TEST_F(DeviceSettingsServiceTest, StoreSuccess) { |
| 246 device_settings_test_helper_.set_policy_blob(std::string()); |
| 247 device_settings_service_.Load(); |
| 248 device_settings_test_helper_.Flush(); |
| 249 EXPECT_EQ(DeviceSettingsService::STORE_KEY_UNAVAILABLE, |
| 250 device_settings_service_.status()); |
| 251 |
| 252 owner_key_util_->SetPublicKeyFromPrivateKey(policy_.signing_key()); |
| 253 device_settings_service_.Store( |
| 254 policy_.GetBlob(), |
| 255 base::Bind(&DeviceSettingsServiceTest::SetOperationCompleted, |
| 256 base::Unretained(this))); |
| 257 device_settings_test_helper_.Flush(); |
| 258 EXPECT_TRUE(operation_completed_); |
| 259 EXPECT_EQ(DeviceSettingsService::STORE_SUCCESS, |
| 260 device_settings_service_.status()); |
| 261 CheckPolicy(); |
| 262 } |
| 263 |
| 264 TEST_F(DeviceSettingsServiceTest, StoreRotation) { |
| 265 owner_key_util_->SetPublicKeyFromPrivateKey(policy_.signing_key()); |
| 266 device_settings_service_.Load(); |
| 267 device_settings_test_helper_.Flush(); |
| 268 EXPECT_EQ(DeviceSettingsService::STORE_SUCCESS, |
| 269 device_settings_service_.status()); |
| 270 |
| 271 policy_.payload().mutable_device_policy_refresh_rate()-> |
| 272 set_device_policy_refresh_rate(300); |
| 273 policy_.set_new_signing_key(policy::PolicyBuilder::CreateTestNewSigningKey()); |
| 274 policy_.Build(); |
| 275 device_settings_service_.Store(policy_.GetBlob(), base::Closure()); |
| 276 device_settings_test_helper_.FlushStore(); |
| 277 owner_key_util_->SetPublicKeyFromPrivateKey(policy_.new_signing_key()); |
| 278 device_settings_service_.OwnerKeySet(true); |
| 279 device_settings_test_helper_.Flush(); |
| 280 EXPECT_EQ(DeviceSettingsService::STORE_SUCCESS, |
| 281 device_settings_service_.status()); |
| 282 CheckPolicy(); |
| 283 |
| 284 // Check the new key has been loaded. |
| 285 std::vector<uint8> key; |
| 286 ASSERT_TRUE(policy_.new_signing_key()->ExportPublicKey(&key)); |
| 287 EXPECT_EQ(*device_settings_service_.GetOwnerKey()->public_key(), key); |
| 288 } |
| 289 |
| 290 TEST_F(DeviceSettingsServiceTest, OwnershipStatus) { |
| 291 EXPECT_FALSE(device_settings_service_.HasPrivateOwnerKey()); |
| 292 EXPECT_FALSE(device_settings_service_.GetOwnerKey()); |
| 293 EXPECT_EQ(DeviceSettingsService::OWNERSHIP_UNKNOWN, |
| 294 device_settings_service_.GetOwnershipStatus()); |
| 295 |
| 296 device_settings_service_.GetOwnershipStatusAsync( |
| 297 base::Bind(&DeviceSettingsServiceTest::SetOwnershipStatus, |
| 298 base::Unretained(this))); |
| 299 device_settings_test_helper_.Flush(); |
| 300 EXPECT_FALSE(device_settings_service_.HasPrivateOwnerKey()); |
| 301 ASSERT_TRUE(device_settings_service_.GetOwnerKey()); |
| 302 EXPECT_FALSE(device_settings_service_.GetOwnerKey()->public_key()); |
| 303 EXPECT_FALSE(device_settings_service_.GetOwnerKey()->private_key()); |
| 304 EXPECT_EQ(DeviceSettingsService::OWNERSHIP_NONE, |
| 305 device_settings_service_.GetOwnershipStatus()); |
| 306 EXPECT_FALSE(is_owner_); |
| 307 EXPECT_EQ(DeviceSettingsService::OWNERSHIP_NONE, ownership_status_); |
| 308 |
| 309 owner_key_util_->SetPublicKeyFromPrivateKey(policy_.signing_key()); |
| 310 device_settings_service_.Load(); |
| 311 device_settings_test_helper_.Flush(); |
| 312 device_settings_service_.GetOwnershipStatusAsync( |
| 313 base::Bind(&DeviceSettingsServiceTest::SetOwnershipStatus, |
| 314 base::Unretained(this))); |
| 315 device_settings_test_helper_.Flush(); |
| 316 EXPECT_FALSE(device_settings_service_.HasPrivateOwnerKey()); |
| 317 ASSERT_TRUE(device_settings_service_.GetOwnerKey()); |
| 318 ASSERT_TRUE(device_settings_service_.GetOwnerKey()->public_key()); |
| 319 std::vector<uint8> key; |
| 320 ASSERT_TRUE(policy_.signing_key()->ExportPublicKey(&key)); |
| 321 EXPECT_EQ(*device_settings_service_.GetOwnerKey()->public_key(), key); |
| 322 EXPECT_FALSE(device_settings_service_.GetOwnerKey()->private_key()); |
| 323 EXPECT_EQ(DeviceSettingsService::OWNERSHIP_TAKEN, |
| 324 device_settings_service_.GetOwnershipStatus()); |
| 325 EXPECT_FALSE(is_owner_); |
| 326 EXPECT_EQ(DeviceSettingsService::OWNERSHIP_TAKEN, ownership_status_); |
| 327 |
| 328 owner_key_util_->SetPrivateKey(policy_.signing_key()); |
| 329 device_settings_service_.SetUsername(policy_.policy_data().username()); |
| 330 device_settings_service_.GetOwnershipStatusAsync( |
| 331 base::Bind(&DeviceSettingsServiceTest::SetOwnershipStatus, |
| 332 base::Unretained(this))); |
| 333 device_settings_test_helper_.Flush(); |
| 334 EXPECT_TRUE(device_settings_service_.HasPrivateOwnerKey()); |
| 335 ASSERT_TRUE(device_settings_service_.GetOwnerKey()); |
| 336 ASSERT_TRUE(device_settings_service_.GetOwnerKey()->public_key()); |
| 337 ASSERT_TRUE(policy_.signing_key()->ExportPublicKey(&key)); |
| 338 EXPECT_EQ(*device_settings_service_.GetOwnerKey()->public_key(), key); |
| 339 EXPECT_TRUE(device_settings_service_.GetOwnerKey()->private_key()); |
| 340 EXPECT_EQ(DeviceSettingsService::OWNERSHIP_TAKEN, |
| 341 device_settings_service_.GetOwnershipStatus()); |
| 342 EXPECT_TRUE(is_owner_); |
| 343 EXPECT_EQ(DeviceSettingsService::OWNERSHIP_TAKEN, ownership_status_); |
| 344 } |
| 345 |
| 346 TEST_F(DeviceSettingsServiceTest, Observer) { |
| 347 MockDeviceSettingsObserver observer_; |
| 348 device_settings_service_.AddObserver(&observer_); |
| 349 |
| 350 EXPECT_CALL(observer_, OwnershipStatusChanged()).Times(1); |
| 351 EXPECT_CALL(observer_, DeviceSettingsUpdated()).Times(1); |
| 352 device_settings_service_.Load(); |
| 353 device_settings_test_helper_.Flush(); |
| 354 Mock::VerifyAndClearExpectations(&observer_); |
| 355 |
| 356 EXPECT_CALL(observer_, OwnershipStatusChanged()).Times(1); |
| 357 EXPECT_CALL(observer_, DeviceSettingsUpdated()).Times(1); |
| 358 owner_key_util_->SetPublicKeyFromPrivateKey(policy_.signing_key()); |
| 359 device_settings_service_.OwnerKeySet(true); |
| 360 device_settings_test_helper_.Flush(); |
| 361 Mock::VerifyAndClearExpectations(&observer_); |
| 362 |
| 363 EXPECT_CALL(observer_, OwnershipStatusChanged()).Times(0); |
| 364 EXPECT_CALL(observer_, DeviceSettingsUpdated()).Times(1); |
| 365 device_settings_service_.Store(policy_.GetBlob(), base::Closure()); |
| 366 device_settings_test_helper_.Flush(); |
| 367 Mock::VerifyAndClearExpectations(&observer_); |
| 368 |
| 369 EXPECT_CALL(observer_, OwnershipStatusChanged()).Times(0); |
| 370 EXPECT_CALL(observer_, DeviceSettingsUpdated()).Times(1); |
| 371 device_settings_service_.PropertyChangeComplete(true); |
| 372 device_settings_test_helper_.Flush(); |
| 373 Mock::VerifyAndClearExpectations(&observer_); |
| 374 |
| 375 device_settings_service_.RemoveObserver(&observer_); |
| 376 } |
| 377 |
| 378 } // namespace chromeos |
| OLD | NEW |