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