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