// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include <gtest/gtest.h> #include "base/mac/scoped_cftyperef.h" #include "base/stl_util-inl.h" #include "base/sys_string_conversions.h" #include "chrome/browser/policy/configuration_policy_pref_store.h" #include "chrome/browser/policy/configuration_policy_provider_mac.h" #include "chrome/browser/policy/mock_configuration_policy_store.h" #include "chrome/browser/preferences_mock_mac.h" #include "policy/policy_constants.h" #include "testing/gtest/include/gtest/gtest.h" namespace policy { // Holds parameters for the parametrized policy tests. class PolicyTestParams { public: // Takes ownership of |test_value|. PolicyTestParams(ConfigurationPolicyType type, const char* policy_name, Value* test_value) : type_(type), policy_name_(policy_name), test_value_(test_value) {} // testing::TestWithParam does copying, so provide copy constructor and // assignment operator. PolicyTestParams(const PolicyTestParams& other) : type_(other.type_), policy_name_(other.policy_name_), test_value_(other.test_value_->DeepCopy()) {} const PolicyTestParams& operator=(PolicyTestParams other) { swap(other); return *this; } void swap(PolicyTestParams& other) { std::swap(type_, other.type_); std::swap(policy_name_, other.policy_name_); test_value_.swap(other.test_value_); } ConfigurationPolicyType type() const { return type_; } const char* policy_name() const { return policy_name_; } const Value* test_value() const { return test_value_.get(); } // Get the test value in the appropriate CFPropertyListRef representation. CFPropertyListRef GetPropertyListValue() const { switch (test_value_->GetType()) { case Value::TYPE_BOOLEAN: { bool v; if (!test_value_->GetAsBoolean(&v)) return NULL; return CFRetain(v ? kCFBooleanTrue : kCFBooleanFalse); } case Value::TYPE_INTEGER: { int v; if (!test_value_->GetAsInteger(&v)) return NULL; return CFNumberCreate(NULL, kCFNumberIntType, &v); } case Value::TYPE_STRING: { std::string v; if (!test_value_->GetAsString(&v)) return NULL; return base::SysUTF8ToCFStringRef(v); } case Value::TYPE_LIST: { const ListValue* list = static_cast<const ListValue*>(test_value_.get()); base::mac::ScopedCFTypeRef<CFMutableArrayRef> array( CFArrayCreateMutable(NULL, list->GetSize(), &kCFTypeArrayCallBacks)); for (ListValue::const_iterator element(list->begin()); element != list->end(); ++element) { if (!(*element)->IsType(Value::TYPE_STRING)) return NULL; std::string element_value; if (!(*element)->GetAsString(&element_value)) return NULL; base::mac::ScopedCFTypeRef<CFStringRef> cf_element_value( base::SysUTF8ToCFStringRef(element_value)); CFArrayAppendValue(array, cf_element_value.get()); } return array.release(); } default: return NULL; } } // Factory methods that create parameter objects for different value types. static PolicyTestParams ForStringPolicy( ConfigurationPolicyType type, const char* name) { return PolicyTestParams(type, name, Value::CreateStringValue("test")); } static PolicyTestParams ForBooleanPolicy( ConfigurationPolicyType type, const char* name) { return PolicyTestParams(type, name, Value::CreateBooleanValue(true)); } static PolicyTestParams ForIntegerPolicy( ConfigurationPolicyType type, const char* name) { return PolicyTestParams(type, name, Value::CreateIntegerValue(42)); } static PolicyTestParams ForListPolicy( ConfigurationPolicyType type, const char* name) { ListValue* value = new ListValue; value->Set(0U, Value::CreateStringValue("first")); value->Set(1U, Value::CreateStringValue("second")); return PolicyTestParams(type, name, value); } private: ConfigurationPolicyType type_; const char* policy_name_; scoped_ptr<Value> test_value_; }; // Parametrized test class for testing whether ConfigurationPolicyProviderMac // can handle all policies correctly. class ConfigurationPolicyProviderMacTest : public testing::TestWithParam<PolicyTestParams> { public: virtual void SetUp() { prefs_ = new MockPreferences; store_.reset(new MockConfigurationPolicyStore); } protected: MockPreferences* prefs_; scoped_ptr<MockConfigurationPolicyStore> store_; }; TEST_P(ConfigurationPolicyProviderMacTest, Default) { ConfigurationPolicyProviderMac provider( ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList(), prefs_); EXPECT_TRUE(provider.Provide(store_.get())); EXPECT_TRUE(store_->policy_map().empty()); } TEST_P(ConfigurationPolicyProviderMacTest, Invalid) { base::mac::ScopedCFTypeRef<CFStringRef> name( base::SysUTF8ToCFStringRef(GetParam().policy_name())); base::mac::ScopedCFTypeRef<CFDataRef> invalid_data( CFDataCreate(NULL, NULL, 0)); prefs_->AddTestItem(name, invalid_data.get(), true); // Create the provider and have it read |prefs_|. ConfigurationPolicyProviderMac provider( ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList(), prefs_); EXPECT_TRUE(provider.Provide(store_.get())); EXPECT_TRUE(store_->policy_map().empty()); } TEST_P(ConfigurationPolicyProviderMacTest, TestNonForcedValue) { base::mac::ScopedCFTypeRef<CFStringRef> name( base::SysUTF8ToCFStringRef(GetParam().policy_name())); base::mac::ScopedCFTypeRef<CFPropertyListRef> test_value( GetParam().GetPropertyListValue()); ASSERT_TRUE(test_value.get()); prefs_->AddTestItem(name, test_value.get(), false); // Create the provider and have it read |prefs_|. ConfigurationPolicyProviderMac provider( ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList(), prefs_); EXPECT_TRUE(provider.Provide(store_.get())); EXPECT_TRUE(store_->policy_map().empty()); } TEST_P(ConfigurationPolicyProviderMacTest, TestValue) { base::mac::ScopedCFTypeRef<CFStringRef> name( base::SysUTF8ToCFStringRef(GetParam().policy_name())); base::mac::ScopedCFTypeRef<CFPropertyListRef> test_value( GetParam().GetPropertyListValue()); ASSERT_TRUE(test_value.get()); prefs_->AddTestItem(name, test_value, true); // Create the provider and have it read |prefs_|. ConfigurationPolicyProviderMac provider( ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList(), prefs_); EXPECT_TRUE(provider.Provide(store_.get())); ASSERT_EQ(1U, store_->policy_map().size()); const Value* value = store_->Get(GetParam().type()); ASSERT_TRUE(value); EXPECT_TRUE(GetParam().test_value()->Equals(value)); } // Instantiate the test case for all policies. INSTANTIATE_TEST_CASE_P( ConfigurationPolicyProviderMacTestInstance, ConfigurationPolicyProviderMacTest, testing::Values( PolicyTestParams::ForStringPolicy( kPolicyHomepageLocation, key::kHomepageLocation), PolicyTestParams::ForBooleanPolicy( kPolicyHomepageIsNewTabPage, key::kHomepageIsNewTabPage), PolicyTestParams::ForIntegerPolicy( kPolicyRestoreOnStartup, key::kRestoreOnStartup), PolicyTestParams::ForListPolicy( kPolicyRestoreOnStartupURLs, key::kRestoreOnStartupURLs), PolicyTestParams::ForBooleanPolicy( kPolicyDefaultSearchProviderEnabled, key::kDefaultSearchProviderEnabled), PolicyTestParams::ForStringPolicy( kPolicyDefaultSearchProviderName, key::kDefaultSearchProviderName), PolicyTestParams::ForStringPolicy( kPolicyDefaultSearchProviderKeyword, key::kDefaultSearchProviderKeyword), PolicyTestParams::ForStringPolicy( kPolicyDefaultSearchProviderSearchURL, key::kDefaultSearchProviderSearchURL), PolicyTestParams::ForStringPolicy( kPolicyDefaultSearchProviderSuggestURL, key::kDefaultSearchProviderSuggestURL), PolicyTestParams::ForStringPolicy( kPolicyDefaultSearchProviderInstantURL, key::kDefaultSearchProviderInstantURL), PolicyTestParams::ForStringPolicy( kPolicyDefaultSearchProviderIconURL, key::kDefaultSearchProviderIconURL), PolicyTestParams::ForStringPolicy( kPolicyDefaultSearchProviderEncodings, key::kDefaultSearchProviderEncodings), PolicyTestParams::ForStringPolicy( kPolicyProxyMode, key::kProxyMode), PolicyTestParams::ForIntegerPolicy( kPolicyProxyServerMode, key::kProxyServerMode), PolicyTestParams::ForStringPolicy( kPolicyProxyServer, key::kProxyServer), PolicyTestParams::ForStringPolicy( kPolicyProxyPacUrl, key::kProxyPacUrl), PolicyTestParams::ForStringPolicy( kPolicyProxyBypassList, key::kProxyBypassList), PolicyTestParams::ForBooleanPolicy( kPolicyAlternateErrorPagesEnabled, key::kAlternateErrorPagesEnabled), PolicyTestParams::ForBooleanPolicy( kPolicySearchSuggestEnabled, key::kSearchSuggestEnabled), PolicyTestParams::ForBooleanPolicy( kPolicyDnsPrefetchingEnabled, key::kDnsPrefetchingEnabled), PolicyTestParams::ForBooleanPolicy( kPolicySafeBrowsingEnabled, key::kSafeBrowsingEnabled), PolicyTestParams::ForBooleanPolicy( kPolicyMetricsReportingEnabled, key::kMetricsReportingEnabled), PolicyTestParams::ForBooleanPolicy( kPolicyPasswordManagerEnabled, key::kPasswordManagerEnabled), PolicyTestParams::ForBooleanPolicy( kPolicyPasswordManagerAllowShowPasswords, key::kPasswordManagerAllowShowPasswords), PolicyTestParams::ForListPolicy( kPolicyDisabledPlugins, key::kDisabledPlugins), PolicyTestParams::ForListPolicy( kPolicyDisabledPluginsExceptions, key::kDisabledPluginsExceptions), PolicyTestParams::ForListPolicy( kPolicyEnabledPlugins, key::kEnabledPlugins), PolicyTestParams::ForBooleanPolicy( kPolicyAutoFillEnabled, key::kAutoFillEnabled), PolicyTestParams::ForStringPolicy( kPolicyApplicationLocaleValue, key::kApplicationLocaleValue), PolicyTestParams::ForBooleanPolicy( kPolicySyncDisabled, key::kSyncDisabled), PolicyTestParams::ForListPolicy( kPolicyExtensionInstallWhitelist, key::kExtensionInstallWhitelist), PolicyTestParams::ForListPolicy( kPolicyExtensionInstallBlacklist, key::kExtensionInstallBlacklist), PolicyTestParams::ForBooleanPolicy( kPolicyShowHomeButton, key::kShowHomeButton), PolicyTestParams::ForBooleanPolicy( kPolicyPrintingEnabled, key::kPrintingEnabled), PolicyTestParams::ForBooleanPolicy( kPolicyInstantEnabled, key::kInstantEnabled), PolicyTestParams::ForIntegerPolicy( kPolicyPolicyRefreshRate, key::kPolicyRefreshRate), PolicyTestParams::ForBooleanPolicy( kPolicyDisablePluginFinder, key::kDisablePluginFinder), PolicyTestParams::ForBooleanPolicy( kPolicyClearSiteDataOnExit, key::kClearSiteDataOnExit), PolicyTestParams::ForStringPolicy( kPolicyDownloadDirectory, key::kDownloadDirectory), PolicyTestParams::ForBooleanPolicy( kPolicyDefaultBrowserSettingEnabled, key::kDefaultBrowserSettingEnabled), PolicyTestParams::ForBooleanPolicy( kPolicyCloudPrintProxyEnabled, key::kCloudPrintProxyEnabled), PolicyTestParams::ForBooleanPolicy( kPolicyTranslateEnabled, key::kTranslateEnabled), PolicyTestParams::ForBooleanPolicy( kPolicyAllowOutdatedPlugins, key::kAllowOutdatedPlugins), PolicyTestParams::ForBooleanPolicy( kPolicyBookmarkBarEnabled, key::kBookmarkBarEnabled), PolicyTestParams::ForBooleanPolicy( kPolicyEditBookmarksEnabled, key::kEditBookmarksEnabled), PolicyTestParams::ForBooleanPolicy( kPolicyAllowFileSelectionDialogs, key::kAllowFileSelectionDialogs), PolicyTestParams::ForListPolicy( kPolicyDisabledSchemes, key::kDisabledSchemes))); } // namespace policy