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