| Index: chrome/browser/policy/cloud/cloud_policy_invalidator_unittest.cc
|
| diff --git a/chrome/browser/policy/cloud/cloud_policy_invalidator_unittest.cc b/chrome/browser/policy/cloud/cloud_policy_invalidator_unittest.cc
|
| index eed8bfc9f1f6012c0baa09e7fbfe0696a9bf87f9..a621977bf22668d7aacd17ff0733a39966ff4aa3 100644
|
| --- a/chrome/browser/policy/cloud/cloud_policy_invalidator_unittest.cc
|
| +++ b/chrome/browser/policy/cloud/cloud_policy_invalidator_unittest.cc
|
| @@ -5,8 +5,10 @@
|
| #include <string>
|
|
|
| #include "base/basictypes.h"
|
| +#include "base/bind.h"
|
| #include "base/memory/ref_counted.h"
|
| #include "base/memory/scoped_ptr.h"
|
| +#include "base/message_loop/message_loop.h"
|
| #include "base/metrics/histogram.h"
|
| #include "base/metrics/histogram_samples.h"
|
| #include "base/metrics/sample_map.h"
|
| @@ -15,9 +17,10 @@
|
| #include "base/time/time.h"
|
| #include "base/values.h"
|
| #include "chrome/browser/invalidation/fake_invalidation_service.h"
|
| +#include "chrome/browser/policy/cloud/cloud_policy_constants.h"
|
| #include "chrome/browser/policy/cloud/cloud_policy_core.h"
|
| #include "chrome/browser/policy/cloud/cloud_policy_invalidator.h"
|
| -#include "chrome/browser/policy/cloud/cloud_policy_service.h"
|
| +#include "chrome/browser/policy/cloud/cloud_policy_refresh_scheduler.h"
|
| #include "chrome/browser/policy/cloud/enterprise_metrics.h"
|
| #include "chrome/browser/policy/cloud/mock_cloud_policy_client.h"
|
| #include "chrome/browser/policy/cloud/mock_cloud_policy_store.h"
|
| @@ -30,8 +33,7 @@
|
|
|
| namespace policy {
|
|
|
| -class CloudPolicyInvalidatorTest : public testing::Test,
|
| - public CloudPolicyInvalidationHandler {
|
| +class CloudPolicyInvalidatorTest : public testing::Test {
|
| protected:
|
| // Policy objects which can be used in tests.
|
| enum PolicyObject {
|
| @@ -47,11 +49,32 @@ class CloudPolicyInvalidatorTest : public testing::Test,
|
| virtual void TearDown() OVERRIDE;
|
|
|
| // Starts the invalidator which will be tested.
|
| - void StartInvalidator(bool initialize);
|
| + // |initialize| determines if the invalidator should be initialized.
|
| + // |start_refresh_scheduler| determines if the refresh scheduler should start.
|
| + void StartInvalidator(bool initialize, bool start_refresh_scheduler);
|
| void StartInvalidator() {
|
| - StartInvalidator(true /* initialize */);
|
| + StartInvalidator(true /* initialize */, true /* start_refresh_scheduler */);
|
| }
|
|
|
| + // Calls Initialize on the invalidator.
|
| + void InitializeInvalidator();
|
| +
|
| + // Calls Shutdown on the invalidator. Test must call DestroyInvalidator
|
| + // afterwards to prevent Shutdown from being called twice.
|
| + void ShutdownInvalidator();
|
| +
|
| + // Destroys the invalidator.
|
| + void DestroyInvalidator();
|
| +
|
| + // Connects the cloud policy core.
|
| + void ConnectCore();
|
| +
|
| + // Starts the refresh scheduler.
|
| + void StartRefreshScheduler();
|
| +
|
| + // Disconnects the cloud policy core.
|
| + void DisconnectCore();
|
| +
|
| // Simulates storing a new policy to the policy store.
|
| // |object| determines which policy object the store will report the
|
| // invalidator should register for. May be POLICY_OBJECT_NONE for no object.
|
| @@ -98,40 +121,36 @@ class CloudPolicyInvalidatorTest : public testing::Test,
|
| // Checks the expected value of the currently set invalidation info.
|
| bool CheckInvalidationInfo(int64 version, const std::string& payload);
|
|
|
| - // Checks that the invalidate callback was not called.
|
| - bool CheckInvalidateNotCalled();
|
| + // Checks that the policy was not refreshed due to an invalidation.
|
| + bool CheckPolicyNotRefreshed();
|
|
|
| - // Checks that the invalidate callback was called within an appropriate
|
| - // timeframe depending on whether the invalidation had unknown version.
|
| - bool CheckInvalidateCalled(bool unknown_version);
|
| - bool CheckInvalidateCalled() {
|
| - return CheckInvalidateCalled(true);
|
| - }
|
| -
|
| - // Checks that the state changed callback of the invalidation handler was not
|
| - // called.
|
| - bool CheckStateChangedNotCalled();
|
| + // Checks that the policy was refreshed due to an invalidation within an
|
| + // appropriate timeframe depending on whether the invalidation had unknown
|
| + // version.
|
| + bool CheckPolicyRefreshed();
|
| + bool CheckPolicyRefreshedWithUnknownVersion();
|
|
|
| - // Checks that the state changed callback of the invalidation handler was
|
| - // called with the given state.
|
| - bool CheckStateChangedCalled(bool invalidations_enabled);
|
| + // Returns the invalidations enabled state set by the invalidator on the
|
| + // refresh scheduler.
|
| + bool InvalidationsEnabled();
|
|
|
| // Determines if the invalidation with the given ack handle has been
|
| // acknowledged.
|
| bool IsInvalidationAcknowledged(const syncer::AckHandle& ack_handle);
|
|
|
| + // Determines if the invalidator has registered for an object with the
|
| + // invalidation service.
|
| + bool IsInvalidatorRegistered();
|
| +
|
| // Get the current count for the given metric.
|
| base::HistogramBase::Count GetCount(MetricPolicyRefresh metric);
|
| base::HistogramBase::Count GetInvalidationCount(bool with_payload);
|
|
|
| - // CloudPolicyInvalidationHandler:
|
| - virtual void SetInvalidationInfo(
|
| - int64 version,
|
| - const std::string& payload) OVERRIDE;
|
| - virtual void InvalidatePolicy() OVERRIDE;
|
| - virtual void OnInvalidatorStateChanged(bool invalidations_enabled) OVERRIDE;
|
| -
|
| private:
|
| + // Checks that the policy was refreshed due to an invalidation with the given
|
| + // base delay.
|
| + bool CheckPolicyRefreshed(base::TimeDelta delay);
|
| +
|
| // Returns the object id of the given policy object.
|
| const invalidation::ObjectId& GetPolicyObjectId(PolicyObject object) const;
|
|
|
| @@ -142,15 +161,12 @@ class CloudPolicyInvalidatorTest : public testing::Test,
|
| // Objects the invalidator depends on.
|
| invalidation::FakeInvalidationService invalidation_service_;
|
| MockCloudPolicyStore store_;
|
| + CloudPolicyCore core_;
|
| scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
|
|
|
| // The invalidator which will be tested.
|
| scoped_ptr<CloudPolicyInvalidator> invalidator_;
|
|
|
| - // The latest invalidation info set by the invalidator.
|
| - int64 invalidation_version_;
|
| - std::string invalidation_payload_;
|
| -
|
| // Object ids for the test policy objects.
|
| invalidation::ObjectId object_id_a_;
|
| invalidation::ObjectId object_id_b_;
|
| @@ -166,32 +182,27 @@ class CloudPolicyInvalidatorTest : public testing::Test,
|
| // The currently used policy value.
|
| const char* policy_value_cur_;
|
|
|
| - // Stores how many times the invalidate callback was called.
|
| - int invalidate_callback_count_;
|
| -
|
| - // Stores how many times the state change callback was called for each state.
|
| - int state_change_enabled_callback_count_;
|
| - int state_change_disabled_callback_count_;
|
| -
|
| // Stores starting histogram counts for kMetricPolicyRefresh.
|
| scoped_ptr<base::HistogramSamples> refresh_samples_;
|
|
|
| // Stores starting histogram counts for kMetricPolicyInvalidations.
|
| scoped_ptr<base::HistogramSamples> invalidations_samples_;
|
| +
|
| + // Initialize message loop.
|
| + base::MessageLoop loop_;
|
| };
|
|
|
| CloudPolicyInvalidatorTest::CloudPolicyInvalidatorTest()
|
| - : task_runner_(new base::TestSimpleTaskRunner()),
|
| - invalidation_version_(0),
|
| + : core_(PolicyNamespaceKey(dm_protocol::kChromeUserPolicyType,
|
| + std::string()),
|
| + &store_),
|
| + task_runner_(new base::TestSimpleTaskRunner()),
|
| object_id_a_(135, "asdf"),
|
| object_id_b_(246, "zxcv"),
|
| timestamp_(123456),
|
| policy_value_a_("asdf"),
|
| policy_value_b_("zxcv"),
|
| - policy_value_cur_(policy_value_a_),
|
| - invalidate_callback_count_(0),
|
| - state_change_enabled_callback_count_(0),
|
| - state_change_disabled_callback_count_(0) {}
|
| + policy_value_cur_(policy_value_a_) {}
|
|
|
| void CloudPolicyInvalidatorTest::SetUp() {
|
| base::StatisticsRecorder::Initialize();
|
| @@ -203,15 +214,43 @@ void CloudPolicyInvalidatorTest::TearDown() {
|
| EXPECT_FALSE(invalidation_service_.ReceivedInvalidAcknowledgement());
|
| if (invalidator_)
|
| invalidator_->Shutdown();
|
| + core_.Disconnect();
|
| }
|
|
|
| -void CloudPolicyInvalidatorTest::StartInvalidator(bool initialize) {
|
| - invalidator_.reset(new CloudPolicyInvalidator(
|
| - this /* invalidation_handler */,
|
| - &store_,
|
| - task_runner_));
|
| +void CloudPolicyInvalidatorTest::StartInvalidator(
|
| + bool initialize,
|
| + bool start_refresh_scheduler) {
|
| + invalidator_.reset(new CloudPolicyInvalidator(&core_, task_runner_));
|
| + if (start_refresh_scheduler) {
|
| + ConnectCore();
|
| + StartRefreshScheduler();
|
| + }
|
| if (initialize)
|
| - invalidator_->InitializeWithService(&invalidation_service_);
|
| + InitializeInvalidator();
|
| +}
|
| +
|
| +void CloudPolicyInvalidatorTest::InitializeInvalidator() {
|
| + invalidator_->Initialize(&invalidation_service_);
|
| +}
|
| +
|
| +void CloudPolicyInvalidatorTest::ShutdownInvalidator() {
|
| + invalidator_->Shutdown();
|
| +}
|
| +
|
| +void CloudPolicyInvalidatorTest::DestroyInvalidator() {
|
| + invalidator_.reset();
|
| +}
|
| +
|
| +void CloudPolicyInvalidatorTest::ConnectCore() {
|
| + core_.Connect(scoped_ptr<CloudPolicyClient>(new MockCloudPolicyClient()));
|
| +}
|
| +
|
| +void CloudPolicyInvalidatorTest::StartRefreshScheduler() {
|
| + core_.StartRefreshScheduler();
|
| +}
|
| +
|
| +void CloudPolicyInvalidatorTest::DisconnectCore() {
|
| + core_.Disconnect();
|
| }
|
|
|
| void CloudPolicyInvalidatorTest::StorePolicy(
|
| @@ -274,60 +313,29 @@ syncer::AckHandle CloudPolicyInvalidatorTest::FireInvalidation(
|
| bool CloudPolicyInvalidatorTest::CheckInvalidationInfo(
|
| int64 version,
|
| const std::string& payload) {
|
| - return version == invalidation_version_ && payload == invalidation_payload_;
|
| + MockCloudPolicyClient* client =
|
| + static_cast<MockCloudPolicyClient*>(core_.client());
|
| + return version == client->invalidation_version_ &&
|
| + payload == client->invalidation_payload_;
|
| }
|
|
|
| -bool CloudPolicyInvalidatorTest::CheckInvalidateNotCalled() {
|
| - bool result = true;
|
| - if (invalidate_callback_count_ != 0)
|
| - result = false;
|
| +bool CloudPolicyInvalidatorTest::CheckPolicyNotRefreshed() {
|
| + const int start_count = invalidator_->policy_refresh_count();
|
| task_runner_->RunUntilIdle();
|
| - if (invalidate_callback_count_ != 0)
|
| - result = false;
|
| - return result;
|
| + return invalidator_->policy_refresh_count() == start_count;
|
| }
|
|
|
| -bool CloudPolicyInvalidatorTest::CheckInvalidateCalled(bool unknown_version) {
|
| - base::TimeDelta min_delay;
|
| - base::TimeDelta max_delay = base::TimeDelta::FromMilliseconds(
|
| - CloudPolicyInvalidator::kMaxFetchDelayMin);
|
| - if (unknown_version) {
|
| - base::TimeDelta additional_delay = base::TimeDelta::FromMinutes(
|
| - CloudPolicyInvalidator::kMissingPayloadDelay);
|
| - min_delay += additional_delay;
|
| - max_delay += additional_delay;
|
| - }
|
| -
|
| - if (task_runner_->GetPendingTasks().empty())
|
| - return false;
|
| - base::TimeDelta actual_delay = task_runner_->GetPendingTasks().back().delay;
|
| - EXPECT_GE(actual_delay, min_delay);
|
| - EXPECT_LE(actual_delay, max_delay);
|
| -
|
| - bool result = true;
|
| - if (invalidate_callback_count_ != 0)
|
| - result = false;
|
| - task_runner_->RunUntilIdle();
|
| - if (invalidate_callback_count_ != 1)
|
| - result = false;
|
| - invalidate_callback_count_ = 0;
|
| - return result;
|
| +bool CloudPolicyInvalidatorTest::CheckPolicyRefreshed() {
|
| + return CheckPolicyRefreshed(base::TimeDelta());
|
| }
|
|
|
| -bool CloudPolicyInvalidatorTest::CheckStateChangedNotCalled() {
|
| - return state_change_enabled_callback_count_ == 0 &&
|
| - state_change_disabled_callback_count_ == 0;
|
| +bool CloudPolicyInvalidatorTest::CheckPolicyRefreshedWithUnknownVersion() {
|
| + return CheckPolicyRefreshed(base::TimeDelta::FromMinutes(
|
| + CloudPolicyInvalidator::kMissingPayloadDelay));
|
| }
|
|
|
| -bool CloudPolicyInvalidatorTest::CheckStateChangedCalled(
|
| - bool invalidations_enabled) {
|
| - int expected_enabled_count_ = invalidations_enabled ? 1 : 0;
|
| - int expected_disabled_count_ = invalidations_enabled ? 0 : 1;
|
| - bool result = state_change_enabled_callback_count_ == expected_enabled_count_
|
| - && state_change_disabled_callback_count_ == expected_disabled_count_;
|
| - state_change_enabled_callback_count_ = 0;
|
| - state_change_disabled_callback_count_ = 0;
|
| - return result;
|
| +bool CloudPolicyInvalidatorTest::InvalidationsEnabled() {
|
| + return core_.refresh_scheduler()->invalidations_available();
|
| }
|
|
|
| bool CloudPolicyInvalidatorTest::IsInvalidationAcknowledged(
|
| @@ -335,6 +343,11 @@ bool CloudPolicyInvalidatorTest::IsInvalidationAcknowledged(
|
| return invalidation_service_.IsInvalidationAcknowledged(ack_handle);
|
| }
|
|
|
| +bool CloudPolicyInvalidatorTest::IsInvalidatorRegistered() {
|
| + return !invalidation_service_.invalidator_registrar()
|
| + .GetRegisteredIds(invalidator_.get()).empty();
|
| +}
|
| +
|
| base::HistogramBase::Count CloudPolicyInvalidatorTest::GetCount(
|
| MetricPolicyRefresh metric) {
|
| return GetHistogramSamples(kMetricPolicyRefresh)->GetCount(metric) -
|
| @@ -348,25 +361,19 @@ base::HistogramBase::Count CloudPolicyInvalidatorTest::GetInvalidationCount(
|
| invalidations_samples_->GetCount(metric);
|
| }
|
|
|
| -void CloudPolicyInvalidatorTest::SetInvalidationInfo(
|
| - int64 version,
|
| - const std::string& payload) {
|
| - invalidation_version_ = version;
|
| - invalidation_payload_ = payload;
|
| -}
|
| +bool CloudPolicyInvalidatorTest::CheckPolicyRefreshed(base::TimeDelta delay) {
|
| + base::TimeDelta max_delay = delay + base::TimeDelta::FromMilliseconds(
|
| + CloudPolicyInvalidator::kMaxFetchDelayMin);
|
|
|
| -void CloudPolicyInvalidatorTest::InvalidatePolicy() {
|
| - ++invalidate_callback_count_;
|
| -}
|
| + if (task_runner_->GetPendingTasks().empty())
|
| + return false;
|
| + base::TimeDelta actual_delay = task_runner_->GetPendingTasks().back().delay;
|
| + EXPECT_GE(actual_delay, delay);
|
| + EXPECT_LE(actual_delay, max_delay);
|
|
|
| -void CloudPolicyInvalidatorTest::OnInvalidatorStateChanged(
|
| - bool invalidations_enabled) {
|
| - if (invalidator_.get())
|
| - EXPECT_EQ(invalidations_enabled, invalidator_->invalidations_enabled());
|
| - if (invalidations_enabled)
|
| - ++state_change_enabled_callback_count_;
|
| - else
|
| - ++state_change_disabled_callback_count_;
|
| + const int start_count = invalidator_->policy_refresh_count();
|
| + task_runner_->RunUntilIdle();
|
| + return invalidator_->policy_refresh_count() == start_count + 1;
|
| }
|
|
|
| const invalidation::ObjectId& CloudPolicyInvalidatorTest::GetPolicyObjectId(
|
| @@ -386,98 +393,144 @@ scoped_ptr<base::HistogramSamples>
|
| }
|
|
|
| TEST_F(CloudPolicyInvalidatorTest, Uninitialized) {
|
| - // No invalidations should be processed if the invalidator is not intialized.
|
| - StartInvalidator(false /* initialize */);
|
| + // No invalidations should be processed if the invalidator is not initialized.
|
| + StartInvalidator(false /* initialize */, true /* start_refresh_scheduler */);
|
| StorePolicy(POLICY_OBJECT_A);
|
| + EXPECT_FALSE(IsInvalidatorRegistered());
|
| FireInvalidation(POLICY_OBJECT_A);
|
| - EXPECT_TRUE(CheckInvalidateNotCalled());
|
| + EXPECT_TRUE(CheckPolicyNotRefreshed());
|
| +}
|
| +
|
| +TEST_F(CloudPolicyInvalidatorTest, RefreshSchedulerNotStarted) {
|
| + // No invalidations should be processed if the refresh scheduler is not
|
| + // started.
|
| + StartInvalidator(true /* initialize */, false /* start_refresh_scheduler */);
|
| + StorePolicy(POLICY_OBJECT_A);
|
| + EXPECT_FALSE(IsInvalidatorRegistered());
|
| + FireInvalidation(POLICY_OBJECT_A);
|
| + EXPECT_TRUE(CheckPolicyNotRefreshed());
|
| +}
|
| +
|
| +TEST_F(CloudPolicyInvalidatorTest, DisconnectCoreThenInitialize) {
|
| + // No invalidations should be processed if the core is disconnected before
|
| + // initialization.
|
| + StartInvalidator(false /* initialize */, true /* start_refresh_scheduler */);
|
| + DisconnectCore();
|
| + InitializeInvalidator();
|
| + StorePolicy(POLICY_OBJECT_A);
|
| + EXPECT_FALSE(IsInvalidatorRegistered());
|
| + FireInvalidation(POLICY_OBJECT_A);
|
| + EXPECT_TRUE(CheckPolicyNotRefreshed());
|
| +}
|
| +
|
| +TEST_F(CloudPolicyInvalidatorTest, InitializeThenStartRefreshScheduler) {
|
| + // Make sure registration occurs and invalidations are processed when
|
| + // Initialize is called before starting the refresh scheduler.
|
| + // Note that the reverse case (start refresh scheduler then initialize) is
|
| + // the default behavior for the test fixture, so will be tested in most other
|
| + // tests.
|
| + StartInvalidator(true /* initialize */, false /* start_refresh_scheduler */);
|
| + ConnectCore();
|
| + StartRefreshScheduler();
|
| + StorePolicy(POLICY_OBJECT_A);
|
| + EXPECT_TRUE(IsInvalidatorRegistered());
|
| + FireInvalidation(POLICY_OBJECT_A);
|
| + EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion());
|
| }
|
|
|
| TEST_F(CloudPolicyInvalidatorTest, RegisterOnStoreLoaded) {
|
| // No registration when store is not loaded.
|
| StartInvalidator();
|
| - EXPECT_TRUE(CheckStateChangedNotCalled());
|
| + EXPECT_FALSE(IsInvalidatorRegistered());
|
| + EXPECT_FALSE(InvalidationsEnabled());
|
| FireInvalidation(POLICY_OBJECT_A);
|
| FireInvalidation(POLICY_OBJECT_B);
|
| - EXPECT_TRUE(CheckInvalidateNotCalled());
|
| + EXPECT_TRUE(CheckPolicyNotRefreshed());
|
|
|
| // No registration when store is loaded with no invalidation object id.
|
| StorePolicy(POLICY_OBJECT_NONE);
|
| - EXPECT_TRUE(CheckStateChangedNotCalled());
|
| + EXPECT_FALSE(IsInvalidatorRegistered());
|
| + EXPECT_FALSE(InvalidationsEnabled());
|
| FireInvalidation(POLICY_OBJECT_A);
|
| FireInvalidation(POLICY_OBJECT_B);
|
| - EXPECT_TRUE(CheckInvalidateNotCalled());
|
| + EXPECT_TRUE(CheckPolicyNotRefreshed());
|
|
|
| // Check registration when store is loaded for object A.
|
| StorePolicy(POLICY_OBJECT_A);
|
| - EXPECT_TRUE(CheckStateChangedCalled(true));
|
| + EXPECT_TRUE(IsInvalidatorRegistered());
|
| + EXPECT_TRUE(InvalidationsEnabled());
|
| FireInvalidation(POLICY_OBJECT_A);
|
| - EXPECT_TRUE(CheckInvalidateCalled());
|
| + EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion());
|
| FireInvalidation(POLICY_OBJECT_B);
|
| - EXPECT_TRUE(CheckInvalidateNotCalled());
|
| + EXPECT_TRUE(CheckPolicyNotRefreshed());
|
| }
|
|
|
| TEST_F(CloudPolicyInvalidatorTest, ChangeRegistration) {
|
| // Register for object A.
|
| StartInvalidator();
|
| StorePolicy(POLICY_OBJECT_A);
|
| - EXPECT_TRUE(CheckStateChangedCalled(true));
|
| + EXPECT_TRUE(IsInvalidatorRegistered());
|
| + EXPECT_TRUE(InvalidationsEnabled());
|
| FireInvalidation(POLICY_OBJECT_A);
|
| - EXPECT_TRUE(CheckInvalidateCalled());
|
| + EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion());
|
| FireInvalidation(POLICY_OBJECT_B);
|
| - EXPECT_TRUE(CheckInvalidateNotCalled());
|
| + EXPECT_TRUE(CheckPolicyNotRefreshed());
|
| syncer::AckHandle ack = FireInvalidation(POLICY_OBJECT_A);
|
|
|
| // Check re-registration for object B. Make sure the pending invalidation for
|
| // object A is acknowledged without making the callback.
|
| StorePolicy(POLICY_OBJECT_B);
|
| - EXPECT_TRUE(CheckStateChangedNotCalled());
|
| + EXPECT_TRUE(IsInvalidatorRegistered());
|
| + EXPECT_TRUE(InvalidationsEnabled());
|
| EXPECT_TRUE(IsInvalidationAcknowledged(ack));
|
| - EXPECT_TRUE(CheckInvalidateNotCalled());
|
| + EXPECT_TRUE(CheckPolicyNotRefreshed());
|
|
|
| // Make sure future invalidations for object A are ignored and for object B
|
| // are processed.
|
| FireInvalidation(POLICY_OBJECT_A);
|
| - EXPECT_TRUE(CheckInvalidateNotCalled());
|
| + EXPECT_TRUE(CheckPolicyNotRefreshed());
|
| FireInvalidation(POLICY_OBJECT_B);
|
| - EXPECT_TRUE(CheckInvalidateCalled());
|
| + EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion());
|
| }
|
|
|
| TEST_F(CloudPolicyInvalidatorTest, UnregisterOnStoreLoaded) {
|
| // Register for object A.
|
| StartInvalidator();
|
| StorePolicy(POLICY_OBJECT_A);
|
| - EXPECT_TRUE(CheckStateChangedCalled(true));
|
| + EXPECT_TRUE(IsInvalidatorRegistered());
|
| + EXPECT_TRUE(InvalidationsEnabled());
|
| FireInvalidation(POLICY_OBJECT_A);
|
| - EXPECT_TRUE(CheckInvalidateCalled());
|
| + EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion());
|
|
|
| // Check unregistration when store is loaded with no invalidation object id.
|
| syncer::AckHandle ack = FireInvalidation(POLICY_OBJECT_A);
|
| EXPECT_FALSE(IsInvalidationAcknowledged(ack));
|
| StorePolicy(POLICY_OBJECT_NONE);
|
| + EXPECT_FALSE(IsInvalidatorRegistered());
|
| EXPECT_TRUE(IsInvalidationAcknowledged(ack));
|
| - EXPECT_TRUE(CheckStateChangedCalled(false));
|
| + EXPECT_FALSE(InvalidationsEnabled());
|
| FireInvalidation(POLICY_OBJECT_A);
|
| FireInvalidation(POLICY_OBJECT_B);
|
| - EXPECT_TRUE(CheckInvalidateNotCalled());
|
| + EXPECT_TRUE(CheckPolicyNotRefreshed());
|
|
|
| // Check re-registration for object B.
|
| StorePolicy(POLICY_OBJECT_B);
|
| - EXPECT_TRUE(CheckStateChangedCalled(true));
|
| + EXPECT_TRUE(IsInvalidatorRegistered());
|
| + EXPECT_TRUE(InvalidationsEnabled());
|
| FireInvalidation(POLICY_OBJECT_B);
|
| - EXPECT_TRUE(CheckInvalidateCalled());
|
| + EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion());
|
| }
|
|
|
| TEST_F(CloudPolicyInvalidatorTest, HandleInvalidation) {
|
| // Register and fire invalidation
|
| StorePolicy(POLICY_OBJECT_A);
|
| StartInvalidator();
|
| - EXPECT_TRUE(CheckStateChangedCalled(true));
|
| + EXPECT_TRUE(InvalidationsEnabled());
|
| syncer::AckHandle ack = FireInvalidation(POLICY_OBJECT_A, 12, "test_payload");
|
|
|
| // Make sure client info is set as soon as the invalidation is received.
|
| EXPECT_TRUE(CheckInvalidationInfo(12, "test_payload"));
|
| - EXPECT_TRUE(CheckInvalidateCalled(false /* unknown_version */));
|
| + EXPECT_TRUE(CheckPolicyRefreshed());
|
|
|
| // Make sure invalidation is not acknowledged until the store is loaded.
|
| EXPECT_FALSE(IsInvalidationAcknowledged(ack));
|
| @@ -496,7 +549,7 @@ TEST_F(CloudPolicyInvalidatorTest, HandleInvalidationWithUnknownVersion) {
|
| // Make sure client info is not set until after the invalidation callback is
|
| // made.
|
| EXPECT_TRUE(CheckInvalidationInfo(0, std::string()));
|
| - EXPECT_TRUE(CheckInvalidateCalled());
|
| + EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion());
|
| EXPECT_TRUE(CheckInvalidationInfo(-1, std::string()));
|
|
|
| // Make sure invalidation is not acknowledged until the store is loaded.
|
| @@ -521,8 +574,8 @@ TEST_F(CloudPolicyInvalidatorTest, HandleMultipleInvalidations) {
|
| EXPECT_TRUE(IsInvalidationAcknowledged(ack1));
|
| EXPECT_TRUE(IsInvalidationAcknowledged(ack2));
|
|
|
| - // Make sure the invalidate callback is called once.
|
| - EXPECT_TRUE(CheckInvalidateCalled(false /* unknown_version */));
|
| + // Make sure the policy is refreshed once.
|
| + EXPECT_TRUE(CheckPolicyRefreshed());
|
|
|
| // Make sure that the last invalidation is only acknowledged after the store
|
| // is loaded with the latest version.
|
| @@ -542,15 +595,15 @@ TEST_F(CloudPolicyInvalidatorTest,
|
| StartInvalidator();
|
| syncer::AckHandle ack1 = FireInvalidation(POLICY_OBJECT_A);
|
| EXPECT_TRUE(CheckInvalidationInfo(0, std::string()));
|
| - EXPECT_TRUE(CheckInvalidateCalled());
|
| + EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion());
|
| EXPECT_TRUE(CheckInvalidationInfo(-1, std::string()));
|
| syncer::AckHandle ack2 = FireInvalidation(POLICY_OBJECT_A);
|
| EXPECT_TRUE(CheckInvalidationInfo(0, std::string()));
|
| - EXPECT_TRUE(CheckInvalidateCalled());
|
| + EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion());
|
| EXPECT_TRUE(CheckInvalidationInfo(-2, std::string()));
|
| syncer::AckHandle ack3 = FireInvalidation(POLICY_OBJECT_A);
|
| EXPECT_TRUE(CheckInvalidationInfo(0, std::string()));
|
| - EXPECT_TRUE(CheckInvalidateCalled());
|
| + EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion());
|
| EXPECT_TRUE(CheckInvalidationInfo(-3, std::string()));
|
|
|
| // Make sure the replaced invalidations are acknowledged.
|
| @@ -567,59 +620,107 @@ TEST_F(CloudPolicyInvalidatorTest,
|
| EXPECT_TRUE(IsInvalidationAcknowledged(ack3));
|
| }
|
|
|
| -TEST_F(CloudPolicyInvalidatorTest, AcknowledgeBeforeInvalidateCallback) {
|
| +TEST_F(CloudPolicyInvalidatorTest, AcknowledgeBeforeRefresh) {
|
| // Generate an invalidation.
|
| StorePolicy(POLICY_OBJECT_A);
|
| StartInvalidator();
|
| syncer::AckHandle ack = FireInvalidation(POLICY_OBJECT_A, 3, "test");
|
|
|
| - // Ensure that the invalidate callback is not made and the invalidation is
|
| + // Ensure that the policy is not refreshed and the invalidation is
|
| // acknowledged if the store is loaded with the latest version before the
|
| - // callback is invoked.
|
| + // refresh can occur.
|
| StorePolicy(POLICY_OBJECT_A, 3);
|
| EXPECT_TRUE(IsInvalidationAcknowledged(ack));
|
| - EXPECT_TRUE(CheckInvalidateNotCalled());
|
| + EXPECT_TRUE(CheckPolicyNotRefreshed());
|
| +}
|
| +
|
| +TEST_F(CloudPolicyInvalidatorTest, NoCallbackAfterShutdown) {
|
| + // Generate an invalidation.
|
| + StorePolicy(POLICY_OBJECT_A);
|
| + StartInvalidator();
|
| + syncer::AckHandle ack = FireInvalidation(POLICY_OBJECT_A, 3, "test");
|
| +
|
| + // Ensure that the policy refresh is not made after the invalidator is shut
|
| + // down.
|
| + ShutdownInvalidator();
|
| + EXPECT_TRUE(CheckPolicyNotRefreshed());
|
| + DestroyInvalidator();
|
| }
|
|
|
| TEST_F(CloudPolicyInvalidatorTest, StateChanged) {
|
| - // Before registration, changes to the invalidation service state should not
|
| - // generate change state notifications.
|
| + // Test invalidation service state changes while not registered.
|
| StartInvalidator();
|
| DisableInvalidationService();
|
| EnableInvalidationService();
|
| - EXPECT_TRUE(CheckStateChangedNotCalled());
|
| + EXPECT_FALSE(InvalidationsEnabled());
|
|
|
| - // After registration, changes to the invalidation service state should
|
| - // generate notifications.
|
| + // Test invalidation service state changes while registered.
|
| StorePolicy(POLICY_OBJECT_A);
|
| - EXPECT_TRUE(CheckStateChangedCalled(true));
|
| + EXPECT_TRUE(InvalidationsEnabled());
|
| DisableInvalidationService();
|
| - EXPECT_TRUE(CheckStateChangedCalled(false));
|
| + EXPECT_FALSE(InvalidationsEnabled());
|
| DisableInvalidationService();
|
| - EXPECT_TRUE(CheckStateChangedNotCalled());
|
| + EXPECT_FALSE(InvalidationsEnabled());
|
| EnableInvalidationService();
|
| - EXPECT_TRUE(CheckStateChangedCalled(true));
|
| + EXPECT_TRUE(InvalidationsEnabled());
|
| EnableInvalidationService();
|
| - EXPECT_TRUE(CheckStateChangedNotCalled());
|
| + EXPECT_TRUE(InvalidationsEnabled());
|
|
|
| - // When the invalidation service is enabled, changes to the registration
|
| - // state should generate notifications.
|
| + // Test registration changes with invalidation service enabled.
|
| StorePolicy(POLICY_OBJECT_NONE);
|
| - EXPECT_TRUE(CheckStateChangedCalled(false));
|
| + EXPECT_FALSE(InvalidationsEnabled());
|
| StorePolicy(POLICY_OBJECT_NONE);
|
| - EXPECT_TRUE(CheckStateChangedNotCalled());
|
| + EXPECT_FALSE(InvalidationsEnabled());
|
| StorePolicy(POLICY_OBJECT_A);
|
| - EXPECT_TRUE(CheckStateChangedCalled(true));
|
| + EXPECT_TRUE(InvalidationsEnabled());
|
| StorePolicy(POLICY_OBJECT_A);
|
| - EXPECT_TRUE(CheckStateChangedNotCalled());
|
| + EXPECT_TRUE(InvalidationsEnabled());
|
|
|
| - // When the invalidation service is disabled, changes to the registration
|
| - // state should not generate notifications.
|
| + // Test registration changes with invalidation service disabled.
|
| DisableInvalidationService();
|
| - EXPECT_TRUE(CheckStateChangedCalled(false));
|
| + EXPECT_FALSE(InvalidationsEnabled());
|
| StorePolicy(POLICY_OBJECT_NONE);
|
| StorePolicy(POLICY_OBJECT_A);
|
| - EXPECT_TRUE(CheckStateChangedNotCalled());
|
| + EXPECT_FALSE(InvalidationsEnabled());
|
| +}
|
| +
|
| +TEST_F(CloudPolicyInvalidatorTest, Disconnect) {
|
| + // Generate an invalidation.
|
| + StorePolicy(POLICY_OBJECT_A);
|
| + StartInvalidator();
|
| + syncer::AckHandle ack = FireInvalidation(POLICY_OBJECT_A, 1, "test");
|
| + EXPECT_TRUE(InvalidationsEnabled());
|
| +
|
| + // Ensure that the policy is not refreshed after disconnecting the core, but
|
| + // a call to indicate that invalidations are disabled is made.
|
| + DisconnectCore();
|
| + EXPECT_TRUE(CheckPolicyNotRefreshed());
|
| +
|
| + // Ensure that invalidation service events do not cause refreshes while the
|
| + // invalidator is stopped.
|
| + FireInvalidation(POLICY_OBJECT_A, 2, "test");
|
| + EXPECT_TRUE(CheckPolicyNotRefreshed());
|
| + DisableInvalidationService();
|
| + EnableInvalidationService();
|
| +
|
| + // Connect and disconnect without starting the refresh scheduler.
|
| + ConnectCore();
|
| + FireInvalidation(POLICY_OBJECT_A, 3, "test");
|
| + EXPECT_TRUE(CheckPolicyNotRefreshed());
|
| + DisconnectCore();
|
| + FireInvalidation(POLICY_OBJECT_A, 4, "test");
|
| + EXPECT_TRUE(CheckPolicyNotRefreshed());
|
| +
|
| + // Ensure that the invalidator returns to normal after reconnecting.
|
| + ConnectCore();
|
| + StartRefreshScheduler();
|
| + EXPECT_TRUE(CheckPolicyNotRefreshed());
|
| + EXPECT_TRUE(InvalidationsEnabled());
|
| + FireInvalidation(POLICY_OBJECT_A, 5, "test");
|
| + EXPECT_TRUE(CheckInvalidationInfo(5, "test"));
|
| + EXPECT_TRUE(CheckPolicyRefreshed());
|
| + DisableInvalidationService();
|
| + EXPECT_FALSE(InvalidationsEnabled());
|
| }
|
|
|
| TEST_F(CloudPolicyInvalidatorTest, RefreshMetricsUnregistered) {
|
|
|