OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 <string> | 5 #include <string> |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/bind.h" |
8 #include "base/memory/ref_counted.h" | 9 #include "base/memory/ref_counted.h" |
9 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
10 #include "base/metrics/histogram.h" | 11 #include "base/metrics/histogram.h" |
11 #include "base/metrics/histogram_samples.h" | 12 #include "base/metrics/histogram_samples.h" |
12 #include "base/metrics/sample_map.h" | 13 #include "base/metrics/sample_map.h" |
13 #include "base/metrics/statistics_recorder.h" | 14 #include "base/metrics/statistics_recorder.h" |
14 #include "base/test/test_simple_task_runner.h" | 15 #include "base/test/test_simple_task_runner.h" |
15 #include "base/time/time.h" | 16 #include "base/time/time.h" |
16 #include "base/values.h" | 17 #include "base/values.h" |
17 #include "chrome/browser/invalidation/fake_invalidation_service.h" | 18 #include "chrome/browser/invalidation/fake_invalidation_service.h" |
(...skipping 22 matching lines...) Expand all Loading... |
40 POLICY_OBJECT_B | 41 POLICY_OBJECT_B |
41 }; | 42 }; |
42 | 43 |
43 CloudPolicyInvalidatorTest(); | 44 CloudPolicyInvalidatorTest(); |
44 | 45 |
45 virtual void SetUp() OVERRIDE; | 46 virtual void SetUp() OVERRIDE; |
46 | 47 |
47 virtual void TearDown() OVERRIDE; | 48 virtual void TearDown() OVERRIDE; |
48 | 49 |
49 // Starts the invalidator which will be tested. | 50 // Starts the invalidator which will be tested. |
50 void StartInvalidator(bool initialize); | 51 // |instantiate| determines if the invalidator should be instantiated. |
| 52 // |start| determines if the invalidator should be started. |
| 53 void StartInvalidator(bool instantiate, bool start); |
51 void StartInvalidator() { | 54 void StartInvalidator() { |
52 StartInvalidator(true /* initialize */); | 55 StartInvalidator(true /* instantiate */, true /* start */); |
53 } | 56 } |
54 | 57 |
| 58 // Calls Stop on the invalidator. |
| 59 void StopInvalidator(); |
| 60 |
| 61 // Calls Shutdown on the invalidator. Test must call DestroyInvalidator |
| 62 // afterwards to prevent Shutdown from being called twice. |
| 63 void ShutdownInvalidator(); |
| 64 |
| 65 // Destroys the invalidator. |
| 66 void DestroyInvalidator(); |
| 67 |
55 // Simulates storing a new policy to the policy store. | 68 // Simulates storing a new policy to the policy store. |
56 // |object| determines which policy object the store will report the | 69 // |object| determines which policy object the store will report the |
57 // invalidator should register for. May be POLICY_OBJECT_NONE for no object. | 70 // invalidator should register for. May be POLICY_OBJECT_NONE for no object. |
58 // |invalidation_version| determines what invalidation the store will report. | 71 // |invalidation_version| determines what invalidation the store will report. |
59 // |policy_changed| determines whether the store will report that the | 72 // |policy_changed| determines whether the store will report that the |
60 // policy changed. | 73 // policy changed. |
61 // |timestamp| determines the response timestamp the store will report. | 74 // |timestamp| determines the response timestamp the store will report. |
62 void StorePolicy( | 75 void StorePolicy( |
63 PolicyObject object, | 76 PolicyObject object, |
64 int64 invalidation_version, | 77 int64 invalidation_version, |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
125 base::HistogramBase::Count GetInvalidationCount(bool with_payload); | 138 base::HistogramBase::Count GetInvalidationCount(bool with_payload); |
126 | 139 |
127 // CloudPolicyInvalidationHandler: | 140 // CloudPolicyInvalidationHandler: |
128 virtual void SetInvalidationInfo( | 141 virtual void SetInvalidationInfo( |
129 int64 version, | 142 int64 version, |
130 const std::string& payload) OVERRIDE; | 143 const std::string& payload) OVERRIDE; |
131 virtual void InvalidatePolicy() OVERRIDE; | 144 virtual void InvalidatePolicy() OVERRIDE; |
132 virtual void OnInvalidatorStateChanged(bool invalidations_enabled) OVERRIDE; | 145 virtual void OnInvalidatorStateChanged(bool invalidations_enabled) OVERRIDE; |
133 | 146 |
134 private: | 147 private: |
| 148 // Get a pointer to the invalidation service. |
| 149 invalidation::InvalidationService* GetInvalidationService(); |
| 150 |
135 // Returns the object id of the given policy object. | 151 // Returns the object id of the given policy object. |
136 const invalidation::ObjectId& GetPolicyObjectId(PolicyObject object) const; | 152 const invalidation::ObjectId& GetPolicyObjectId(PolicyObject object) const; |
137 | 153 |
138 // Get histogram samples for the given histogram. | 154 // Get histogram samples for the given histogram. |
139 scoped_ptr<base::HistogramSamples> GetHistogramSamples( | 155 scoped_ptr<base::HistogramSamples> GetHistogramSamples( |
140 const std::string& name) const; | 156 const std::string& name) const; |
141 | 157 |
142 // Objects the invalidator depends on. | 158 // Objects the invalidator depends on. |
143 invalidation::FakeInvalidationService invalidation_service_; | 159 invalidation::FakeInvalidationService invalidation_service_; |
144 MockCloudPolicyStore store_; | 160 MockCloudPolicyStore store_; |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 refresh_samples_ = GetHistogramSamples(kMetricPolicyRefresh); | 214 refresh_samples_ = GetHistogramSamples(kMetricPolicyRefresh); |
199 invalidations_samples_ = GetHistogramSamples(kMetricPolicyInvalidations); | 215 invalidations_samples_ = GetHistogramSamples(kMetricPolicyInvalidations); |
200 } | 216 } |
201 | 217 |
202 void CloudPolicyInvalidatorTest::TearDown() { | 218 void CloudPolicyInvalidatorTest::TearDown() { |
203 EXPECT_FALSE(invalidation_service_.ReceivedInvalidAcknowledgement()); | 219 EXPECT_FALSE(invalidation_service_.ReceivedInvalidAcknowledgement()); |
204 if (invalidator_) | 220 if (invalidator_) |
205 invalidator_->Shutdown(); | 221 invalidator_->Shutdown(); |
206 } | 222 } |
207 | 223 |
208 void CloudPolicyInvalidatorTest::StartInvalidator(bool initialize) { | 224 void CloudPolicyInvalidatorTest::StartInvalidator(bool instantiate, |
209 invalidator_.reset(new CloudPolicyInvalidator( | 225 bool start) { |
210 this /* invalidation_handler */, | 226 if (instantiate) { |
211 &store_, | 227 invalidator_.reset(new CloudPolicyInvalidator( |
212 task_runner_)); | 228 base::Bind( |
213 if (initialize) | 229 &CloudPolicyInvalidatorTest::GetInvalidationService, |
214 invalidator_->InitializeWithService(&invalidation_service_); | 230 base::Unretained(this)), |
| 231 this /* invalidation_handler */, |
| 232 &store_, |
| 233 task_runner_)); |
| 234 } |
| 235 if (start) |
| 236 invalidator_->Start(); |
| 237 } |
| 238 |
| 239 void CloudPolicyInvalidatorTest::StopInvalidator() { |
| 240 invalidator_->Stop(); |
| 241 } |
| 242 |
| 243 void CloudPolicyInvalidatorTest::ShutdownInvalidator() { |
| 244 invalidator_->Shutdown(); |
| 245 } |
| 246 |
| 247 void CloudPolicyInvalidatorTest::DestroyInvalidator() { |
| 248 invalidator_.reset(); |
215 } | 249 } |
216 | 250 |
217 void CloudPolicyInvalidatorTest::StorePolicy( | 251 void CloudPolicyInvalidatorTest::StorePolicy( |
218 PolicyObject object, | 252 PolicyObject object, |
219 int64 invalidation_version, | 253 int64 invalidation_version, |
220 bool policy_changed, | 254 bool policy_changed, |
221 int64 timestamp) { | 255 int64 timestamp) { |
222 enterprise_management::PolicyData* data = | 256 enterprise_management::PolicyData* data = |
223 new enterprise_management::PolicyData(); | 257 new enterprise_management::PolicyData(); |
224 if (object != POLICY_OBJECT_NONE) { | 258 if (object != POLICY_OBJECT_NONE) { |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
362 void CloudPolicyInvalidatorTest::OnInvalidatorStateChanged( | 396 void CloudPolicyInvalidatorTest::OnInvalidatorStateChanged( |
363 bool invalidations_enabled) { | 397 bool invalidations_enabled) { |
364 if (invalidator_.get()) | 398 if (invalidator_.get()) |
365 EXPECT_EQ(invalidations_enabled, invalidator_->invalidations_enabled()); | 399 EXPECT_EQ(invalidations_enabled, invalidator_->invalidations_enabled()); |
366 if (invalidations_enabled) | 400 if (invalidations_enabled) |
367 ++state_change_enabled_callback_count_; | 401 ++state_change_enabled_callback_count_; |
368 else | 402 else |
369 ++state_change_disabled_callback_count_; | 403 ++state_change_disabled_callback_count_; |
370 } | 404 } |
371 | 405 |
| 406 invalidation::InvalidationService* |
| 407 CloudPolicyInvalidatorTest::GetInvalidationService() { |
| 408 return &invalidation_service_; |
| 409 } |
| 410 |
372 const invalidation::ObjectId& CloudPolicyInvalidatorTest::GetPolicyObjectId( | 411 const invalidation::ObjectId& CloudPolicyInvalidatorTest::GetPolicyObjectId( |
373 PolicyObject object) const { | 412 PolicyObject object) const { |
374 EXPECT_TRUE(object == POLICY_OBJECT_A || object == POLICY_OBJECT_B); | 413 EXPECT_TRUE(object == POLICY_OBJECT_A || object == POLICY_OBJECT_B); |
375 return object == POLICY_OBJECT_A ? object_id_a_ : object_id_b_; | 414 return object == POLICY_OBJECT_A ? object_id_a_ : object_id_b_; |
376 } | 415 } |
377 | 416 |
378 scoped_ptr<base::HistogramSamples> | 417 scoped_ptr<base::HistogramSamples> |
379 CloudPolicyInvalidatorTest::GetHistogramSamples( | 418 CloudPolicyInvalidatorTest::GetHistogramSamples( |
380 const std::string& name) const { | 419 const std::string& name) const { |
381 base::HistogramBase* histogram = | 420 base::HistogramBase* histogram = |
382 base::StatisticsRecorder::FindHistogram(name); | 421 base::StatisticsRecorder::FindHistogram(name); |
383 if (!histogram) | 422 if (!histogram) |
384 return scoped_ptr<base::HistogramSamples>(new base::SampleMap()); | 423 return scoped_ptr<base::HistogramSamples>(new base::SampleMap()); |
385 return histogram->SnapshotSamples(); | 424 return histogram->SnapshotSamples(); |
386 } | 425 } |
387 | 426 |
388 TEST_F(CloudPolicyInvalidatorTest, Uninitialized) { | 427 TEST_F(CloudPolicyInvalidatorTest, Unstarted) { |
389 // No invalidations should be processed if the invalidator is not intialized. | 428 // No invalidations should be processed if the invalidator is not started. |
390 StartInvalidator(false /* initialize */); | 429 StartInvalidator(true /* instantiate */, false /* start */); |
391 StorePolicy(POLICY_OBJECT_A); | 430 StorePolicy(POLICY_OBJECT_A); |
392 FireInvalidation(POLICY_OBJECT_A); | 431 FireInvalidation(POLICY_OBJECT_A); |
393 EXPECT_TRUE(CheckInvalidateNotCalled()); | 432 EXPECT_TRUE(CheckInvalidateNotCalled()); |
394 } | 433 } |
395 | 434 |
396 TEST_F(CloudPolicyInvalidatorTest, RegisterOnStoreLoaded) { | 435 TEST_F(CloudPolicyInvalidatorTest, RegisterOnStoreLoaded) { |
397 // No registration when store is not loaded. | 436 // No registration when store is not loaded. |
398 StartInvalidator(); | 437 StartInvalidator(); |
399 EXPECT_TRUE(CheckStateChangedNotCalled()); | 438 EXPECT_TRUE(CheckStateChangedNotCalled()); |
400 FireInvalidation(POLICY_OBJECT_A); | 439 FireInvalidation(POLICY_OBJECT_A); |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
574 syncer::AckHandle ack = FireInvalidation(POLICY_OBJECT_A, 3, "test"); | 613 syncer::AckHandle ack = FireInvalidation(POLICY_OBJECT_A, 3, "test"); |
575 | 614 |
576 // Ensure that the invalidate callback is not made and the invalidation is | 615 // Ensure that the invalidate callback is not made and the invalidation is |
577 // acknowledged if the store is loaded with the latest version before the | 616 // acknowledged if the store is loaded with the latest version before the |
578 // callback is invoked. | 617 // callback is invoked. |
579 StorePolicy(POLICY_OBJECT_A, 3); | 618 StorePolicy(POLICY_OBJECT_A, 3); |
580 EXPECT_TRUE(IsInvalidationAcknowledged(ack)); | 619 EXPECT_TRUE(IsInvalidationAcknowledged(ack)); |
581 EXPECT_TRUE(CheckInvalidateNotCalled()); | 620 EXPECT_TRUE(CheckInvalidateNotCalled()); |
582 } | 621 } |
583 | 622 |
| 623 TEST_F(CloudPolicyInvalidatorTest, NoCallbackAfterShutdown) { |
| 624 // Generate an invalidation. |
| 625 StorePolicy(POLICY_OBJECT_A); |
| 626 StartInvalidator(); |
| 627 syncer::AckHandle ack = FireInvalidation(POLICY_OBJECT_A, 3, "test"); |
| 628 |
| 629 // Ensure that the invalidate callback is not made after the invalidator is |
| 630 // shut down. |
| 631 ShutdownInvalidator(); |
| 632 EXPECT_TRUE(CheckInvalidateNotCalled()); |
| 633 DestroyInvalidator(); |
| 634 } |
| 635 |
584 TEST_F(CloudPolicyInvalidatorTest, StateChanged) { | 636 TEST_F(CloudPolicyInvalidatorTest, StateChanged) { |
585 // Before registration, changes to the invalidation service state should not | 637 // Before registration, changes to the invalidation service state should not |
586 // generate change state notifications. | 638 // generate change state notifications. |
587 StartInvalidator(); | 639 StartInvalidator(); |
588 DisableInvalidationService(); | 640 DisableInvalidationService(); |
589 EnableInvalidationService(); | 641 EnableInvalidationService(); |
590 EXPECT_TRUE(CheckStateChangedNotCalled()); | 642 EXPECT_TRUE(CheckStateChangedNotCalled()); |
591 | 643 |
592 // After registration, changes to the invalidation service state should | 644 // After registration, changes to the invalidation service state should |
593 // generate notifications. | 645 // generate notifications. |
(...skipping 21 matching lines...) Expand all Loading... |
615 | 667 |
616 // When the invalidation service is disabled, changes to the registration | 668 // When the invalidation service is disabled, changes to the registration |
617 // state should not generate notifications. | 669 // state should not generate notifications. |
618 DisableInvalidationService(); | 670 DisableInvalidationService(); |
619 EXPECT_TRUE(CheckStateChangedCalled(false)); | 671 EXPECT_TRUE(CheckStateChangedCalled(false)); |
620 StorePolicy(POLICY_OBJECT_NONE); | 672 StorePolicy(POLICY_OBJECT_NONE); |
621 StorePolicy(POLICY_OBJECT_A); | 673 StorePolicy(POLICY_OBJECT_A); |
622 EXPECT_TRUE(CheckStateChangedNotCalled()); | 674 EXPECT_TRUE(CheckStateChangedNotCalled()); |
623 } | 675 } |
624 | 676 |
| 677 TEST_F(CloudPolicyInvalidatorTest, Stop) { |
| 678 // Generate an invalidation. |
| 679 StorePolicy(POLICY_OBJECT_A); |
| 680 StartInvalidator(); |
| 681 syncer::AckHandle ack = FireInvalidation(POLICY_OBJECT_A, 3, "test"); |
| 682 EXPECT_TRUE(CheckStateChangedCalled(true)); |
| 683 |
| 684 // Ensure that the invalidate callback is not made after stopping the |
| 685 // invalidator, but a call to indicate that invalidations are disabled is |
| 686 // made. |
| 687 StopInvalidator(); |
| 688 EXPECT_TRUE(CheckInvalidateNotCalled()); |
| 689 EXPECT_TRUE(CheckStateChangedCalled(false)); |
| 690 |
| 691 // Ensure that invalidation service events do not cause callbacks to be |
| 692 // invoked while the invalidator is stopped. |
| 693 FireInvalidation(POLICY_OBJECT_A, 4, "test"); |
| 694 EXPECT_TRUE(CheckInvalidateNotCalled()); |
| 695 DisableInvalidationService(); |
| 696 EXPECT_TRUE(CheckStateChangedNotCalled()); |
| 697 EnableInvalidationService(); |
| 698 EXPECT_TRUE(CheckStateChangedNotCalled()); |
| 699 |
| 700 // Ensure that the invalidator returns to normal after restarting. |
| 701 StartInvalidator(false /* instantiate */, true /* start */); |
| 702 EXPECT_TRUE(CheckInvalidateNotCalled()); |
| 703 EXPECT_TRUE(CheckStateChangedCalled(true)); |
| 704 FireInvalidation(POLICY_OBJECT_A, 4, "test"); |
| 705 EXPECT_TRUE(CheckInvalidationInfo(4, "test")); |
| 706 EXPECT_TRUE(CheckInvalidateCalled(false /* unknown_version */)); |
| 707 DisableInvalidationService(); |
| 708 EXPECT_TRUE(CheckStateChangedCalled(false)); |
| 709 } |
| 710 |
625 TEST_F(CloudPolicyInvalidatorTest, RefreshMetricsUnregistered) { | 711 TEST_F(CloudPolicyInvalidatorTest, RefreshMetricsUnregistered) { |
626 // Store loads occurring before invalidation registration are not counted. | 712 // Store loads occurring before invalidation registration are not counted. |
627 StartInvalidator(); | 713 StartInvalidator(); |
628 StorePolicy(POLICY_OBJECT_NONE, 0, false /* policy_changed */); | 714 StorePolicy(POLICY_OBJECT_NONE, 0, false /* policy_changed */); |
629 StorePolicy(POLICY_OBJECT_NONE, 0, true /* policy_changed */); | 715 StorePolicy(POLICY_OBJECT_NONE, 0, true /* policy_changed */); |
630 EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_CHANGED)); | 716 EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_CHANGED)); |
631 EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_CHANGED_NO_INVALIDATIONS)); | 717 EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_CHANGED_NO_INVALIDATIONS)); |
632 EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_UNCHANGED)); | 718 EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_UNCHANGED)); |
633 EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_INVALIDATED_CHANGED)); | 719 EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_INVALIDATED_CHANGED)); |
634 EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_INVALIDATED_UNCHANGED)); | 720 EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_INVALIDATED_UNCHANGED)); |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
715 FireInvalidation(POLICY_OBJECT_A); | 801 FireInvalidation(POLICY_OBJECT_A); |
716 FireInvalidation(POLICY_OBJECT_A, 3, "test"); | 802 FireInvalidation(POLICY_OBJECT_A, 3, "test"); |
717 FireInvalidation(POLICY_OBJECT_A, 4, "test"); | 803 FireInvalidation(POLICY_OBJECT_A, 4, "test"); |
718 | 804 |
719 // Verify that received invalidations metrics are correct. | 805 // Verify that received invalidations metrics are correct. |
720 EXPECT_EQ(3, GetInvalidationCount(false /* with_payload */)); | 806 EXPECT_EQ(3, GetInvalidationCount(false /* with_payload */)); |
721 EXPECT_EQ(4, GetInvalidationCount(true /* with_payload */)); | 807 EXPECT_EQ(4, GetInvalidationCount(true /* with_payload */)); |
722 } | 808 } |
723 | 809 |
724 } // namespace policy | 810 } // namespace policy |
OLD | NEW |