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/policy_service_impl.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/callback.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/run_loop.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/external_data_fetcher.h"
14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/mock_configuration_policy_provider.h"
15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/mock_policy_service.h"
16d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#include "policy/policy_constants.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::AnyNumber;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Mock;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace policy {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kExtension[] = "extension-id";
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSameLevelPolicy[] = "policy-same-level-and-scope";
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kDiffLevelPolicy[] = "chrome-diff-level-and-scope";
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper to compare the arguments to an EXPECT_CALL of OnPolicyUpdated() with
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// their expected values.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER_P(PolicyEquals, expected, "") {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return arg.Equals(*expected);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper to compare the arguments to an EXPECT_CALL of OnPolicyValueUpdated()
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with their expected values.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER_P(ValueEquals, expected, "") {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::Value::Equals(arg, expected);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper that fills |bundle| with test policies.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AddTestPolicies(PolicyBundle* bundle,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const char* value,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     PolicyLevel level,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     PolicyScope scope) {
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PolicyMap* policy_map =
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &bundle->Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()));
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy_map->Set(kSameLevelPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                  base::Value::CreateStringValue(value), NULL);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy_map->Set(kDiffLevelPolicy, level, scope,
557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                  base::Value::CreateStringValue(value), NULL);
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  policy_map =
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &bundle->Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kExtension));
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy_map->Set(kSameLevelPolicy, POLICY_LEVEL_MANDATORY,
597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                  POLICY_SCOPE_USER, base::Value::CreateStringValue(value),
607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                  NULL);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy_map->Set(kDiffLevelPolicy, level, scope,
627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                  base::Value::CreateStringValue(value), NULL);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Observer class that changes the policy in the passed provider when the
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// callback is invoked.
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ChangePolicyObserver : public PolicyService::Observer {
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit ChangePolicyObserver(MockConfigurationPolicyProvider* provider)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : provider_(provider),
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        observer_invoked_(false) {}
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnPolicyUpdated(const PolicyNamespace&,
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               const PolicyMap& previous,
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               const PolicyMap& current) OVERRIDE {
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PolicyMap new_policy;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    new_policy.Set("foo", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                   base::Value::CreateIntegerValue(14), NULL);
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    provider_->UpdateChromePolicy(new_policy);
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer_invoked_ = true;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool observer_invoked() const { return observer_invoked_; }
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockConfigurationPolicyProvider* provider_;
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool observer_invoked_;
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PolicyServiceTest : public testing::Test {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PolicyServiceTest() {}
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(provider0_, IsInitializationComplete(_))
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(Return(true));
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(provider1_, IsInitializationComplete(_))
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(Return(true));
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(provider2_, IsInitializationComplete(_))
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(Return(true));
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    provider0_.Init();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    provider1_.Init();
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    provider2_.Init();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    policy0_.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 base::Value::CreateIntegerValue(13), NULL);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    provider0_.UpdateChromePolicy(policy0_);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PolicyServiceImpl::Providers providers;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    providers.push_back(&provider0_);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    providers.push_back(&provider1_);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    providers.push_back(&provider2_);
115d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)    policy_service_.reset(new PolicyServiceImpl(providers));
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    provider0_.Shutdown();
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    provider1_.Shutdown();
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    provider2_.Shutdown();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(OnPolicyValueUpdated, void(const base::Value*,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const base::Value*));
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(OnPolicyRefresh, void());
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true if the policies for namespace |ns| match |expected|.
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool VerifyPolicies(const PolicyNamespace& ns,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const PolicyMap& expected) {
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return policy_service_->GetPolicies(ns).Equals(expected);
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RunUntilIdle() {
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::RunLoop loop;
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop.RunUntilIdle();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::MessageLoop loop_;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockConfigurationPolicyProvider provider0_;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockConfigurationPolicyProvider provider1_;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockConfigurationPolicyProvider provider2_;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PolicyMap policy0_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PolicyMap policy1_;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PolicyMap policy2_;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PolicyServiceImpl> policy_service_;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PolicyServiceTest);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PolicyServiceTest, LoadsPoliciesBeforeProvidersRefresh) {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PolicyMap expected;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
1577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               base::Value::CreateIntegerValue(13), NULL);
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(VerifyPolicies(
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()), expected));
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PolicyServiceTest, NotifyObservers) {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockPolicyServiceObserver observer;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy_service_->AddObserver(POLICY_DOMAIN_CHROME, &observer);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PolicyMap expectedPrevious;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expectedPrevious.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
1687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                       base::Value::CreateIntegerValue(13), NULL);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PolicyMap expectedCurrent;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expectedCurrent.CopyFrom(expectedPrevious);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expectedCurrent.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
1737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                      base::Value::CreateIntegerValue(123), NULL);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
1757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               base::Value::CreateIntegerValue(123), NULL);
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(observer, OnPolicyUpdated(PolicyNamespace(POLICY_DOMAIN_CHROME,
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                        std::string()),
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        PolicyEquals(&expectedPrevious),
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        PolicyEquals(&expectedCurrent)));
180a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  provider0_.UpdateChromePolicy(policy0_);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No changes.
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(observer, OnPolicyUpdated(_, _, _)).Times(0);
185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  provider0_.UpdateChromePolicy(policy0_);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer);
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(VerifyPolicies(
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()), expectedCurrent));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // New policy.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expectedPrevious.CopyFrom(expectedCurrent);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expectedCurrent.Set("bbb", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
1937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                      base::Value::CreateIntegerValue(456), NULL);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy0_.Set("bbb", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
1957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               base::Value::CreateIntegerValue(456), NULL);
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(observer, OnPolicyUpdated(PolicyNamespace(POLICY_DOMAIN_CHROME,
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                        std::string()),
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        PolicyEquals(&expectedPrevious),
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        PolicyEquals(&expectedCurrent)));
200a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  provider0_.UpdateChromePolicy(policy0_);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removed policy.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expectedPrevious.CopyFrom(expectedCurrent);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expectedCurrent.Erase("bbb");
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy0_.Erase("bbb");
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(observer, OnPolicyUpdated(PolicyNamespace(POLICY_DOMAIN_CHROME,
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                        std::string()),
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        PolicyEquals(&expectedPrevious),
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        PolicyEquals(&expectedCurrent)));
211a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  provider0_.UpdateChromePolicy(policy0_);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Changed policy.
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expectedPrevious.CopyFrom(expectedCurrent);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expectedCurrent.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
2177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                      base::Value::CreateIntegerValue(789), NULL);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
2197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               base::Value::CreateIntegerValue(789), NULL);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(observer, OnPolicyUpdated(PolicyNamespace(POLICY_DOMAIN_CHROME,
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                        std::string()),
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        PolicyEquals(&expectedPrevious),
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        PolicyEquals(&expectedCurrent)));
225a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  provider0_.UpdateChromePolicy(policy0_);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No changes again.
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(observer, OnPolicyUpdated(_, _, _)).Times(0);
230a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  provider0_.UpdateChromePolicy(policy0_);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer);
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(VerifyPolicies(
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()), expectedCurrent));
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy_service_->RemoveObserver(POLICY_DOMAIN_CHROME, &observer);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PolicyServiceTest, NotifyObserversInMultipleNamespaces) {
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string kExtension0("extension-0");
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string kExtension1("extension-1");
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string kExtension2("extension-2");
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockPolicyServiceObserver chrome_observer;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockPolicyServiceObserver extension_observer;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy_service_->AddObserver(POLICY_DOMAIN_CHROME, &chrome_observer);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy_service_->AddObserver(POLICY_DOMAIN_EXTENSIONS, &extension_observer);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PolicyMap previous_policy_map;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  previous_policy_map.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
2497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                          base::Value::CreateIntegerValue(13), NULL);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PolicyMap policy_map;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy_map.CopyFrom(previous_policy_map);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy_map.Set("policy", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
2537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 base::Value::CreateStringValue("value"), NULL);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PolicyBundle> bundle(new PolicyBundle());
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The initial setup includes a policy for chrome that is now changing.
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bundle->Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()))
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .CopyFrom(policy_map);
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bundle->Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kExtension0))
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .CopyFrom(policy_map);
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bundle->Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kExtension1))
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .CopyFrom(policy_map);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PolicyMap kEmptyPolicyMap;
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chrome_observer,
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      OnPolicyUpdated(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()),
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      PolicyEquals(&previous_policy_map),
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      PolicyEquals(&policy_map)));
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_observer,
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      OnPolicyUpdated(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kExtension0),
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      PolicyEquals(&kEmptyPolicyMap),
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      PolicyEquals(&policy_map)));
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_observer,
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      OnPolicyUpdated(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kExtension1),
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      PolicyEquals(&kEmptyPolicyMap),
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      PolicyEquals(&policy_map)));
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider0_.UpdatePolicy(bundle.Pass());
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RunUntilIdle();
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&chrome_observer);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&extension_observer);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Chrome policy stays the same, kExtension0 is gone, kExtension1 changes,
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and kExtension2 is new.
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  previous_policy_map.CopyFrom(policy_map);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bundle.reset(new PolicyBundle());
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bundle->Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()))
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .CopyFrom(policy_map);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy_map.Set("policy", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
2927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 base::Value::CreateStringValue("another value"), NULL);
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bundle->Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kExtension1))
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .CopyFrom(policy_map);
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bundle->Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kExtension2))
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .CopyFrom(policy_map);
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(chrome_observer, OnPolicyUpdated(_, _, _)).Times(0);
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_observer,
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      OnPolicyUpdated(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kExtension0),
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      PolicyEquals(&previous_policy_map),
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      PolicyEquals(&kEmptyPolicyMap)));
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_observer,
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      OnPolicyUpdated(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kExtension1),
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      PolicyEquals(&previous_policy_map),
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      PolicyEquals(&policy_map)));
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extension_observer,
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      OnPolicyUpdated(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kExtension2),
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      PolicyEquals(&kEmptyPolicyMap),
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      PolicyEquals(&policy_map)));
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider0_.UpdatePolicy(bundle.Pass());
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RunUntilIdle();
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&chrome_observer);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(&extension_observer);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy_service_->RemoveObserver(POLICY_DOMAIN_CHROME, &chrome_observer);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy_service_->RemoveObserver(POLICY_DOMAIN_EXTENSIONS,
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  &extension_observer);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PolicyServiceTest, ObserverChangesPolicy) {
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ChangePolicyObserver observer(&provider0_);
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  policy_service_->AddObserver(POLICY_DOMAIN_CHROME, &observer);
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
3287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               base::Value::CreateIntegerValue(123), NULL);
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  policy0_.Set("bbb", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
3307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               base::Value::CreateIntegerValue(1234), NULL);
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Should not crash.
332a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  provider0_.UpdateChromePolicy(policy0_);
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  policy_service_->RemoveObserver(POLICY_DOMAIN_CHROME, &observer);
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(observer.observer_invoked());
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PolicyServiceTest, Priorities) {
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PolicyMap expected;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
3407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               base::Value::CreateIntegerValue(13), NULL);
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
3427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               base::Value::CreateIntegerValue(0), NULL);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
3447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               base::Value::CreateIntegerValue(0), NULL);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy1_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
3467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               base::Value::CreateIntegerValue(1), NULL);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy2_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
3487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               base::Value::CreateIntegerValue(2), NULL);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider0_.UpdateChromePolicy(policy0_);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider1_.UpdateChromePolicy(policy1_);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider2_.UpdateChromePolicy(policy2_);
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(VerifyPolicies(
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()), expected));
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
3567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               base::Value::CreateIntegerValue(1), NULL);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy0_.Erase("aaa");
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider0_.UpdateChromePolicy(policy0_);
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(VerifyPolicies(
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()), expected));
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
3637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               base::Value::CreateIntegerValue(2), NULL);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy1_.Set("aaa", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER,
3657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               base::Value::CreateIntegerValue(1), NULL);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider1_.UpdateChromePolicy(policy1_);
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(VerifyPolicies(
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()), expected));
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PolicyServiceTest, PolicyChangeRegistrar) {
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<PolicyChangeRegistrar> registrar(new PolicyChangeRegistrar(
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      policy_service_.get(),
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())));
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starting to observe existing policies doesn't trigger a notification.
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this, OnPolicyValueUpdated(_, _)).Times(0);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar->Observe("pre", base::Bind(
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &PolicyServiceTest::OnPolicyValueUpdated,
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Unretained(this)));
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar->Observe("aaa", base::Bind(
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &PolicyServiceTest::OnPolicyValueUpdated,
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Unretained(this)));
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RunUntilIdle();
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(this);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Changing it now triggers a notification.
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::FundamentalValue kValue0(0);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this, OnPolicyValueUpdated(NULL, ValueEquals(&kValue0)));
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
3917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               kValue0.DeepCopy(), NULL);
392a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  provider0_.UpdateChromePolicy(policy0_);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(this);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Changing other values doesn't trigger a notification.
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this, OnPolicyValueUpdated(_, _)).Times(0);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy0_.Set("bbb", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
3987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               kValue0.DeepCopy(), NULL);
399a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  provider0_.UpdateChromePolicy(policy0_);
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(this);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Modifying the value triggers a notification.
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::FundamentalValue kValue1(1);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this, OnPolicyValueUpdated(ValueEquals(&kValue0),
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          ValueEquals(&kValue1)));
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
4077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               kValue1.DeepCopy(), NULL);
408a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  provider0_.UpdateChromePolicy(policy0_);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(this);
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removing the value triggers a notification.
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this, OnPolicyValueUpdated(ValueEquals(&kValue1), NULL));
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy0_.Erase("aaa");
414a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  provider0_.UpdateChromePolicy(policy0_);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(this);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No more notifications after destroying the registrar.
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this, OnPolicyValueUpdated(_, _)).Times(0);
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar.reset();
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
4217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               kValue1.DeepCopy(), NULL);
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy0_.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
4237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               kValue1.DeepCopy(), NULL);
424a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  provider0_.UpdateChromePolicy(policy0_);
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(this);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PolicyServiceTest, RefreshPolicies) {
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(provider0_, RefreshPolicies()).Times(AnyNumber());
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(provider1_, RefreshPolicies()).Times(AnyNumber());
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(provider2_, RefreshPolicies()).Times(AnyNumber());
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this, OnPolicyRefresh()).Times(0);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy_service_->RefreshPolicies(base::Bind(
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &PolicyServiceTest::OnPolicyRefresh,
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Unretained(this)));
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Let any queued observer tasks run.
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RunUntilIdle();
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(this);
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this, OnPolicyRefresh()).Times(0);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::FundamentalValue kValue0(0);
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
4447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               kValue0.DeepCopy(), NULL);
445a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  provider0_.UpdateChromePolicy(policy0_);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(this);
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this, OnPolicyRefresh()).Times(0);
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::FundamentalValue kValue1(1);
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy1_.Set("aaa", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER,
4517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               kValue1.DeepCopy(), NULL);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider1_.UpdateChromePolicy(policy1_);
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(this);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A provider can refresh more than once after a RefreshPolicies call, but
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OnPolicyRefresh should be triggered only after all providers are
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // refreshed.
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this, OnPolicyRefresh()).Times(0);
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy1_.Set("bbb", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER,
4607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               kValue1.DeepCopy(), NULL);
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider1_.UpdateChromePolicy(policy1_);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(this);
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If another RefreshPolicies() call happens while waiting for a previous
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // one to complete, then all providers must refresh again.
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this, OnPolicyRefresh()).Times(0);
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy_service_->RefreshPolicies(base::Bind(
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &PolicyServiceTest::OnPolicyRefresh,
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Unretained(this)));
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RunUntilIdle();
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(this);
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this, OnPolicyRefresh()).Times(0);
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy2_.Set("bbb", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
4757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               kValue0.DeepCopy(), NULL);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider2_.UpdateChromePolicy(policy2_);
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(this);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Providers 0 and 1 must reload again.
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*this, OnPolicyRefresh()).Times(2);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::FundamentalValue kValue2(2);
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
4837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               kValue2.DeepCopy(), NULL);
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider0_.UpdateChromePolicy(policy0_);
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider1_.UpdateChromePolicy(policy1_);
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClearExpectations(this);
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PolicyMap& policies = policy_service_->GetPolicies(
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()));
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(base::Value::Equals(&kValue2, policies.GetValue("aaa")));
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(base::Value::Equals(&kValue0, policies.GetValue("bbb")));
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PolicyServiceTest, NamespaceMerge) {
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PolicyBundle> bundle0(new PolicyBundle());
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PolicyBundle> bundle1(new PolicyBundle());
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PolicyBundle> bundle2(new PolicyBundle());
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddTestPolicies(bundle0.get(), "bundle0",
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddTestPolicies(bundle1.get(), "bundle1",
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddTestPolicies(bundle2.get(), "bundle2",
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE);
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider0_.UpdatePolicy(bundle0.Pass());
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider1_.UpdatePolicy(bundle1.Pass());
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  provider2_.UpdatePolicy(bundle2.Pass());
509a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  RunUntilIdle();
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PolicyMap expected;
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For policies of the same level and scope, the first provider takes
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // precedence, on every namespace.
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.Set(kSameLevelPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
5157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               base::Value::CreateStringValue("bundle0"), NULL);
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For policies with different levels and scopes, the highest priority
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // level/scope combination takes precedence, on every namespace.
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.Set(kDiffLevelPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE,
5197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               base::Value::CreateStringValue("bundle2"), NULL);
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(policy_service_->GetPolicies(
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())).Equals(expected));
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(policy_service_->GetPolicies(
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kExtension)).Equals(expected));
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(PolicyServiceTest, IsInitializationComplete) {
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |provider0| has all domains initialized.
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&provider1_);
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&provider2_);
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(provider1_, IsInitializationComplete(_))
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillRepeatedly(Return(false));
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(provider2_, IsInitializationComplete(_))
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillRepeatedly(Return(false));
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PolicyServiceImpl::Providers providers;
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  providers.push_back(&provider0_);
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  providers.push_back(&provider1_);
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  providers.push_back(&provider2_);
538d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  policy_service_.reset(new PolicyServiceImpl(providers));
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(policy_service_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      policy_service_->IsInitializationComplete(POLICY_DOMAIN_EXTENSIONS));
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |provider2_| still doesn't have POLICY_DOMAIN_CHROME initialized, so
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the initialization status of that domain won't change.
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockPolicyServiceObserver observer;
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  policy_service_->AddObserver(POLICY_DOMAIN_CHROME, &observer);
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  policy_service_->AddObserver(POLICY_DOMAIN_EXTENSIONS, &observer);
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(observer, OnPolicyServiceInitialized(_)).Times(0);
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&provider1_);
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(provider1_, IsInitializationComplete(POLICY_DOMAIN_CHROME))
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillRepeatedly(Return(true));
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(provider1_, IsInitializationComplete(POLICY_DOMAIN_EXTENSIONS))
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillRepeatedly(Return(false));
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const PolicyMap kPolicyMap;
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  provider1_.UpdateChromePolicy(kPolicyMap);
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer);
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(policy_service_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      policy_service_->IsInitializationComplete(POLICY_DOMAIN_EXTENSIONS));
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Same if |provider1_| doesn't have POLICY_DOMAIN_EXTENSIONS initialized.
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(observer, OnPolicyServiceInitialized(_)).Times(0);
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&provider2_);
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(provider2_, IsInitializationComplete(POLICY_DOMAIN_CHROME))
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillRepeatedly(Return(false));
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(provider2_, IsInitializationComplete(POLICY_DOMAIN_EXTENSIONS))
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillRepeatedly(Return(true));
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  provider2_.UpdateChromePolicy(kPolicyMap);
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer);
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(policy_service_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      policy_service_->IsInitializationComplete(POLICY_DOMAIN_EXTENSIONS));
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Now initialize POLICY_DOMAIN_CHROME on all the providers.
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(observer, OnPolicyServiceInitialized(POLICY_DOMAIN_CHROME));
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&provider2_);
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(provider2_, IsInitializationComplete(POLICY_DOMAIN_CHROME))
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillRepeatedly(Return(true));
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(provider2_, IsInitializationComplete(POLICY_DOMAIN_EXTENSIONS))
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillRepeatedly(Return(true));
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  provider2_.UpdateChromePolicy(kPolicyMap);
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer);
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(policy_service_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Other domains are still not initialized.
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      policy_service_->IsInitializationComplete(POLICY_DOMAIN_EXTENSIONS));
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Initialize the remaining domain.
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(observer, OnPolicyServiceInitialized(POLICY_DOMAIN_EXTENSIONS));
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&provider1_);
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(provider1_, IsInitializationComplete(POLICY_DOMAIN_CHROME))
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillRepeatedly(Return(true));
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(provider1_, IsInitializationComplete(POLICY_DOMAIN_EXTENSIONS))
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      .WillRepeatedly(Return(true));
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  provider1_.UpdateChromePolicy(kPolicyMap);
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&observer);
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(policy_service_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      policy_service_->IsInitializationComplete(POLICY_DOMAIN_EXTENSIONS));
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Cleanup.
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  policy_service_->RemoveObserver(POLICY_DOMAIN_CHROME, &observer);
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  policy_service_->RemoveObserver(POLICY_DOMAIN_EXTENSIONS, &observer);
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
606d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)TEST_F(PolicyServiceTest, FixDeprecatedPolicies) {
607d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  const PolicyNamespace chrome_namespace(POLICY_DOMAIN_CHROME, std::string());
608d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  const PolicyNamespace extension_namespace(POLICY_DOMAIN_EXTENSIONS, "xyz");
609d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)
610d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  scoped_ptr<PolicyBundle> policy_bundle(new PolicyBundle());
611d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  PolicyMap& policy_map = policy_bundle->Get(chrome_namespace);
612d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  // Individual proxy policy values in the Chrome namespace should be collected
613d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  // into a dictionary.
614d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  policy_map.Set(key::kProxyServerMode, POLICY_LEVEL_MANDATORY,
615d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)                 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(3), NULL);
616d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)
617d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  // Both these policies should be ignored, since there's a higher priority
618d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  // policy available.
619d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  policy_map.Set(key::kProxyMode, POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER,
620d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)                 base::Value::CreateStringValue("pac_script"), NULL);
621d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  policy_map.Set(key::kProxyPacUrl, POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER,
622d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)                 base::Value::CreateStringValue("http://example.com/wpad.dat"),
623d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)                 NULL);
624d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)
625d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  // Add a value to a non-Chrome namespace.
626d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  policy_bundle->Get(extension_namespace)
627d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)      .Set(key::kProxyServerMode, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
628d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)           base::Value::CreateIntegerValue(3), NULL);
629d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)
630d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  // The resulting Chrome namespace map should have the collected policy.
631d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  PolicyMap expected_chrome;
632d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> expected_value(new base::DictionaryValue);
633d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  expected_value->SetInteger(key::kProxyServerMode, 3);
634d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  expected_chrome.Set(key::kProxySettings, POLICY_LEVEL_MANDATORY,
635d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)                      POLICY_SCOPE_USER, expected_value.release(), NULL);
636d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)
637d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  // The resulting Extensions namespace map shouldn't have been modified.
638d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  PolicyMap expected_extension;
639d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  expected_extension.Set(key::kProxyServerMode, POLICY_LEVEL_MANDATORY,
640d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)                         POLICY_SCOPE_USER, base::Value::CreateIntegerValue(3),
641d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)                         NULL);
642d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)
643d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  provider0_.UpdatePolicy(policy_bundle.Pass());
644d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  RunUntilIdle();
645d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)
646d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  EXPECT_TRUE(VerifyPolicies(chrome_namespace, expected_chrome));
647d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)  EXPECT_TRUE(VerifyPolicies(extension_namespace, expected_extension));
648d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)}
649d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace policy
651