cloud_policy_invalidator_unittest.cc revision f2477e01787aa58f445919b809d89e252beef54f
1a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// found in the LICENSE file. 4a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 5a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include <string> 6a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 7a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/basictypes.h" 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/bind.h" 9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/memory/ref_counted.h" 10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/message_loop/message_loop.h" 12a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/metrics/histogram.h" 13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/metrics/histogram_samples.h" 14a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/metrics/sample_map.h" 15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/metrics/statistics_recorder.h" 16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/run_loop.h" 17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/test/test_simple_task_runner.h" 18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/time/time.h" 19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/values.h" 20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/invalidation/fake_invalidation_service.h" 2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/policy/cloud/cloud_policy_constants.h" 22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/policy/cloud/cloud_policy_core.h" 23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/policy/cloud/cloud_policy_invalidator.h" 2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/policy/cloud/cloud_policy_refresh_scheduler.h" 25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/policy/cloud/enterprise_metrics.h" 26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/policy/cloud/mock_cloud_policy_client.h" 27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/policy/cloud/mock_cloud_policy_store.h" 28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/policy/proto/cloud/device_management_backend.pb.h" 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/policy_types.h" 30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "policy/policy_constants.h" 31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "sync/notifier/invalidation_util.h" 32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace policy { 36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class CloudPolicyInvalidatorTest : public testing::Test { 38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) protected: 39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Policy objects which can be used in tests. 40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) enum PolicyObject { 41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) POLICY_OBJECT_NONE, 42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) POLICY_OBJECT_A, 43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) POLICY_OBJECT_B 44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) }; 45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CloudPolicyInvalidatorTest(); 47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void SetUp() OVERRIDE; 49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void TearDown() OVERRIDE; 51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Starts the invalidator which will be tested. 5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // |initialize| determines if the invalidator should be initialized. 5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // |start_refresh_scheduler| determines if the refresh scheduler should start. 5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void StartInvalidator(bool initialize, bool start_refresh_scheduler); 56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void StartInvalidator() { 5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartInvalidator(true /* initialize */, true /* start_refresh_scheduler */); 58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Calls Initialize on the invalidator. 6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void InitializeInvalidator(); 6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Calls Shutdown on the invalidator. Test must call DestroyInvalidator 6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // afterwards to prevent Shutdown from being called twice. 6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void ShutdownInvalidator(); 6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Destroys the invalidator. 6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void DestroyInvalidator(); 6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Connects the cloud policy core. 7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void ConnectCore(); 7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Starts the refresh scheduler. 7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void StartRefreshScheduler(); 7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Disconnects the cloud policy core. 7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void DisconnectCore(); 7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Simulates storing a new policy to the policy store. 80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // |object| determines which policy object the store will report the 81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // invalidator should register for. May be POLICY_OBJECT_NONE for no object. 82a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // |invalidation_version| determines what invalidation the store will report. 8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // |policy_changed| determines whether a policy value different from the 8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // current value will be stored. 85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // |timestamp| determines the response timestamp the store will report. 86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void StorePolicy( 87a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PolicyObject object, 88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int64 invalidation_version, 89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool policy_changed, 90a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int64 timestamp); 91a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void StorePolicy( 92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PolicyObject object, 93a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int64 invalidation_version, 94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool policy_changed) { 95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(object, invalidation_version, policy_changed, ++timestamp_); 96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void StorePolicy(PolicyObject object, int64 invalidation_version) { 98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(object, invalidation_version, false); 99a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void StorePolicy(PolicyObject object) { 101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(object, 0); 102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Disables the invalidation service. It is enabled by default. 105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void DisableInvalidationService(); 106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Enables the invalidation service. It is enabled by default. 108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void EnableInvalidationService(); 109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Causes the invalidation service to fire an invalidation. 111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::Invalidation FireInvalidation( 112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PolicyObject object, 113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int64 version, 114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& payload); 115a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Causes the invalidation service to fire an invalidation with unknown 117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // version. 118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::Invalidation FireUnknownVersionInvalidation(PolicyObject object); 119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Checks the expected value of the currently set invalidation info. 121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool CheckInvalidationInfo(int64 version, const std::string& payload); 122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Checks that the policy was not refreshed due to an invalidation. 12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool CheckPolicyNotRefreshed(); 125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Checks that the policy was refreshed due to an invalidation within an 12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // appropriate timeframe depending on whether the invalidation had unknown 12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // version. 12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool CheckPolicyRefreshed(); 13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool CheckPolicyRefreshedWithUnknownVersion(); 131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool IsUnsent(const syncer::Invalidation& invalidation); 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Returns the invalidations enabled state set by the invalidator on the 13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // refresh scheduler. 13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool InvalidationsEnabled(); 137a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 138a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Determines if the invalidation with the given ack handle has been 139a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // acknowledged. 140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool IsInvalidationAcknowledged(const syncer::Invalidation& invalidation); 141a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Determines if the invalidator has registered for an object with the 14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // invalidation service. 14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool IsInvalidatorRegistered(); 14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 146a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Get the current count for the given metric. 147a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::HistogramBase::Count GetCount(MetricPolicyRefresh metric); 148a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::HistogramBase::Count GetInvalidationCount(bool with_payload); 149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 150a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private: 15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Checks that the policy was refreshed due to an invalidation with the given 15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // base delay. 15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool CheckPolicyRefreshed(base::TimeDelta delay); 15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 155d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Checks that the policy was refreshed the given number of times. 156d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool CheckPolicyRefreshCount(int count); 157d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 158a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Returns the object id of the given policy object. 159a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const invalidation::ObjectId& GetPolicyObjectId(PolicyObject object) const; 160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Get histogram samples for the given histogram. 162a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<base::HistogramSamples> GetHistogramSamples( 163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& name) const; 164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 165d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::MessageLoop loop_; 166d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Objects the invalidator depends on. 168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) invalidation::FakeInvalidationService invalidation_service_; 169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MockCloudPolicyStore store_; 17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CloudPolicyCore core_; 171d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) MockCloudPolicyClient* client_; 172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<base::TestSimpleTaskRunner> task_runner_; 173a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The invalidator which will be tested. 175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<CloudPolicyInvalidator> invalidator_; 176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Object ids for the test policy objects. 178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) invalidation::ObjectId object_id_a_; 179a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) invalidation::ObjectId object_id_b_; 180a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Increasing policy timestamp. 182a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int64 timestamp_; 183a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 184a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Fake policy values which are alternated to cause the store to report a 185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // changed policy. 186a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const char* policy_value_a_; 187a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const char* policy_value_b_; 188a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 189a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The currently used policy value. 190a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const char* policy_value_cur_; 191a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 192a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Stores starting histogram counts for kMetricPolicyRefresh. 193a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<base::HistogramSamples> refresh_samples_; 194a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 195a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Stores starting histogram counts for kMetricPolicyInvalidations. 196a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<base::HistogramSamples> invalidations_samples_; 197a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 198a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 199a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)CloudPolicyInvalidatorTest::CloudPolicyInvalidatorTest() 20058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : core_(PolicyNamespaceKey(dm_protocol::kChromeUserPolicyType, 20158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string()), 202d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) &store_, 203d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) loop_.message_loop_proxy()), 204d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) client_(NULL), 20558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) task_runner_(new base::TestSimpleTaskRunner()), 206a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) object_id_a_(135, "asdf"), 207a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) object_id_b_(246, "zxcv"), 208a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) timestamp_(123456), 209a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) policy_value_a_("asdf"), 210a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) policy_value_b_("zxcv"), 21158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) policy_value_cur_(policy_value_a_) {} 212a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 213a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void CloudPolicyInvalidatorTest::SetUp() { 214a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::StatisticsRecorder::Initialize(); 215a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) refresh_samples_ = GetHistogramSamples(kMetricPolicyRefresh); 216a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) invalidations_samples_ = GetHistogramSamples(kMetricPolicyInvalidations); 217a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 218a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 219a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void CloudPolicyInvalidatorTest::TearDown() { 220a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (invalidator_) 221a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) invalidator_->Shutdown(); 22258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) core_.Disconnect(); 223a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 224a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 22558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void CloudPolicyInvalidatorTest::StartInvalidator( 22658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool initialize, 22758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool start_refresh_scheduler) { 22858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) invalidator_.reset(new CloudPolicyInvalidator(&core_, task_runner_)); 22958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (start_refresh_scheduler) { 23058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ConnectCore(); 23158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartRefreshScheduler(); 23258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 233a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (initialize) 23458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) InitializeInvalidator(); 23558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 23658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 23758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void CloudPolicyInvalidatorTest::InitializeInvalidator() { 23858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) invalidator_->Initialize(&invalidation_service_); 23958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 24058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 24158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void CloudPolicyInvalidatorTest::ShutdownInvalidator() { 24258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) invalidator_->Shutdown(); 24358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 24458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 24558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void CloudPolicyInvalidatorTest::DestroyInvalidator() { 24658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) invalidator_.reset(); 24758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 24858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 24958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void CloudPolicyInvalidatorTest::ConnectCore() { 250d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) client_ = new MockCloudPolicyClient(); 251d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) client_->SetDMToken("dm"); 252d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) core_.Connect(scoped_ptr<CloudPolicyClient>(client_)); 25358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 25458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 25558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void CloudPolicyInvalidatorTest::StartRefreshScheduler() { 25658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) core_.StartRefreshScheduler(); 25758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 25858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 25958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void CloudPolicyInvalidatorTest::DisconnectCore() { 260d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) client_ = NULL; 26158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) core_.Disconnect(); 262a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 263a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 264a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void CloudPolicyInvalidatorTest::StorePolicy( 265a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PolicyObject object, 266a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int64 invalidation_version, 267a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool policy_changed, 268a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int64 timestamp) { 269a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) enterprise_management::PolicyData* data = 270a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) new enterprise_management::PolicyData(); 271a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (object != POLICY_OBJECT_NONE) { 272a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) data->set_invalidation_source(GetPolicyObjectId(object).source()); 273a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) data->set_invalidation_name(GetPolicyObjectId(object).name()); 274a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 275a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) data->set_timestamp(timestamp); 276a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Swap the policy value if a policy change is desired. 277a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (policy_changed) 278a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) policy_value_cur_ = policy_value_cur_ == policy_value_a_ ? 279a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) policy_value_b_ : policy_value_a_; 280a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) data->set_policy_value(policy_value_cur_); 281a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) store_.invalidation_version_ = invalidation_version; 282a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) store_.policy_.reset(data); 283a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::DictionaryValue policies; 284a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) policies.SetInteger( 285a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) key::kMaxInvalidationFetchDelay, 286a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CloudPolicyInvalidator::kMaxFetchDelayMin); 287a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) store_.policy_map_.LoadFrom( 288a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) &policies, 289a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) POLICY_LEVEL_MANDATORY, 290a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) POLICY_SCOPE_MACHINE); 291a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) store_.NotifyStoreLoaded(); 292a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 293a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 294a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void CloudPolicyInvalidatorTest::DisableInvalidationService() { 295a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) invalidation_service_.SetInvalidatorState( 296a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) syncer::TRANSIENT_INVALIDATION_ERROR); 297a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 298a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 299a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void CloudPolicyInvalidatorTest::EnableInvalidationService() { 300a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) invalidation_service_.SetInvalidatorState(syncer::INVALIDATIONS_ENABLED); 301a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 302a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)syncer::Invalidation CloudPolicyInvalidatorTest::FireInvalidation( 304a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PolicyObject object, 305a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int64 version, 306a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& payload) { 3074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) syncer::Invalidation invalidation = syncer::Invalidation::Init( 308a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GetPolicyObjectId(object), 309a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) version, 310a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) payload); 3114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) invalidation_service_.EmitInvalidationForTest(invalidation); 312f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return invalidation; 313a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 314a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 315f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)syncer::Invalidation CloudPolicyInvalidatorTest::FireUnknownVersionInvalidation( 316a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PolicyObject object) { 317f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::Invalidation invalidation = syncer::Invalidation::InitUnknownVersion( 318f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetPolicyObjectId(object)); 3194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) invalidation_service_.EmitInvalidationForTest(invalidation); 320f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return invalidation; 321a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 322a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 323a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool CloudPolicyInvalidatorTest::CheckInvalidationInfo( 324a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int64 version, 325a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& payload) { 32658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MockCloudPolicyClient* client = 32758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static_cast<MockCloudPolicyClient*>(core_.client()); 32858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return version == client->invalidation_version_ && 32958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) payload == client->invalidation_payload_; 330a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 331a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 33258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool CloudPolicyInvalidatorTest::CheckPolicyNotRefreshed() { 333d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return CheckPolicyRefreshCount(0); 334a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 335a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 33658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool CloudPolicyInvalidatorTest::CheckPolicyRefreshed() { 33758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return CheckPolicyRefreshed(base::TimeDelta()); 338a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 339a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 340f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool CloudPolicyInvalidatorTest::IsUnsent( 341f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const syncer::Invalidation& invalidation) { 342f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return invalidation_service_.GetMockAckHandler()->IsUnsent(invalidation); 343f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 344f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 34558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool CloudPolicyInvalidatorTest::CheckPolicyRefreshedWithUnknownVersion() { 34658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return CheckPolicyRefreshed(base::TimeDelta::FromMinutes( 34758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CloudPolicyInvalidator::kMissingPayloadDelay)); 348a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 349a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 35058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool CloudPolicyInvalidatorTest::InvalidationsEnabled() { 35158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return core_.refresh_scheduler()->invalidations_available(); 352a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 353a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 354a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool CloudPolicyInvalidatorTest::IsInvalidationAcknowledged( 355f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const syncer::Invalidation& invalidation) { 356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The acknowledgement task is run through a WeakHandle that posts back to our 357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // own thread. We need to run any posted tasks before we can check 358f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // acknowledgement status. 359f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) loop_.RunUntilIdle(); 360f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(IsUnsent(invalidation)); 362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return !invalidation_service_.GetMockAckHandler()->IsUnacked(invalidation); 363a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 364a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 36558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool CloudPolicyInvalidatorTest::IsInvalidatorRegistered() { 36658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return !invalidation_service_.invalidator_registrar() 36758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) .GetRegisteredIds(invalidator_.get()).empty(); 36858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 36958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 370a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)base::HistogramBase::Count CloudPolicyInvalidatorTest::GetCount( 371a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MetricPolicyRefresh metric) { 372a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return GetHistogramSamples(kMetricPolicyRefresh)->GetCount(metric) - 373a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) refresh_samples_->GetCount(metric); 374a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 375a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 376a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)base::HistogramBase::Count CloudPolicyInvalidatorTest::GetInvalidationCount( 377a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool with_payload) { 378a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int metric = with_payload ? 1 : 0; 379a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return GetHistogramSamples(kMetricPolicyInvalidations)->GetCount(metric) - 380a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) invalidations_samples_->GetCount(metric); 381a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 382a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 38358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool CloudPolicyInvalidatorTest::CheckPolicyRefreshed(base::TimeDelta delay) { 38458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta max_delay = delay + base::TimeDelta::FromMilliseconds( 38558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CloudPolicyInvalidator::kMaxFetchDelayMin); 386a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 38758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (task_runner_->GetPendingTasks().empty()) 38858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return false; 38958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta actual_delay = task_runner_->GetPendingTasks().back().delay; 39058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_GE(actual_delay, delay); 39158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_LE(actual_delay, max_delay); 392a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 393d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return CheckPolicyRefreshCount(1); 394d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 395d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 396d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)bool CloudPolicyInvalidatorTest::CheckPolicyRefreshCount(int count) { 397d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (!client_) { 398d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) task_runner_->RunUntilIdle(); 399d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return count == 0; 400d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 401d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 402d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Clear any non-invalidation refreshes which may be pending. 403d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_CALL(*client_, FetchPolicy()).Times(testing::AnyNumber()); 404d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 405d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) testing::Mock::VerifyAndClearExpectations(client_); 406d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 407d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Run the invalidator tasks then check for invalidation refreshes. 408d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_CALL(*client_, FetchPolicy()).Times(count); 40958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) task_runner_->RunUntilIdle(); 410d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 411d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return testing::Mock::VerifyAndClearExpectations(client_); 412a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 413a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 414a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)const invalidation::ObjectId& CloudPolicyInvalidatorTest::GetPolicyObjectId( 415a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PolicyObject object) const { 416a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(object == POLICY_OBJECT_A || object == POLICY_OBJECT_B); 417a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return object == POLICY_OBJECT_A ? object_id_a_ : object_id_b_; 418a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 419a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 420a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)scoped_ptr<base::HistogramSamples> 421a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CloudPolicyInvalidatorTest::GetHistogramSamples( 422a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& name) const { 423a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::HistogramBase* histogram = 424a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::StatisticsRecorder::FindHistogram(name); 425a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!histogram) 426a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return scoped_ptr<base::HistogramSamples>(new base::SampleMap()); 427a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return histogram->SnapshotSamples(); 428a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 429a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 430a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, Uninitialized) { 43158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // No invalidations should be processed if the invalidator is not initialized. 43258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartInvalidator(false /* initialize */, true /* start_refresh_scheduler */); 43358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 43458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(IsInvalidatorRegistered()); 435f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsUnsent(FireUnknownVersionInvalidation(POLICY_OBJECT_A))); 43658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 43758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 43858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 43958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, RefreshSchedulerNotStarted) { 44058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // No invalidations should be processed if the refresh scheduler is not 44158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // started. 44258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartInvalidator(true /* initialize */, false /* start_refresh_scheduler */); 443a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 44458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(IsInvalidatorRegistered()); 445f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsUnsent(FireUnknownVersionInvalidation(POLICY_OBJECT_A))); 44658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 44758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 44858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 44958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, DisconnectCoreThenInitialize) { 45058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // No invalidations should be processed if the core is disconnected before 45158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // initialization. 45258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartInvalidator(false /* initialize */, true /* start_refresh_scheduler */); 45358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DisconnectCore(); 45458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) InitializeInvalidator(); 45558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 45658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(IsInvalidatorRegistered()); 457f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsUnsent(FireUnknownVersionInvalidation(POLICY_OBJECT_A))); 45858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 45958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 46058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 46158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, InitializeThenStartRefreshScheduler) { 46258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Make sure registration occurs and invalidations are processed when 46358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Initialize is called before starting the refresh scheduler. 46458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Note that the reverse case (start refresh scheduler then initialize) is 46558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // the default behavior for the test fixture, so will be tested in most other 46658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // tests. 46758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartInvalidator(true /* initialize */, false /* start_refresh_scheduler */); 46858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ConnectCore(); 46958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartRefreshScheduler(); 47058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 47158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(IsInvalidatorRegistered()); 4724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FireUnknownVersionInvalidation(POLICY_OBJECT_A); 47358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 474a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 475a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 476a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, RegisterOnStoreLoaded) { 477a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // No registration when store is not loaded. 478a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 47958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(IsInvalidatorRegistered()); 48058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 481f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsUnsent(FireUnknownVersionInvalidation(POLICY_OBJECT_A))); 482f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsUnsent(FireUnknownVersionInvalidation(POLICY_OBJECT_B))); 48358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 484a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 485a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // No registration when store is loaded with no invalidation object id. 486a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_NONE); 48758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(IsInvalidatorRegistered()); 48858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsUnsent(FireUnknownVersionInvalidation(POLICY_OBJECT_A))); 490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsUnsent(FireUnknownVersionInvalidation(POLICY_OBJECT_B))); 49158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 492a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 493a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Check registration when store is loaded for object A. 494a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 49558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(IsInvalidatorRegistered()); 49658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 4974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FireUnknownVersionInvalidation(POLICY_OBJECT_A); 49858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsUnsent(FireUnknownVersionInvalidation(POLICY_OBJECT_B))); 50058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 501a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 502a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 503a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, ChangeRegistration) { 504a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Register for object A. 505a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 506a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 50758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(IsInvalidatorRegistered()); 50858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 5094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FireUnknownVersionInvalidation(POLICY_OBJECT_A); 51058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 511f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsUnsent(FireUnknownVersionInvalidation(POLICY_OBJECT_B))); 51258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 513f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::Invalidation inv = FireUnknownVersionInvalidation(POLICY_OBJECT_A); 514a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 515a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Check re-registration for object B. Make sure the pending invalidation for 516a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // object A is acknowledged without making the callback. 517a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_B); 51858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(IsInvalidatorRegistered()); 51958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 520f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(inv)); 52158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 522a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 523a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Make sure future invalidations for object A are ignored and for object B 524a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // are processed. 525f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsUnsent(FireUnknownVersionInvalidation(POLICY_OBJECT_A))); 52658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 5274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FireUnknownVersionInvalidation(POLICY_OBJECT_B); 52858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 529a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 530a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 531a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, UnregisterOnStoreLoaded) { 532a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Register for object A. 533a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 534a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 53558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(IsInvalidatorRegistered()); 53658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 5374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FireUnknownVersionInvalidation(POLICY_OBJECT_A); 53858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 539a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 540a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Check unregistration when store is loaded with no invalidation object id. 541f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::Invalidation inv = FireUnknownVersionInvalidation(POLICY_OBJECT_A); 542f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(IsInvalidationAcknowledged(inv)); 543a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_NONE); 54458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(IsInvalidatorRegistered()); 545f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(inv)); 54658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 547f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsUnsent(FireUnknownVersionInvalidation(POLICY_OBJECT_A))); 548f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsUnsent(FireUnknownVersionInvalidation(POLICY_OBJECT_B))); 54958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 550a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 551a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Check re-registration for object B. 552a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_B); 55358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(IsInvalidatorRegistered()); 55458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 5554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FireUnknownVersionInvalidation(POLICY_OBJECT_B); 55658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 557a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 558a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 559a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, HandleInvalidation) { 560a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Register and fire invalidation 561a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 562a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 56358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 564f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::Invalidation inv = 565f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FireInvalidation(POLICY_OBJECT_A, 12, "test_payload"); 566a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 567a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Make sure client info is set as soon as the invalidation is received. 568a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(12, "test_payload")); 56958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshed()); 570a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 571a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Make sure invalidation is not acknowledged until the store is loaded. 572f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(IsInvalidationAcknowledged(inv)); 573a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(12, "test_payload")); 574a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 12); 575f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(inv)); 576a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(0, std::string())); 577a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 578a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 579a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, HandleInvalidationWithUnknownVersion) { 580a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Register and fire invalidation with unknown version. 581a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 582a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 583f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::Invalidation inv = FireUnknownVersionInvalidation(POLICY_OBJECT_A); 584a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 585a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Make sure client info is not set until after the invalidation callback is 586a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // made. 587a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(0, std::string())); 58858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 589a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(-1, std::string())); 590a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 591a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Make sure invalidation is not acknowledged until the store is loaded. 592f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(IsInvalidationAcknowledged(inv)); 593a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, -1); 594f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(inv)); 595a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(0, std::string())); 596a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 597a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 598a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, HandleMultipleInvalidations) { 599a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Generate multiple invalidations. 600a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 601a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 602f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::Invalidation inv1 = FireInvalidation(POLICY_OBJECT_A, 1, "test1"); 603a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(1, "test1")); 604f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::Invalidation inv2 = FireInvalidation(POLICY_OBJECT_A, 2, "test2"); 605a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(2, "test2")); 606f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::Invalidation inv3 = FireInvalidation(POLICY_OBJECT_A, 3, "test3"); 607a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(3, "test3")); 608a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 609a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Make sure the replaced invalidations are acknowledged. 610f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(inv1)); 611f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(inv2)); 612a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 61358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Make sure the policy is refreshed once. 61458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshed()); 615a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 616a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Make sure that the last invalidation is only acknowledged after the store 617a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // is loaded with the latest version. 618a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 1); 619f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(IsInvalidationAcknowledged(inv3)); 620a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 2); 621f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(IsInvalidationAcknowledged(inv3)); 622a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 3); 623f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(inv3)); 624a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 625a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 626a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, 627a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) HandleMultipleInvalidationsWithUnknownVersion) { 628a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Validate that multiple invalidations with unknown version each generate 629a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // unique invalidation version numbers. 630a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 631a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 632f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::Invalidation inv1 = FireUnknownVersionInvalidation(POLICY_OBJECT_A); 633a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(0, std::string())); 63458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 635a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(-1, std::string())); 636f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::Invalidation inv2 = FireUnknownVersionInvalidation(POLICY_OBJECT_A); 637a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(0, std::string())); 63858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 639a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(-2, std::string())); 640f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::Invalidation inv3 = FireUnknownVersionInvalidation(POLICY_OBJECT_A); 641a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(0, std::string())); 64258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 643a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(-3, std::string())); 644a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 645a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Make sure the replaced invalidations are acknowledged. 646f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(inv1)); 647f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(inv2)); 648a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 649a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Make sure that the last invalidation is only acknowledged after the store 650a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // is loaded with the last unknown version. 651a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, -1); 652f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(IsInvalidationAcknowledged(inv3)); 653a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, -2); 654f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(IsInvalidationAcknowledged(inv3)); 655a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, -3); 656f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(inv3)); 657a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 658a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 65958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, AcknowledgeBeforeRefresh) { 660a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Generate an invalidation. 661a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 662a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 663f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::Invalidation inv = FireInvalidation(POLICY_OBJECT_A, 3, "test"); 664a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 66558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Ensure that the policy is not refreshed and the invalidation is 666a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // acknowledged if the store is loaded with the latest version before the 66758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // refresh can occur. 668a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 3); 669f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(inv)); 67058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 67158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 67258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 67358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, NoCallbackAfterShutdown) { 67458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Generate an invalidation. 67558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 67658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartInvalidator(); 677f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::Invalidation inv = FireInvalidation(POLICY_OBJECT_A, 3, "test"); 67858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 67958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Ensure that the policy refresh is not made after the invalidator is shut 68058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // down. 68158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ShutdownInvalidator(); 68258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 68358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DestroyInvalidator(); 684a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 685a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 686a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, StateChanged) { 68758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Test invalidation service state changes while not registered. 688a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 689a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DisableInvalidationService(); 690a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EnableInvalidationService(); 69158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 692a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 69358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Test invalidation service state changes while registered. 694a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 69558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 696a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DisableInvalidationService(); 69758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 698a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DisableInvalidationService(); 69958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 700a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EnableInvalidationService(); 70158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 702a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EnableInvalidationService(); 70358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 704a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 70558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Test registration changes with invalidation service enabled. 706a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_NONE); 70758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 708a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_NONE); 70958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 710a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 71158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 712a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 71358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 714a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 71558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Test registration changes with invalidation service disabled. 716a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DisableInvalidationService(); 71758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 718a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_NONE); 719a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 72058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 72158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 72258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 72358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, Disconnect) { 72458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Generate an invalidation. 72558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 72658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartInvalidator(); 727f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::Invalidation inv = FireInvalidation(POLICY_OBJECT_A, 1, "test"); 72858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 72958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 73058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Ensure that the policy is not refreshed after disconnecting the core, but 73158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // a call to indicate that invalidations are disabled is made. 73258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DisconnectCore(); 73358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 73458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 73558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Ensure that invalidation service events do not cause refreshes while the 73658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // invalidator is stopped. 737f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsUnsent(FireInvalidation(POLICY_OBJECT_A, 2, "test"))); 73858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 73958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DisableInvalidationService(); 74058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EnableInvalidationService(); 74158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 74258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Connect and disconnect without starting the refresh scheduler. 74358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ConnectCore(); 744f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsUnsent(FireInvalidation(POLICY_OBJECT_A, 3, "test"))); 74558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 74658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DisconnectCore(); 747f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsUnsent(FireInvalidation(POLICY_OBJECT_A, 4, "test"))); 74858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 74958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 75058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Ensure that the invalidator returns to normal after reconnecting. 75158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ConnectCore(); 75258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartRefreshScheduler(); 75358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 75458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 75558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FireInvalidation(POLICY_OBJECT_A, 5, "test"); 75658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(5, "test")); 75758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshed()); 75858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DisableInvalidationService(); 75958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 760a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 761a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 762a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, RefreshMetricsUnregistered) { 763a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Store loads occurring before invalidation registration are not counted. 764a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 765a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_NONE, 0, false /* policy_changed */); 766a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_NONE, 0, true /* policy_changed */); 767a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_CHANGED)); 768a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_CHANGED_NO_INVALIDATIONS)); 769a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_UNCHANGED)); 770a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_INVALIDATED_CHANGED)); 771a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_INVALIDATED_UNCHANGED)); 772a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 773a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 774a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, RefreshMetricsNoInvalidations) { 775a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Store loads occurring while registered should be differentiated depending 776a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // on whether the invalidation service was enabled or not. 777a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 778a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 779a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, false /* policy_changed */); 780a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, true /* policy_changed */); 781a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DisableInvalidationService(); 782a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, false /* policy_changed */); 783a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, true /* policy_changed */); 784a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, false /* policy_changed */); 785a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, true /* policy_changed */); 786a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1, GetCount(METRIC_POLICY_REFRESH_CHANGED)); 787a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(2, GetCount(METRIC_POLICY_REFRESH_CHANGED_NO_INVALIDATIONS)); 788a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(3, GetCount(METRIC_POLICY_REFRESH_UNCHANGED)); 789a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_INVALIDATED_CHANGED)); 790a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_INVALIDATED_UNCHANGED)); 791a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 792a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 793a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, RefreshMetricsStoreSameTimestamp) { 794a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Store loads with the same timestamp as the load which causes registration 795a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // are not counted. 796a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 797a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy( 798a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) POLICY_OBJECT_A, 0, false /* policy_changed */, 12 /* timestamp */); 799a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy( 800a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) POLICY_OBJECT_A, 0, false /* policy_changed */, 12 /* timestamp */); 801a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy( 802a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) POLICY_OBJECT_A, 0, true /* policy_changed */, 12 /* timestamp */); 803a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 804a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The next load with a different timestamp counts. 805a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy( 806a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) POLICY_OBJECT_A, 0, true /* policy_changed */, 13 /* timestamp */); 807a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 808a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1, GetCount(METRIC_POLICY_REFRESH_CHANGED)); 809a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_CHANGED_NO_INVALIDATIONS)); 810a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_UNCHANGED)); 811a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_INVALIDATED_CHANGED)); 812a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_INVALIDATED_UNCHANGED)); 813a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 814a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 815a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, RefreshMetricsInvalidation) { 816a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Store loads after an invalidation are counted as invalidated, even if 817a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // the loads do not result in the invalidation being acknowledged. 818a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 819a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 820a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_A, 5, "test"); 821a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, false /* policy_changed */); 822a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, true /* policy_changed */); 823a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 5, true /* policy_changed */); 824a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 825a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Store loads after the invalidation is complete are not counted as 826a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // invalidated. 827a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, false /* policy_changed */); 828a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, true /* policy_changed */); 829a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, false /* policy_changed */); 830a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, true /* policy_changed */); 831a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, false /* policy_changed */); 832a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, true /* policy_changed */); 833a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, false /* policy_changed */); 834a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 835a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(3, GetCount(METRIC_POLICY_REFRESH_CHANGED)); 836a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_CHANGED_NO_INVALIDATIONS)); 837a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(4, GetCount(METRIC_POLICY_REFRESH_UNCHANGED)); 838a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(2, GetCount(METRIC_POLICY_REFRESH_INVALIDATED_CHANGED)); 839a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1, GetCount(METRIC_POLICY_REFRESH_INVALIDATED_UNCHANGED)); 840a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 841a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 842a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, InvalidationMetrics) { 843a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Generate a mix of versioned and unknown-version invalidations. 844a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 845a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 846f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsUnsent(FireUnknownVersionInvalidation(POLICY_OBJECT_B))); 8474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FireUnknownVersionInvalidation(POLICY_OBJECT_A); 848f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsUnsent(FireInvalidation(POLICY_OBJECT_B, 1, "test"))); 849a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_A, 1, "test"); 850a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_A, 2, "test"); 8514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FireUnknownVersionInvalidation(POLICY_OBJECT_A); 8524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FireUnknownVersionInvalidation(POLICY_OBJECT_A); 853a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_A, 3, "test"); 854a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_A, 4, "test"); 855a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 856a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Verify that received invalidations metrics are correct. 857a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(3, GetInvalidationCount(false /* with_payload */)); 858a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(4, GetInvalidationCount(true /* with_payload */)); 859a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 860a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 861a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace policy 862