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