| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/policy/policy_service_impl.h" | 5 #include "chrome/browser/policy/policy_service_impl.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/message_loop.h" |
| 10 #include "base/values.h" | 11 #include "base/values.h" |
| 11 #include "chrome/browser/policy/mock_configuration_policy_provider.h" | 12 #include "chrome/browser/policy/mock_configuration_policy_provider.h" |
| 13 #include "content/public/browser/browser_thread.h" |
| 14 #include "content/test/test_browser_thread.h" |
| 12 #include "testing/gmock/include/gmock/gmock.h" | 15 #include "testing/gmock/include/gmock/gmock.h" |
| 13 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 14 | 17 |
| 15 using ::testing::AnyNumber; | 18 using ::testing::AnyNumber; |
| 16 using ::testing::Mock; | 19 using ::testing::Mock; |
| 20 using ::testing::Return; |
| 17 using ::testing::_; | 21 using ::testing::_; |
| 18 | 22 |
| 19 namespace policy { | 23 namespace policy { |
| 20 | 24 |
| 21 namespace { | 25 namespace { |
| 22 | 26 |
| 23 class MockPolicyServiceObserver : public PolicyService::Observer { | 27 class MockPolicyServiceObserver : public PolicyService::Observer { |
| 24 public: | 28 public: |
| 25 virtual ~MockPolicyServiceObserver() {} | 29 virtual ~MockPolicyServiceObserver() {} |
| 26 MOCK_METHOD4(OnPolicyUpdated, void(PolicyDomain, | 30 MOCK_METHOD4(OnPolicyUpdated, void(PolicyDomain, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 41 return base::Value::Equals(arg, expected); | 45 return base::Value::Equals(arg, expected); |
| 42 } | 46 } |
| 43 | 47 |
| 44 } // namespace | 48 } // namespace |
| 45 | 49 |
| 46 class PolicyServiceTest : public testing::Test { | 50 class PolicyServiceTest : public testing::Test { |
| 47 public: | 51 public: |
| 48 PolicyServiceTest() {} | 52 PolicyServiceTest() {} |
| 49 | 53 |
| 50 void SetUp() OVERRIDE { | 54 void SetUp() OVERRIDE { |
| 51 provider0_.AddMandatoryPolicy("pre", base::Value::CreateIntegerValue(13)); | 55 EXPECT_CALL(provider0_, ProvideInternal(_)) |
| 52 provider0_.SetInitializationComplete(true); | 56 .WillRepeatedly(CopyPolicyMap(&policy0_)); |
| 53 provider1_.SetInitializationComplete(true); | 57 EXPECT_CALL(provider1_, ProvideInternal(_)) |
| 54 provider2_.SetInitializationComplete(true); | 58 .WillRepeatedly(CopyPolicyMap(&policy1_)); |
| 59 EXPECT_CALL(provider2_, ProvideInternal(_)) |
| 60 .WillRepeatedly(CopyPolicyMap(&policy2_)); |
| 61 |
| 62 EXPECT_CALL(provider0_, IsInitializationComplete()) |
| 63 .WillRepeatedly(Return(true)); |
| 64 EXPECT_CALL(provider1_, IsInitializationComplete()) |
| 65 .WillRepeatedly(Return(true)); |
| 66 EXPECT_CALL(provider2_, IsInitializationComplete()) |
| 67 .WillRepeatedly(Return(true)); |
| 68 |
| 69 policy0_.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 70 base::Value::CreateIntegerValue(13)); |
| 71 |
| 55 PolicyServiceImpl::Providers providers; | 72 PolicyServiceImpl::Providers providers; |
| 56 providers.push_back(&provider0_); | 73 providers.push_back(&provider0_); |
| 57 providers.push_back(&provider1_); | 74 providers.push_back(&provider1_); |
| 58 providers.push_back(&provider2_); | 75 providers.push_back(&provider2_); |
| 59 policy_service_.reset(new PolicyServiceImpl(providers)); | 76 policy_service_.reset(new PolicyServiceImpl(providers)); |
| 60 } | 77 } |
| 61 | 78 |
| 62 MOCK_METHOD2(OnPolicyValueUpdated, void(const base::Value*, | 79 MOCK_METHOD2(OnPolicyValueUpdated, void(const base::Value*, |
| 63 const base::Value*)); | 80 const base::Value*)); |
| 64 | 81 |
| 82 MOCK_METHOD0(OnPolicyRefresh, void()); |
| 83 |
| 65 // Returns true if the policies for |domain|, |component_id| match |expected|. | 84 // Returns true if the policies for |domain|, |component_id| match |expected|. |
| 66 bool VerifyPolicies(PolicyDomain domain, | 85 bool VerifyPolicies(PolicyDomain domain, |
| 67 const std::string& component_id, | 86 const std::string& component_id, |
| 68 const PolicyMap& expected) { | 87 const PolicyMap& expected) { |
| 69 const PolicyMap* policies = | 88 const PolicyMap* policies = |
| 70 policy_service_->GetPolicies(domain, component_id); | 89 policy_service_->GetPolicies(domain, component_id); |
| 71 return policies && policies->Equals(expected); | 90 return policies && policies->Equals(expected); |
| 72 } | 91 } |
| 73 | 92 |
| 74 protected: | 93 protected: |
| 75 MockConfigurationPolicyProvider provider0_; | 94 MockConfigurationPolicyProvider provider0_; |
| 76 MockConfigurationPolicyProvider provider1_; | 95 MockConfigurationPolicyProvider provider1_; |
| 77 MockConfigurationPolicyProvider provider2_; | 96 MockConfigurationPolicyProvider provider2_; |
| 97 PolicyMap policy0_; |
| 98 PolicyMap policy1_; |
| 99 PolicyMap policy2_; |
| 78 scoped_ptr<PolicyServiceImpl> policy_service_; | 100 scoped_ptr<PolicyServiceImpl> policy_service_; |
| 79 | 101 |
| 80 private: | 102 private: |
| 81 DISALLOW_COPY_AND_ASSIGN(PolicyServiceTest); | 103 DISALLOW_COPY_AND_ASSIGN(PolicyServiceTest); |
| 82 }; | 104 }; |
| 83 | 105 |
| 84 TEST_F(PolicyServiceTest, LoadsPoliciesBeforeProvidersRefresh) { | 106 TEST_F(PolicyServiceTest, LoadsPoliciesBeforeProvidersRefresh) { |
| 85 PolicyMap expected; | 107 PolicyMap expected; |
| 86 expected.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 108 expected.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 87 base::Value::CreateIntegerValue(13)); | 109 base::Value::CreateIntegerValue(13)); |
| 88 EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expected)); | 110 EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expected)); |
| 89 } | 111 } |
| 90 | 112 |
| 91 TEST_F(PolicyServiceTest, NotifyObservers) { | 113 TEST_F(PolicyServiceTest, NotifyObservers) { |
| 92 MockPolicyServiceObserver observer; | 114 MockPolicyServiceObserver observer; |
| 93 policy_service_->AddObserver(POLICY_DOMAIN_CHROME, "", &observer); | 115 policy_service_->AddObserver(POLICY_DOMAIN_CHROME, "", &observer); |
| 94 | 116 |
| 95 PolicyMap expectedPrevious; | 117 PolicyMap expectedPrevious; |
| 96 expectedPrevious.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 118 expectedPrevious.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 97 base::Value::CreateIntegerValue(13)); | 119 base::Value::CreateIntegerValue(13)); |
| 98 | 120 |
| 99 PolicyMap expectedCurrent; | 121 PolicyMap expectedCurrent; |
| 100 expectedCurrent.CopyFrom(expectedPrevious); | 122 expectedCurrent.CopyFrom(expectedPrevious); |
| 101 expectedCurrent.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 123 expectedCurrent.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 102 base::Value::CreateIntegerValue(123)); | 124 base::Value::CreateIntegerValue(123)); |
| 103 provider0_.AddMandatoryPolicy("aaa", base::Value::CreateIntegerValue(123)); | 125 policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 126 base::Value::CreateIntegerValue(123)); |
| 104 EXPECT_CALL(observer, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "", | 127 EXPECT_CALL(observer, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "", |
| 105 PolicyEquals(&expectedPrevious), | 128 PolicyEquals(&expectedPrevious), |
| 106 PolicyEquals(&expectedCurrent))); | 129 PolicyEquals(&expectedCurrent))); |
| 107 provider0_.RefreshPolicies(); | 130 provider0_.NotifyPolicyUpdated(); |
| 108 Mock::VerifyAndClearExpectations(&observer); | 131 Mock::VerifyAndClearExpectations(&observer); |
| 109 | 132 |
| 110 // No changes. | 133 // No changes. |
| 111 EXPECT_CALL(observer, OnPolicyUpdated(_, _, _, _)).Times(0); | 134 EXPECT_CALL(observer, OnPolicyUpdated(_, _, _, _)).Times(0); |
| 112 provider0_.RefreshPolicies(); | 135 provider0_.NotifyPolicyUpdated(); |
| 113 Mock::VerifyAndClearExpectations(&observer); | 136 Mock::VerifyAndClearExpectations(&observer); |
| 114 EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expectedCurrent)); | 137 EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expectedCurrent)); |
| 115 | 138 |
| 116 // New policy. | 139 // New policy. |
| 117 expectedPrevious.CopyFrom(expectedCurrent); | 140 expectedPrevious.CopyFrom(expectedCurrent); |
| 118 expectedCurrent.Set("bbb", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 141 expectedCurrent.Set("bbb", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 119 base::Value::CreateIntegerValue(456)); | 142 base::Value::CreateIntegerValue(456)); |
| 120 provider0_.AddMandatoryPolicy("bbb", base::Value::CreateIntegerValue(456)); | 143 policy0_.Set("bbb", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 144 base::Value::CreateIntegerValue(456)); |
| 121 EXPECT_CALL(observer, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "", | 145 EXPECT_CALL(observer, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "", |
| 122 PolicyEquals(&expectedPrevious), | 146 PolicyEquals(&expectedPrevious), |
| 123 PolicyEquals(&expectedCurrent))); | 147 PolicyEquals(&expectedCurrent))); |
| 124 provider0_.RefreshPolicies(); | 148 provider0_.NotifyPolicyUpdated(); |
| 125 Mock::VerifyAndClearExpectations(&observer); | 149 Mock::VerifyAndClearExpectations(&observer); |
| 126 | 150 |
| 127 // Removed policy. | 151 // Removed policy. |
| 128 expectedPrevious.CopyFrom(expectedCurrent); | 152 expectedPrevious.CopyFrom(expectedCurrent); |
| 129 expectedCurrent.Erase("bbb"); | 153 expectedCurrent.Erase("bbb"); |
| 130 provider0_.RemovePolicy("bbb"); | 154 policy0_.Erase("bbb"); |
| 131 EXPECT_CALL(observer, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "", | 155 EXPECT_CALL(observer, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "", |
| 132 PolicyEquals(&expectedPrevious), | 156 PolicyEquals(&expectedPrevious), |
| 133 PolicyEquals(&expectedCurrent))); | 157 PolicyEquals(&expectedCurrent))); |
| 134 provider0_.RefreshPolicies(); | 158 provider0_.NotifyPolicyUpdated(); |
| 135 Mock::VerifyAndClearExpectations(&observer); | 159 Mock::VerifyAndClearExpectations(&observer); |
| 136 | 160 |
| 137 // Changed policy. | 161 // Changed policy. |
| 138 expectedPrevious.CopyFrom(expectedCurrent); | 162 expectedPrevious.CopyFrom(expectedCurrent); |
| 139 expectedCurrent.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 163 expectedCurrent.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 140 base::Value::CreateIntegerValue(789)); | 164 base::Value::CreateIntegerValue(789)); |
| 141 provider0_.AddMandatoryPolicy("aaa", base::Value::CreateIntegerValue(789)); | 165 policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 166 base::Value::CreateIntegerValue(789)); |
| 167 |
| 142 EXPECT_CALL(observer, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "", | 168 EXPECT_CALL(observer, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "", |
| 143 PolicyEquals(&expectedPrevious), | 169 PolicyEquals(&expectedPrevious), |
| 144 PolicyEquals(&expectedCurrent))); | 170 PolicyEquals(&expectedCurrent))); |
| 145 provider0_.RefreshPolicies(); | 171 provider0_.NotifyPolicyUpdated(); |
| 146 Mock::VerifyAndClearExpectations(&observer); | 172 Mock::VerifyAndClearExpectations(&observer); |
| 147 | 173 |
| 148 // No changes again. | 174 // No changes again. |
| 149 EXPECT_CALL(observer, OnPolicyUpdated(_, _, _, _)).Times(0); | 175 EXPECT_CALL(observer, OnPolicyUpdated(_, _, _, _)).Times(0); |
| 150 provider0_.RefreshPolicies(); | 176 provider0_.NotifyPolicyUpdated(); |
| 151 Mock::VerifyAndClearExpectations(&observer); | 177 Mock::VerifyAndClearExpectations(&observer); |
| 152 EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expectedCurrent)); | 178 EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expectedCurrent)); |
| 153 | 179 |
| 154 policy_service_->RemoveObserver(POLICY_DOMAIN_CHROME, "", &observer); | 180 policy_service_->RemoveObserver(POLICY_DOMAIN_CHROME, "", &observer); |
| 155 } | 181 } |
| 156 | 182 |
| 157 TEST_F(PolicyServiceTest, Priorities) { | 183 TEST_F(PolicyServiceTest, Priorities) { |
| 158 PolicyMap expected; | 184 PolicyMap expected; |
| 159 expected.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 185 expected.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 160 base::Value::CreateIntegerValue(13)); | 186 base::Value::CreateIntegerValue(13)); |
| 161 expected.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 187 expected.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 162 base::Value::CreateIntegerValue(0)); | 188 base::Value::CreateIntegerValue(0)); |
| 163 provider0_.AddMandatoryPolicy("aaa", base::Value::CreateIntegerValue(0)); | 189 policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 164 provider1_.AddMandatoryPolicy("aaa", base::Value::CreateIntegerValue(1)); | 190 base::Value::CreateIntegerValue(0)); |
| 165 provider2_.AddMandatoryPolicy("aaa", base::Value::CreateIntegerValue(2)); | 191 policy1_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 166 provider0_.RefreshPolicies(); | 192 base::Value::CreateIntegerValue(1)); |
| 167 provider1_.RefreshPolicies(); | 193 policy2_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 168 provider2_.RefreshPolicies(); | 194 base::Value::CreateIntegerValue(2)); |
| 195 provider0_.NotifyPolicyUpdated(); |
| 196 provider1_.NotifyPolicyUpdated(); |
| 197 provider2_.NotifyPolicyUpdated(); |
| 169 EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expected)); | 198 EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expected)); |
| 170 | 199 |
| 171 expected.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 200 expected.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 172 base::Value::CreateIntegerValue(1)); | 201 base::Value::CreateIntegerValue(1)); |
| 173 provider0_.RemovePolicy("aaa"); | 202 policy0_.Erase("aaa"); |
| 174 provider0_.RefreshPolicies(); | 203 provider0_.NotifyPolicyUpdated(); |
| 175 EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expected)); | 204 EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expected)); |
| 176 | 205 |
| 177 expected.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 206 expected.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 178 base::Value::CreateIntegerValue(2)); | 207 base::Value::CreateIntegerValue(2)); |
| 179 provider1_.AddRecommendedPolicy("aaa", base::Value::CreateIntegerValue(1)); | 208 policy1_.Set("aaa", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER, |
| 180 provider1_.RefreshPolicies(); | 209 base::Value::CreateIntegerValue(1)); |
| 210 provider1_.NotifyPolicyUpdated(); |
| 181 EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expected)); | 211 EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expected)); |
| 182 } | 212 } |
| 183 | 213 |
| 184 TEST_F(PolicyServiceTest, PolicyChangeRegistrar) { | 214 TEST_F(PolicyServiceTest, PolicyChangeRegistrar) { |
| 185 scoped_ptr<PolicyChangeRegistrar> registrar( | 215 scoped_ptr<PolicyChangeRegistrar> registrar( |
| 186 new PolicyChangeRegistrar( | 216 new PolicyChangeRegistrar( |
| 187 policy_service_.get(), POLICY_DOMAIN_CHROME, "")); | 217 policy_service_.get(), POLICY_DOMAIN_CHROME, "")); |
| 188 | 218 |
| 189 // Starting to observe existing policies doesn't trigger a notification. | 219 // Starting to observe existing policies doesn't trigger a notification. |
| 190 EXPECT_CALL(*this, OnPolicyValueUpdated(_, _)).Times(0); | 220 EXPECT_CALL(*this, OnPolicyValueUpdated(_, _)).Times(0); |
| 191 registrar->Observe("pre", base::Bind( | 221 registrar->Observe("pre", base::Bind( |
| 192 &PolicyServiceTest::OnPolicyValueUpdated, | 222 &PolicyServiceTest::OnPolicyValueUpdated, |
| 193 base::Unretained(this))); | 223 base::Unretained(this))); |
| 194 registrar->Observe("aaa", base::Bind( | 224 registrar->Observe("aaa", base::Bind( |
| 195 &PolicyServiceTest::OnPolicyValueUpdated, | 225 &PolicyServiceTest::OnPolicyValueUpdated, |
| 196 base::Unretained(this))); | 226 base::Unretained(this))); |
| 197 Mock::VerifyAndClearExpectations(this); | 227 Mock::VerifyAndClearExpectations(this); |
| 198 | 228 |
| 199 // Changing it now triggers a notification. | 229 // Changing it now triggers a notification. |
| 200 base::FundamentalValue kValue0(0); | 230 base::FundamentalValue kValue0(0); |
| 201 EXPECT_CALL(*this, OnPolicyValueUpdated(NULL, ValueEquals(&kValue0))); | 231 EXPECT_CALL(*this, OnPolicyValueUpdated(NULL, ValueEquals(&kValue0))); |
| 202 provider0_.AddMandatoryPolicy("aaa", kValue0.DeepCopy()); | 232 policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 203 provider0_.RefreshPolicies(); | 233 kValue0.DeepCopy()); |
| 234 provider0_.NotifyPolicyUpdated(); |
| 204 Mock::VerifyAndClearExpectations(this); | 235 Mock::VerifyAndClearExpectations(this); |
| 205 | 236 |
| 206 // Changing other values doesn't trigger a notification. | 237 // Changing other values doesn't trigger a notification. |
| 207 EXPECT_CALL(*this, OnPolicyValueUpdated(_, _)).Times(0); | 238 EXPECT_CALL(*this, OnPolicyValueUpdated(_, _)).Times(0); |
| 208 provider0_.AddMandatoryPolicy("bbb", kValue0.DeepCopy()); | 239 policy0_.Set("bbb", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 209 provider0_.RefreshPolicies(); | 240 kValue0.DeepCopy()); |
| 241 provider0_.NotifyPolicyUpdated(); |
| 210 Mock::VerifyAndClearExpectations(this); | 242 Mock::VerifyAndClearExpectations(this); |
| 211 | 243 |
| 212 // Modifying the value triggers a notification. | 244 // Modifying the value triggers a notification. |
| 213 base::FundamentalValue kValue1(1); | 245 base::FundamentalValue kValue1(1); |
| 214 EXPECT_CALL(*this, OnPolicyValueUpdated(ValueEquals(&kValue0), | 246 EXPECT_CALL(*this, OnPolicyValueUpdated(ValueEquals(&kValue0), |
| 215 ValueEquals(&kValue1))); | 247 ValueEquals(&kValue1))); |
| 216 provider0_.AddMandatoryPolicy("aaa", kValue1.DeepCopy()); | 248 policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 217 provider0_.RefreshPolicies(); | 249 kValue1.DeepCopy()); |
| 250 provider0_.NotifyPolicyUpdated(); |
| 218 Mock::VerifyAndClearExpectations(this); | 251 Mock::VerifyAndClearExpectations(this); |
| 219 | 252 |
| 220 // Removing the value triggers a notification. | 253 // Removing the value triggers a notification. |
| 221 EXPECT_CALL(*this, OnPolicyValueUpdated(ValueEquals(&kValue1), NULL)); | 254 EXPECT_CALL(*this, OnPolicyValueUpdated(ValueEquals(&kValue1), NULL)); |
| 222 provider0_.RemovePolicy("aaa"); | 255 policy0_.Erase("aaa"); |
| 223 provider0_.RefreshPolicies(); | 256 provider0_.NotifyPolicyUpdated(); |
| 224 Mock::VerifyAndClearExpectations(this); | 257 Mock::VerifyAndClearExpectations(this); |
| 225 | 258 |
| 226 // No more notifications after destroying the registrar. | 259 // No more notifications after destroying the registrar. |
| 227 EXPECT_CALL(*this, OnPolicyValueUpdated(_, _)).Times(0); | 260 EXPECT_CALL(*this, OnPolicyValueUpdated(_, _)).Times(0); |
| 228 registrar.reset(); | 261 registrar.reset(); |
| 229 provider0_.AddMandatoryPolicy("aaa", kValue1.DeepCopy()); | 262 policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 230 provider0_.AddMandatoryPolicy("pre", kValue1.DeepCopy()); | 263 kValue1.DeepCopy()); |
| 231 provider0_.RefreshPolicies(); | 264 policy0_.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 265 kValue1.DeepCopy()); |
| 266 provider0_.NotifyPolicyUpdated(); |
| 232 Mock::VerifyAndClearExpectations(this); | 267 Mock::VerifyAndClearExpectations(this); |
| 233 } | 268 } |
| 234 | 269 |
| 270 TEST_F(PolicyServiceTest, RefreshPolicies) { |
| 271 MessageLoop loop; |
| 272 content::TestBrowserThread ui_thread(content::BrowserThread::UI, &loop); |
| 273 content::TestBrowserThread file_thread(content::BrowserThread::FILE, &loop); |
| 274 content::TestBrowserThread io_thread(content::BrowserThread::IO, &loop); |
| 275 |
| 276 EXPECT_CALL(provider0_, RefreshPolicies()).Times(AnyNumber()); |
| 277 EXPECT_CALL(provider1_, RefreshPolicies()).Times(AnyNumber()); |
| 278 EXPECT_CALL(provider2_, RefreshPolicies()).Times(AnyNumber()); |
| 279 |
| 280 EXPECT_CALL(*this, OnPolicyRefresh()).Times(0); |
| 281 policy_service_->RefreshPolicies(base::Bind( |
| 282 &PolicyServiceTest::OnPolicyRefresh, |
| 283 base::Unretained(this))); |
| 284 loop.RunAllPending(); |
| 285 Mock::VerifyAndClearExpectations(this); |
| 286 |
| 287 EXPECT_CALL(*this, OnPolicyRefresh()).Times(0); |
| 288 base::FundamentalValue kValue0(0); |
| 289 policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 290 kValue0.DeepCopy()); |
| 291 provider0_.NotifyPolicyUpdated(); |
| 292 loop.RunAllPending(); |
| 293 Mock::VerifyAndClearExpectations(this); |
| 294 |
| 295 EXPECT_CALL(*this, OnPolicyRefresh()).Times(0); |
| 296 base::FundamentalValue kValue1(1); |
| 297 policy1_.Set("aaa", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER, |
| 298 kValue1.DeepCopy()); |
| 299 provider1_.NotifyPolicyUpdated(); |
| 300 loop.RunAllPending(); |
| 301 Mock::VerifyAndClearExpectations(this); |
| 302 |
| 303 // A provider can refresh more than once after a RefreshPolicies call, but |
| 304 // OnPolicyRefresh should be triggered only after all providers are |
| 305 // refreshed. |
| 306 EXPECT_CALL(*this, OnPolicyRefresh()).Times(0); |
| 307 policy1_.Set("bbb", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER, |
| 308 kValue1.DeepCopy()); |
| 309 provider1_.NotifyPolicyUpdated(); |
| 310 loop.RunAllPending(); |
| 311 Mock::VerifyAndClearExpectations(this); |
| 312 |
| 313 // If another RefreshPolicies() call happens while waiting for a previous |
| 314 // one to complete, then all providers must refresh again. |
| 315 EXPECT_CALL(*this, OnPolicyRefresh()).Times(0); |
| 316 policy_service_->RefreshPolicies(base::Bind( |
| 317 &PolicyServiceTest::OnPolicyRefresh, |
| 318 base::Unretained(this))); |
| 319 loop.RunAllPending(); |
| 320 Mock::VerifyAndClearExpectations(this); |
| 321 |
| 322 EXPECT_CALL(*this, OnPolicyRefresh()).Times(0); |
| 323 policy2_.Set("bbb", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 324 kValue0.DeepCopy()); |
| 325 provider2_.NotifyPolicyUpdated(); |
| 326 loop.RunAllPending(); |
| 327 Mock::VerifyAndClearExpectations(this); |
| 328 |
| 329 // Providers 0 and 1 must reload again. |
| 330 EXPECT_CALL(*this, OnPolicyRefresh()).Times(2); |
| 331 base::FundamentalValue kValue2(2); |
| 332 policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 333 kValue2.DeepCopy()); |
| 334 provider0_.NotifyPolicyUpdated(); |
| 335 provider1_.NotifyPolicyUpdated(); |
| 336 loop.RunAllPending(); |
| 337 Mock::VerifyAndClearExpectations(this); |
| 338 |
| 339 const PolicyMap* policies = policy_service_->GetPolicies( |
| 340 POLICY_DOMAIN_CHROME, ""); |
| 341 ASSERT_TRUE(policies); |
| 342 EXPECT_TRUE(base::Value::Equals(&kValue2, policies->GetValue("aaa"))); |
| 343 EXPECT_TRUE(base::Value::Equals(&kValue0, policies->GetValue("bbb"))); |
| 344 } |
| 345 |
| 235 } // namespace policy | 346 } // namespace policy |
| OLD | NEW |