1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#ifndef COMPONENTS_POLICY_CORE_COMMON_CONFIGURATION_POLICY_PROVIDER_TEST_H_ 6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define COMPONENTS_POLICY_CORE_COMMON_CONFIGURATION_POLICY_PROVIDER_TEST_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_forward.h" 123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/memory/ref_counted.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 149ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/policy_types.h" 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/schema.h" 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/schema_registry.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DictionaryValue; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ListValue; 233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class SequencedTaskRunner; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Value; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace policy { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ConfigurationPolicyProvider; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace test_keys { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern const char kKeyString[]; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern const char kKeyBoolean[]; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern const char kKeyInteger[]; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern const char kKeyStringList[]; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern const char kKeyDictionary[]; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace test_keys 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PolicyTestBase : public testing::Test { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyTestBase(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~PolicyTestBase(); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // testing::Test: 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void SetUp() OVERRIDE; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool RegisterSchema(const PolicyNamespace& ns, 52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::string& schema); 53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SchemaRegistry schema_registry_; 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create an actual IO loop (needed by FilePathWatcher). 5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForIO loop_; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PolicyTestBase); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An interface for creating a test policy provider and creating a policy 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// provider instance for testing. Used as the parameter to the abstract 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ConfigurationPolicyProviderTest below. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PolicyProviderTestHarness { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |level| and |scope| are the level and scope of the policies returned by 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the providers from CreateProvider(). 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyProviderTestHarness(PolicyLevel level, PolicyScope scope); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~PolicyProviderTestHarness(); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Actions to run at gtest SetUp() time. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() = 0; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a new policy provider. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ConfigurationPolicyProvider* CreateProvider( 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SchemaRegistry* registry, 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> task_runner) = 0; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the policy level and scope set by the policy provider. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyLevel policy_level() const; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyScope policy_scope() const; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helpers to configure the environment the policy provider reads from. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InstallEmptyPolicy() = 0; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InstallStringPolicy(const std::string& policy_name, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& policy_value) = 0; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InstallIntegerPolicy(const std::string& policy_name, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int policy_value) = 0; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InstallBooleanPolicy(const std::string& policy_name, 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool policy_value) = 0; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InstallStringListPolicy(const std::string& policy_name, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::ListValue* policy_value) = 0; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InstallDictionaryPolicy( 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& policy_name, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue* policy_value) = 0; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Not every provider supports installing 3rd party policy. Those who do 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should override this method; the default just makes the test fail. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Install3rdPartyPolicy(const base::DictionaryValue* policies); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyLevel level_; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyScope scope_; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PolicyProviderTestHarness); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A factory method for creating a test harness. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef PolicyProviderTestHarness* (*CreatePolicyProviderTestHarness)(); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Abstract policy provider test. This is meant to be instantiated for each 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// policy provider implementation, passing in a suitable harness factory 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// function as the test parameter. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ConfigurationPolicyProviderTest 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public PolicyTestBase, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public testing::WithParamInterface<CreatePolicyProviderTestHarness> { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConfigurationPolicyProviderTest(); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ConfigurationPolicyProviderTest(); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Installs a valid policy and checks whether the provider returns the 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |expected_value|. 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CheckValue(const char* policy_name, 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Value& expected_value, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Closure install_value); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<PolicyProviderTestHarness> test_harness_; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ConfigurationPolicyProvider> provider_; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ConfigurationPolicyProviderTest); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An extension of ConfigurationPolicyProviderTest that also tests loading of 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3rd party policy. Policy provider implementations that support loading of 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3rd party policy should also instantiate these tests. 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Configuration3rdPartyPolicyProviderTest 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public ConfigurationPolicyProviderTest { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Configuration3rdPartyPolicyProviderTest(); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Configuration3rdPartyPolicyProviderTest(); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Configuration3rdPartyPolicyProviderTest); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace policy 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // COMPONENTS_POLICY_CORE_COMMON_CONFIGURATION_POLICY_PROVIDER_TEST_H_ 155