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