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