15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)#include "components/policy/core/common/cloud/cloud_policy_manager.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/callback.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/cloud_policy_constants.h"
13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/mock_cloud_policy_client.h"
14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/mock_cloud_policy_store.h"
15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/policy_builder.h"
16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/configuration_policy_provider_test.h"
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/external_data_fetcher.h"
18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/mock_configuration_policy_provider.h"
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/schema_registry.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::Mock;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using testing::_;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace em = enterprise_management;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace policy {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestHarness : public PolicyProviderTestHarness {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit TestHarness(PolicyLevel level);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestHarness();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ConfigurationPolicyProvider* CreateProvider(
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      SchemaRegistry* registry,
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      scoped_refptr<base::SequencedTaskRunner> task_runner) OVERRIDE;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void InstallEmptyPolicy() OVERRIDE;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void InstallStringPolicy(const std::string& policy_name,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const std::string& policy_value) OVERRIDE;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void InstallIntegerPolicy(const std::string& policy_name,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    int policy_value) OVERRIDE;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void InstallBooleanPolicy(const std::string& policy_name,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    bool policy_value) OVERRIDE;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void InstallStringListPolicy(
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& policy_name,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::ListValue* policy_value) OVERRIDE;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void InstallDictionaryPolicy(
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& policy_name,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::DictionaryValue* policy_value) OVERRIDE;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates harnesses for mandatory and recommended levels, respectively.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static PolicyProviderTestHarness* CreateMandatory();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static PolicyProviderTestHarness* CreateRecommended();
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockCloudPolicyStore store_;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestHarness);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestHarness::TestHarness(PolicyLevel level)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : PolicyProviderTestHarness(level, POLICY_SCOPE_USER) {}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestHarness::~TestHarness() {}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestHarness::SetUp() {}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ConfigurationPolicyProvider* TestHarness::CreateProvider(
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SchemaRegistry* registry,
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_refptr<base::SequencedTaskRunner> task_runner) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create and initialize the store.
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  store_.NotifyStoreLoaded();
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ConfigurationPolicyProvider* provider = new CloudPolicyManager(
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PolicyNamespaceKey(dm_protocol::kChromeUserPolicyType, std::string()),
80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      &store_,
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      task_runner,
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      task_runner,
83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      task_runner);
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&store_);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return provider;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestHarness::InstallEmptyPolicy() {}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestHarness::InstallStringPolicy(const std::string& policy_name,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const std::string& policy_value) {
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  store_.policy_map_.Set(policy_name,
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         policy_level(),
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         policy_scope(),
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         new base::StringValue(policy_value),
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         NULL);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestHarness::InstallIntegerPolicy(const std::string& policy_name,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int policy_value) {
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  store_.policy_map_.Set(policy_name,
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         policy_level(),
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         policy_scope(),
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         new base::FundamentalValue(policy_value),
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         NULL);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestHarness::InstallBooleanPolicy(const std::string& policy_name,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       bool policy_value) {
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  store_.policy_map_.Set(policy_name,
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         policy_level(),
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         policy_scope(),
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         new base::FundamentalValue(policy_value),
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         NULL);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestHarness::InstallStringListPolicy(const std::string& policy_name,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const base::ListValue* policy_value) {
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  store_.policy_map_.Set(policy_name, policy_level(), policy_scope(),
1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                         policy_value->DeepCopy(), NULL);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestHarness::InstallDictionaryPolicy(
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& policy_name,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::DictionaryValue* policy_value) {
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  store_.policy_map_.Set(policy_name, policy_level(), policy_scope(),
1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                         policy_value->DeepCopy(), NULL);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PolicyProviderTestHarness* TestHarness::CreateMandatory() {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new TestHarness(POLICY_LEVEL_MANDATORY);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PolicyProviderTestHarness* TestHarness::CreateRecommended() {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new TestHarness(POLICY_LEVEL_RECOMMENDED);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Instantiate abstract test case for basic policy reading tests.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UserCloudPolicyManagerProviderTest,
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ConfigurationPolicyProviderTest,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testing::Values(TestHarness::CreateMandatory,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    TestHarness::CreateRecommended));
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestCloudPolicyManager : public CloudPolicyManager {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
149d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  TestCloudPolicyManager(
150d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      CloudPolicyStore* store,
151d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      const scoped_refptr<base::SequencedTaskRunner>& task_runner)
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : CloudPolicyManager(PolicyNamespaceKey(
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               dm_protocol::kChromeUserPolicyType,
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               std::string()),
155d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                           store,
156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           task_runner,
157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           task_runner,
158d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                           task_runner) {}
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestCloudPolicyManager() {}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Publish the protected members for testing.
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  using CloudPolicyManager::client;
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  using CloudPolicyManager::store;
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  using CloudPolicyManager::service;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using CloudPolicyManager::CheckAndPublishPolicy;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestCloudPolicyManager);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER_P(ProtoMatches, proto, "") {
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return arg.SerializePartialAsString() == proto.SerializePartialAsString();
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CloudPolicyManagerTest : public testing::Test {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CloudPolicyManagerTest()
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : policy_ns_key_(dm_protocol::kChromeUserPolicyType, std::string()) {}
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Set up a policy map for testing.
1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    policy_map_.Set("key",
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    POLICY_LEVEL_MANDATORY,
1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    POLICY_SCOPE_USER,
1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    new base::StringValue("value"),
1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    NULL);
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    expected_bundle_.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()))
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        .CopyFrom(policy_map_);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    policy_.payload().mutable_passwordmanagerenabled()->set_value(false);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    policy_.Build();
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(store_, Load());
194d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    manager_.reset(new TestCloudPolicyManager(&store_,
195d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                              loop_.message_loop_proxy()));
196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    manager_->Init(&schema_registry_);
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Mock::VerifyAndClearExpectations(&store_);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_->AddObserver(&observer_);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_->RemoveObserver(&observer_);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_->Shutdown();
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Required by the refresh scheduler that's created by the manager.
20790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop loop_;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Testing policy.
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const PolicyNamespaceKey policy_ns_key_;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UserPolicyBuilder policy_;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PolicyMap policy_map_;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PolicyBundle expected_bundle_;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Policy infrastructure.
216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SchemaRegistry schema_registry_;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockConfigurationPolicyObserver observer_;
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockCloudPolicyStore store_;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestCloudPolicyManager> manager_;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CloudPolicyManagerTest);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CloudPolicyManagerTest, InitAndShutdown) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PolicyBundle empty_bundle;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(empty_bundle.Equals(manager_->policies()));
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnUpdatePolicy(_)).Times(0);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->CheckAndPublishPolicy();
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer_);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  store_.policy_map_.CopyFrom(policy_map_);
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  store_.policy_.reset(new em::PolicyData(policy_.policy_data()));
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnUpdatePolicy(manager_.get()));
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  store_.NotifyStoreLoaded();
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer_);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(expected_bundle_.Equals(manager_->policies()));
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockCloudPolicyClient* client = new MockCloudPolicyClient();
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*client, SetupRegistration(_, _));
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->core()->Connect(scoped_ptr<CloudPolicyClient>(client));
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(client);
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->client());
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->service());
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnUpdatePolicy(manager_.get()));
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->CheckAndPublishPolicy();
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer_);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->core()->Disconnect();
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->client());
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_->service());
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CloudPolicyManagerTest, RegistrationAndFetch) {
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnUpdatePolicy(manager_.get()));
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  store_.NotifyStoreLoaded();
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer_);
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockCloudPolicyClient* client = new MockCloudPolicyClient();
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->core()->Connect(scoped_ptr<CloudPolicyClient>(client));
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client->SetDMToken(policy_.policy_data().request_token());
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client->NotifyRegistrationStateChanged();
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client->SetPolicy(policy_ns_key_, policy_.policy());
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(store_, Store(ProtoMatches(policy_.policy())));
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client->NotifyPolicyFetched();
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&store_);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  store_.policy_map_.CopyFrom(policy_map_);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnUpdatePolicy(manager_.get()));
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  store_.NotifyStoreLoaded();
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer_);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(expected_bundle_.Equals(manager_->policies()));
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CloudPolicyManagerTest, Update) {
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnUpdatePolicy(manager_.get()));
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  store_.NotifyStoreLoaded();
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer_);
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PolicyBundle empty_bundle;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(empty_bundle.Equals(manager_->policies()));
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  store_.policy_map_.CopyFrom(policy_map_);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnUpdatePolicy(manager_.get()));
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  store_.NotifyStoreLoaded();
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer_);
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(expected_bundle_.Equals(manager_->policies()));
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CloudPolicyManagerTest, RefreshNotRegistered) {
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockCloudPolicyClient* client = new MockCloudPolicyClient();
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->core()->Connect(scoped_ptr<CloudPolicyClient>(client));
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnUpdatePolicy(manager_.get()));
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  store_.NotifyStoreLoaded();
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer_);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A refresh on a non-registered store should not block.
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnUpdatePolicy(manager_.get()));
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->RefreshPolicies();
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer_);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CloudPolicyManagerTest, RefreshSuccessful) {
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockCloudPolicyClient* client = new MockCloudPolicyClient();
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_->core()->Connect(scoped_ptr<CloudPolicyClient>(client));
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate a store load.
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  store_.policy_.reset(new em::PolicyData(policy_.policy_data()));
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnUpdatePolicy(manager_.get()));
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*client, SetupRegistration(_, _));
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  store_.NotifyStoreLoaded();
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(client);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer_);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Acknowledge registration.
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client->SetDMToken(policy_.policy_data().request_token());
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start a refresh.
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnUpdatePolicy(_)).Times(0);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*client, FetchPolicy());
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->RefreshPolicies();
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(client);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer_);
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  store_.policy_map_.CopyFrom(policy_map_);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A stray reload should be suppressed until the refresh completes.
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnUpdatePolicy(_)).Times(0);
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  store_.NotifyStoreLoaded();
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer_);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Respond to the policy fetch, which should trigger a write to |store_|.
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnUpdatePolicy(_)).Times(0);
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(store_, Store(_));
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  client->SetPolicy(policy_ns_key_, policy_.policy());
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  client->NotifyPolicyFetched();
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer_);
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&store_);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The load notification from |store_| should trigger the policy update.
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer_, OnUpdatePolicy(manager_.get()));
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  store_.NotifyStoreLoaded();
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(expected_bundle_.Equals(manager_->policies()));
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer_);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(CloudPolicyManagerTest, SignalOnError) {
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Simulate a failed load and verify that it triggers OnUpdatePolicy().
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  store_.policy_.reset(new em::PolicyData(policy_.policy_data()));
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(observer_, OnUpdatePolicy(manager_.get()));
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  store_.NotifyStoreError();
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer_);
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace policy
367