// Copyright (c) 2012 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 "chrome/browser/policy/configuration_policy_pref_store_unittest.h" #include #include "base/callback.h" #include "base/files/file_path.h" #include "base/prefs/pref_store_observer_mock.h" #include "base/run_loop.h" #include "chrome/browser/policy/configuration_policy_handler.h" #include "chrome/browser/policy/configuration_policy_pref_store.h" #include "chrome/browser/policy/policy_service_impl.h" #include "components/policy/core/common/external_data_fetcher.h" #include "components/policy/core/common/policy_map.h" #include "components/policy/core/common/policy_pref_names.h" #include "testing/gmock/include/gmock/gmock.h" using testing::Mock; using testing::Return; using testing::_; namespace { const char kTestPolicy[] = "test.policy"; const char kTestPref[] = "test.pref"; } // namespace namespace policy { // Holds a set of test parameters, consisting of pref name and policy name. class PolicyAndPref { public: PolicyAndPref(const char* policy_name, const char* pref_name) : policy_name_(policy_name), pref_name_(pref_name) {} const char* policy_name() const { return policy_name_; } const char* pref_name() const { return pref_name_; } private: const char* policy_name_; const char* pref_name_; }; ConfigurationPolicyPrefStoreTest::ConfigurationPolicyPrefStoreTest() { EXPECT_CALL(provider_, IsInitializationComplete(_)) .WillRepeatedly(Return(false)); provider_.Init(); providers_.push_back(&provider_); policy_service_.reset(new PolicyServiceImpl( providers_, PolicyServiceImpl::PreprocessCallback())); store_ = new ConfigurationPolicyPrefStore( policy_service_.get(), &handler_list_, POLICY_LEVEL_MANDATORY); } ConfigurationPolicyPrefStoreTest::~ConfigurationPolicyPrefStoreTest() {} void ConfigurationPolicyPrefStoreTest::TearDown() { provider_.Shutdown(); } void ConfigurationPolicyPrefStoreTest::UpdateProviderPolicy( const PolicyMap& policy) { provider_.UpdateChromePolicy(policy); base::RunLoop loop; loop.RunUntilIdle(); } // Test cases for list-valued policy settings. class ConfigurationPolicyPrefStoreListTest : public ConfigurationPolicyPrefStoreTest { virtual void SetUp() OVERRIDE { handler_list_.AddHandler( make_scoped_ptr(new SimplePolicyHandler( kTestPolicy, kTestPref, base::Value::TYPE_LIST))); } }; TEST_F(ConfigurationPolicyPrefStoreListTest, GetDefault) { EXPECT_FALSE(store_->GetValue(kTestPref, NULL)); } TEST_F(ConfigurationPolicyPrefStoreListTest, SetValue) { base::ListValue* in_value = new base::ListValue(); in_value->Append(base::Value::CreateStringValue("test1")); in_value->Append(base::Value::CreateStringValue("test2,")); PolicyMap policy; policy.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, in_value, NULL); UpdateProviderPolicy(policy); const base::Value* value = NULL; EXPECT_TRUE(store_->GetValue(kTestPref, &value)); ASSERT_TRUE(value); EXPECT_TRUE(in_value->Equals(value)); } // Test cases for string-valued policy settings. class ConfigurationPolicyPrefStoreStringTest : public ConfigurationPolicyPrefStoreTest { virtual void SetUp() OVERRIDE { handler_list_.AddHandler( make_scoped_ptr(new SimplePolicyHandler( kTestPolicy, kTestPref, base::Value::TYPE_STRING))); } }; TEST_F(ConfigurationPolicyPrefStoreStringTest, GetDefault) { EXPECT_FALSE(store_->GetValue(kTestPref, NULL)); } TEST_F(ConfigurationPolicyPrefStoreStringTest, SetValue) { PolicyMap policy; policy.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, base::Value::CreateStringValue("http://chromium.org"), NULL); UpdateProviderPolicy(policy); const base::Value* value = NULL; EXPECT_TRUE(store_->GetValue(kTestPref, &value)); ASSERT_TRUE(value); EXPECT_TRUE(base::StringValue("http://chromium.org").Equals(value)); } // Test cases for boolean-valued policy settings. class ConfigurationPolicyPrefStoreBooleanTest : public ConfigurationPolicyPrefStoreTest { virtual void SetUp() OVERRIDE { handler_list_.AddHandler( make_scoped_ptr(new SimplePolicyHandler( kTestPolicy, kTestPref, base::Value::TYPE_BOOLEAN))); } }; TEST_F(ConfigurationPolicyPrefStoreBooleanTest, GetDefault) { EXPECT_FALSE(store_->GetValue(kTestPref, NULL)); } TEST_F(ConfigurationPolicyPrefStoreBooleanTest, SetValue) { PolicyMap policy; policy.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, base::Value::CreateBooleanValue(false), NULL); UpdateProviderPolicy(policy); const base::Value* value = NULL; EXPECT_TRUE(store_->GetValue(kTestPref, &value)); ASSERT_TRUE(value); bool boolean_value = true; bool result = value->GetAsBoolean(&boolean_value); ASSERT_TRUE(result); EXPECT_FALSE(boolean_value); policy.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, base::Value::CreateBooleanValue(true), NULL); UpdateProviderPolicy(policy); value = NULL; EXPECT_TRUE(store_->GetValue(kTestPref, &value)); boolean_value = false; result = value->GetAsBoolean(&boolean_value); ASSERT_TRUE(result); EXPECT_TRUE(boolean_value); } // Test cases for integer-valued policy settings. class ConfigurationPolicyPrefStoreIntegerTest : public ConfigurationPolicyPrefStoreTest { virtual void SetUp() OVERRIDE { handler_list_.AddHandler( make_scoped_ptr(new SimplePolicyHandler( kTestPolicy, kTestPref, base::Value::TYPE_INTEGER))); } }; TEST_F(ConfigurationPolicyPrefStoreIntegerTest, GetDefault) { EXPECT_FALSE(store_->GetValue(kTestPref, NULL)); } TEST_F(ConfigurationPolicyPrefStoreIntegerTest, SetValue) { PolicyMap policy; policy.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, base::Value::CreateIntegerValue(2), NULL); UpdateProviderPolicy(policy); const base::Value* value = NULL; EXPECT_TRUE(store_->GetValue(kTestPref, &value)); EXPECT_TRUE(base::FundamentalValue(2).Equals(value)); } // Exercises the policy refresh mechanism. class ConfigurationPolicyPrefStoreRefreshTest : public ConfigurationPolicyPrefStoreTest { protected: virtual void SetUp() OVERRIDE { ConfigurationPolicyPrefStoreTest::SetUp(); store_->AddObserver(&observer_); handler_list_.AddHandler( make_scoped_ptr(new SimplePolicyHandler( kTestPolicy, kTestPref, base::Value::TYPE_STRING))); } virtual void TearDown() OVERRIDE { store_->RemoveObserver(&observer_); ConfigurationPolicyPrefStoreTest::TearDown(); } PrefStoreObserverMock observer_; }; TEST_F(ConfigurationPolicyPrefStoreRefreshTest, Refresh) { const base::Value* value = NULL; EXPECT_FALSE(store_->GetValue(kTestPolicy, NULL)); EXPECT_CALL(observer_, OnPrefValueChanged(kTestPref)).Times(1); PolicyMap policy; policy.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, base::Value::CreateStringValue("http://www.chromium.org"), NULL); UpdateProviderPolicy(policy); Mock::VerifyAndClearExpectations(&observer_); EXPECT_TRUE(store_->GetValue(kTestPref, &value)); EXPECT_TRUE(base::StringValue("http://www.chromium.org").Equals(value)); EXPECT_CALL(observer_, OnPrefValueChanged(_)).Times(0); UpdateProviderPolicy(policy); Mock::VerifyAndClearExpectations(&observer_); EXPECT_CALL(observer_, OnPrefValueChanged(kTestPref)).Times(1); policy.Erase(kTestPolicy); UpdateProviderPolicy(policy); Mock::VerifyAndClearExpectations(&observer_); EXPECT_FALSE(store_->GetValue(kTestPref, NULL)); } TEST_F(ConfigurationPolicyPrefStoreRefreshTest, Initialization) { EXPECT_FALSE(store_->IsInitializationComplete()); EXPECT_CALL(provider_, IsInitializationComplete(POLICY_DOMAIN_CHROME)) .WillRepeatedly(Return(true)); EXPECT_CALL(observer_, OnInitializationCompleted(true)).Times(1); PolicyMap policy; UpdateProviderPolicy(policy); Mock::VerifyAndClearExpectations(&observer_); EXPECT_TRUE(store_->IsInitializationComplete()); } } // namespace policy