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 <algorithm>
      6 
      7 #include "base/file_util.h"
      8 #include "base/memory/scoped_temp_dir.h"
      9 #include "base/path_service.h"
     10 #include "base/string_number_conversions.h"
     11 #include "chrome/browser/policy/config_dir_policy_provider.h"
     12 #include "chrome/browser/policy/configuration_policy_pref_store.h"
     13 #include "chrome/browser/policy/mock_configuration_policy_store.h"
     14 #include "content/browser/browser_thread.h"
     15 #include "content/common/json_value_serializer.h"
     16 #include "policy/policy_constants.h"
     17 #include "testing/gtest/include/gtest/gtest.h"
     18 
     19 namespace policy {
     20 
     21 template<typename BASE>
     22 class ConfigDirPolicyProviderTestBase : public BASE {
     23  protected:
     24   ConfigDirPolicyProviderTestBase() {}
     25 
     26   virtual void SetUp() {
     27     ASSERT_TRUE(test_dir_.CreateUniqueTempDir());
     28   }
     29 
     30   // JSON-encode a dictionary and write it to a file.
     31   void WriteConfigFile(const DictionaryValue& dict,
     32                        const std::string& file_name) {
     33     std::string data;
     34     JSONStringValueSerializer serializer(&data);
     35     serializer.Serialize(dict);
     36     const FilePath file_path(test_dir().AppendASCII(file_name));
     37     ASSERT_TRUE(file_util::WriteFile(file_path, data.c_str(), data.size()));
     38   }
     39 
     40   const FilePath& test_dir() { return test_dir_.path(); }
     41 
     42  private:
     43   ScopedTempDir test_dir_;
     44 };
     45 
     46 class ConfigDirPolicyLoaderTest
     47     : public ConfigDirPolicyProviderTestBase<testing::Test> {
     48 };
     49 
     50 // The preferences dictionary is expected to be empty when there are no files to
     51 // load.
     52 TEST_F(ConfigDirPolicyLoaderTest, ReadPrefsEmpty) {
     53   ConfigDirPolicyProviderDelegate loader(test_dir());
     54   scoped_ptr<DictionaryValue> policy(loader.Load());
     55   EXPECT_TRUE(policy.get());
     56   EXPECT_TRUE(policy->empty());
     57 }
     58 
     59 // Reading from a non-existent directory should result in an empty preferences
     60 // dictionary.
     61 TEST_F(ConfigDirPolicyLoaderTest, ReadPrefsNonExistentDirectory) {
     62   FilePath non_existent_dir(test_dir().Append(FILE_PATH_LITERAL("not_there")));
     63   ConfigDirPolicyProviderDelegate loader(non_existent_dir);
     64   scoped_ptr<DictionaryValue> policy(loader.Load());
     65   EXPECT_TRUE(policy.get());
     66   EXPECT_TRUE(policy->empty());
     67 }
     68 
     69 // Test reading back a single preference value.
     70 TEST_F(ConfigDirPolicyLoaderTest, ReadPrefsSinglePref) {
     71   DictionaryValue test_dict;
     72   test_dict.SetString("HomepageLocation", "http://www.google.com");
     73   WriteConfigFile(test_dict, "config_file");
     74 
     75   ConfigDirPolicyProviderDelegate loader(test_dir());
     76   scoped_ptr<DictionaryValue> policy(loader.Load());
     77   EXPECT_TRUE(policy.get());
     78   EXPECT_TRUE(policy->Equals(&test_dict));
     79 }
     80 
     81 // Test merging values from different files.
     82 TEST_F(ConfigDirPolicyLoaderTest, ReadPrefsMergePrefs) {
     83   // Write a bunch of data files in order to increase the chance to detect the
     84   // provider not respecting lexicographic ordering when reading them. Since the
     85   // filesystem may return files in arbitrary order, there is no way to be sure,
     86   // but this is better than nothing.
     87   DictionaryValue test_dict_bar;
     88   test_dict_bar.SetString("HomepageLocation", "http://bar.com");
     89   for (unsigned int i = 1; i <= 4; ++i)
     90     WriteConfigFile(test_dict_bar, base::IntToString(i));
     91   DictionaryValue test_dict_foo;
     92   test_dict_foo.SetString("HomepageLocation", "http://foo.com");
     93   WriteConfigFile(test_dict_foo, "9");
     94   for (unsigned int i = 5; i <= 8; ++i)
     95     WriteConfigFile(test_dict_bar, base::IntToString(i));
     96 
     97   ConfigDirPolicyProviderDelegate loader(test_dir());
     98   scoped_ptr<DictionaryValue> policy(loader.Load());
     99   EXPECT_TRUE(policy.get());
    100   EXPECT_TRUE(policy->Equals(&test_dict_foo));
    101 }
    102 
    103 // Holds policy type, corresponding policy key string and a valid value for use
    104 // in parametrized value tests.
    105 class ValueTestParams {
    106  public:
    107   // Assumes ownership of |test_value|.
    108   ValueTestParams(ConfigurationPolicyType type,
    109                   const char* policy_key,
    110                   Value* test_value)
    111       : type_(type),
    112         policy_key_(policy_key),
    113         test_value_(test_value) {}
    114 
    115   // testing::TestWithParam does copying, so provide copy constructor and
    116   // assignment operator.
    117   ValueTestParams(const ValueTestParams& other)
    118       : type_(other.type_),
    119         policy_key_(other.policy_key_),
    120         test_value_(other.test_value_->DeepCopy()) {}
    121 
    122   const ValueTestParams& operator=(ValueTestParams other) {
    123     swap(other);
    124     return *this;
    125   }
    126 
    127   void swap(ValueTestParams& other) {
    128     std::swap(type_, other.type_);
    129     std::swap(policy_key_, other.policy_key_);
    130     test_value_.swap(other.test_value_);
    131   }
    132 
    133   ConfigurationPolicyType type() const { return type_; }
    134   const char* policy_key() const { return policy_key_; }
    135   const Value* test_value() const { return test_value_.get(); }
    136 
    137   // Factory methods that create parameter objects for different value types.
    138   static ValueTestParams ForStringPolicy(
    139       ConfigurationPolicyType type,
    140       const char* policy_key) {
    141     return ValueTestParams(type, policy_key, Value::CreateStringValue("test"));
    142   }
    143   static ValueTestParams ForBooleanPolicy(
    144       ConfigurationPolicyType type,
    145       const char* policy_key) {
    146     return ValueTestParams(type, policy_key, Value::CreateBooleanValue(true));
    147   }
    148   static ValueTestParams ForIntegerPolicy(
    149       ConfigurationPolicyType type,
    150       const char* policy_key) {
    151     return ValueTestParams(type, policy_key, Value::CreateIntegerValue(42));
    152   }
    153   static ValueTestParams ForListPolicy(
    154       ConfigurationPolicyType type,
    155       const char* policy_key) {
    156     ListValue* value = new ListValue();
    157     value->Set(0U, Value::CreateStringValue("first"));
    158     value->Set(1U, Value::CreateStringValue("second"));
    159     return ValueTestParams(type, policy_key, value);
    160   }
    161 
    162  private:
    163   ConfigurationPolicyType type_;
    164   const char* policy_key_;
    165   scoped_ptr<Value> test_value_;
    166 };
    167 
    168 // Tests whether the provider correctly reads a value from the file and forwards
    169 // it to the store.
    170 class ConfigDirPolicyProviderValueTest
    171     : public ConfigDirPolicyProviderTestBase<
    172           testing::TestWithParam<ValueTestParams> > {
    173  protected:
    174   ConfigDirPolicyProviderValueTest()
    175       : ui_thread_(BrowserThread::UI, &loop_),
    176         file_thread_(BrowserThread::FILE, &loop_) {}
    177 
    178   virtual void TearDown() {
    179     loop_.RunAllPending();
    180   }
    181 
    182   MockConfigurationPolicyStore policy_store_;
    183 
    184  private:
    185   MessageLoop loop_;
    186   BrowserThread ui_thread_;
    187   BrowserThread file_thread_;
    188 };
    189 
    190 TEST_P(ConfigDirPolicyProviderValueTest, Default) {
    191   ConfigDirPolicyProvider provider(
    192       ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList(),
    193       test_dir());
    194   EXPECT_TRUE(provider.Provide(&policy_store_));
    195   EXPECT_TRUE(policy_store_.policy_map().empty());
    196 }
    197 
    198 TEST_P(ConfigDirPolicyProviderValueTest, NullValue) {
    199   DictionaryValue dict;
    200   dict.Set(GetParam().policy_key(), Value::CreateNullValue());
    201   WriteConfigFile(dict, "empty");
    202   ConfigDirPolicyProvider provider(
    203       ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList(),
    204       test_dir());
    205   EXPECT_TRUE(provider.Provide(&policy_store_));
    206   EXPECT_TRUE(policy_store_.policy_map().empty());
    207 }
    208 
    209 TEST_P(ConfigDirPolicyProviderValueTest, TestValue) {
    210   DictionaryValue dict;
    211   dict.Set(GetParam().policy_key(), GetParam().test_value()->DeepCopy());
    212   WriteConfigFile(dict, "policy");
    213   ConfigDirPolicyProvider provider(
    214       ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList(),
    215       test_dir());
    216   EXPECT_TRUE(provider.Provide(&policy_store_));
    217   EXPECT_EQ(1U, policy_store_.policy_map().size());
    218   const Value* value = policy_store_.Get(GetParam().type());
    219   ASSERT_TRUE(value);
    220   EXPECT_TRUE(GetParam().test_value()->Equals(value));
    221 }
    222 
    223 // Test parameters for all supported policies.
    224 INSTANTIATE_TEST_CASE_P(
    225     ConfigDirPolicyProviderValueTestInstance,
    226     ConfigDirPolicyProviderValueTest,
    227     testing::Values(
    228         ValueTestParams::ForStringPolicy(
    229             kPolicyHomepageLocation,
    230             key::kHomepageLocation),
    231         ValueTestParams::ForBooleanPolicy(
    232             kPolicyHomepageIsNewTabPage,
    233             key::kHomepageIsNewTabPage),
    234         ValueTestParams::ForIntegerPolicy(
    235             kPolicyRestoreOnStartup,
    236             key::kRestoreOnStartup),
    237         ValueTestParams::ForListPolicy(
    238             kPolicyRestoreOnStartupURLs,
    239             key::kRestoreOnStartupURLs),
    240         ValueTestParams::ForBooleanPolicy(
    241             kPolicyDefaultSearchProviderEnabled,
    242             key::kDefaultSearchProviderEnabled),
    243         ValueTestParams::ForStringPolicy(
    244             kPolicyDefaultSearchProviderName,
    245             key::kDefaultSearchProviderName),
    246         ValueTestParams::ForStringPolicy(
    247             kPolicyDefaultSearchProviderKeyword,
    248             key::kDefaultSearchProviderKeyword),
    249         ValueTestParams::ForStringPolicy(
    250             kPolicyDefaultSearchProviderSearchURL,
    251             key::kDefaultSearchProviderSearchURL),
    252         ValueTestParams::ForStringPolicy(
    253             kPolicyDefaultSearchProviderSuggestURL,
    254             key::kDefaultSearchProviderSuggestURL),
    255         ValueTestParams::ForStringPolicy(
    256             kPolicyDefaultSearchProviderInstantURL,
    257             key::kDefaultSearchProviderInstantURL),
    258         ValueTestParams::ForStringPolicy(
    259             kPolicyDefaultSearchProviderIconURL,
    260             key::kDefaultSearchProviderIconURL),
    261         ValueTestParams::ForStringPolicy(
    262             kPolicyDefaultSearchProviderEncodings,
    263             key::kDefaultSearchProviderEncodings),
    264         ValueTestParams::ForStringPolicy(
    265             kPolicyProxyMode,
    266             key::kProxyMode),
    267         ValueTestParams::ForIntegerPolicy(
    268             kPolicyProxyServerMode,
    269             key::kProxyServerMode),
    270         ValueTestParams::ForStringPolicy(
    271             kPolicyProxyServer,
    272             key::kProxyServer),
    273         ValueTestParams::ForStringPolicy(
    274             kPolicyProxyPacUrl,
    275             key::kProxyPacUrl),
    276         ValueTestParams::ForStringPolicy(
    277             kPolicyProxyBypassList,
    278             key::kProxyBypassList),
    279         ValueTestParams::ForBooleanPolicy(
    280             kPolicyAlternateErrorPagesEnabled,
    281             key::kAlternateErrorPagesEnabled),
    282         ValueTestParams::ForBooleanPolicy(
    283             kPolicySearchSuggestEnabled,
    284             key::kSearchSuggestEnabled),
    285         ValueTestParams::ForBooleanPolicy(
    286             kPolicyDnsPrefetchingEnabled,
    287             key::kDnsPrefetchingEnabled),
    288         ValueTestParams::ForBooleanPolicy(
    289             kPolicySafeBrowsingEnabled,
    290             key::kSafeBrowsingEnabled),
    291         ValueTestParams::ForBooleanPolicy(
    292             kPolicyMetricsReportingEnabled,
    293             key::kMetricsReportingEnabled),
    294         ValueTestParams::ForBooleanPolicy(
    295             kPolicyPasswordManagerEnabled,
    296             key::kPasswordManagerEnabled),
    297         ValueTestParams::ForBooleanPolicy(
    298             kPolicyPasswordManagerAllowShowPasswords,
    299             key::kPasswordManagerAllowShowPasswords),
    300         ValueTestParams::ForListPolicy(
    301             kPolicyDisabledPlugins,
    302             key::kDisabledPlugins),
    303         ValueTestParams::ForListPolicy(
    304             kPolicyDisabledPluginsExceptions,
    305             key::kDisabledPluginsExceptions),
    306         ValueTestParams::ForListPolicy(
    307             kPolicyEnabledPlugins,
    308             key::kEnabledPlugins),
    309         ValueTestParams::ForBooleanPolicy(
    310             kPolicyAutoFillEnabled,
    311             key::kAutoFillEnabled),
    312         ValueTestParams::ForStringPolicy(
    313             kPolicyApplicationLocaleValue,
    314             key::kApplicationLocaleValue),
    315         ValueTestParams::ForBooleanPolicy(
    316             kPolicySyncDisabled,
    317             key::kSyncDisabled),
    318         ValueTestParams::ForListPolicy(
    319             kPolicyExtensionInstallWhitelist,
    320             key::kExtensionInstallWhitelist),
    321         ValueTestParams::ForListPolicy(
    322             kPolicyExtensionInstallBlacklist,
    323             key::kExtensionInstallBlacklist),
    324         ValueTestParams::ForBooleanPolicy(
    325             kPolicyShowHomeButton,
    326             key::kShowHomeButton),
    327         ValueTestParams::ForBooleanPolicy(
    328             kPolicyPrintingEnabled,
    329             key::kPrintingEnabled),
    330         ValueTestParams::ForIntegerPolicy(
    331             kPolicyPolicyRefreshRate,
    332             key::kPolicyRefreshRate),
    333         ValueTestParams::ForBooleanPolicy(
    334             kPolicyInstantEnabled,
    335             key::kInstantEnabled),
    336         ValueTestParams::ForBooleanPolicy(
    337             kPolicyIncognitoEnabled,
    338             key::kIncognitoEnabled),
    339         ValueTestParams::ForBooleanPolicy(
    340             kPolicyDisablePluginFinder,
    341             key::kDisablePluginFinder),
    342         ValueTestParams::ForBooleanPolicy(
    343             kPolicyClearSiteDataOnExit,
    344             key::kClearSiteDataOnExit),
    345         ValueTestParams::ForStringPolicy(
    346             kPolicyDownloadDirectory,
    347             key::kDownloadDirectory),
    348         ValueTestParams::ForBooleanPolicy(
    349             kPolicyDefaultBrowserSettingEnabled,
    350             key::kDefaultBrowserSettingEnabled),
    351         ValueTestParams::ForBooleanPolicy(
    352             kPolicyCloudPrintProxyEnabled,
    353             key::kCloudPrintProxyEnabled),
    354         ValueTestParams::ForBooleanPolicy(
    355             kPolicyTranslateEnabled,
    356             key::kTranslateEnabled),
    357         ValueTestParams::ForBooleanPolicy(
    358             kPolicyAllowOutdatedPlugins,
    359             key::kAllowOutdatedPlugins),
    360         ValueTestParams::ForBooleanPolicy(
    361             kPolicyBookmarkBarEnabled,
    362             key::kBookmarkBarEnabled),
    363         ValueTestParams::ForBooleanPolicy(
    364             kPolicyEditBookmarksEnabled,
    365             key::kEditBookmarksEnabled),
    366         ValueTestParams::ForListPolicy(
    367             kPolicyDisabledSchemes,
    368             key::kDisabledSchemes)));
    369 
    370 }  // namespace policy
    371