policy_loader_mac_unittest.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
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 23using base::ScopedCFTypeRef; 24 25namespace policy { 26 27namespace { 28 29class 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 62TestHarness::TestHarness() 63 : PolicyProviderTestHarness(POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER) {} 64 65TestHarness::~TestHarness() {} 66 67void TestHarness::SetUp() {} 68 69ConfigurationPolicyProvider* 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 78void TestHarness::InstallEmptyPolicy() {} 79 80void 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 87void 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 95void 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 103void 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 111void 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 121PolicyProviderTestHarness* TestHarness::Create() { 122 return new TestHarness(); 123} 124 125} // namespace 126 127// Instantiate abstract test case for basic policy reading tests. 128INSTANTIATE_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. 137class 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 160TEST_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 179TEST_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 base::Value::CreateStringValue("string value"), 196 NULL); 197 EXPECT_TRUE(provider_->policies().Equals(expected_bundle)); 198} 199 200} // namespace policy 201