1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file. 4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/forwarding_policy_provider.h" 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <string> 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/values.h" 11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/mock_configuration_policy_provider.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/policy_bundle.h" 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/policy_map.h" 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/policy_types.h" 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/schema.h" 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/schema_registry.h" 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using testing::_; 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using testing::Mock; 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using testing::Return; 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace policy { 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace { 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kTestSchema[] = 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "{" 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch " \"type\": \"object\"," 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch " \"properties\": {" 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch " \"foo\": { \"type\": \"string\" }" 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch " }" 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "}"; 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ForwardingPolicyProviderTest : public testing::Test { 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected: 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ForwardingPolicyProviderTest() : forwarding_provider_(&mock_provider_) { 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mock_provider_.Init(); 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) forwarding_provider_.Init(&schema_registry_); 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) forwarding_provider_.AddObserver(&observer_); 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual ~ForwardingPolicyProviderTest() { 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) forwarding_provider_.RemoveObserver(&observer_); 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) forwarding_provider_.Shutdown(); 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mock_provider_.Shutdown(); 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Schema CreateTestSchema() { 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string error; 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Schema schema = Schema::Parse(kTestSchema, &error); 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!schema.valid()) 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ADD_FAILURE() << error; 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return schema; 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SchemaRegistry schema_registry_; 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) MockConfigurationPolicyObserver observer_; 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) MockConfigurationPolicyProvider mock_provider_; 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ForwardingPolicyProvider forwarding_provider_; 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ForwardingPolicyProviderTest, Empty) { 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(schema_registry_.IsReady()); 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE( 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) forwarding_provider_.IsInitializationComplete(POLICY_DOMAIN_EXTENSIONS)); 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(mock_provider_, IsInitializationComplete(POLICY_DOMAIN_CHROME)) 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) .WillOnce(Return(false)); 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE( 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) forwarding_provider_.IsInitializationComplete(POLICY_DOMAIN_CHROME)); 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Mock::VerifyAndClearExpectations(&mock_provider_); 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const PolicyBundle empty_bundle; 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(forwarding_provider_.policies().Equals(empty_bundle)); 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ForwardingPolicyProviderTest, ForwardsChromePolicy) { 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PolicyBundle bundle; 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const PolicyNamespace chrome_ns(POLICY_DOMAIN_CHROME, ""); 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bundle.Get(chrome_ns).Set("policy", 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) POLICY_LEVEL_MANDATORY, 865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) POLICY_SCOPE_USER, 875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new base::StringValue("value"), 885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NULL); 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(observer_, OnUpdatePolicy(&forwarding_provider_)); 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<PolicyBundle> delegate_bundle(new PolicyBundle); 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delegate_bundle->CopyFrom(bundle); 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delegate_bundle->Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, "xyz")) 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) .Set("foo", 955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) POLICY_LEVEL_MANDATORY, 965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) POLICY_SCOPE_USER, 975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new base::StringValue("not forwarded"), 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NULL); 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mock_provider_.UpdatePolicy(delegate_bundle.Pass()); 100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Mock::VerifyAndClearExpectations(&observer_); 101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE( 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) forwarding_provider_.IsInitializationComplete(POLICY_DOMAIN_EXTENSIONS)); 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(forwarding_provider_.policies().Equals(bundle)); 105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ForwardingPolicyProviderTest, RefreshPolicies) { 108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(mock_provider_, RefreshPolicies()); 109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) forwarding_provider_.RefreshPolicies(); 110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Mock::VerifyAndClearExpectations(&mock_provider_); 111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ForwardingPolicyProviderTest, SchemaReady) { 114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(observer_, OnUpdatePolicy(&forwarding_provider_)); 115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) schema_registry_.SetReady(POLICY_DOMAIN_CHROME); 116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) schema_registry_.SetReady(POLICY_DOMAIN_EXTENSIONS); 117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Mock::VerifyAndClearExpectations(&observer_); 118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(forwarding_provider_.IsInitializationComplete( 120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) policy::POLICY_DOMAIN_EXTENSIONS)); 121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ForwardingPolicyProviderTest, SchemaReadyWithComponents) { 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PolicyMap policy_map; 1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) policy_map.Set("foo", 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) POLICY_LEVEL_MANDATORY, 1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) POLICY_SCOPE_USER, 1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new base::StringValue("omg"), 1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NULL); 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<PolicyBundle> bundle(new PolicyBundle); 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bundle->Get(PolicyNamespace(POLICY_DOMAIN_CHROME, "")).CopyFrom(policy_map); 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bundle->Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, "xyz")) 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) .CopyFrom(policy_map); 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(observer_, OnUpdatePolicy(&forwarding_provider_)); 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mock_provider_.UpdatePolicy(bundle.Pass()); 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Mock::VerifyAndClearExpectations(&observer_); 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(mock_provider_, RefreshPolicies()).Times(0); 139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) schema_registry_.RegisterComponent( 140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, "xyz"), CreateTestSchema()); 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) schema_registry_.SetReady(POLICY_DOMAIN_EXTENSIONS); 142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Mock::VerifyAndClearExpectations(&mock_provider_); 143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(mock_provider_, RefreshPolicies()); 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) schema_registry_.SetReady(POLICY_DOMAIN_CHROME); 146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Mock::VerifyAndClearExpectations(&mock_provider_); 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(forwarding_provider_.IsInitializationComplete( 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) policy::POLICY_DOMAIN_EXTENSIONS)); 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PolicyBundle expected_bundle; 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) expected_bundle.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, "")) 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) .CopyFrom(policy_map); 153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(forwarding_provider_.policies().Equals(expected_bundle)); 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(observer_, OnUpdatePolicy(&forwarding_provider_)); 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) forwarding_provider_.OnUpdatePolicy(&mock_provider_); 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Mock::VerifyAndClearExpectations(&observer_); 158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(forwarding_provider_.IsInitializationComplete( 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) policy::POLICY_DOMAIN_EXTENSIONS)); 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) expected_bundle.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, "xyz")) 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) .CopyFrom(policy_map); 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(forwarding_provider_.policies().Equals(expected_bundle)); 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ForwardingPolicyProviderTest, DelegateUpdates) { 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) schema_registry_.RegisterComponent( 168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, "xyz"), CreateTestSchema()); 169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(schema_registry_.IsReady()); 170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(forwarding_provider_.IsInitializationComplete( 171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) policy::POLICY_DOMAIN_EXTENSIONS)); 172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PolicyMap policy_map; 1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) policy_map.Set("foo", 1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) POLICY_LEVEL_MANDATORY, 1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) POLICY_SCOPE_USER, 1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new base::StringValue("omg"), 1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NULL); 179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Chrome policy updates are forwarded even if the components aren't ready. 180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(observer_, OnUpdatePolicy(&forwarding_provider_)); 181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mock_provider_.UpdateChromePolicy(policy_map); 182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Mock::VerifyAndClearExpectations(&observer_); 183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(mock_provider_, RefreshPolicies()); 185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) schema_registry_.SetReady(POLICY_DOMAIN_CHROME); 186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) schema_registry_.SetReady(POLICY_DOMAIN_EXTENSIONS); 187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(schema_registry_.IsReady()); 188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Mock::VerifyAndClearExpectations(&mock_provider_); 189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(forwarding_provider_.IsInitializationComplete( 190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) policy::POLICY_DOMAIN_EXTENSIONS)); 191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The forwarding provider becomes ready after this refresh completes, and 193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // starts forwarding policy updates after that. 194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(observer_, OnUpdatePolicy(_)); 195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mock_provider_.UpdateChromePolicy(policy_map); 196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Mock::VerifyAndClearExpectations(&observer_); 197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(forwarding_provider_.IsInitializationComplete( 199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) policy::POLICY_DOMAIN_EXTENSIONS)); 200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Keeps forwarding. 202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(observer_, OnUpdatePolicy(_)); 203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mock_provider_.UpdateChromePolicy(policy_map); 204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Mock::VerifyAndClearExpectations(&observer_); 205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ForwardingPolicyProviderTest, RemoveAndAddComponent) { 208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(mock_provider_, RefreshPolicies()); 209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const PolicyNamespace ns(POLICY_DOMAIN_EXTENSIONS, "xyz"); 210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) schema_registry_.SetReady(POLICY_DOMAIN_CHROME); 211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch schema_registry_.RegisterComponent(ns, CreateTestSchema()); 212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) schema_registry_.SetReady(POLICY_DOMAIN_EXTENSIONS); 213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Mock::VerifyAndClearExpectations(&mock_provider_); 214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Serve policy for |ns|. 216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PolicyBundle platform_policy; 2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) platform_policy.Get(ns).Set("foo", 2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) POLICY_LEVEL_MANDATORY, 2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) POLICY_SCOPE_USER, 2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new base::StringValue("omg"), 2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NULL); 222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<PolicyBundle> copy(new PolicyBundle); 223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) copy->CopyFrom(platform_policy); 224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(observer_, OnUpdatePolicy(_)); 225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mock_provider_.UpdatePolicy(copy.Pass()); 226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Mock::VerifyAndClearExpectations(&observer_); 227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(forwarding_provider_.policies().Equals(platform_policy)); 228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Now remove that component. 230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(observer_, OnUpdatePolicy(_)); 231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) schema_registry_.UnregisterComponent(ns); 232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Mock::VerifyAndClearExpectations(&observer_); 233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const PolicyBundle empty; 234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(forwarding_provider_.policies().Equals(empty)); 235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Adding it back should serve the current policies again, even though they 237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // haven't changed on the platform provider. 238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(mock_provider_, RefreshPolicies()); 239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch schema_registry_.RegisterComponent(ns, CreateTestSchema()); 240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Mock::VerifyAndClearExpectations(&mock_provider_); 241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_CALL(observer_, OnUpdatePolicy(_)); 243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) copy.reset(new PolicyBundle); 244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) copy->CopyFrom(platform_policy); 245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mock_provider_.UpdatePolicy(copy.Pass()); 246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Mock::VerifyAndClearExpectations(&observer_); 247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(forwarding_provider_.policies().Equals(platform_policy)); 248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace policy 251