• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <gtest/gtest.h>
6 
7 #include "base/mac/scoped_cftyperef.h"
8 #include "base/stl_util-inl.h"
9 #include "base/sys_string_conversions.h"
10 #include "chrome/browser/policy/configuration_policy_pref_store.h"
11 #include "chrome/browser/policy/configuration_policy_provider_mac.h"
12 #include "chrome/browser/policy/mock_configuration_policy_store.h"
13 #include "chrome/browser/preferences_mock_mac.h"
14 #include "policy/policy_constants.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16 
17 namespace policy {
18 
19 // Holds parameters for the parametrized policy tests.
20 class PolicyTestParams {
21  public:
22   // Takes ownership of |test_value|.
PolicyTestParams(ConfigurationPolicyType type,const char * policy_name,Value * test_value)23   PolicyTestParams(ConfigurationPolicyType type,
24                    const char* policy_name,
25                    Value* test_value)
26       : type_(type),
27         policy_name_(policy_name),
28         test_value_(test_value) {}
29 
30   // testing::TestWithParam does copying, so provide copy constructor and
31   // assignment operator.
PolicyTestParams(const PolicyTestParams & other)32   PolicyTestParams(const PolicyTestParams& other)
33       : type_(other.type_),
34         policy_name_(other.policy_name_),
35         test_value_(other.test_value_->DeepCopy()) {}
36 
operator =(PolicyTestParams other)37   const PolicyTestParams& operator=(PolicyTestParams other) {
38     swap(other);
39     return *this;
40   }
41 
swap(PolicyTestParams & other)42   void swap(PolicyTestParams& other) {
43     std::swap(type_, other.type_);
44     std::swap(policy_name_, other.policy_name_);
45     test_value_.swap(other.test_value_);
46   }
47 
type() const48   ConfigurationPolicyType type() const { return type_; }
policy_name() const49   const char* policy_name() const { return policy_name_; }
test_value() const50   const Value* test_value() const { return test_value_.get(); }
51 
52   // Get the test value in the appropriate CFPropertyListRef representation.
GetPropertyListValue() const53   CFPropertyListRef GetPropertyListValue() const {
54     switch (test_value_->GetType()) {
55       case Value::TYPE_BOOLEAN: {
56         bool v;
57         if (!test_value_->GetAsBoolean(&v))
58           return NULL;
59         return CFRetain(v ? kCFBooleanTrue : kCFBooleanFalse);
60       }
61       case Value::TYPE_INTEGER: {
62         int v;
63         if (!test_value_->GetAsInteger(&v))
64           return NULL;
65         return CFNumberCreate(NULL, kCFNumberIntType, &v);
66       }
67       case Value::TYPE_STRING: {
68         std::string v;
69         if (!test_value_->GetAsString(&v))
70           return NULL;
71         return base::SysUTF8ToCFStringRef(v);
72       }
73       case Value::TYPE_LIST: {
74         const ListValue* list =
75             static_cast<const ListValue*>(test_value_.get());
76         base::mac::ScopedCFTypeRef<CFMutableArrayRef> array(
77             CFArrayCreateMutable(NULL, list->GetSize(),
78                                  &kCFTypeArrayCallBacks));
79         for (ListValue::const_iterator element(list->begin());
80              element != list->end(); ++element) {
81           if (!(*element)->IsType(Value::TYPE_STRING))
82             return NULL;
83           std::string element_value;
84           if (!(*element)->GetAsString(&element_value))
85             return NULL;
86           base::mac::ScopedCFTypeRef<CFStringRef> cf_element_value(
87               base::SysUTF8ToCFStringRef(element_value));
88           CFArrayAppendValue(array, cf_element_value.get());
89         }
90         return array.release();
91       }
92       default:
93         return NULL;
94     }
95   }
96 
97   // Factory methods that create parameter objects for different value types.
ForStringPolicy(ConfigurationPolicyType type,const char * name)98   static PolicyTestParams ForStringPolicy(
99       ConfigurationPolicyType type,
100       const char* name) {
101     return PolicyTestParams(type, name, Value::CreateStringValue("test"));
102   }
ForBooleanPolicy(ConfigurationPolicyType type,const char * name)103   static PolicyTestParams ForBooleanPolicy(
104       ConfigurationPolicyType type,
105       const char* name) {
106     return PolicyTestParams(type, name, Value::CreateBooleanValue(true));
107   }
ForIntegerPolicy(ConfigurationPolicyType type,const char * name)108   static PolicyTestParams ForIntegerPolicy(
109       ConfigurationPolicyType type,
110       const char* name) {
111     return PolicyTestParams(type, name, Value::CreateIntegerValue(42));
112   }
ForListPolicy(ConfigurationPolicyType type,const char * name)113   static PolicyTestParams ForListPolicy(
114       ConfigurationPolicyType type,
115       const char* name) {
116     ListValue* value = new ListValue;
117     value->Set(0U, Value::CreateStringValue("first"));
118     value->Set(1U, Value::CreateStringValue("second"));
119     return PolicyTestParams(type, name, value);
120   }
121 
122  private:
123   ConfigurationPolicyType type_;
124   const char* policy_name_;
125   scoped_ptr<Value> test_value_;
126 };
127 
128 // Parametrized test class for testing whether ConfigurationPolicyProviderMac
129 // can handle all policies correctly.
130 class ConfigurationPolicyProviderMacTest
131     : public testing::TestWithParam<PolicyTestParams> {
132  public:
SetUp()133   virtual void SetUp() {
134     prefs_ = new MockPreferences;
135     store_.reset(new MockConfigurationPolicyStore);
136   }
137 
138  protected:
139   MockPreferences* prefs_;
140   scoped_ptr<MockConfigurationPolicyStore> store_;
141 };
142 
TEST_P(ConfigurationPolicyProviderMacTest,Default)143 TEST_P(ConfigurationPolicyProviderMacTest, Default) {
144   ConfigurationPolicyProviderMac provider(
145       ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList(), prefs_);
146   EXPECT_TRUE(provider.Provide(store_.get()));
147   EXPECT_TRUE(store_->policy_map().empty());
148 }
149 
TEST_P(ConfigurationPolicyProviderMacTest,Invalid)150 TEST_P(ConfigurationPolicyProviderMacTest, Invalid) {
151   base::mac::ScopedCFTypeRef<CFStringRef> name(
152       base::SysUTF8ToCFStringRef(GetParam().policy_name()));
153   base::mac::ScopedCFTypeRef<CFDataRef> invalid_data(
154       CFDataCreate(NULL, NULL, 0));
155   prefs_->AddTestItem(name, invalid_data.get(), true);
156 
157   // Create the provider and have it read |prefs_|.
158   ConfigurationPolicyProviderMac provider(
159       ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList(), prefs_);
160   EXPECT_TRUE(provider.Provide(store_.get()));
161   EXPECT_TRUE(store_->policy_map().empty());
162 }
163 
TEST_P(ConfigurationPolicyProviderMacTest,TestNonForcedValue)164 TEST_P(ConfigurationPolicyProviderMacTest, TestNonForcedValue) {
165   base::mac::ScopedCFTypeRef<CFStringRef> name(
166       base::SysUTF8ToCFStringRef(GetParam().policy_name()));
167   base::mac::ScopedCFTypeRef<CFPropertyListRef> test_value(
168       GetParam().GetPropertyListValue());
169   ASSERT_TRUE(test_value.get());
170   prefs_->AddTestItem(name, test_value.get(), false);
171 
172   // Create the provider and have it read |prefs_|.
173   ConfigurationPolicyProviderMac provider(
174       ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList(), prefs_);
175   EXPECT_TRUE(provider.Provide(store_.get()));
176   EXPECT_TRUE(store_->policy_map().empty());
177 }
178 
TEST_P(ConfigurationPolicyProviderMacTest,TestValue)179 TEST_P(ConfigurationPolicyProviderMacTest, TestValue) {
180   base::mac::ScopedCFTypeRef<CFStringRef> name(
181       base::SysUTF8ToCFStringRef(GetParam().policy_name()));
182   base::mac::ScopedCFTypeRef<CFPropertyListRef> test_value(
183       GetParam().GetPropertyListValue());
184   ASSERT_TRUE(test_value.get());
185   prefs_->AddTestItem(name, test_value, true);
186 
187   // Create the provider and have it read |prefs_|.
188   ConfigurationPolicyProviderMac provider(
189       ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList(), prefs_);
190   EXPECT_TRUE(provider.Provide(store_.get()));
191   ASSERT_EQ(1U, store_->policy_map().size());
192   const Value* value = store_->Get(GetParam().type());
193   ASSERT_TRUE(value);
194   EXPECT_TRUE(GetParam().test_value()->Equals(value));
195 }
196 
197 // Instantiate the test case for all policies.
198 INSTANTIATE_TEST_CASE_P(
199     ConfigurationPolicyProviderMacTestInstance,
200     ConfigurationPolicyProviderMacTest,
201     testing::Values(
202         PolicyTestParams::ForStringPolicy(
203             kPolicyHomepageLocation,
204             key::kHomepageLocation),
205         PolicyTestParams::ForBooleanPolicy(
206             kPolicyHomepageIsNewTabPage,
207             key::kHomepageIsNewTabPage),
208         PolicyTestParams::ForIntegerPolicy(
209             kPolicyRestoreOnStartup,
210             key::kRestoreOnStartup),
211         PolicyTestParams::ForListPolicy(
212             kPolicyRestoreOnStartupURLs,
213             key::kRestoreOnStartupURLs),
214         PolicyTestParams::ForBooleanPolicy(
215             kPolicyDefaultSearchProviderEnabled,
216             key::kDefaultSearchProviderEnabled),
217         PolicyTestParams::ForStringPolicy(
218             kPolicyDefaultSearchProviderName,
219             key::kDefaultSearchProviderName),
220         PolicyTestParams::ForStringPolicy(
221             kPolicyDefaultSearchProviderKeyword,
222             key::kDefaultSearchProviderKeyword),
223         PolicyTestParams::ForStringPolicy(
224             kPolicyDefaultSearchProviderSearchURL,
225             key::kDefaultSearchProviderSearchURL),
226         PolicyTestParams::ForStringPolicy(
227             kPolicyDefaultSearchProviderSuggestURL,
228             key::kDefaultSearchProviderSuggestURL),
229         PolicyTestParams::ForStringPolicy(
230             kPolicyDefaultSearchProviderInstantURL,
231             key::kDefaultSearchProviderInstantURL),
232         PolicyTestParams::ForStringPolicy(
233             kPolicyDefaultSearchProviderIconURL,
234             key::kDefaultSearchProviderIconURL),
235         PolicyTestParams::ForStringPolicy(
236             kPolicyDefaultSearchProviderEncodings,
237             key::kDefaultSearchProviderEncodings),
238         PolicyTestParams::ForStringPolicy(
239             kPolicyProxyMode,
240             key::kProxyMode),
241         PolicyTestParams::ForIntegerPolicy(
242             kPolicyProxyServerMode,
243             key::kProxyServerMode),
244         PolicyTestParams::ForStringPolicy(
245             kPolicyProxyServer,
246             key::kProxyServer),
247         PolicyTestParams::ForStringPolicy(
248             kPolicyProxyPacUrl,
249             key::kProxyPacUrl),
250         PolicyTestParams::ForStringPolicy(
251             kPolicyProxyBypassList,
252             key::kProxyBypassList),
253         PolicyTestParams::ForBooleanPolicy(
254             kPolicyAlternateErrorPagesEnabled,
255             key::kAlternateErrorPagesEnabled),
256         PolicyTestParams::ForBooleanPolicy(
257             kPolicySearchSuggestEnabled,
258             key::kSearchSuggestEnabled),
259         PolicyTestParams::ForBooleanPolicy(
260             kPolicyDnsPrefetchingEnabled,
261             key::kDnsPrefetchingEnabled),
262         PolicyTestParams::ForBooleanPolicy(
263             kPolicySafeBrowsingEnabled,
264             key::kSafeBrowsingEnabled),
265         PolicyTestParams::ForBooleanPolicy(
266             kPolicyMetricsReportingEnabled,
267             key::kMetricsReportingEnabled),
268         PolicyTestParams::ForBooleanPolicy(
269             kPolicyPasswordManagerEnabled,
270             key::kPasswordManagerEnabled),
271         PolicyTestParams::ForBooleanPolicy(
272             kPolicyPasswordManagerAllowShowPasswords,
273             key::kPasswordManagerAllowShowPasswords),
274         PolicyTestParams::ForListPolicy(
275             kPolicyDisabledPlugins,
276             key::kDisabledPlugins),
277         PolicyTestParams::ForListPolicy(
278             kPolicyDisabledPluginsExceptions,
279             key::kDisabledPluginsExceptions),
280         PolicyTestParams::ForListPolicy(
281             kPolicyEnabledPlugins,
282             key::kEnabledPlugins),
283         PolicyTestParams::ForBooleanPolicy(
284             kPolicyAutoFillEnabled,
285             key::kAutoFillEnabled),
286         PolicyTestParams::ForStringPolicy(
287             kPolicyApplicationLocaleValue,
288             key::kApplicationLocaleValue),
289         PolicyTestParams::ForBooleanPolicy(
290             kPolicySyncDisabled,
291             key::kSyncDisabled),
292         PolicyTestParams::ForListPolicy(
293             kPolicyExtensionInstallWhitelist,
294             key::kExtensionInstallWhitelist),
295         PolicyTestParams::ForListPolicy(
296             kPolicyExtensionInstallBlacklist,
297             key::kExtensionInstallBlacklist),
298         PolicyTestParams::ForBooleanPolicy(
299             kPolicyShowHomeButton,
300             key::kShowHomeButton),
301         PolicyTestParams::ForBooleanPolicy(
302             kPolicyPrintingEnabled,
303             key::kPrintingEnabled),
304         PolicyTestParams::ForBooleanPolicy(
305             kPolicyInstantEnabled,
306             key::kInstantEnabled),
307         PolicyTestParams::ForIntegerPolicy(
308             kPolicyPolicyRefreshRate,
309             key::kPolicyRefreshRate),
310         PolicyTestParams::ForBooleanPolicy(
311             kPolicyDisablePluginFinder,
312             key::kDisablePluginFinder),
313         PolicyTestParams::ForBooleanPolicy(
314             kPolicyClearSiteDataOnExit,
315             key::kClearSiteDataOnExit),
316         PolicyTestParams::ForStringPolicy(
317             kPolicyDownloadDirectory,
318             key::kDownloadDirectory),
319         PolicyTestParams::ForBooleanPolicy(
320             kPolicyDefaultBrowserSettingEnabled,
321             key::kDefaultBrowserSettingEnabled),
322         PolicyTestParams::ForBooleanPolicy(
323             kPolicyCloudPrintProxyEnabled,
324             key::kCloudPrintProxyEnabled),
325         PolicyTestParams::ForBooleanPolicy(
326             kPolicyTranslateEnabled,
327             key::kTranslateEnabled),
328         PolicyTestParams::ForBooleanPolicy(
329             kPolicyAllowOutdatedPlugins,
330             key::kAllowOutdatedPlugins),
331         PolicyTestParams::ForBooleanPolicy(
332             kPolicyBookmarkBarEnabled,
333             key::kBookmarkBarEnabled),
334         PolicyTestParams::ForBooleanPolicy(
335             kPolicyEditBookmarksEnabled,
336             key::kEditBookmarksEnabled),
337         PolicyTestParams::ForBooleanPolicy(
338             kPolicyAllowFileSelectionDialogs,
339             key::kAllowFileSelectionDialogs),
340         PolicyTestParams::ForListPolicy(
341             kPolicyDisabledSchemes,
342             key::kDisabledSchemes)));
343 
344 }  // namespace policy
345