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