cloud_policy_invalidator_unittest.cc revision 58537e28ecd584eab876aee8be7156509866d23a
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" 16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/test/test_simple_task_runner.h" 17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/time/time.h" 18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/values.h" 19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/invalidation/fake_invalidation_service.h" 2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/policy/cloud/cloud_policy_constants.h" 21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/policy/cloud/cloud_policy_core.h" 22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/policy/cloud/cloud_policy_invalidator.h" 2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/policy/cloud/cloud_policy_refresh_scheduler.h" 24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/policy/cloud/enterprise_metrics.h" 25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/policy/cloud/mock_cloud_policy_client.h" 26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/policy/cloud/mock_cloud_policy_store.h" 27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/policy/policy_types.h" 28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/policy/proto/cloud/device_management_backend.pb.h" 29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "policy/policy_constants.h" 30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "sync/notifier/invalidation_util.h" 31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace policy { 35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class CloudPolicyInvalidatorTest : public testing::Test { 37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) protected: 38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Policy objects which can be used in tests. 39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) enum PolicyObject { 40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) POLICY_OBJECT_NONE, 41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) POLICY_OBJECT_A, 42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) POLICY_OBJECT_B 43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) }; 44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CloudPolicyInvalidatorTest(); 46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void SetUp() OVERRIDE; 48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void TearDown() OVERRIDE; 50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Starts the invalidator which will be tested. 5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // |initialize| determines if the invalidator should be initialized. 5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // |start_refresh_scheduler| determines if the refresh scheduler should start. 5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void StartInvalidator(bool initialize, bool start_refresh_scheduler); 55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void StartInvalidator() { 5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartInvalidator(true /* initialize */, true /* start_refresh_scheduler */); 57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Calls Initialize on the invalidator. 6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void InitializeInvalidator(); 6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Calls Shutdown on the invalidator. Test must call DestroyInvalidator 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // afterwards to prevent Shutdown from being called twice. 6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void ShutdownInvalidator(); 6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Destroys the invalidator. 6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void DestroyInvalidator(); 6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Connects the cloud policy core. 7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void ConnectCore(); 7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Starts the refresh scheduler. 7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void StartRefreshScheduler(); 7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Disconnects the cloud policy core. 7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void DisconnectCore(); 7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Simulates storing a new policy to the policy store. 79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // |object| determines which policy object the store will report the 80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // invalidator should register for. May be POLICY_OBJECT_NONE for no object. 81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // |invalidation_version| determines what invalidation the store will report. 8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // |policy_changed| determines whether a policy value different from the 8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // current value will be stored. 84a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // |timestamp| determines the response timestamp the store will report. 85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void StorePolicy( 86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PolicyObject object, 87a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int64 invalidation_version, 88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool policy_changed, 89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int64 timestamp); 90a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void StorePolicy( 91a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PolicyObject object, 92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int64 invalidation_version, 93a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool policy_changed) { 94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(object, invalidation_version, policy_changed, ++timestamp_); 95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void StorePolicy(PolicyObject object, int64 invalidation_version) { 97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(object, invalidation_version, false); 98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 99a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void StorePolicy(PolicyObject object) { 100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(object, 0); 101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Disables the invalidation service. It is enabled by default. 104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void DisableInvalidationService(); 105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Enables the invalidation service. It is enabled by default. 107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void EnableInvalidationService(); 108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Causes the invalidation service to fire an invalidation. Returns an ack 110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // handle which be used to verify that the invalidation was acknowledged. 111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) syncer::AckHandle 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 117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // version. Returns an ack handle which be used to verify that the 118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // invalidation was acknowledged. 119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) syncer::AckHandle FireInvalidation(PolicyObject object); 120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Checks the expected value of the currently set invalidation info. 122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool CheckInvalidationInfo(int64 version, const std::string& payload); 123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Checks that the policy was not refreshed due to an invalidation. 12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool CheckPolicyNotRefreshed(); 126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Checks that the policy was refreshed due to an invalidation within an 12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // appropriate timeframe depending on whether the invalidation had unknown 12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // version. 13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool CheckPolicyRefreshed(); 13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool CheckPolicyRefreshedWithUnknownVersion(); 132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Returns the invalidations enabled state set by the invalidator on the 13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // refresh scheduler. 13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool InvalidationsEnabled(); 136a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 137a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Determines if the invalidation with the given ack handle has been 138a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // acknowledged. 139a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool IsInvalidationAcknowledged(const syncer::AckHandle& ack_handle); 140a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Determines if the invalidator has registered for an object with the 14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // invalidation service. 14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool IsInvalidatorRegistered(); 14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Get the current count for the given metric. 146a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::HistogramBase::Count GetCount(MetricPolicyRefresh metric); 147a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::HistogramBase::Count GetInvalidationCount(bool with_payload); 148a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private: 15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Checks that the policy was refreshed due to an invalidation with the given 15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // base delay. 15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool CheckPolicyRefreshed(base::TimeDelta delay); 15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 154a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Returns the object id of the given policy object. 155a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const invalidation::ObjectId& GetPolicyObjectId(PolicyObject object) const; 156a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 157a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Get histogram samples for the given histogram. 158a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<base::HistogramSamples> GetHistogramSamples( 159a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& name) const; 160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Objects the invalidator depends on. 162a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) invalidation::FakeInvalidationService invalidation_service_; 163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MockCloudPolicyStore store_; 16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CloudPolicyCore core_; 165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<base::TestSimpleTaskRunner> task_runner_; 166a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The invalidator which will be tested. 168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<CloudPolicyInvalidator> invalidator_; 169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 170a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Object ids for the test policy objects. 171a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) invalidation::ObjectId object_id_a_; 172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) invalidation::ObjectId object_id_b_; 173a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Increasing policy timestamp. 175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int64 timestamp_; 176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Fake policy values which are alternated to cause the store to report a 178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // changed policy. 179a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const char* policy_value_a_; 180a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const char* policy_value_b_; 181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 182a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The currently used policy value. 183a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const char* policy_value_cur_; 184a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Stores starting histogram counts for kMetricPolicyRefresh. 186a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<base::HistogramSamples> refresh_samples_; 187a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 188a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Stores starting histogram counts for kMetricPolicyInvalidations. 189a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<base::HistogramSamples> invalidations_samples_; 19058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 19158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Initialize message loop. 19258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::MessageLoop loop_; 193a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 194a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 195a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)CloudPolicyInvalidatorTest::CloudPolicyInvalidatorTest() 19658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : core_(PolicyNamespaceKey(dm_protocol::kChromeUserPolicyType, 19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string()), 19858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) &store_), 19958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) task_runner_(new base::TestSimpleTaskRunner()), 200a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) object_id_a_(135, "asdf"), 201a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) object_id_b_(246, "zxcv"), 202a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) timestamp_(123456), 203a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) policy_value_a_("asdf"), 204a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) policy_value_b_("zxcv"), 20558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) policy_value_cur_(policy_value_a_) {} 206a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 207a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void CloudPolicyInvalidatorTest::SetUp() { 208a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::StatisticsRecorder::Initialize(); 209a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) refresh_samples_ = GetHistogramSamples(kMetricPolicyRefresh); 210a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) invalidations_samples_ = GetHistogramSamples(kMetricPolicyInvalidations); 211a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 212a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 213a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void CloudPolicyInvalidatorTest::TearDown() { 214a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(invalidation_service_.ReceivedInvalidAcknowledgement()); 215a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (invalidator_) 216a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) invalidator_->Shutdown(); 21758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) core_.Disconnect(); 218a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 219a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 22058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void CloudPolicyInvalidatorTest::StartInvalidator( 22158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool initialize, 22258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool start_refresh_scheduler) { 22358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) invalidator_.reset(new CloudPolicyInvalidator(&core_, task_runner_)); 22458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (start_refresh_scheduler) { 22558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ConnectCore(); 22658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartRefreshScheduler(); 22758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 228a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (initialize) 22958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) InitializeInvalidator(); 23058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 23158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 23258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void CloudPolicyInvalidatorTest::InitializeInvalidator() { 23358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) invalidator_->Initialize(&invalidation_service_); 23458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 23558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 23658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void CloudPolicyInvalidatorTest::ShutdownInvalidator() { 23758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) invalidator_->Shutdown(); 23858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 23958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 24058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void CloudPolicyInvalidatorTest::DestroyInvalidator() { 24158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) invalidator_.reset(); 24258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 24358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 24458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void CloudPolicyInvalidatorTest::ConnectCore() { 24558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) core_.Connect(scoped_ptr<CloudPolicyClient>(new MockCloudPolicyClient())); 24658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 24758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 24858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void CloudPolicyInvalidatorTest::StartRefreshScheduler() { 24958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) core_.StartRefreshScheduler(); 25058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 25158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 25258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void CloudPolicyInvalidatorTest::DisconnectCore() { 25358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) core_.Disconnect(); 254a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 255a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 256a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void CloudPolicyInvalidatorTest::StorePolicy( 257a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PolicyObject object, 258a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int64 invalidation_version, 259a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool policy_changed, 260a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int64 timestamp) { 261a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) enterprise_management::PolicyData* data = 262a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) new enterprise_management::PolicyData(); 263a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (object != POLICY_OBJECT_NONE) { 264a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) data->set_invalidation_source(GetPolicyObjectId(object).source()); 265a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) data->set_invalidation_name(GetPolicyObjectId(object).name()); 266a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 267a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) data->set_timestamp(timestamp); 268a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Swap the policy value if a policy change is desired. 269a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (policy_changed) 270a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) policy_value_cur_ = policy_value_cur_ == policy_value_a_ ? 271a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) policy_value_b_ : policy_value_a_; 272a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) data->set_policy_value(policy_value_cur_); 273a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) store_.invalidation_version_ = invalidation_version; 274a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) store_.policy_.reset(data); 275a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::DictionaryValue policies; 276a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) policies.SetInteger( 277a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) key::kMaxInvalidationFetchDelay, 278a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CloudPolicyInvalidator::kMaxFetchDelayMin); 279a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) store_.policy_map_.LoadFrom( 280a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) &policies, 281a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) POLICY_LEVEL_MANDATORY, 282a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) POLICY_SCOPE_MACHINE); 283a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) store_.NotifyStoreLoaded(); 284a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 285a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 286a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void CloudPolicyInvalidatorTest::DisableInvalidationService() { 287a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) invalidation_service_.SetInvalidatorState( 288a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) syncer::TRANSIENT_INVALIDATION_ERROR); 289a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 290a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 291a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void CloudPolicyInvalidatorTest::EnableInvalidationService() { 292a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) invalidation_service_.SetInvalidatorState(syncer::INVALIDATIONS_ENABLED); 293a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 294a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 295a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)syncer::AckHandle CloudPolicyInvalidatorTest::FireInvalidation( 296a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PolicyObject object, 297a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int64 version, 298a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& payload) { 299a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return invalidation_service_.EmitInvalidationForTest( 300a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GetPolicyObjectId(object), 301a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) version, 302a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) payload); 303a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 304a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 305a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)syncer::AckHandle CloudPolicyInvalidatorTest::FireInvalidation( 306a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PolicyObject object) { 307a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return invalidation_service_.EmitInvalidationForTest( 308a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GetPolicyObjectId(object), 309a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) syncer::Invalidation::kUnknownVersion, 310a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string()); 311a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 312a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 313a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool CloudPolicyInvalidatorTest::CheckInvalidationInfo( 314a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int64 version, 315a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& payload) { 31658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MockCloudPolicyClient* client = 31758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static_cast<MockCloudPolicyClient*>(core_.client()); 31858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return version == client->invalidation_version_ && 31958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) payload == client->invalidation_payload_; 320a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 321a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 32258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool CloudPolicyInvalidatorTest::CheckPolicyNotRefreshed() { 32358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const int start_count = invalidator_->policy_refresh_count(); 324a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) task_runner_->RunUntilIdle(); 32558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return invalidator_->policy_refresh_count() == start_count; 326a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 327a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 32858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool CloudPolicyInvalidatorTest::CheckPolicyRefreshed() { 32958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return CheckPolicyRefreshed(base::TimeDelta()); 330a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 331a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 33258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool CloudPolicyInvalidatorTest::CheckPolicyRefreshedWithUnknownVersion() { 33358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return CheckPolicyRefreshed(base::TimeDelta::FromMinutes( 33458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CloudPolicyInvalidator::kMissingPayloadDelay)); 335a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 336a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 33758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool CloudPolicyInvalidatorTest::InvalidationsEnabled() { 33858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return core_.refresh_scheduler()->invalidations_available(); 339a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 340a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 341a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool CloudPolicyInvalidatorTest::IsInvalidationAcknowledged( 342a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const syncer::AckHandle& ack_handle) { 343a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return invalidation_service_.IsInvalidationAcknowledged(ack_handle); 344a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 345a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 34658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool CloudPolicyInvalidatorTest::IsInvalidatorRegistered() { 34758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return !invalidation_service_.invalidator_registrar() 34858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) .GetRegisteredIds(invalidator_.get()).empty(); 34958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 35058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 351a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)base::HistogramBase::Count CloudPolicyInvalidatorTest::GetCount( 352a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MetricPolicyRefresh metric) { 353a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return GetHistogramSamples(kMetricPolicyRefresh)->GetCount(metric) - 354a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) refresh_samples_->GetCount(metric); 355a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 356a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 357a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)base::HistogramBase::Count CloudPolicyInvalidatorTest::GetInvalidationCount( 358a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool with_payload) { 359a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int metric = with_payload ? 1 : 0; 360a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return GetHistogramSamples(kMetricPolicyInvalidations)->GetCount(metric) - 361a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) invalidations_samples_->GetCount(metric); 362a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 363a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 36458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool CloudPolicyInvalidatorTest::CheckPolicyRefreshed(base::TimeDelta delay) { 36558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta max_delay = delay + base::TimeDelta::FromMilliseconds( 36658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CloudPolicyInvalidator::kMaxFetchDelayMin); 367a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 36858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (task_runner_->GetPendingTasks().empty()) 36958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return false; 37058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta actual_delay = task_runner_->GetPendingTasks().back().delay; 37158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_GE(actual_delay, delay); 37258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_LE(actual_delay, max_delay); 373a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 37458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const int start_count = invalidator_->policy_refresh_count(); 37558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) task_runner_->RunUntilIdle(); 37658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return invalidator_->policy_refresh_count() == start_count + 1; 377a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 378a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 379a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)const invalidation::ObjectId& CloudPolicyInvalidatorTest::GetPolicyObjectId( 380a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PolicyObject object) const { 381a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(object == POLICY_OBJECT_A || object == POLICY_OBJECT_B); 382a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return object == POLICY_OBJECT_A ? object_id_a_ : object_id_b_; 383a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 384a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 385a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)scoped_ptr<base::HistogramSamples> 386a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CloudPolicyInvalidatorTest::GetHistogramSamples( 387a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& name) const { 388a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::HistogramBase* histogram = 389a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::StatisticsRecorder::FindHistogram(name); 390a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!histogram) 391a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return scoped_ptr<base::HistogramSamples>(new base::SampleMap()); 392a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return histogram->SnapshotSamples(); 393a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 394a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 395a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, Uninitialized) { 39658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // No invalidations should be processed if the invalidator is not initialized. 39758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartInvalidator(false /* initialize */, true /* start_refresh_scheduler */); 39858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 39958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(IsInvalidatorRegistered()); 40058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FireInvalidation(POLICY_OBJECT_A); 40158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 40258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 40358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 40458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, RefreshSchedulerNotStarted) { 40558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // No invalidations should be processed if the refresh scheduler is not 40658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // started. 40758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartInvalidator(true /* initialize */, false /* start_refresh_scheduler */); 408a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 40958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(IsInvalidatorRegistered()); 410a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_A); 41158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 41258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 41358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 41458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, DisconnectCoreThenInitialize) { 41558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // No invalidations should be processed if the core is disconnected before 41658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // initialization. 41758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartInvalidator(false /* initialize */, true /* start_refresh_scheduler */); 41858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DisconnectCore(); 41958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) InitializeInvalidator(); 42058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 42158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(IsInvalidatorRegistered()); 42258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FireInvalidation(POLICY_OBJECT_A); 42358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 42458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 42558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 42658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, InitializeThenStartRefreshScheduler) { 42758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Make sure registration occurs and invalidations are processed when 42858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Initialize is called before starting the refresh scheduler. 42958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Note that the reverse case (start refresh scheduler then initialize) is 43058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // the default behavior for the test fixture, so will be tested in most other 43158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // tests. 43258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartInvalidator(true /* initialize */, false /* start_refresh_scheduler */); 43358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ConnectCore(); 43458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartRefreshScheduler(); 43558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 43658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(IsInvalidatorRegistered()); 43758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FireInvalidation(POLICY_OBJECT_A); 43858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 439a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 440a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 441a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, RegisterOnStoreLoaded) { 442a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // No registration when store is not loaded. 443a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 44458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(IsInvalidatorRegistered()); 44558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 446a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_A); 447a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_B); 44858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 449a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 450a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // No registration when store is loaded with no invalidation object id. 451a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_NONE); 45258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(IsInvalidatorRegistered()); 45358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 454a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_A); 455a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_B); 45658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 457a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 458a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Check registration when store is loaded for object A. 459a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 46058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(IsInvalidatorRegistered()); 46158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 462a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_A); 46358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 464a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_B); 46558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 466a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 467a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 468a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, ChangeRegistration) { 469a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Register for object A. 470a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 471a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 47258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(IsInvalidatorRegistered()); 47358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 474a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_A); 47558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 476a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_B); 47758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 478a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) syncer::AckHandle ack = FireInvalidation(POLICY_OBJECT_A); 479a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 480a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Check re-registration for object B. Make sure the pending invalidation for 481a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // object A is acknowledged without making the callback. 482a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_B); 48358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(IsInvalidatorRegistered()); 48458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 485a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(ack)); 48658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 487a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 488a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Make sure future invalidations for object A are ignored and for object B 489a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // are processed. 490a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_A); 49158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 492a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_B); 49358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 494a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 495a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 496a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, UnregisterOnStoreLoaded) { 497a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Register for object A. 498a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 499a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 50058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(IsInvalidatorRegistered()); 50158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 502a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_A); 50358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 504a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 505a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Check unregistration when store is loaded with no invalidation object id. 506a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) syncer::AckHandle ack = FireInvalidation(POLICY_OBJECT_A); 507a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(IsInvalidationAcknowledged(ack)); 508a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_NONE); 50958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(IsInvalidatorRegistered()); 510a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(ack)); 51158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 512a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_A); 513a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_B); 51458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 515a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 516a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Check re-registration for object B. 517a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_B); 51858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(IsInvalidatorRegistered()); 51958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 520a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_B); 52158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 522a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 523a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 524a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, HandleInvalidation) { 525a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Register and fire invalidation 526a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 527a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 52858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 529a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) syncer::AckHandle ack = FireInvalidation(POLICY_OBJECT_A, 12, "test_payload"); 530a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 531a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Make sure client info is set as soon as the invalidation is received. 532a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(12, "test_payload")); 53358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshed()); 534a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 535a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Make sure invalidation is not acknowledged until the store is loaded. 536a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(IsInvalidationAcknowledged(ack)); 537a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(12, "test_payload")); 538a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 12); 539a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(ack)); 540a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(0, std::string())); 541a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 542a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 543a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, HandleInvalidationWithUnknownVersion) { 544a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Register and fire invalidation with unknown version. 545a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 546a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 547a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) syncer::AckHandle ack = FireInvalidation(POLICY_OBJECT_A); 548a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 549a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Make sure client info is not set until after the invalidation callback is 550a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // made. 551a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(0, std::string())); 55258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 553a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(-1, std::string())); 554a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 555a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Make sure invalidation is not acknowledged until the store is loaded. 556a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(IsInvalidationAcknowledged(ack)); 557a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, -1); 558a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(ack)); 559a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(0, std::string())); 560a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 561a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 562a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, HandleMultipleInvalidations) { 563a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Generate multiple invalidations. 564a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 565a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 566a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) syncer::AckHandle ack1 = FireInvalidation(POLICY_OBJECT_A, 1, "test1"); 567a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(1, "test1")); 568a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) syncer::AckHandle ack2 = FireInvalidation(POLICY_OBJECT_A, 2, "test2"); 569a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(2, "test2")); 570a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) syncer::AckHandle ack3= FireInvalidation(POLICY_OBJECT_A, 3, "test3"); 571a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(3, "test3")); 572a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 573a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Make sure the replaced invalidations are acknowledged. 574a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(ack1)); 575a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(ack2)); 576a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 57758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Make sure the policy is refreshed once. 57858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshed()); 579a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 580a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Make sure that the last invalidation is only acknowledged after the store 581a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // is loaded with the latest version. 582a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 1); 583a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(IsInvalidationAcknowledged(ack3)); 584a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 2); 585a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(IsInvalidationAcknowledged(ack3)); 586a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 3); 587a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(ack3)); 588a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 589a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 590a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, 591a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) HandleMultipleInvalidationsWithUnknownVersion) { 592a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Validate that multiple invalidations with unknown version each generate 593a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // unique invalidation version numbers. 594a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 595a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 596a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) syncer::AckHandle ack1 = FireInvalidation(POLICY_OBJECT_A); 597a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(0, std::string())); 59858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 599a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(-1, std::string())); 600a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) syncer::AckHandle ack2 = FireInvalidation(POLICY_OBJECT_A); 601a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(0, std::string())); 60258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 603a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(-2, std::string())); 604a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) syncer::AckHandle ack3 = FireInvalidation(POLICY_OBJECT_A); 605a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(0, std::string())); 60658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 607a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(-3, std::string())); 608a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 609a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Make sure the replaced invalidations are acknowledged. 610a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(ack1)); 611a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(ack2)); 612a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 613a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Make sure that the last invalidation is only acknowledged after the store 614a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // is loaded with the last unknown version. 615a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, -1); 616a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(IsInvalidationAcknowledged(ack3)); 617a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, -2); 618a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(IsInvalidationAcknowledged(ack3)); 619a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, -3); 620a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(ack3)); 621a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 622a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 62358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, AcknowledgeBeforeRefresh) { 624a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Generate an invalidation. 625a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 626a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 627a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) syncer::AckHandle ack = FireInvalidation(POLICY_OBJECT_A, 3, "test"); 628a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 62958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Ensure that the policy is not refreshed and the invalidation is 630a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // acknowledged if the store is loaded with the latest version before the 63158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // refresh can occur. 632a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 3); 633a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(ack)); 63458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 63558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 63658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 63758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, NoCallbackAfterShutdown) { 63858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Generate an invalidation. 63958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 64058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartInvalidator(); 64158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) syncer::AckHandle ack = FireInvalidation(POLICY_OBJECT_A, 3, "test"); 64258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 64358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Ensure that the policy refresh is not made after the invalidator is shut 64458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // down. 64558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ShutdownInvalidator(); 64658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 64758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DestroyInvalidator(); 648a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 649a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 650a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, StateChanged) { 65158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Test invalidation service state changes while not registered. 652a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 653a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DisableInvalidationService(); 654a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EnableInvalidationService(); 65558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 656a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 65758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Test invalidation service state changes while registered. 658a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 65958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 660a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DisableInvalidationService(); 66158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 662a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DisableInvalidationService(); 66358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 664a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EnableInvalidationService(); 66558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 666a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EnableInvalidationService(); 66758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 668a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 66958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Test registration changes with invalidation service enabled. 670a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_NONE); 67158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 672a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_NONE); 67358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 674a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 67558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 676a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 67758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 678a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 67958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Test registration changes with invalidation service disabled. 680a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DisableInvalidationService(); 68158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 682a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_NONE); 683a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 68458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 68558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 68658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 68758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, Disconnect) { 68858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Generate an invalidation. 68958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 69058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartInvalidator(); 69158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) syncer::AckHandle ack = FireInvalidation(POLICY_OBJECT_A, 1, "test"); 69258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 69358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 69458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Ensure that the policy is not refreshed after disconnecting the core, but 69558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // a call to indicate that invalidations are disabled is made. 69658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DisconnectCore(); 69758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 69858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 69958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Ensure that invalidation service events do not cause refreshes while the 70058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // invalidator is stopped. 70158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FireInvalidation(POLICY_OBJECT_A, 2, "test"); 70258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 70358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DisableInvalidationService(); 70458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EnableInvalidationService(); 70558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 70658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Connect and disconnect without starting the refresh scheduler. 70758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ConnectCore(); 70858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FireInvalidation(POLICY_OBJECT_A, 3, "test"); 70958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 71058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DisconnectCore(); 71158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FireInvalidation(POLICY_OBJECT_A, 4, "test"); 71258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 71358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 71458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Ensure that the invalidator returns to normal after reconnecting. 71558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ConnectCore(); 71658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartRefreshScheduler(); 71758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 71858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 71958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FireInvalidation(POLICY_OBJECT_A, 5, "test"); 72058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(5, "test")); 72158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshed()); 72258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DisableInvalidationService(); 72358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 724a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 725a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 726a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, RefreshMetricsUnregistered) { 727a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Store loads occurring before invalidation registration are not counted. 728a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 729a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_NONE, 0, false /* policy_changed */); 730a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_NONE, 0, true /* policy_changed */); 731a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_CHANGED)); 732a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_CHANGED_NO_INVALIDATIONS)); 733a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_UNCHANGED)); 734a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_INVALIDATED_CHANGED)); 735a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_INVALIDATED_UNCHANGED)); 736a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 737a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 738a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, RefreshMetricsNoInvalidations) { 739a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Store loads occurring while registered should be differentiated depending 740a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // on whether the invalidation service was enabled or not. 741a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 742a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 743a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, false /* policy_changed */); 744a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, true /* policy_changed */); 745a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DisableInvalidationService(); 746a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, false /* policy_changed */); 747a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, true /* policy_changed */); 748a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, false /* policy_changed */); 749a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, true /* policy_changed */); 750a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1, GetCount(METRIC_POLICY_REFRESH_CHANGED)); 751a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(2, GetCount(METRIC_POLICY_REFRESH_CHANGED_NO_INVALIDATIONS)); 752a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(3, GetCount(METRIC_POLICY_REFRESH_UNCHANGED)); 753a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_INVALIDATED_CHANGED)); 754a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_INVALIDATED_UNCHANGED)); 755a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 756a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 757a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, RefreshMetricsStoreSameTimestamp) { 758a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Store loads with the same timestamp as the load which causes registration 759a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // are not counted. 760a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 761a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy( 762a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) POLICY_OBJECT_A, 0, false /* policy_changed */, 12 /* timestamp */); 763a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy( 764a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) POLICY_OBJECT_A, 0, false /* policy_changed */, 12 /* timestamp */); 765a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy( 766a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) POLICY_OBJECT_A, 0, true /* policy_changed */, 12 /* timestamp */); 767a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 768a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The next load with a different timestamp counts. 769a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy( 770a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) POLICY_OBJECT_A, 0, true /* policy_changed */, 13 /* timestamp */); 771a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 772a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1, GetCount(METRIC_POLICY_REFRESH_CHANGED)); 773a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_CHANGED_NO_INVALIDATIONS)); 774a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_UNCHANGED)); 775a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_INVALIDATED_CHANGED)); 776a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_INVALIDATED_UNCHANGED)); 777a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 778a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 779a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, RefreshMetricsInvalidation) { 780a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Store loads after an invalidation are counted as invalidated, even if 781a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // the loads do not result in the invalidation being acknowledged. 782a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 783a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 784a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_A, 5, "test"); 785a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, false /* policy_changed */); 786a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, true /* policy_changed */); 787a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 5, true /* policy_changed */); 788a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 789a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Store loads after the invalidation is complete are not counted as 790a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // invalidated. 791a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, false /* policy_changed */); 792a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, true /* policy_changed */); 793a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, false /* policy_changed */); 794a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, true /* policy_changed */); 795a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, false /* policy_changed */); 796a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, true /* policy_changed */); 797a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, false /* policy_changed */); 798a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 799a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(3, GetCount(METRIC_POLICY_REFRESH_CHANGED)); 800a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_CHANGED_NO_INVALIDATIONS)); 801a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(4, GetCount(METRIC_POLICY_REFRESH_UNCHANGED)); 802a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(2, GetCount(METRIC_POLICY_REFRESH_INVALIDATED_CHANGED)); 803a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1, GetCount(METRIC_POLICY_REFRESH_INVALIDATED_UNCHANGED)); 804a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 805a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 806a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, InvalidationMetrics) { 807a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Generate a mix of versioned and unknown-version invalidations. 808a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 809a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 810a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_B); 811a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_A); 812a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_B, 1, "test"); 813a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_A, 1, "test"); 814a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_A, 2, "test"); 815a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_A); 816a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_A); 817a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_A, 3, "test"); 818a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FireInvalidation(POLICY_OBJECT_A, 4, "test"); 819a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 820a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Verify that received invalidations metrics are correct. 821a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(3, GetInvalidationCount(false /* with_payload */)); 822a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(4, GetInvalidationCount(true /* with_payload */)); 823a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 824a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 825a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace policy 826