Home | History | Annotate | Download | only in policy
      1 // Copyright (c) 2011 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/policy/device_policy_cache.h"
      6 
      7 #include "chrome/browser/chromeos/cros/cryptohome_library.h"
      8 #include "chrome/browser/policy/device_policy_identity_strategy.h"
      9 #include "chrome/browser/policy/enterprise_install_attributes.h"
     10 #include "policy/configuration_policy_type.h"
     11 #include "testing/gmock/include/gmock/gmock.h"
     12 #include "testing/gtest/include/gtest/gtest.h"
     13 
     14 namespace policy {
     15 
     16 namespace {
     17 
     18 // Test registration user name.
     19 const char kTestUser[] = "test (at) example.com";
     20 
     21 using ::chromeos::SignedSettings;
     22 using ::chromeos::SignedSettingsHelper;
     23 using ::testing::_;
     24 using ::testing::InSequence;
     25 
     26 class MockSignedSettingsHelper : public SignedSettingsHelper {
     27  public:
     28   MockSignedSettingsHelper() {}
     29   virtual ~MockSignedSettingsHelper() {}
     30 
     31   MOCK_METHOD2(StartStorePolicyOp, void(const em::PolicyFetchResponse&,
     32                                         SignedSettingsHelper::Callback*));
     33   MOCK_METHOD1(StartRetrievePolicyOp, void(SignedSettingsHelper::Callback*));
     34   MOCK_METHOD1(CancelCallback, void(SignedSettingsHelper::Callback*));
     35 
     36   // This test doesn't need these methods, but since they're pure virtual in
     37   // SignedSettingsHelper, they must be implemented:
     38   MOCK_METHOD2(StartCheckWhitelistOp, void(const std::string&,
     39                                            SignedSettingsHelper::Callback*));
     40   MOCK_METHOD3(StartWhitelistOp, void(const std::string&, bool,
     41                                       SignedSettingsHelper::Callback*));
     42   MOCK_METHOD3(StartStorePropertyOp, void(const std::string&,
     43                                           const std::string&,
     44                                           SignedSettingsHelper::Callback*));
     45   MOCK_METHOD2(StartRetrieveProperty, void(const std::string&,
     46                                            SignedSettingsHelper::Callback*));
     47 
     48  private:
     49   DISALLOW_COPY_AND_ASSIGN(MockSignedSettingsHelper);
     50 };
     51 
     52 ACTION_P(MockSignedSettingsHelperStorePolicy, status_code) {
     53   arg1->OnStorePolicyCompleted(status_code);
     54 }
     55 
     56 ACTION_P2(MockSignedSettingsHelperRetrievePolicy, status_code, policy) {
     57   arg0->OnRetrievePolicyCompleted(status_code, policy);
     58 }
     59 
     60 void CreateRefreshRatePolicy(em::PolicyFetchResponse* policy,
     61                              const std::string& user,
     62                              int refresh_rate) {
     63   // This method omits a few fields which currently aren't needed by tests:
     64   // timestamp, machine_name, policy_type, public key info.
     65   em::PolicyData signed_response;
     66   em::ChromeDeviceSettingsProto settings;
     67   settings.mutable_policy_refresh_rate()->set_policy_refresh_rate(refresh_rate);
     68   signed_response.set_username(user);
     69   signed_response.set_request_token("dmtoken");
     70   signed_response.set_device_id("deviceid");
     71   EXPECT_TRUE(
     72       settings.SerializeToString(signed_response.mutable_policy_value()));
     73   std::string serialized_signed_response;
     74   EXPECT_TRUE(signed_response.SerializeToString(&serialized_signed_response));
     75   policy->set_policy_data(serialized_signed_response);
     76 }
     77 
     78 void CreateProxyPolicy(em::PolicyFetchResponse* policy,
     79                        const std::string& user,
     80                        const std::string& proxy_mode,
     81                        const std::string& proxy_server,
     82                        const std::string& proxy_pac_url,
     83                        const std::string& proxy_bypass_list) {
     84   em::PolicyData signed_response;
     85   em::ChromeDeviceSettingsProto settings;
     86   em::DeviceProxySettingsProto* proxy_settings =
     87       settings.mutable_device_proxy_settings();
     88   proxy_settings->set_proxy_mode(proxy_mode);
     89   proxy_settings->set_proxy_server(proxy_server);
     90   proxy_settings->set_proxy_pac_url(proxy_pac_url);
     91   proxy_settings->set_proxy_bypass_list(proxy_bypass_list);
     92   signed_response.set_username(user);
     93   signed_response.set_request_token("dmtoken");
     94   signed_response.set_device_id("deviceid");
     95   EXPECT_TRUE(
     96       settings.SerializeToString(signed_response.mutable_policy_value()));
     97   std::string serialized_signed_response;
     98   EXPECT_TRUE(signed_response.SerializeToString(&serialized_signed_response));
     99   policy->set_policy_data(serialized_signed_response);
    100 }
    101 
    102 }  // namespace
    103 
    104 class DevicePolicyCacheTest : public testing::Test {
    105  protected:
    106   DevicePolicyCacheTest()
    107       : cryptohome_(chromeos::CryptohomeLibrary::GetImpl(true)),
    108         install_attributes_(cryptohome_.get()) {}
    109 
    110   virtual void SetUp() {
    111     cache_.reset(new DevicePolicyCache(&identity_strategy_,
    112                                        &install_attributes_,
    113                                        &signed_settings_helper_));
    114   }
    115 
    116   virtual void TearDown() {
    117     EXPECT_CALL(signed_settings_helper_, CancelCallback(_));
    118     cache_.reset();
    119   }
    120 
    121   void MakeEnterpriseDevice(const char* registration_user) {
    122     ASSERT_EQ(EnterpriseInstallAttributes::LOCK_SUCCESS,
    123               install_attributes_.LockDevice(registration_user));
    124   }
    125 
    126   const Value* GetMandatoryPolicy(ConfigurationPolicyType policy) {
    127     return cache_->mandatory_policy_.Get(policy);
    128   }
    129 
    130   const Value* GetRecommendedPolicy(ConfigurationPolicyType policy) {
    131     return cache_->recommended_policy_.Get(policy);
    132   }
    133 
    134   scoped_ptr<chromeos::CryptohomeLibrary> cryptohome_;
    135   EnterpriseInstallAttributes install_attributes_;
    136   DevicePolicyIdentityStrategy identity_strategy_;
    137   MockSignedSettingsHelper signed_settings_helper_;
    138   scoped_ptr<DevicePolicyCache> cache_;
    139 
    140  private:
    141   DISALLOW_COPY_AND_ASSIGN(DevicePolicyCacheTest);
    142 };
    143 
    144 TEST_F(DevicePolicyCacheTest, Startup) {
    145   em::PolicyFetchResponse policy;
    146   CreateRefreshRatePolicy(&policy, kTestUser, 120);
    147   EXPECT_CALL(signed_settings_helper_, StartRetrievePolicyOp(_)).WillOnce(
    148       MockSignedSettingsHelperRetrievePolicy(SignedSettings::SUCCESS,
    149                                              policy));
    150   cache_->Load();
    151   testing::Mock::VerifyAndClearExpectations(&signed_settings_helper_);
    152   FundamentalValue expected(120);
    153   EXPECT_TRUE(Value::Equals(&expected,
    154                             GetMandatoryPolicy(kPolicyPolicyRefreshRate)));
    155 }
    156 
    157 TEST_F(DevicePolicyCacheTest, SetPolicy) {
    158   InSequence s;
    159 
    160   MakeEnterpriseDevice(kTestUser);
    161 
    162   // Startup.
    163   em::PolicyFetchResponse policy;
    164   CreateRefreshRatePolicy(&policy, kTestUser, 120);
    165   EXPECT_CALL(signed_settings_helper_, StartRetrievePolicyOp(_)).WillOnce(
    166       MockSignedSettingsHelperRetrievePolicy(SignedSettings::SUCCESS,
    167                                              policy));
    168   cache_->Load();
    169   testing::Mock::VerifyAndClearExpectations(&signed_settings_helper_);
    170   FundamentalValue expected(120);
    171   EXPECT_TRUE(Value::Equals(&expected,
    172                             GetMandatoryPolicy(kPolicyPolicyRefreshRate)));
    173 
    174   // Set new policy information.
    175   em::PolicyFetchResponse new_policy;
    176   CreateRefreshRatePolicy(&new_policy, kTestUser, 300);
    177   EXPECT_CALL(signed_settings_helper_, StartStorePolicyOp(_, _)).WillOnce(
    178       MockSignedSettingsHelperStorePolicy(chromeos::SignedSettings::SUCCESS));
    179   EXPECT_CALL(signed_settings_helper_, StartRetrievePolicyOp(_)).WillOnce(
    180       MockSignedSettingsHelperRetrievePolicy(SignedSettings::SUCCESS,
    181                                              new_policy));
    182   cache_->SetPolicy(new_policy);
    183   testing::Mock::VerifyAndClearExpectations(&signed_settings_helper_);
    184   FundamentalValue updated_expected(300);
    185   EXPECT_TRUE(Value::Equals(&updated_expected,
    186                             GetMandatoryPolicy(kPolicyPolicyRefreshRate)));
    187 }
    188 
    189 TEST_F(DevicePolicyCacheTest, SetPolicyWrongUser) {
    190   InSequence s;
    191 
    192   MakeEnterpriseDevice(kTestUser);
    193 
    194   // Startup.
    195   em::PolicyFetchResponse policy;
    196   CreateRefreshRatePolicy(&policy, kTestUser, 120);
    197   EXPECT_CALL(signed_settings_helper_, StartRetrievePolicyOp(_)).WillOnce(
    198       MockSignedSettingsHelperRetrievePolicy(SignedSettings::SUCCESS,
    199                                              policy));
    200   cache_->Load();
    201   testing::Mock::VerifyAndClearExpectations(&signed_settings_helper_);
    202 
    203   // Set new policy information. This should fail due to invalid user.
    204   em::PolicyFetchResponse new_policy;
    205   CreateRefreshRatePolicy(&new_policy, "foreign_user (at) example.com", 300);
    206   EXPECT_CALL(signed_settings_helper_, StartStorePolicyOp(_, _)).Times(0);
    207   cache_->SetPolicy(new_policy);
    208   testing::Mock::VerifyAndClearExpectations(&signed_settings_helper_);
    209 
    210   FundamentalValue expected(120);
    211   EXPECT_TRUE(Value::Equals(&expected,
    212                             GetMandatoryPolicy(kPolicyPolicyRefreshRate)));
    213 }
    214 
    215 TEST_F(DevicePolicyCacheTest, SetPolicyNonEnterpriseDevice) {
    216   InSequence s;
    217 
    218   // Startup.
    219   em::PolicyFetchResponse policy;
    220   CreateRefreshRatePolicy(&policy, kTestUser, 120);
    221   EXPECT_CALL(signed_settings_helper_, StartRetrievePolicyOp(_)).WillOnce(
    222       MockSignedSettingsHelperRetrievePolicy(SignedSettings::SUCCESS,
    223                                              policy));
    224   cache_->Load();
    225   testing::Mock::VerifyAndClearExpectations(&signed_settings_helper_);
    226 
    227   // Set new policy information. This should fail due to invalid user.
    228   em::PolicyFetchResponse new_policy;
    229   CreateRefreshRatePolicy(&new_policy, kTestUser, 120);
    230   EXPECT_CALL(signed_settings_helper_, StartStorePolicyOp(_, _)).Times(0);
    231   cache_->SetPolicy(new_policy);
    232   testing::Mock::VerifyAndClearExpectations(&signed_settings_helper_);
    233 
    234   FundamentalValue expected(120);
    235   EXPECT_TRUE(Value::Equals(&expected,
    236                             GetMandatoryPolicy(kPolicyPolicyRefreshRate)));
    237 }
    238 
    239 TEST_F(DevicePolicyCacheTest, SetProxyPolicy) {
    240   InSequence s;
    241 
    242   MakeEnterpriseDevice(kTestUser);
    243 
    244   // Startup.
    245   em::PolicyFetchResponse policy;
    246   CreateProxyPolicy(&policy, kTestUser, "direct", "http://proxy:8080",
    247                     "http://proxy:8080/pac.js", "127.0.0.1,example.com");
    248   EXPECT_CALL(signed_settings_helper_, StartRetrievePolicyOp(_)).WillOnce(
    249       MockSignedSettingsHelperRetrievePolicy(SignedSettings::SUCCESS,
    250                                              policy));
    251   cache_->Load();
    252   testing::Mock::VerifyAndClearExpectations(&signed_settings_helper_);
    253   StringValue expected_proxy_mode("direct");
    254   StringValue expected_proxy_server("http://proxy:8080");
    255   StringValue expected_proxy_pac_url("http://proxy:8080/pac.js");
    256   StringValue expected_proxy_bypass_list("127.0.0.1,example.com");
    257   EXPECT_TRUE(Value::Equals(&expected_proxy_mode,
    258                             GetRecommendedPolicy(kPolicyProxyMode)));
    259   EXPECT_TRUE(Value::Equals(&expected_proxy_server,
    260                             GetRecommendedPolicy(kPolicyProxyServer)));
    261   EXPECT_TRUE(Value::Equals(&expected_proxy_pac_url,
    262                             GetRecommendedPolicy(kPolicyProxyPacUrl)));
    263   EXPECT_TRUE(Value::Equals(&expected_proxy_bypass_list,
    264                             GetRecommendedPolicy(kPolicyProxyBypassList)));
    265 }
    266 
    267 }  // namespace policy
    268