OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/callback.h" | 5 #include "base/callback.h" |
6 #include "base/compiler_specific.h" | 6 #include "base/compiler_specific.h" |
7 #include "base/memory/ref_counted.h" | 7 #include "base/memory/ref_counted.h" |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "base/test/test_simple_task_runner.h" | 10 #include "base/test/test_simple_task_runner.h" |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 store_.policy_.reset(new em::PolicyData()); | 46 store_.policy_.reset(new em::PolicyData()); |
47 store_.policy_->set_timestamp( | 47 store_.policy_->set_timestamp( |
48 ((base::Time::NowFromSystemTime() - base::TimeDelta::FromMinutes(1)) - | 48 ((base::Time::NowFromSystemTime() - base::TimeDelta::FromMinutes(1)) - |
49 base::Time::UnixEpoch()).InMilliseconds()); | 49 base::Time::UnixEpoch()).InMilliseconds()); |
50 last_refresh_ = | 50 last_refresh_ = |
51 base::Time::UnixEpoch() + | 51 base::Time::UnixEpoch() + |
52 base::TimeDelta::FromMilliseconds(store_.policy_->timestamp()); | 52 base::TimeDelta::FromMilliseconds(store_.policy_->timestamp()); |
53 } | 53 } |
54 | 54 |
55 CloudPolicyRefreshScheduler* CreateRefreshScheduler() { | 55 CloudPolicyRefreshScheduler* CreateRefreshScheduler() { |
| 56 return CreateRefreshScheduler(true /* invalidations_enabled */); |
| 57 } |
| 58 |
| 59 CloudPolicyRefreshScheduler* CreateRefreshScheduler( |
| 60 bool invalidations_enabled) { |
56 CloudPolicyRefreshScheduler* scheduler = | 61 CloudPolicyRefreshScheduler* scheduler = |
57 new CloudPolicyRefreshScheduler(&client_, &store_, task_runner_); | 62 new CloudPolicyRefreshScheduler(&client_, &store_, task_runner_, |
| 63 invalidations_enabled); |
58 scheduler->SetRefreshDelay(kPolicyRefreshRate); | 64 scheduler->SetRefreshDelay(kPolicyRefreshRate); |
59 return scheduler; | 65 return scheduler; |
60 } | 66 } |
61 | 67 |
62 void NotifyIPAddressChanged() { | 68 void NotifyIPAddressChanged() { |
63 net::NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); | 69 net::NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); |
64 loop_.RunUntilIdle(); | 70 loop_.RunUntilIdle(); |
65 } | 71 } |
66 | 72 |
67 base::TimeDelta GetLastDelay() const { | 73 base::TimeDelta GetLastDelay() const { |
(...skipping 19 matching lines...) Expand all Loading... |
87 scoped_ptr<net::NetworkChangeNotifier> network_change_notifier_; | 93 scoped_ptr<net::NetworkChangeNotifier> network_change_notifier_; |
88 | 94 |
89 // Base time for the refresh that the scheduler should be using. | 95 // Base time for the refresh that the scheduler should be using. |
90 base::Time last_refresh_; | 96 base::Time last_refresh_; |
91 }; | 97 }; |
92 | 98 |
93 TEST_F(CloudPolicyRefreshSchedulerTest, InitialRefreshNoPolicy) { | 99 TEST_F(CloudPolicyRefreshSchedulerTest, InitialRefreshNoPolicy) { |
94 store_.policy_.reset(); | 100 store_.policy_.reset(); |
95 scoped_ptr<CloudPolicyRefreshScheduler> scheduler(CreateRefreshScheduler()); | 101 scoped_ptr<CloudPolicyRefreshScheduler> scheduler(CreateRefreshScheduler()); |
96 EXPECT_FALSE(task_runner_->GetPendingTasks().empty()); | 102 EXPECT_FALSE(task_runner_->GetPendingTasks().empty()); |
| 103 CheckTiming(CloudPolicyRefreshScheduler::kFirstRefreshDelayMs); |
| 104 EXPECT_CALL(client_, FetchPolicy()).Times(1); |
| 105 task_runner_->RunUntilIdle(); |
| 106 } |
| 107 |
| 108 TEST_F(CloudPolicyRefreshSchedulerTest, InitialRefreshNoPolicyNoInvalidations) { |
| 109 store_.policy_.reset(); |
| 110 scoped_ptr<CloudPolicyRefreshScheduler> scheduler(CreateRefreshScheduler( |
| 111 false /* invalidations_enabled */)); |
| 112 EXPECT_FALSE(task_runner_->GetPendingTasks().empty()); |
97 EXPECT_EQ(GetLastDelay(), base::TimeDelta()); | 113 EXPECT_EQ(GetLastDelay(), base::TimeDelta()); |
98 EXPECT_CALL(client_, FetchPolicy()).Times(1); | 114 EXPECT_CALL(client_, FetchPolicy()).Times(1); |
99 task_runner_->RunUntilIdle(); | 115 task_runner_->RunUntilIdle(); |
100 } | 116 } |
101 | 117 |
102 TEST_F(CloudPolicyRefreshSchedulerTest, InitialRefreshUnmanaged) { | 118 TEST_F(CloudPolicyRefreshSchedulerTest, InitialRefreshUnmanaged) { |
103 store_.policy_->set_state(em::PolicyData::UNMANAGED); | 119 store_.policy_->set_state(em::PolicyData::UNMANAGED); |
104 scoped_ptr<CloudPolicyRefreshScheduler> scheduler(CreateRefreshScheduler()); | 120 scoped_ptr<CloudPolicyRefreshScheduler> scheduler(CreateRefreshScheduler()); |
105 CheckTiming(CloudPolicyRefreshScheduler::kUnmanagedRefreshDelayMs); | 121 CheckTiming(CloudPolicyRefreshScheduler::kUnmanagedRefreshDelayMs); |
106 EXPECT_CALL(client_, FetchPolicy()).Times(1); | 122 EXPECT_CALL(client_, FetchPolicy()).Times(1); |
107 task_runner_->RunUntilIdle(); | 123 task_runner_->RunUntilIdle(); |
108 } | 124 } |
109 | 125 |
110 TEST_F(CloudPolicyRefreshSchedulerTest, InitialRefreshManagedNotYetFetched) { | 126 TEST_F(CloudPolicyRefreshSchedulerTest, InitialRefreshManagedNotYetFetched) { |
111 scoped_ptr<CloudPolicyRefreshScheduler> scheduler(CreateRefreshScheduler()); | 127 scoped_ptr<CloudPolicyRefreshScheduler> scheduler(CreateRefreshScheduler()); |
112 EXPECT_FALSE(task_runner_->GetPendingTasks().empty()); | 128 EXPECT_FALSE(task_runner_->GetPendingTasks().empty()); |
| 129 CheckTiming(CloudPolicyRefreshScheduler::kFirstRefreshDelayMs); |
| 130 EXPECT_CALL(client_, FetchPolicy()).Times(1); |
| 131 task_runner_->RunUntilIdle(); |
| 132 } |
| 133 |
| 134 TEST_F(CloudPolicyRefreshSchedulerTest, |
| 135 InitialRefreshManagedNotYetFetchedNoInvalidations) { |
| 136 scoped_ptr<CloudPolicyRefreshScheduler> scheduler(CreateRefreshScheduler( |
| 137 false /* invalidations_enabled */)); |
| 138 EXPECT_FALSE(task_runner_->GetPendingTasks().empty()); |
113 EXPECT_EQ(GetLastDelay(), base::TimeDelta()); | 139 EXPECT_EQ(GetLastDelay(), base::TimeDelta()); |
114 EXPECT_CALL(client_, FetchPolicy()).Times(1); | 140 EXPECT_CALL(client_, FetchPolicy()).Times(1); |
115 task_runner_->RunUntilIdle(); | 141 task_runner_->RunUntilIdle(); |
116 } | 142 } |
117 | 143 |
118 TEST_F(CloudPolicyRefreshSchedulerTest, InitialRefreshManagedAlreadyFetched) { | 144 TEST_F(CloudPolicyRefreshSchedulerTest, InitialRefreshManagedAlreadyFetched) { |
119 last_refresh_ = base::Time::NowFromSystemTime(); | 145 last_refresh_ = base::Time::NowFromSystemTime(); |
120 client_.SetPolicy(PolicyNamespaceKey(dm_protocol::kChromeUserPolicyType, | 146 client_.SetPolicy(PolicyNamespaceKey(dm_protocol::kChromeUserPolicyType, |
121 std::string()), | 147 std::string()), |
122 em::PolicyFetchResponse()); | 148 em::PolicyFetchResponse()); |
123 scoped_ptr<CloudPolicyRefreshScheduler> scheduler(CreateRefreshScheduler()); | 149 scoped_ptr<CloudPolicyRefreshScheduler> scheduler(CreateRefreshScheduler()); |
124 CheckTiming(kPolicyRefreshRate); | 150 CheckTiming(kPolicyRefreshRate); |
125 EXPECT_CALL(client_, FetchPolicy()).Times(1); | 151 EXPECT_CALL(client_, FetchPolicy()).Times(1); |
126 task_runner_->RunUntilIdle(); | 152 task_runner_->RunUntilIdle(); |
127 } | 153 } |
128 | 154 |
129 TEST_F(CloudPolicyRefreshSchedulerTest, Unregistered) { | 155 TEST_F(CloudPolicyRefreshSchedulerTest, Unregistered) { |
130 client_.SetDMToken(std::string()); | 156 client_.SetDMToken(std::string()); |
131 scoped_ptr<CloudPolicyRefreshScheduler> scheduler(CreateRefreshScheduler()); | 157 scoped_ptr<CloudPolicyRefreshScheduler> scheduler(CreateRefreshScheduler()); |
132 client_.NotifyPolicyFetched(); | 158 client_.NotifyPolicyFetched(); |
133 client_.NotifyRegistrationStateChanged(); | 159 client_.NotifyRegistrationStateChanged(); |
134 client_.NotifyClientError(); | 160 client_.NotifyClientError(); |
135 scheduler->SetRefreshDelay(12 * 60 * 60 * 1000); | 161 scheduler->SetRefreshDelay(12 * 60 * 60 * 1000); |
136 store_.NotifyStoreLoaded(); | 162 store_.NotifyStoreLoaded(); |
137 store_.NotifyStoreError(); | 163 store_.NotifyStoreError(); |
138 EXPECT_TRUE(task_runner_->GetPendingTasks().empty()); | 164 EXPECT_TRUE(task_runner_->GetPendingTasks().empty()); |
139 } | 165 } |
140 | 166 |
| 167 TEST_F(CloudPolicyRefreshSchedulerTest, RefreshSoon) { |
| 168 last_refresh_ = base::Time::NowFromSystemTime(); |
| 169 store_.policy_.reset(); |
| 170 scoped_ptr<CloudPolicyRefreshScheduler> scheduler(CreateRefreshScheduler()); |
| 171 EXPECT_FALSE(task_runner_->GetPendingTasks().empty()); |
| 172 CheckTiming(CloudPolicyRefreshScheduler::kFirstRefreshDelayMs); |
| 173 scheduler->RefreshSoon(); |
| 174 EXPECT_FALSE(task_runner_->GetPendingTasks().empty()); |
| 175 CheckTiming(CloudPolicyRefreshScheduler::kFirstRefreshDelayMs); |
| 176 EXPECT_CALL(client_, FetchPolicy()).Times(1); |
| 177 task_runner_->RunUntilIdle(); |
| 178 } |
| 179 |
| 180 TEST_F(CloudPolicyRefreshSchedulerTest, RefreshForInvalidation) { |
| 181 last_refresh_ = base::Time::NowFromSystemTime(); |
| 182 store_.policy_.reset(); |
| 183 scoped_ptr<CloudPolicyRefreshScheduler> scheduler(CreateRefreshScheduler()); |
| 184 EXPECT_FALSE(task_runner_->GetPendingTasks().empty()); |
| 185 CheckTiming(CloudPolicyRefreshScheduler::kFirstRefreshDelayMs); |
| 186 scheduler->RefreshForInvalidation(); |
| 187 EXPECT_FALSE(task_runner_->GetPendingTasks().empty()); |
| 188 EXPECT_EQ(GetLastDelay(), base::TimeDelta()); |
| 189 EXPECT_CALL(client_, FetchPolicy()).Times(1); |
| 190 task_runner_->RunUntilIdle(); |
| 191 } |
| 192 |
141 TEST_F(CloudPolicyRefreshSchedulerTest, RefreshSoonRateLimit) { | 193 TEST_F(CloudPolicyRefreshSchedulerTest, RefreshSoonRateLimit) { |
142 scoped_ptr<CloudPolicyRefreshScheduler> scheduler(CreateRefreshScheduler()); | 194 scoped_ptr<CloudPolicyRefreshScheduler> scheduler(CreateRefreshScheduler()); |
143 // Max out the request rate. | 195 // Max out the request rate. |
144 for (int i = 0; i < 5; ++i) { | 196 for (int i = 0; i < 5; ++i) { |
145 EXPECT_CALL(client_, FetchPolicy()).Times(1); | 197 EXPECT_CALL(client_, FetchPolicy()).Times(1); |
146 scheduler->RefreshSoon(); | 198 scheduler->RefreshSoon(); |
147 task_runner_->RunUntilIdle(); | 199 task_runner_->RunUntilIdle(); |
148 Mock::VerifyAndClearExpectations(&client_); | 200 Mock::VerifyAndClearExpectations(&client_); |
149 } | 201 } |
150 // The next refresh is throttled. | 202 // The next refresh is throttled. |
151 EXPECT_CALL(client_, FetchPolicy()).Times(0); | 203 EXPECT_CALL(client_, FetchPolicy()).Times(0); |
152 scheduler->RefreshSoon(); | 204 scheduler->RefreshSoon(); |
153 task_runner_->RunPendingTasks(); | 205 task_runner_->RunPendingTasks(); |
154 Mock::VerifyAndClearExpectations(&client_); | 206 Mock::VerifyAndClearExpectations(&client_); |
155 } | 207 } |
156 | 208 |
157 class CloudPolicyRefreshSchedulerSteadyStateTest | 209 class CloudPolicyRefreshSchedulerSteadyStateTest |
158 : public CloudPolicyRefreshSchedulerTest { | 210 : public CloudPolicyRefreshSchedulerTest { |
159 protected: | 211 protected: |
160 CloudPolicyRefreshSchedulerSteadyStateTest() | 212 CloudPolicyRefreshSchedulerSteadyStateTest() |
161 : refresh_scheduler_(&client_, &store_, task_runner_) {} | 213 : refresh_scheduler_(&client_, &store_, task_runner_, |
| 214 true /* invalidations_enabled */) {} |
162 | 215 |
163 virtual void SetUp() OVERRIDE { | 216 virtual void SetUp() OVERRIDE { |
164 refresh_scheduler_.SetRefreshDelay(kPolicyRefreshRate); | 217 refresh_scheduler_.SetRefreshDelay(kPolicyRefreshRate); |
165 CloudPolicyRefreshSchedulerTest::SetUp(); | 218 CloudPolicyRefreshSchedulerTest::SetUp(); |
166 last_refresh_ = base::Time::NowFromSystemTime(); | 219 last_refresh_ = base::Time::NowFromSystemTime(); |
167 client_.NotifyPolicyFetched(); | 220 client_.NotifyPolicyFetched(); |
168 CheckTiming(kPolicyRefreshRate); | 221 CheckTiming(kPolicyRefreshRate); |
169 } | 222 } |
170 | 223 |
171 CloudPolicyRefreshScheduler refresh_scheduler_; | 224 CloudPolicyRefreshScheduler refresh_scheduler_; |
172 }; | 225 }; |
173 | 226 |
174 TEST_F(CloudPolicyRefreshSchedulerSteadyStateTest, OnPolicyFetched) { | 227 TEST_F(CloudPolicyRefreshSchedulerSteadyStateTest, OnPolicyFetched) { |
175 client_.NotifyPolicyFetched(); | 228 client_.NotifyPolicyFetched(); |
176 CheckTiming(kPolicyRefreshRate); | 229 CheckTiming(kPolicyRefreshRate); |
177 } | 230 } |
178 | 231 |
179 TEST_F(CloudPolicyRefreshSchedulerSteadyStateTest, OnRegistrationStateChanged) { | 232 TEST_F(CloudPolicyRefreshSchedulerSteadyStateTest, OnRegistrationStateChanged) { |
180 client_.SetDMToken("new_token"); | 233 client_.SetDMToken("new_token"); |
181 client_.NotifyRegistrationStateChanged(); | 234 client_.NotifyRegistrationStateChanged(); |
182 EXPECT_EQ(GetLastDelay(), base::TimeDelta()); | 235 CheckTiming(CloudPolicyRefreshScheduler::kFirstRefreshDelayMs); |
183 | 236 |
184 task_runner_->ClearPendingTasks(); | 237 task_runner_->ClearPendingTasks(); |
185 client_.SetDMToken(std::string()); | 238 client_.SetDMToken(std::string()); |
186 client_.NotifyRegistrationStateChanged(); | 239 client_.NotifyRegistrationStateChanged(); |
187 EXPECT_TRUE(task_runner_->GetPendingTasks().empty()); | 240 EXPECT_TRUE(task_runner_->GetPendingTasks().empty()); |
188 } | 241 } |
189 | 242 |
190 TEST_F(CloudPolicyRefreshSchedulerSteadyStateTest, OnStoreLoaded) { | 243 TEST_F(CloudPolicyRefreshSchedulerSteadyStateTest, OnStoreLoaded) { |
191 store_.NotifyStoreLoaded(); | 244 store_.NotifyStoreLoaded(); |
192 CheckTiming(kPolicyRefreshRate); | 245 CheckTiming(kPolicyRefreshRate); |
(...skipping 18 matching lines...) Expand all Loading... |
211 refresh_scheduler_.SetRefreshDelay(delay_long_ms); | 264 refresh_scheduler_.SetRefreshDelay(delay_long_ms); |
212 CheckTiming(CloudPolicyRefreshScheduler::kRefreshDelayMaxMs); | 265 CheckTiming(CloudPolicyRefreshScheduler::kRefreshDelayMaxMs); |
213 } | 266 } |
214 | 267 |
215 TEST_F(CloudPolicyRefreshSchedulerSteadyStateTest, OnIPAddressChanged) { | 268 TEST_F(CloudPolicyRefreshSchedulerSteadyStateTest, OnIPAddressChanged) { |
216 NotifyIPAddressChanged(); | 269 NotifyIPAddressChanged(); |
217 CheckTiming(kPolicyRefreshRate); | 270 CheckTiming(kPolicyRefreshRate); |
218 | 271 |
219 client_.SetStatus(DM_STATUS_REQUEST_FAILED); | 272 client_.SetStatus(DM_STATUS_REQUEST_FAILED); |
220 NotifyIPAddressChanged(); | 273 NotifyIPAddressChanged(); |
221 EXPECT_EQ(GetLastDelay(), base::TimeDelta()); | 274 CheckTiming(CloudPolicyRefreshScheduler::kFirstRefreshDelayMs); |
222 } | 275 } |
223 | 276 |
224 struct ClientErrorTestParam { | 277 struct ClientErrorTestParam { |
225 DeviceManagementStatus client_error; | 278 DeviceManagementStatus client_error; |
226 int64 expected_delay_ms; | 279 int64 expected_delay_ms; |
227 int backoff_factor; | 280 int backoff_factor; |
228 }; | 281 }; |
229 | 282 |
230 static const ClientErrorTestParam kClientErrorTestCases[] = { | 283 static const ClientErrorTestParam kClientErrorTestCases[] = { |
231 { DM_STATUS_REQUEST_INVALID, | 284 { DM_STATUS_REQUEST_INVALID, |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
285 EXPECT_EQ(base::TimeDelta(), GetLastDelay()); | 338 EXPECT_EQ(base::TimeDelta(), GetLastDelay()); |
286 EXPECT_TRUE(task_runner_->GetPendingTasks().empty()); | 339 EXPECT_TRUE(task_runner_->GetPendingTasks().empty()); |
287 } | 340 } |
288 } | 341 } |
289 | 342 |
290 INSTANTIATE_TEST_CASE_P(CloudPolicyRefreshSchedulerClientErrorTest, | 343 INSTANTIATE_TEST_CASE_P(CloudPolicyRefreshSchedulerClientErrorTest, |
291 CloudPolicyRefreshSchedulerClientErrorTest, | 344 CloudPolicyRefreshSchedulerClientErrorTest, |
292 testing::ValuesIn(kClientErrorTestCases)); | 345 testing::ValuesIn(kClientErrorTestCases)); |
293 | 346 |
294 } // namespace policy | 347 } // namespace policy |
OLD | NEW |