Home | History | Annotate | Download | only in common
      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 <CoreFoundation/CoreFoundation.h>
      6 
      7 #include "base/basictypes.h"
      8 #include "base/callback.h"
      9 #include "base/files/file_path.h"
     10 #include "base/mac/scoped_cftyperef.h"
     11 #include "base/strings/sys_string_conversions.h"
     12 #include "base/values.h"
     13 #include "components/policy/core/common/async_policy_provider.h"
     14 #include "components/policy/core/common/configuration_policy_provider_test.h"
     15 #include "components/policy/core/common/external_data_fetcher.h"
     16 #include "components/policy/core/common/policy_bundle.h"
     17 #include "components/policy/core/common/policy_loader_mac.h"
     18 #include "components/policy/core/common/policy_map.h"
     19 #include "components/policy/core/common/policy_test_utils.h"
     20 #include "components/policy/core/common/preferences_mock_mac.h"
     21 #include "testing/gtest/include/gtest/gtest.h"
     22 
     23 using base::ScopedCFTypeRef;
     24 
     25 namespace policy {
     26 
     27 namespace {
     28 
     29 class TestHarness : public PolicyProviderTestHarness {
     30  public:
     31   TestHarness();
     32   virtual ~TestHarness();
     33 
     34   virtual void SetUp() OVERRIDE;
     35 
     36   virtual ConfigurationPolicyProvider* CreateProvider(
     37       SchemaRegistry* registry,
     38       scoped_refptr<base::SequencedTaskRunner> task_runner) OVERRIDE;
     39 
     40   virtual void InstallEmptyPolicy() OVERRIDE;
     41   virtual void InstallStringPolicy(const std::string& policy_name,
     42                                    const std::string& policy_value) OVERRIDE;
     43   virtual void InstallIntegerPolicy(const std::string& policy_name,
     44                                     int policy_value) OVERRIDE;
     45   virtual void InstallBooleanPolicy(const std::string& policy_name,
     46                                     bool policy_value) OVERRIDE;
     47   virtual void InstallStringListPolicy(
     48       const std::string& policy_name,
     49       const base::ListValue* policy_value) OVERRIDE;
     50   virtual void InstallDictionaryPolicy(
     51       const std::string& policy_name,
     52       const base::DictionaryValue* policy_value) OVERRIDE;
     53 
     54   static PolicyProviderTestHarness* Create();
     55 
     56  private:
     57   MockPreferences* prefs_;
     58 
     59   DISALLOW_COPY_AND_ASSIGN(TestHarness);
     60 };
     61 
     62 TestHarness::TestHarness()
     63     : PolicyProviderTestHarness(POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER) {}
     64 
     65 TestHarness::~TestHarness() {}
     66 
     67 void TestHarness::SetUp() {}
     68 
     69 ConfigurationPolicyProvider* TestHarness::CreateProvider(
     70     SchemaRegistry* registry,
     71     scoped_refptr<base::SequencedTaskRunner> task_runner) {
     72   prefs_ = new MockPreferences();
     73   scoped_ptr<AsyncPolicyLoader> loader(
     74       new PolicyLoaderMac(task_runner, base::FilePath(), prefs_));
     75   return new AsyncPolicyProvider(registry, loader.Pass());
     76 }
     77 
     78 void TestHarness::InstallEmptyPolicy() {}
     79 
     80 void TestHarness::InstallStringPolicy(const std::string& policy_name,
     81                                       const std::string& policy_value) {
     82   ScopedCFTypeRef<CFStringRef> name(base::SysUTF8ToCFStringRef(policy_name));
     83   ScopedCFTypeRef<CFStringRef> value(base::SysUTF8ToCFStringRef(policy_value));
     84   prefs_->AddTestItem(name, value, true);
     85 }
     86 
     87 void TestHarness::InstallIntegerPolicy(const std::string& policy_name,
     88                                        int policy_value) {
     89   ScopedCFTypeRef<CFStringRef> name(base::SysUTF8ToCFStringRef(policy_name));
     90   ScopedCFTypeRef<CFNumberRef> value(
     91       CFNumberCreate(NULL, kCFNumberIntType, &policy_value));
     92   prefs_->AddTestItem(name, value, true);
     93 }
     94 
     95 void TestHarness::InstallBooleanPolicy(const std::string& policy_name,
     96                                        bool policy_value) {
     97   ScopedCFTypeRef<CFStringRef> name(base::SysUTF8ToCFStringRef(policy_name));
     98   prefs_->AddTestItem(name,
     99                       policy_value ? kCFBooleanTrue : kCFBooleanFalse,
    100                       true);
    101 }
    102 
    103 void TestHarness::InstallStringListPolicy(const std::string& policy_name,
    104                                           const base::ListValue* policy_value) {
    105   ScopedCFTypeRef<CFStringRef> name(base::SysUTF8ToCFStringRef(policy_name));
    106   ScopedCFTypeRef<CFPropertyListRef> array(ValueToProperty(policy_value));
    107   ASSERT_TRUE(array);
    108   prefs_->AddTestItem(name, array, true);
    109 }
    110 
    111 void TestHarness::InstallDictionaryPolicy(
    112     const std::string& policy_name,
    113     const base::DictionaryValue* policy_value) {
    114   ScopedCFTypeRef<CFStringRef> name(base::SysUTF8ToCFStringRef(policy_name));
    115   ScopedCFTypeRef<CFPropertyListRef> dict(ValueToProperty(policy_value));
    116   ASSERT_TRUE(dict);
    117   prefs_->AddTestItem(name, dict, true);
    118 }
    119 
    120 // static
    121 PolicyProviderTestHarness* TestHarness::Create() {
    122   return new TestHarness();
    123 }
    124 
    125 }  // namespace
    126 
    127 // Instantiate abstract test case for basic policy reading tests.
    128 INSTANTIATE_TEST_CASE_P(
    129     PolicyProviderMacTest,
    130     ConfigurationPolicyProviderTest,
    131     testing::Values(TestHarness::Create));
    132 
    133 // TODO(joaodasilva): instantiate Configuration3rdPartyPolicyProviderTest too
    134 // once the mac loader supports 3rd party policy. http://crbug.com/108995
    135 
    136 // Special test cases for some mac preferences details.
    137 class PolicyLoaderMacTest : public PolicyTestBase {
    138  protected:
    139   PolicyLoaderMacTest()
    140       : prefs_(new MockPreferences()) {}
    141   virtual ~PolicyLoaderMacTest() {}
    142 
    143   virtual void SetUp() OVERRIDE {
    144     PolicyTestBase::SetUp();
    145     scoped_ptr<AsyncPolicyLoader> loader(new PolicyLoaderMac(
    146         loop_.message_loop_proxy(), base::FilePath(), prefs_));
    147     provider_.reset(new AsyncPolicyProvider(&schema_registry_, loader.Pass()));
    148     provider_->Init(&schema_registry_);
    149   }
    150 
    151   virtual void TearDown() OVERRIDE {
    152     provider_->Shutdown();
    153     PolicyTestBase::TearDown();
    154   }
    155 
    156   MockPreferences* prefs_;
    157   scoped_ptr<AsyncPolicyProvider> provider_;
    158 };
    159 
    160 TEST_F(PolicyLoaderMacTest, Invalid) {
    161   ScopedCFTypeRef<CFStringRef> name(
    162       base::SysUTF8ToCFStringRef(test_keys::kKeyString));
    163   const char buffer[] = "binary \xde\xad\xbe\xef data";
    164   ScopedCFTypeRef<CFDataRef> invalid_data(
    165       CFDataCreate(kCFAllocatorDefault,
    166                    reinterpret_cast<const UInt8 *>(buffer),
    167                    arraysize(buffer)));
    168   ASSERT_TRUE(invalid_data);
    169   prefs_->AddTestItem(name, invalid_data.get(), true);
    170   prefs_->AddTestItem(name, invalid_data.get(), false);
    171 
    172   // Make the provider read the updated |prefs_|.
    173   provider_->RefreshPolicies();
    174   loop_.RunUntilIdle();
    175   const PolicyBundle kEmptyBundle;
    176   EXPECT_TRUE(provider_->policies().Equals(kEmptyBundle));
    177 }
    178 
    179 TEST_F(PolicyLoaderMacTest, TestNonForcedValue) {
    180   ScopedCFTypeRef<CFStringRef> name(
    181       base::SysUTF8ToCFStringRef(test_keys::kKeyString));
    182   ScopedCFTypeRef<CFPropertyListRef> test_value(
    183       base::SysUTF8ToCFStringRef("string value"));
    184   ASSERT_TRUE(test_value.get());
    185   prefs_->AddTestItem(name, test_value.get(), false);
    186 
    187   // Make the provider read the updated |prefs_|.
    188   provider_->RefreshPolicies();
    189   loop_.RunUntilIdle();
    190   PolicyBundle expected_bundle;
    191   expected_bundle.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()))
    192       .Set(test_keys::kKeyString,
    193            POLICY_LEVEL_RECOMMENDED,
    194            POLICY_SCOPE_USER,
    195            new base::StringValue("string value"),
    196            NULL);
    197   EXPECT_TRUE(provider_->policies().Equals(expected_bundle));
    198 }
    199 
    200 }  // namespace policy
    201