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