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.
5 #include <CoreFoundation/CoreFoundation.h>
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"
23 using base::ScopedCFTypeRef;
29 class TestHarness : public PolicyProviderTestHarness {
32 ~TestHarness() override;
34 void SetUp() override;
36 ConfigurationPolicyProvider* CreateProvider(
37 SchemaRegistry* registry,
38 scoped_refptr<base::SequencedTaskRunner> task_runner) override;
40 void InstallEmptyPolicy() override;
41 void InstallStringPolicy(const std::string& policy_name,
42 const std::string& policy_value) override;
43 void InstallIntegerPolicy(const std::string& policy_name,
44 int policy_value) override;
45 void InstallBooleanPolicy(const std::string& policy_name,
46 bool policy_value) override;
47 void InstallStringListPolicy(const std::string& policy_name,
48 const base::ListValue* policy_value) override;
49 void InstallDictionaryPolicy(
50 const std::string& policy_name,
51 const base::DictionaryValue* policy_value) override;
53 static PolicyProviderTestHarness* Create();
56 MockPreferences* prefs_;
58 DISALLOW_COPY_AND_ASSIGN(TestHarness);
61 TestHarness::TestHarness()
62 : PolicyProviderTestHarness(POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER) {}
64 TestHarness::~TestHarness() {}
66 void TestHarness::SetUp() {}
68 ConfigurationPolicyProvider* TestHarness::CreateProvider(
69 SchemaRegistry* registry,
70 scoped_refptr<base::SequencedTaskRunner> task_runner) {
71 prefs_ = new MockPreferences();
72 scoped_ptr<AsyncPolicyLoader> loader(
73 new PolicyLoaderMac(task_runner, base::FilePath(), prefs_));
74 return new AsyncPolicyProvider(registry, loader.Pass());
77 void TestHarness::InstallEmptyPolicy() {}
79 void TestHarness::InstallStringPolicy(const std::string& policy_name,
80 const std::string& policy_value) {
81 ScopedCFTypeRef<CFStringRef> name(base::SysUTF8ToCFStringRef(policy_name));
82 ScopedCFTypeRef<CFStringRef> value(base::SysUTF8ToCFStringRef(policy_value));
83 prefs_->AddTestItem(name, value, true);
86 void TestHarness::InstallIntegerPolicy(const std::string& policy_name,
88 ScopedCFTypeRef<CFStringRef> name(base::SysUTF8ToCFStringRef(policy_name));
89 ScopedCFTypeRef<CFNumberRef> value(
90 CFNumberCreate(NULL, kCFNumberIntType, &policy_value));
91 prefs_->AddTestItem(name, value, true);
94 void TestHarness::InstallBooleanPolicy(const std::string& policy_name,
96 ScopedCFTypeRef<CFStringRef> name(base::SysUTF8ToCFStringRef(policy_name));
97 prefs_->AddTestItem(name,
98 policy_value ? kCFBooleanTrue : kCFBooleanFalse,
102 void TestHarness::InstallStringListPolicy(const std::string& policy_name,
103 const base::ListValue* policy_value) {
104 ScopedCFTypeRef<CFStringRef> name(base::SysUTF8ToCFStringRef(policy_name));
105 ScopedCFTypeRef<CFPropertyListRef> array(ValueToProperty(policy_value));
107 prefs_->AddTestItem(name, array, true);
110 void TestHarness::InstallDictionaryPolicy(
111 const std::string& policy_name,
112 const base::DictionaryValue* policy_value) {
113 ScopedCFTypeRef<CFStringRef> name(base::SysUTF8ToCFStringRef(policy_name));
114 ScopedCFTypeRef<CFPropertyListRef> dict(ValueToProperty(policy_value));
116 prefs_->AddTestItem(name, dict, true);
120 PolicyProviderTestHarness* TestHarness::Create() {
121 return new TestHarness();
126 // Instantiate abstract test case for basic policy reading tests.
127 INSTANTIATE_TEST_CASE_P(
128 PolicyProviderMacTest,
129 ConfigurationPolicyProviderTest,
130 testing::Values(TestHarness::Create));
132 // TODO(joaodasilva): instantiate Configuration3rdPartyPolicyProviderTest too
133 // once the mac loader supports 3rd party policy. http://crbug.com/108995
135 // Special test cases for some mac preferences details.
136 class PolicyLoaderMacTest : public PolicyTestBase {
138 PolicyLoaderMacTest()
139 : prefs_(new MockPreferences()) {}
140 virtual ~PolicyLoaderMacTest() {}
142 virtual void SetUp() override {
143 PolicyTestBase::SetUp();
144 scoped_ptr<AsyncPolicyLoader> loader(new PolicyLoaderMac(
145 loop_.message_loop_proxy(), base::FilePath(), prefs_));
146 provider_.reset(new AsyncPolicyProvider(&schema_registry_, loader.Pass()));
147 provider_->Init(&schema_registry_);
150 virtual void TearDown() override {
151 provider_->Shutdown();
152 PolicyTestBase::TearDown();
155 MockPreferences* prefs_;
156 scoped_ptr<AsyncPolicyProvider> provider_;
159 TEST_F(PolicyLoaderMacTest, Invalid) {
160 ScopedCFTypeRef<CFStringRef> name(
161 base::SysUTF8ToCFStringRef(test_keys::kKeyString));
162 const char buffer[] = "binary \xde\xad\xbe\xef data";
163 ScopedCFTypeRef<CFDataRef> invalid_data(
164 CFDataCreate(kCFAllocatorDefault,
165 reinterpret_cast<const UInt8 *>(buffer),
167 ASSERT_TRUE(invalid_data);
168 prefs_->AddTestItem(name, invalid_data.get(), true);
169 prefs_->AddTestItem(name, invalid_data.get(), false);
171 // Make the provider read the updated |prefs_|.
172 provider_->RefreshPolicies();
173 loop_.RunUntilIdle();
174 const PolicyBundle kEmptyBundle;
175 EXPECT_TRUE(provider_->policies().Equals(kEmptyBundle));
178 TEST_F(PolicyLoaderMacTest, TestNonForcedValue) {
179 ScopedCFTypeRef<CFStringRef> name(
180 base::SysUTF8ToCFStringRef(test_keys::kKeyString));
181 ScopedCFTypeRef<CFPropertyListRef> test_value(
182 base::SysUTF8ToCFStringRef("string value"));
183 ASSERT_TRUE(test_value.get());
184 prefs_->AddTestItem(name, test_value.get(), false);
186 // Make the provider read the updated |prefs_|.
187 provider_->RefreshPolicies();
188 loop_.RunUntilIdle();
189 PolicyBundle expected_bundle;
190 expected_bundle.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()))
191 .Set(test_keys::kKeyString,
192 POLICY_LEVEL_RECOMMENDED,
194 new base::StringValue("string value"),
196 EXPECT_TRUE(provider_->policies().Equals(expected_bundle));
199 } // namespace policy