cloud_policy_invalidator_unittest.cc revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
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" 17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/test/simple_test_clock.h" 18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/test/test_simple_task_runner.h" 19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/time/time.h" 20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/values.h" 21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/invalidation/fake_invalidation_service.h" 22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/policy/cloud/cloud_policy_invalidator.h" 23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/cloud_policy_constants.h" 24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/cloud_policy_core.h" 25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/cloud_policy_refresh_scheduler.h" 26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/enterprise_metrics.h" 27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/mock_cloud_policy_client.h" 28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/cloud/mock_cloud_policy_store.h" 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/policy_types.h" 30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "policy/policy_constants.h" 31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "policy/proto/device_management_backend.pb.h" 32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "sync/notifier/invalidation_util.h" 33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace policy { 37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class CloudPolicyInvalidatorTest : public testing::Test { 39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) protected: 40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Policy objects which can be used in tests. 41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) enum PolicyObject { 42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) POLICY_OBJECT_NONE, 43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) POLICY_OBJECT_A, 44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) POLICY_OBJECT_B 45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) }; 46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CloudPolicyInvalidatorTest(); 48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void SetUp() OVERRIDE; 50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void TearDown() OVERRIDE; 52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Starts the invalidator which will be tested. 5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // |initialize| determines if the invalidator should be initialized. 5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // |start_refresh_scheduler| determines if the refresh scheduler should start. 5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void StartInvalidator(bool initialize, bool start_refresh_scheduler); 57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void StartInvalidator() { 5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartInvalidator(true /* initialize */, true /* start_refresh_scheduler */); 59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Calls Initialize on the invalidator. 6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void InitializeInvalidator(); 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Calls Shutdown on the invalidator. Test must call DestroyInvalidator 6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // afterwards to prevent Shutdown from being called twice. 6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void ShutdownInvalidator(); 6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Destroys the invalidator. 6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void DestroyInvalidator(); 7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Connects the cloud policy core. 7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void ConnectCore(); 7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Starts the refresh scheduler. 7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void StartRefreshScheduler(); 7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Disconnects the cloud policy core. 7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void DisconnectCore(); 7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Simulates storing a new policy to the policy store. 81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // |object| determines which policy object the store will report the 82a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // invalidator should register for. May be POLICY_OBJECT_NONE for no object. 83a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // |invalidation_version| determines what invalidation the store will report. 8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // |policy_changed| determines whether a policy value different from the 8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // current value will be stored. 86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // |time| determines the timestamp the store will report. 87a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void StorePolicy( 88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PolicyObject object, 89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int64 invalidation_version, 90a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool policy_changed, 91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const base::Time& time); 92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void StorePolicy( 93a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PolicyObject object, 94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int64 invalidation_version, 95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool policy_changed) { 96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch StorePolicy(object, 97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch invalidation_version, 98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch policy_changed, 99c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Now() - base::TimeDelta::FromMinutes(5)); 100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void StorePolicy(PolicyObject object, int64 invalidation_version) { 102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(object, invalidation_version, false); 103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void StorePolicy(PolicyObject object) { 105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(object, 0); 106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Disables the invalidation service. It is enabled by default. 109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void DisableInvalidationService(); 110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Enables the invalidation service. It is enabled by default. 112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void EnableInvalidationService(); 113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Causes the invalidation service to fire an invalidation. 115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::Invalidation FireInvalidation( 116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PolicyObject object, 117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int64 version, 118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& payload); 119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Causes the invalidation service to fire an invalidation with unknown 121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // version. 122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::Invalidation FireUnknownVersionInvalidation(PolicyObject object); 123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Checks the expected value of the currently set invalidation info. 125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool CheckInvalidationInfo(int64 version, const std::string& payload); 126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Checks that the policy was not refreshed due to an invalidation. 12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool CheckPolicyNotRefreshed(); 129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Checks that the policy was refreshed due to an invalidation within an 13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // appropriate timeframe depending on whether the invalidation had unknown 13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // version. 13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool CheckPolicyRefreshed(); 13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool CheckPolicyRefreshedWithUnknownVersion(); 135a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool IsUnsent(const syncer::Invalidation& invalidation); 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Returns the invalidations enabled state set by the invalidator on the 13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // refresh scheduler. 14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool InvalidationsEnabled(); 141a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Determines if the invalidation with the given ack handle has been 143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // acknowledged. 144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool IsInvalidationAcknowledged(const syncer::Invalidation& invalidation); 145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Determines if the invalidator has registered for an object with the 14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // invalidation service. 14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool IsInvalidatorRegistered(); 14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 150a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Get the current count for the given metric. 151a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::HistogramBase::Count GetCount(MetricPolicyRefresh metric); 152c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::HistogramBase::Count GetInvalidationCount(PolicyInvalidationType type); 153c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 154c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Advance the test clock. 155c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void AdvanceClock(base::TimeDelta delta); 156c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 157c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Get the current time on the test clock. 158c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::Time Now(); 159c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 160c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Translate a version number into an appropriate invalidation version (which 161c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // is based on the current time). 162c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int64 V(int version); 163c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 164c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Get an invalidation version for the given time. 165c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int64 GetVersion(base::Time time); 166a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private: 16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Checks that the policy was refreshed due to an invalidation with the given 16958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // base delay. 17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool CheckPolicyRefreshed(base::TimeDelta delay); 17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 172d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Checks that the policy was refreshed the given number of times. 173d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool CheckPolicyRefreshCount(int count); 174d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Returns the object id of the given policy object. 176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const invalidation::ObjectId& GetPolicyObjectId(PolicyObject object) const; 177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Get histogram samples for the given histogram. 179a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<base::HistogramSamples> GetHistogramSamples( 180a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& name) const; 181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 182d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::MessageLoop loop_; 183d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 184a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Objects the invalidator depends on. 185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) invalidation::FakeInvalidationService invalidation_service_; 186a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MockCloudPolicyStore store_; 18758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CloudPolicyCore core_; 188d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) MockCloudPolicyClient* client_; 189a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<base::TestSimpleTaskRunner> task_runner_; 190c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::SimpleTestClock* clock_; 191a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 192a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The invalidator which will be tested. 193a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<CloudPolicyInvalidator> invalidator_; 194a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 195a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Object ids for the test policy objects. 196a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) invalidation::ObjectId object_id_a_; 197a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) invalidation::ObjectId object_id_b_; 198a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 199a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Fake policy values which are alternated to cause the store to report a 200a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // changed policy. 201a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const char* policy_value_a_; 202a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const char* policy_value_b_; 203a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 204a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The currently used policy value. 205a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const char* policy_value_cur_; 206a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 207a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Stores starting histogram counts for kMetricPolicyRefresh. 208a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<base::HistogramSamples> refresh_samples_; 209a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 210a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Stores starting histogram counts for kMetricPolicyInvalidations. 211a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<base::HistogramSamples> invalidations_samples_; 212a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 213a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 214a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)CloudPolicyInvalidatorTest::CloudPolicyInvalidatorTest() 21558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : core_(PolicyNamespaceKey(dm_protocol::kChromeUserPolicyType, 21658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string()), 217d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) &store_, 218d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) loop_.message_loop_proxy()), 219d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) client_(NULL), 22058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) task_runner_(new base::TestSimpleTaskRunner()), 221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch clock_(new base::SimpleTestClock()), 222a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) object_id_a_(135, "asdf"), 223a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) object_id_b_(246, "zxcv"), 224a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) policy_value_a_("asdf"), 225a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) policy_value_b_("zxcv"), 226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch policy_value_cur_(policy_value_a_) { 227c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch clock_->SetNow( 228c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::Time::UnixEpoch() + base::TimeDelta::FromSeconds(987654321)); 229c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 230a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 231a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void CloudPolicyInvalidatorTest::SetUp() { 232a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::StatisticsRecorder::Initialize(); 233a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) refresh_samples_ = GetHistogramSamples(kMetricPolicyRefresh); 234a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) invalidations_samples_ = GetHistogramSamples(kMetricPolicyInvalidations); 235a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 236a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 237a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void CloudPolicyInvalidatorTest::TearDown() { 238a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (invalidator_) 239a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) invalidator_->Shutdown(); 24058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) core_.Disconnect(); 241a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 242a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 24358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void CloudPolicyInvalidatorTest::StartInvalidator( 24458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool initialize, 24558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool start_refresh_scheduler) { 246c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch invalidator_.reset(new CloudPolicyInvalidator( 247c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch &core_, 248c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch task_runner_, 249c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<base::Clock>(clock_))); 25058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (start_refresh_scheduler) { 25158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ConnectCore(); 25258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartRefreshScheduler(); 25358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 254a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (initialize) 25558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) InitializeInvalidator(); 25658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 25758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 25858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void CloudPolicyInvalidatorTest::InitializeInvalidator() { 25958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) invalidator_->Initialize(&invalidation_service_); 26058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 26158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 26258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void CloudPolicyInvalidatorTest::ShutdownInvalidator() { 26358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) invalidator_->Shutdown(); 26458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 26558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 26658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void CloudPolicyInvalidatorTest::DestroyInvalidator() { 26758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) invalidator_.reset(); 26858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 26958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 27058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void CloudPolicyInvalidatorTest::ConnectCore() { 271d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) client_ = new MockCloudPolicyClient(); 272d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) client_->SetDMToken("dm"); 273d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) core_.Connect(scoped_ptr<CloudPolicyClient>(client_)); 27458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 27558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 27658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void CloudPolicyInvalidatorTest::StartRefreshScheduler() { 27758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) core_.StartRefreshScheduler(); 27858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 27958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 28058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void CloudPolicyInvalidatorTest::DisconnectCore() { 281d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) client_ = NULL; 28258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) core_.Disconnect(); 283a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 284a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 285a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void CloudPolicyInvalidatorTest::StorePolicy( 286a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PolicyObject object, 287a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int64 invalidation_version, 288a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool policy_changed, 289c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const base::Time& time) { 290a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) enterprise_management::PolicyData* data = 291a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) new enterprise_management::PolicyData(); 292a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (object != POLICY_OBJECT_NONE) { 293a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) data->set_invalidation_source(GetPolicyObjectId(object).source()); 294a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) data->set_invalidation_name(GetPolicyObjectId(object).name()); 295a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 296c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch data->set_timestamp((time - base::Time::UnixEpoch()).InMilliseconds()); 297a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Swap the policy value if a policy change is desired. 298a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (policy_changed) 299a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) policy_value_cur_ = policy_value_cur_ == policy_value_a_ ? 300a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) policy_value_b_ : policy_value_a_; 301a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) data->set_policy_value(policy_value_cur_); 302a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) store_.invalidation_version_ = invalidation_version; 303a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) store_.policy_.reset(data); 304a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::DictionaryValue policies; 305a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) policies.SetInteger( 306a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) key::kMaxInvalidationFetchDelay, 307a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CloudPolicyInvalidator::kMaxFetchDelayMin); 308a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) store_.policy_map_.LoadFrom( 309a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) &policies, 310a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) POLICY_LEVEL_MANDATORY, 311a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) POLICY_SCOPE_MACHINE); 312a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) store_.NotifyStoreLoaded(); 313a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 314a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 315a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void CloudPolicyInvalidatorTest::DisableInvalidationService() { 316a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) invalidation_service_.SetInvalidatorState( 317a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) syncer::TRANSIENT_INVALIDATION_ERROR); 318a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 319a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 320a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void CloudPolicyInvalidatorTest::EnableInvalidationService() { 321a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) invalidation_service_.SetInvalidatorState(syncer::INVALIDATIONS_ENABLED); 322a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 323a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 324f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)syncer::Invalidation CloudPolicyInvalidatorTest::FireInvalidation( 325a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PolicyObject object, 326a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int64 version, 327a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& payload) { 3284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) syncer::Invalidation invalidation = syncer::Invalidation::Init( 329a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GetPolicyObjectId(object), 330a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) version, 331a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) payload); 3324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) invalidation_service_.EmitInvalidationForTest(invalidation); 333f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return invalidation; 334a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 335a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 336f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)syncer::Invalidation CloudPolicyInvalidatorTest::FireUnknownVersionInvalidation( 337a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PolicyObject object) { 338f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::Invalidation invalidation = syncer::Invalidation::InitUnknownVersion( 339f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetPolicyObjectId(object)); 3404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) invalidation_service_.EmitInvalidationForTest(invalidation); 341f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return invalidation; 342a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 343a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 344a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool CloudPolicyInvalidatorTest::CheckInvalidationInfo( 345a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int64 version, 346a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& payload) { 34758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) MockCloudPolicyClient* client = 34858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static_cast<MockCloudPolicyClient*>(core_.client()); 34958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return version == client->invalidation_version_ && 35058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) payload == client->invalidation_payload_; 351a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 352a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 35358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool CloudPolicyInvalidatorTest::CheckPolicyNotRefreshed() { 354d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return CheckPolicyRefreshCount(0); 355a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 356a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 35758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool CloudPolicyInvalidatorTest::CheckPolicyRefreshed() { 35858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return CheckPolicyRefreshed(base::TimeDelta()); 359a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 360a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool CloudPolicyInvalidatorTest::IsUnsent( 362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const syncer::Invalidation& invalidation) { 363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return invalidation_service_.GetMockAckHandler()->IsUnsent(invalidation); 364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 365f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 36658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool CloudPolicyInvalidatorTest::CheckPolicyRefreshedWithUnknownVersion() { 36758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return CheckPolicyRefreshed(base::TimeDelta::FromMinutes( 36858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CloudPolicyInvalidator::kMissingPayloadDelay)); 369a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 370a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 37158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool CloudPolicyInvalidatorTest::InvalidationsEnabled() { 37258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return core_.refresh_scheduler()->invalidations_available(); 373a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 374a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 375a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool CloudPolicyInvalidatorTest::IsInvalidationAcknowledged( 376f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const syncer::Invalidation& invalidation) { 377f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The acknowledgement task is run through a WeakHandle that posts back to our 378f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // own thread. We need to run any posted tasks before we can check 379f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // acknowledgement status. 380f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) loop_.RunUntilIdle(); 381f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 382f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(IsUnsent(invalidation)); 383f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return !invalidation_service_.GetMockAckHandler()->IsUnacked(invalidation); 384a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 385a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 38658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool CloudPolicyInvalidatorTest::IsInvalidatorRegistered() { 38758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return !invalidation_service_.invalidator_registrar() 38858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) .GetRegisteredIds(invalidator_.get()).empty(); 38958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 39058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 391a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)base::HistogramBase::Count CloudPolicyInvalidatorTest::GetCount( 392a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MetricPolicyRefresh metric) { 393a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return GetHistogramSamples(kMetricPolicyRefresh)->GetCount(metric) - 394a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) refresh_samples_->GetCount(metric); 395a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 396a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 397a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)base::HistogramBase::Count CloudPolicyInvalidatorTest::GetInvalidationCount( 398c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch PolicyInvalidationType type) { 399c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return GetHistogramSamples(kMetricPolicyInvalidations)->GetCount(type) - 400c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch invalidations_samples_->GetCount(type); 401c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 402c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 403c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid CloudPolicyInvalidatorTest::AdvanceClock(base::TimeDelta delta) { 404c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch clock_->Advance(delta); 405c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 406c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 407c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbase::Time CloudPolicyInvalidatorTest::Now() { 408c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return clock_->Now(); 409c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 410c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 411c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint64 CloudPolicyInvalidatorTest::V(int version) { 412c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return GetVersion(Now()) + version; 413c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 414c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 415c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint64 CloudPolicyInvalidatorTest::GetVersion(base::Time time) { 416c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return (time - base::Time::UnixEpoch()).InMicroseconds(); 417a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 418a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 41958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool CloudPolicyInvalidatorTest::CheckPolicyRefreshed(base::TimeDelta delay) { 42058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta max_delay = delay + base::TimeDelta::FromMilliseconds( 42158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CloudPolicyInvalidator::kMaxFetchDelayMin); 422a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 42358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (task_runner_->GetPendingTasks().empty()) 42458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return false; 42558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta actual_delay = task_runner_->GetPendingTasks().back().delay; 42658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_GE(actual_delay, delay); 42758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_LE(actual_delay, max_delay); 428a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 429d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return CheckPolicyRefreshCount(1); 430d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 431d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 432d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)bool CloudPolicyInvalidatorTest::CheckPolicyRefreshCount(int count) { 433d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (!client_) { 434d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) task_runner_->RunUntilIdle(); 435d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return count == 0; 436d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 437d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 438d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Clear any non-invalidation refreshes which may be pending. 439d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_CALL(*client_, FetchPolicy()).Times(testing::AnyNumber()); 440d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 441d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) testing::Mock::VerifyAndClearExpectations(client_); 442d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 443d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Run the invalidator tasks then check for invalidation refreshes. 444d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_CALL(*client_, FetchPolicy()).Times(count); 44558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) task_runner_->RunUntilIdle(); 446d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 447d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return testing::Mock::VerifyAndClearExpectations(client_); 448a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 449a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 450a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)const invalidation::ObjectId& CloudPolicyInvalidatorTest::GetPolicyObjectId( 451a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PolicyObject object) const { 452a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(object == POLICY_OBJECT_A || object == POLICY_OBJECT_B); 453a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return object == POLICY_OBJECT_A ? object_id_a_ : object_id_b_; 454a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 455a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 456a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)scoped_ptr<base::HistogramSamples> 457a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CloudPolicyInvalidatorTest::GetHistogramSamples( 458a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& name) const { 459a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::HistogramBase* histogram = 460a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::StatisticsRecorder::FindHistogram(name); 461a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!histogram) 462a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return scoped_ptr<base::HistogramSamples>(new base::SampleMap()); 463a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return histogram->SnapshotSamples(); 464a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 465a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 466a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, Uninitialized) { 46758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // No invalidations should be processed if the invalidator is not initialized. 46858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartInvalidator(false /* initialize */, true /* start_refresh_scheduler */); 46958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 47058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(IsInvalidatorRegistered()); 471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsUnsent(FireUnknownVersionInvalidation(POLICY_OBJECT_A))); 47258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 47358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 47458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 47558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, RefreshSchedulerNotStarted) { 47658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // No invalidations should be processed if the refresh scheduler is not 47758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // started. 47858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartInvalidator(true /* initialize */, false /* start_refresh_scheduler */); 479a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 48058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(IsInvalidatorRegistered()); 481f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsUnsent(FireUnknownVersionInvalidation(POLICY_OBJECT_A))); 48258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 48358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 48458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 48558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, DisconnectCoreThenInitialize) { 48658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // No invalidations should be processed if the core is disconnected before 48758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // initialization. 48858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartInvalidator(false /* initialize */, true /* start_refresh_scheduler */); 48958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DisconnectCore(); 49058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) InitializeInvalidator(); 49158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 49258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(IsInvalidatorRegistered()); 493f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsUnsent(FireUnknownVersionInvalidation(POLICY_OBJECT_A))); 49458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 49558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 49658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 49758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, InitializeThenStartRefreshScheduler) { 49858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Make sure registration occurs and invalidations are processed when 49958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Initialize is called before starting the refresh scheduler. 50058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Note that the reverse case (start refresh scheduler then initialize) is 50158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // the default behavior for the test fixture, so will be tested in most other 50258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // tests. 50358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartInvalidator(true /* initialize */, false /* start_refresh_scheduler */); 50458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ConnectCore(); 50558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartRefreshScheduler(); 50658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 50758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(IsInvalidatorRegistered()); 5084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FireUnknownVersionInvalidation(POLICY_OBJECT_A); 50958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 510a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 511a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 512a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, RegisterOnStoreLoaded) { 513a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // No registration when store is not loaded. 514a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 51558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(IsInvalidatorRegistered()); 51658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 517f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsUnsent(FireUnknownVersionInvalidation(POLICY_OBJECT_A))); 518f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsUnsent(FireUnknownVersionInvalidation(POLICY_OBJECT_B))); 51958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 520a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 521a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // No registration when store is loaded with no invalidation object id. 522a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_NONE); 52358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(IsInvalidatorRegistered()); 52458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 525f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsUnsent(FireUnknownVersionInvalidation(POLICY_OBJECT_A))); 526f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsUnsent(FireUnknownVersionInvalidation(POLICY_OBJECT_B))); 52758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 528a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 529a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Check registration when store is loaded for object A. 530a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 53158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(IsInvalidatorRegistered()); 53258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 5334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FireUnknownVersionInvalidation(POLICY_OBJECT_A); 53458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 535f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsUnsent(FireUnknownVersionInvalidation(POLICY_OBJECT_B))); 53658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 537a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 538a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 539a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, ChangeRegistration) { 540a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Register for object A. 541a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 542a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 54358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(IsInvalidatorRegistered()); 54458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 5454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FireUnknownVersionInvalidation(POLICY_OBJECT_A); 54658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 547f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsUnsent(FireUnknownVersionInvalidation(POLICY_OBJECT_B))); 54858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 549f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::Invalidation inv = FireUnknownVersionInvalidation(POLICY_OBJECT_A); 550a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 551a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Check re-registration for object B. Make sure the pending invalidation for 552a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // object A is acknowledged without making the callback. 553a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_B); 55458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(IsInvalidatorRegistered()); 55558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 556f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(inv)); 55758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 558a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 559a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Make sure future invalidations for object A are ignored and for object B 560a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // are processed. 561f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsUnsent(FireUnknownVersionInvalidation(POLICY_OBJECT_A))); 56258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 5634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FireUnknownVersionInvalidation(POLICY_OBJECT_B); 56458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 565a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 566a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 567a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, UnregisterOnStoreLoaded) { 568a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Register for object A. 569a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 570a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 57158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(IsInvalidatorRegistered()); 57258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 5734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FireUnknownVersionInvalidation(POLICY_OBJECT_A); 57458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 575a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 576a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Check unregistration when store is loaded with no invalidation object id. 577f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::Invalidation inv = FireUnknownVersionInvalidation(POLICY_OBJECT_A); 578f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(IsInvalidationAcknowledged(inv)); 579a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_NONE); 58058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(IsInvalidatorRegistered()); 581f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(inv)); 58258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 583f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsUnsent(FireUnknownVersionInvalidation(POLICY_OBJECT_A))); 584f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsUnsent(FireUnknownVersionInvalidation(POLICY_OBJECT_B))); 58558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 586a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 587a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Check re-registration for object B. 588a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_B); 58958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(IsInvalidatorRegistered()); 59058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 5914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FireUnknownVersionInvalidation(POLICY_OBJECT_B); 59258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 593a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 594a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 595a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, HandleInvalidation) { 596a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Register and fire invalidation 597a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 598a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 59958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 600f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::Invalidation inv = 601c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch FireInvalidation(POLICY_OBJECT_A, V(12), "test_payload"); 602a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 603a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Make sure client info is set as soon as the invalidation is received. 604c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(CheckInvalidationInfo(V(12), "test_payload")); 60558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshed()); 606a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 607a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Make sure invalidation is not acknowledged until the store is loaded. 608f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(IsInvalidationAcknowledged(inv)); 609c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(CheckInvalidationInfo(V(12), "test_payload")); 610c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch StorePolicy(POLICY_OBJECT_A, V(12)); 611f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(inv)); 612a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(0, std::string())); 613a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 614a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 615a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, HandleInvalidationWithUnknownVersion) { 616a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Register and fire invalidation with unknown version. 617a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 618a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 619f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::Invalidation inv = FireUnknownVersionInvalidation(POLICY_OBJECT_A); 620a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 621a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Make sure client info is not set until after the invalidation callback is 622a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // made. 623a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(0, std::string())); 62458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 625a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(-1, std::string())); 626a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 627a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Make sure invalidation is not acknowledged until the store is loaded. 628f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(IsInvalidationAcknowledged(inv)); 629a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, -1); 630f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(inv)); 631a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(0, std::string())); 632a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 633a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 634a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, HandleMultipleInvalidations) { 635a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Generate multiple invalidations. 636a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 637a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 638c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch syncer::Invalidation inv1 = FireInvalidation(POLICY_OBJECT_A, V(1), "test1"); 639c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(CheckInvalidationInfo(V(1), "test1")); 640c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch syncer::Invalidation inv2 = FireInvalidation(POLICY_OBJECT_A, V(2), "test2"); 641c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(CheckInvalidationInfo(V(2), "test2")); 642c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch syncer::Invalidation inv3 = FireInvalidation(POLICY_OBJECT_A, V(3), "test3"); 643c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(CheckInvalidationInfo(V(3), "test3")); 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) 64958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Make sure the policy is refreshed once. 65058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshed()); 651a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 652a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Make sure that the last invalidation is only acknowledged after the store 653a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // is loaded with the latest version. 654c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch StorePolicy(POLICY_OBJECT_A, V(1)); 655f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(IsInvalidationAcknowledged(inv3)); 656c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch StorePolicy(POLICY_OBJECT_A, V(2)); 657f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(IsInvalidationAcknowledged(inv3)); 658c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch StorePolicy(POLICY_OBJECT_A, V(3)); 659f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(inv3)); 660a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 661a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 662a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, 663a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) HandleMultipleInvalidationsWithUnknownVersion) { 664a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Validate that multiple invalidations with unknown version each generate 665a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // unique invalidation version numbers. 666a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 667a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 668f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::Invalidation inv1 = FireUnknownVersionInvalidation(POLICY_OBJECT_A); 669a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(0, std::string())); 67058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 671a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(-1, std::string())); 672f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::Invalidation inv2 = FireUnknownVersionInvalidation(POLICY_OBJECT_A); 673a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(0, std::string())); 67458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 675a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(-2, std::string())); 676f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) syncer::Invalidation inv3 = FireUnknownVersionInvalidation(POLICY_OBJECT_A); 677a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(0, std::string())); 67858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 679a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(CheckInvalidationInfo(-3, std::string())); 680a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 681a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Make sure the replaced invalidations are acknowledged. 682f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(inv1)); 683f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(inv2)); 684a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 685a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Make sure that the last invalidation is only acknowledged after the store 686a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // is loaded with the last unknown version. 687a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, -1); 688f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(IsInvalidationAcknowledged(inv3)); 689a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, -2); 690f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(IsInvalidationAcknowledged(inv3)); 691a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, -3); 692f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(inv3)); 693a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 694a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 69558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, AcknowledgeBeforeRefresh) { 696a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Generate an invalidation. 697a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 698a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 699c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch syncer::Invalidation inv = FireInvalidation(POLICY_OBJECT_A, V(3), "test"); 700a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 70158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Ensure that the policy is not refreshed and the invalidation is 702a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // acknowledged if the store is loaded with the latest version before the 70358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // refresh can occur. 704c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch StorePolicy(POLICY_OBJECT_A, V(3)); 705f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(IsInvalidationAcknowledged(inv)); 70658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 70758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 70858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 70958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, NoCallbackAfterShutdown) { 71058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Generate an invalidation. 71158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 71258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartInvalidator(); 713c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch syncer::Invalidation inv = FireInvalidation(POLICY_OBJECT_A, V(3), "test"); 71458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 71558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Ensure that the policy refresh is not made after the invalidator is shut 71658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // down. 71758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ShutdownInvalidator(); 71858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 71958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DestroyInvalidator(); 720a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 721a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 722a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, StateChanged) { 72358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Test invalidation service state changes while not registered. 724a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 725a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DisableInvalidationService(); 726a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EnableInvalidationService(); 72758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 728a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 72958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Test invalidation service state changes while registered. 730a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 73158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 732a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DisableInvalidationService(); 73358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 734a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DisableInvalidationService(); 73558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 736a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EnableInvalidationService(); 73758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 738a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EnableInvalidationService(); 73958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 740a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 74158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Test registration changes with invalidation service enabled. 742a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_NONE); 74358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 744a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_NONE); 74558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 746a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 74758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 748a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 74958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 750a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 75158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Test registration changes with invalidation service disabled. 752a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DisableInvalidationService(); 75358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 754a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_NONE); 755a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 75658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 75758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 75858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 75958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, Disconnect) { 76058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Generate an invalidation. 76158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 76258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartInvalidator(); 763c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch syncer::Invalidation inv = FireInvalidation(POLICY_OBJECT_A, V(1), "test"); 76458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 76558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 76658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Ensure that the policy is not refreshed after disconnecting the core, but 76758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // a call to indicate that invalidations are disabled is made. 76858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DisconnectCore(); 76958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 77058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 77158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Ensure that invalidation service events do not cause refreshes while the 77258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // invalidator is stopped. 773c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(IsUnsent(FireInvalidation(POLICY_OBJECT_A, V(2), "test"))); 77458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 77558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DisableInvalidationService(); 77658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EnableInvalidationService(); 77758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 77858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Connect and disconnect without starting the refresh scheduler. 77958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ConnectCore(); 780c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(IsUnsent(FireInvalidation(POLICY_OBJECT_A, V(3), "test"))); 78158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 78258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DisconnectCore(); 783c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(IsUnsent(FireInvalidation(POLICY_OBJECT_A, V(4), "test"))); 78458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 78558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 78658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Ensure that the invalidator returns to normal after reconnecting. 78758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ConnectCore(); 78858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartRefreshScheduler(); 78958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyNotRefreshed()); 79058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(InvalidationsEnabled()); 791c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch FireInvalidation(POLICY_OBJECT_A, V(5), "test"); 792c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(CheckInvalidationInfo(V(5), "test")); 79358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(CheckPolicyRefreshed()); 79458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DisableInvalidationService(); 79558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(InvalidationsEnabled()); 796a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 797a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 798a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, RefreshMetricsUnregistered) { 799a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Store loads occurring before invalidation registration are not counted. 800a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 801a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_NONE, 0, false /* policy_changed */); 802a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_NONE, 0, true /* policy_changed */); 803a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_CHANGED)); 804a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_CHANGED_NO_INVALIDATIONS)); 805a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_UNCHANGED)); 806a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_INVALIDATED_CHANGED)); 807a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_INVALIDATED_UNCHANGED)); 808a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 809a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 810a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, RefreshMetricsNoInvalidations) { 811a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Store loads occurring while registered should be differentiated depending 812a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // on whether the invalidation service was enabled or not. 813a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 814a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 815c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 816c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Initially, invalidations have not been enabled past the grace period, so 817c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // invalidations are OFF. 818a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, false /* policy_changed */); 819a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, true /* policy_changed */); 820c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(1, GetCount(METRIC_POLICY_REFRESH_CHANGED_NO_INVALIDATIONS)); 821c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 822c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // If the clock advances less than the grace period, invalidations are OFF. 823c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch AdvanceClock(base::TimeDelta::FromSeconds(1)); 824a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, false /* policy_changed */); 825a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, true /* policy_changed */); 826c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(2, GetCount(METRIC_POLICY_REFRESH_CHANGED_NO_INVALIDATIONS)); 827c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 828c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // After the grace period elapses, invalidations are ON. 829c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch AdvanceClock(base::TimeDelta::FromSeconds( 830c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CloudPolicyInvalidator::kInvalidationGracePeriod)); 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) EXPECT_EQ(1, GetCount(METRIC_POLICY_REFRESH_CHANGED)); 834a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 835c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // After the invalidation service is disabled, invalidations are OFF. 836c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch DisableInvalidationService(); 837c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch StorePolicy(POLICY_OBJECT_A, 0, false /* policy_changed */); 838c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch StorePolicy(POLICY_OBJECT_A, 0, true /* policy_changed */); 839c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(3, GetCount(METRIC_POLICY_REFRESH_CHANGED_NO_INVALIDATIONS)); 840a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 841c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Enabling the invalidation service results in a new grace period, so 842c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // invalidations are OFF. 843c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EnableInvalidationService(); 844c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch StorePolicy(POLICY_OBJECT_A, 0, false /* policy_changed */); 845c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch StorePolicy(POLICY_OBJECT_A, 0, true /* policy_changed */); 846c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(4, GetCount(METRIC_POLICY_REFRESH_CHANGED_NO_INVALIDATIONS)); 847a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 848c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // After the grace period elapses, invalidations are ON. 849c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch AdvanceClock(base::TimeDelta::FromSeconds( 850c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CloudPolicyInvalidator::kInvalidationGracePeriod)); 851c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch StorePolicy(POLICY_OBJECT_A, 0, false /* policy_changed */); 852c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch StorePolicy(POLICY_OBJECT_A, 0, true /* policy_changed */); 853c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 854c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(2, GetCount(METRIC_POLICY_REFRESH_CHANGED)); 855c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(4, GetCount(METRIC_POLICY_REFRESH_CHANGED_NO_INVALIDATIONS)); 856c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(6, GetCount(METRIC_POLICY_REFRESH_UNCHANGED)); 857a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_INVALIDATED_CHANGED)); 858a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_INVALIDATED_UNCHANGED)); 859a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 860a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 861a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(CloudPolicyInvalidatorTest, RefreshMetricsInvalidation) { 862a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Store loads after an invalidation are counted as invalidated, even if 863a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // the loads do not result in the invalidation being acknowledged. 864a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 865a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A); 866c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch AdvanceClock(base::TimeDelta::FromSeconds( 867c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CloudPolicyInvalidator::kInvalidationGracePeriod)); 868c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch FireInvalidation(POLICY_OBJECT_A, V(5), "test"); 869a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, false /* policy_changed */); 870a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, true /* policy_changed */); 871c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch StorePolicy(POLICY_OBJECT_A, V(5), true /* policy_changed */); 872a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 873a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Store loads after the invalidation is complete are not counted as 874a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // invalidated. 875a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, false /* policy_changed */); 876a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, true /* policy_changed */); 877a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, false /* policy_changed */); 878a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, true /* policy_changed */); 879a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, false /* policy_changed */); 880a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, true /* policy_changed */); 881a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StorePolicy(POLICY_OBJECT_A, 0, false /* policy_changed */); 882a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 883a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(3, GetCount(METRIC_POLICY_REFRESH_CHANGED)); 884a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(0, GetCount(METRIC_POLICY_REFRESH_CHANGED_NO_INVALIDATIONS)); 885a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(4, GetCount(METRIC_POLICY_REFRESH_UNCHANGED)); 886a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(2, GetCount(METRIC_POLICY_REFRESH_INVALIDATED_CHANGED)); 887a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1, GetCount(METRIC_POLICY_REFRESH_INVALIDATED_UNCHANGED)); 888a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 889a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 890c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(CloudPolicyInvalidatorTest, ExpiredInvalidations) { 891c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch StorePolicy(POLICY_OBJECT_A, 0, false, Now()); 892a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) StartInvalidator(); 893c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 894c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Invalidations fired before the last fetch time (adjusted by max time delta) 895c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // should be ignored. 896c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::Time time = Now() - base::TimeDelta::FromSeconds( 897c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CloudPolicyInvalidator::kMaxInvalidationTimeDelta + 300); 898c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch syncer::Invalidation inv = 899c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch FireInvalidation(POLICY_OBJECT_A, GetVersion(time), "test"); 900c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE(IsInvalidationAcknowledged(inv)); 901c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE(CheckPolicyNotRefreshed()); 902c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 903c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch time += base::TimeDelta::FromMinutes(5) - base::TimeDelta::FromSeconds(1); 904c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch inv = FireInvalidation(POLICY_OBJECT_A, GetVersion(time), "test"); 905c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE(IsInvalidationAcknowledged(inv)); 906c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE(CheckPolicyNotRefreshed()); 907c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 908c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Invalidations fired after the last fetch should not be ignored. 909c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch time += base::TimeDelta::FromSeconds(1); 910c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch inv = FireInvalidation(POLICY_OBJECT_A, GetVersion(time), "test"); 911c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_FALSE(IsInvalidationAcknowledged(inv)); 912c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE(CheckPolicyRefreshed()); 913c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 914c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch time += base::TimeDelta::FromMinutes(10); 915c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch inv = FireInvalidation(POLICY_OBJECT_A, GetVersion(time), "test"); 916c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_FALSE(IsInvalidationAcknowledged(inv)); 917c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE(CheckPolicyRefreshed()); 918c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 919c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch time += base::TimeDelta::FromMinutes(10); 920c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch inv = FireInvalidation(POLICY_OBJECT_A, GetVersion(time), "test"); 921c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_FALSE(IsInvalidationAcknowledged(inv)); 922c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE(CheckPolicyRefreshed()); 923c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 924c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Unknown version invalidations fired just after the last fetch time should 925c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // be ignored. 926c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch inv = FireUnknownVersionInvalidation(POLICY_OBJECT_A); 927c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE(IsInvalidationAcknowledged(inv)); 928c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE(CheckPolicyNotRefreshed()); 929c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 930c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch AdvanceClock(base::TimeDelta::FromSeconds( 931c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CloudPolicyInvalidator::kUnknownVersionIgnorePeriod - 1)); 932c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch inv = FireUnknownVersionInvalidation(POLICY_OBJECT_A); 933c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE(IsInvalidationAcknowledged(inv)); 934c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE(CheckPolicyNotRefreshed()); 935c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 936c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Unknown version invalidations fired past the ignore period should not be 937c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // ignored. 938c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch AdvanceClock(base::TimeDelta::FromSeconds(1)); 939c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch inv = FireUnknownVersionInvalidation(POLICY_OBJECT_A); 940c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_FALSE(IsInvalidationAcknowledged(inv)); 941c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE(CheckPolicyRefreshedWithUnknownVersion()); 942a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 943a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Verify that received invalidations metrics are correct. 944c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(1, GetInvalidationCount(POLICY_INVALIDATION_TYPE_NO_PAYLOAD)); 945c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(3, GetInvalidationCount(POLICY_INVALIDATION_TYPE_NORMAL)); 946c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(2, 947c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GetInvalidationCount(POLICY_INVALIDATION_TYPE_NO_PAYLOAD_EXPIRED)); 948c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(2, GetInvalidationCount(POLICY_INVALIDATION_TYPE_EXPIRED)); 949a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 950a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 951a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace policy 952