blob: e5d67493bdfe76846201532188ef6b2c7d84b6f9 [file] [log] [blame]
Alex Deymo0d11c602014-04-23 20:12:20 -07001// Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Alex Deymo63784a52014-05-28 10:46:14 -07005#include "update_engine/update_manager/chromeos_policy.h"
Alex Deymo0d11c602014-04-23 20:12:20 -07006
Gilad Arnold0adbc942014-05-12 10:35:43 -07007#include <set>
Alex Deymo0d11c602014-04-23 20:12:20 -07008#include <string>
Gilad Arnolddc4bb262014-07-23 10:45:19 -07009#include <tuple>
Gilad Arnoldb3b05442014-05-30 14:25:05 -070010#include <vector>
Alex Deymo0d11c602014-04-23 20:12:20 -070011
12#include <base/time/time.h>
13#include <gtest/gtest.h>
14
15#include "update_engine/fake_clock.h"
Alex Deymo63784a52014-05-28 10:46:14 -070016#include "update_engine/update_manager/evaluation_context.h"
17#include "update_engine/update_manager/fake_state.h"
18#include "update_engine/update_manager/umtest_utils.h"
Alex Deymo0d11c602014-04-23 20:12:20 -070019
20using base::Time;
21using base::TimeDelta;
Gilad Arnoldb3b05442014-05-30 14:25:05 -070022using chromeos_update_engine::ErrorCode;
Alex Deymo0d11c602014-04-23 20:12:20 -070023using chromeos_update_engine::FakeClock;
Gilad Arnold0adbc942014-05-12 10:35:43 -070024using std::set;
Alex Deymo0d11c602014-04-23 20:12:20 -070025using std::string;
Gilad Arnolddc4bb262014-07-23 10:45:19 -070026using std::tuple;
Gilad Arnoldb3b05442014-05-30 14:25:05 -070027using std::vector;
Alex Deymo0d11c602014-04-23 20:12:20 -070028
Alex Deymo63784a52014-05-28 10:46:14 -070029namespace chromeos_update_manager {
Alex Deymo0d11c602014-04-23 20:12:20 -070030
Alex Deymo63784a52014-05-28 10:46:14 -070031class UmChromeOSPolicyTest : public ::testing::Test {
Alex Deymo0d11c602014-04-23 20:12:20 -070032 protected:
33 virtual void SetUp() {
34 SetUpDefaultClock();
Gilad Arnoldb2271992014-06-19 12:35:24 -070035 eval_ctx_ = new EvaluationContext(&fake_clock_, TimeDelta::FromSeconds(5));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070036 SetUpDefaultState();
37 SetUpDefaultDevicePolicy();
Alex Deymo0d11c602014-04-23 20:12:20 -070038 }
39
40 // Sets the clock to fixed values.
41 void SetUpDefaultClock() {
42 fake_clock_.SetMonotonicTime(Time::FromInternalValue(12345678L));
43 fake_clock_.SetWallclockTime(Time::FromInternalValue(12345678901234L));
44 }
45
46 void SetUpDefaultState() {
47 fake_state_.updater_provider()->var_updater_started_time()->reset(
48 new Time(fake_clock_.GetWallclockTime()));
49 fake_state_.updater_provider()->var_last_checked_time()->reset(
50 new Time(fake_clock_.GetWallclockTime()));
51 fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -070052 reset(new unsigned int{0});
Gilad Arnolda0258a52014-07-10 16:21:19 -070053 fake_state_.updater_provider()->var_server_dictated_poll_interval()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -070054 reset(new unsigned int{0});
55 fake_state_.updater_provider()->var_forced_update_requested()->
56 reset(new UpdateRequestStatus{UpdateRequestStatus::kNone});
Alex Deymo0d11c602014-04-23 20:12:20 -070057
58 fake_state_.random_provider()->var_seed()->reset(
59 new uint64_t(4)); // chosen by fair dice roll.
60 // guaranteed to be random.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070061
62 // No device policy loaded by default.
63 fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
64 new bool(false));
65
Gilad Arnolda1eabcd2014-07-09 15:42:40 -070066 // OOBE is enabled by default.
67 fake_state_.config_provider()->var_is_oobe_enabled()->reset(
68 new bool(true));
69
Gilad Arnold76a11f62014-05-20 09:02:12 -070070 // For the purpose of the tests, this is an official build and OOBE was
71 // completed.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070072 fake_state_.system_provider()->var_is_official_build()->reset(
73 new bool(true));
Gilad Arnold76a11f62014-05-20 09:02:12 -070074 fake_state_.system_provider()->var_is_oobe_complete()->reset(
75 new bool(true));
Gilad Arnoldbfc44f72014-07-09 14:41:39 -070076 fake_state_.system_provider()->var_is_boot_device_removable()->reset(
77 new bool(false));
Gilad Arnold0adbc942014-05-12 10:35:43 -070078
79 // Connection is wifi, untethered.
80 fake_state_.shill_provider()->var_conn_type()->
81 reset(new ConnectionType(ConnectionType::kWifi));
82 fake_state_.shill_provider()->var_conn_tethering()->
83 reset(new ConnectionTethering(ConnectionTethering::kNotDetected));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070084 }
85
Gilad Arnoldb3b05442014-05-30 14:25:05 -070086 // Sets up a default device policy that does not impose any restrictions
87 // (HTTP) nor enables any features (P2P).
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070088 void SetUpDefaultDevicePolicy() {
89 fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
90 new bool(true));
91 fake_state_.device_policy_provider()->var_update_disabled()->reset(
92 new bool(false));
93 fake_state_.device_policy_provider()->
94 var_allowed_connection_types_for_update()->reset(nullptr);
95 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
96 new TimeDelta());
97 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
Gilad Arnoldb3b05442014-05-30 14:25:05 -070098 new bool(true));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070099 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
100 new bool(false));
101 fake_state_.device_policy_provider()->var_release_channel_delegated()->
102 reset(new bool(true));
103 }
104
105 // Configures the UpdateCheckAllowed policy to return a desired value by
106 // faking the current wall clock time as needed. Restores the default state.
107 // This is used when testing policies that depend on this one.
108 void SetUpdateCheckAllowed(bool allow_check) {
109 Time next_update_check;
110 ExpectPolicyStatus(EvalStatus::kSucceeded,
111 &ChromeOSPolicy::NextUpdateCheckTime,
112 &next_update_check);
113 SetUpDefaultState();
114 SetUpDefaultDevicePolicy();
115 Time curr_time = next_update_check;
116 if (allow_check)
117 curr_time += TimeDelta::FromSeconds(1);
118 else
119 curr_time -= TimeDelta::FromSeconds(1);
120 fake_clock_.SetWallclockTime(curr_time);
121 }
122
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700123 // Returns a default UpdateState structure:
124 UpdateState GetDefaultUpdateState(TimeDelta first_seen_period) {
125 Time first_seen_time = fake_clock_.GetWallclockTime() - first_seen_period;
126 UpdateState update_state = UpdateState();
127
128 // This is a non-interactive check returning a delta payload, seen for the
129 // first time (|first_seen_period| ago). Clearly, there were no failed
130 // attempts so far.
131 update_state.is_interactive = false;
132 update_state.is_delta_payload = false;
133 update_state.first_seen = first_seen_time;
134 update_state.num_checks = 1;
135 update_state.num_failures = 0;
136 update_state.failures_last_updated = Time(); // Needs to be zero.
137 // There's a single HTTP download URL with a maximum of 10 retries.
138 update_state.download_urls = vector<string>{"http://fake/url/"};
139 update_state.download_errors_max = 10;
140 // Download was never attempted.
141 update_state.last_download_url_idx = -1;
142 update_state.last_download_url_num_errors = 0;
143 // There were no download errors.
144 update_state.download_errors = vector<tuple<int, ErrorCode, Time>>();
Gilad Arnold349ac832014-10-06 14:20:28 -0700145 // P2P was not attempted.
146 update_state.p2p_num_attempts = 0;
147 update_state.p2p_first_attempted = Time();
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700148 // No active backoff period, backoff is not disabled by Omaha.
149 update_state.backoff_expiry = Time();
150 update_state.is_backoff_disabled = false;
151 // There is no active scattering wait period (max 7 days allowed) nor check
152 // threshold (none allowed).
153 update_state.scatter_wait_period = TimeDelta();
154 update_state.scatter_check_threshold = 0;
155 update_state.scatter_wait_period_max = TimeDelta::FromDays(7);
156 update_state.scatter_check_threshold_min = 0;
157 update_state.scatter_check_threshold_max = 0;
158
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700159 return update_state;
Alex Deymo0d11c602014-04-23 20:12:20 -0700160 }
161
162 // Runs the passed |policy_method| policy and expects it to return the
163 // |expected| return value.
164 template<typename T, typename R, typename... Args>
165 void ExpectPolicyStatus(
166 EvalStatus expected,
167 T policy_method,
168 R* result, Args... args) {
169 string error = "<None>";
170 eval_ctx_->ResetEvaluation();
171 EXPECT_EQ(expected,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700172 (policy_.*policy_method)(eval_ctx_, &fake_state_, &error, result,
173 args...))
Alex Deymoc850b4f2014-05-19 11:06:41 -0700174 << "Returned error: " << error
175 << "\nEvaluation context: " << eval_ctx_->DumpContext();
Alex Deymo0d11c602014-04-23 20:12:20 -0700176 }
177
178 FakeClock fake_clock_;
179 FakeState fake_state_;
180 scoped_refptr<EvaluationContext> eval_ctx_;
181 ChromeOSPolicy policy_; // ChromeOSPolicy under test.
182};
183
Alex Deymo63784a52014-05-28 10:46:14 -0700184TEST_F(UmChromeOSPolicyTest, FirstCheckIsAtMostInitialIntervalAfterStart) {
Alex Deymo0d11c602014-04-23 20:12:20 -0700185 Time next_update_check;
186
Gilad Arnold38b14022014-07-09 12:45:56 -0700187 // Set the last update time so it'll appear as if this is a first update check
188 // in the lifetime of the current updater.
189 fake_state_.updater_provider()->var_last_checked_time()->reset(
190 new Time(fake_clock_.GetWallclockTime() - TimeDelta::FromMinutes(10)));
191
Alex Deymo0d11c602014-04-23 20:12:20 -0700192 ExpectPolicyStatus(EvalStatus::kSucceeded,
193 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
194
195 EXPECT_LE(fake_clock_.GetWallclockTime(), next_update_check);
Gilad Arnold38b14022014-07-09 12:45:56 -0700196 EXPECT_GE(
197 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
198 ChromeOSPolicy::kTimeoutInitialInterval +
199 ChromeOSPolicy::kTimeoutRegularFuzz / 2),
200 next_update_check);
201}
202
203TEST_F(UmChromeOSPolicyTest, RecurringCheckBaseIntervalAndFuzz) {
204 // Ensure that we're using the correct interval (kPeriodicInterval) and fuzz
205 // (kTimeoutRegularFuzz) as base values for period updates.
206 Time next_update_check;
207
208 ExpectPolicyStatus(EvalStatus::kSucceeded,
209 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
210
211 EXPECT_LE(
212 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
213 ChromeOSPolicy::kTimeoutPeriodicInterval -
214 ChromeOSPolicy::kTimeoutRegularFuzz / 2),
215 next_update_check);
216 EXPECT_GE(
217 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
218 ChromeOSPolicy::kTimeoutPeriodicInterval +
219 ChromeOSPolicy::kTimeoutRegularFuzz / 2),
220 next_update_check);
221}
222
223TEST_F(UmChromeOSPolicyTest, RecurringCheckBackoffIntervalAndFuzz) {
224 // Ensure that we're properly backing off and fuzzing in the presence of
225 // failed updates attempts.
226 Time next_update_check;
227
228 fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700229 reset(new unsigned int{2});
Gilad Arnold38b14022014-07-09 12:45:56 -0700230
231 ExpectPolicyStatus(EvalStatus::kSucceeded,
232 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
233
234 int expected_interval = ChromeOSPolicy::kTimeoutPeriodicInterval * 4;
235 EXPECT_LE(
236 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
237 expected_interval - expected_interval / 2),
238 next_update_check);
239 EXPECT_GE(
240 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
241 expected_interval + expected_interval / 2),
242 next_update_check);
Alex Deymo0d11c602014-04-23 20:12:20 -0700243}
244
Gilad Arnolda0258a52014-07-10 16:21:19 -0700245TEST_F(UmChromeOSPolicyTest, RecurringCheckServerDictatedPollInterval) {
246 // Policy honors the server provided check poll interval.
247 Time next_update_check;
248
249 const unsigned int kInterval = ChromeOSPolicy::kTimeoutPeriodicInterval * 4;
250 fake_state_.updater_provider()->var_server_dictated_poll_interval()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700251 reset(new unsigned int{kInterval});
Gilad Arnolda0258a52014-07-10 16:21:19 -0700252 // We should not be backing off in this case.
253 fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700254 reset(new unsigned int{2});
Gilad Arnolda0258a52014-07-10 16:21:19 -0700255
256 ExpectPolicyStatus(EvalStatus::kSucceeded,
257 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
258
259 EXPECT_LE(
260 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
261 kInterval - kInterval / 2),
262 next_update_check);
263 EXPECT_GE(
264 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
265 kInterval + kInterval / 2),
266 next_update_check);
267}
268
Alex Deymo63784a52014-05-28 10:46:14 -0700269TEST_F(UmChromeOSPolicyTest, ExponentialBackoffIsCapped) {
Alex Deymo0d11c602014-04-23 20:12:20 -0700270 Time next_update_check;
271
Alex Deymo0d11c602014-04-23 20:12:20 -0700272 fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700273 reset(new unsigned int{100});
Gilad Arnold38b14022014-07-09 12:45:56 -0700274
Alex Deymo0d11c602014-04-23 20:12:20 -0700275 ExpectPolicyStatus(EvalStatus::kSucceeded,
276 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
277
Gilad Arnold38b14022014-07-09 12:45:56 -0700278 EXPECT_LE(
279 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
280 ChromeOSPolicy::kTimeoutMaxBackoffInterval -
281 ChromeOSPolicy::kTimeoutMaxBackoffInterval / 2),
282 next_update_check);
283 EXPECT_GE(
284 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
285 ChromeOSPolicy::kTimeoutMaxBackoffInterval +
286 ChromeOSPolicy::kTimeoutMaxBackoffInterval /2),
287 next_update_check);
Alex Deymo0d11c602014-04-23 20:12:20 -0700288}
289
Alex Deymo63784a52014-05-28 10:46:14 -0700290TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWaitsForTheTimeout) {
Alex Deymo0d11c602014-04-23 20:12:20 -0700291 // We get the next update_check timestamp from the policy's private method
292 // and then we check the public method respects that value on the normal
293 // case.
294 Time next_update_check;
295 Time last_checked_time =
296 fake_clock_.GetWallclockTime() + TimeDelta::FromMinutes(1234);
297
Alex Deymo0d11c602014-04-23 20:12:20 -0700298 fake_state_.updater_provider()->var_last_checked_time()->reset(
299 new Time(last_checked_time));
300 ExpectPolicyStatus(EvalStatus::kSucceeded,
301 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
302
303 UpdateCheckParams result;
304
305 // Check that the policy blocks until the next_update_check is reached.
306 SetUpDefaultClock();
307 SetUpDefaultState();
308 fake_state_.updater_provider()->var_last_checked_time()->reset(
309 new Time(last_checked_time));
310 fake_clock_.SetWallclockTime(next_update_check - TimeDelta::FromSeconds(1));
311 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
312 &Policy::UpdateCheckAllowed, &result);
313
314 SetUpDefaultClock();
315 SetUpDefaultState();
316 fake_state_.updater_provider()->var_last_checked_time()->reset(
317 new Time(last_checked_time));
318 fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
319 ExpectPolicyStatus(EvalStatus::kSucceeded,
320 &Policy::UpdateCheckAllowed, &result);
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700321 EXPECT_TRUE(result.updates_enabled);
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700322 EXPECT_FALSE(result.is_interactive);
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700323}
324
325TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWaitsForOOBE) {
Alex Vakulenko072359c2014-07-18 11:41:07 -0700326 // Update checks are deferred until OOBE is completed.
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700327
328 // Ensure that update is not allowed even if wait period is satisfied.
329 Time next_update_check;
330 Time last_checked_time =
331 fake_clock_.GetWallclockTime() + TimeDelta::FromMinutes(1234);
332
333 fake_state_.updater_provider()->var_last_checked_time()->reset(
334 new Time(last_checked_time));
335 ExpectPolicyStatus(EvalStatus::kSucceeded,
336 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
337
338 SetUpDefaultClock();
339 SetUpDefaultState();
340 fake_state_.updater_provider()->var_last_checked_time()->reset(
341 new Time(last_checked_time));
342 fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
343 fake_state_.system_provider()->var_is_oobe_complete()->reset(
344 new bool(false));
345
346 UpdateCheckParams result;
347 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
348 &Policy::UpdateCheckAllowed, &result);
349
350 // Now check that it is allowed if OOBE is completed.
351 SetUpDefaultClock();
352 SetUpDefaultState();
353 fake_state_.updater_provider()->var_last_checked_time()->reset(
354 new Time(last_checked_time));
355 fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
356 ExpectPolicyStatus(EvalStatus::kSucceeded,
357 &Policy::UpdateCheckAllowed, &result);
358 EXPECT_TRUE(result.updates_enabled);
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700359 EXPECT_FALSE(result.is_interactive);
Alex Deymo0d11c602014-04-23 20:12:20 -0700360}
361
Gilad Arnold42f253b2014-06-25 12:39:17 -0700362TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWithAttributes) {
Alex Vakulenko072359c2014-07-18 11:41:07 -0700363 // Update check is allowed, response includes attributes for use in the
Gilad Arnold42f253b2014-06-25 12:39:17 -0700364 // request.
365 SetUpdateCheckAllowed(true);
366
367 // Override specific device policy attributes.
Gilad Arnoldd4b30322014-07-21 15:35:27 -0700368 fake_state_.device_policy_provider()->var_target_version_prefix()->
369 reset(new string("1.2"));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700370 fake_state_.device_policy_provider()->var_release_channel_delegated()->
371 reset(new bool(false));
372 fake_state_.device_policy_provider()->var_release_channel()->
373 reset(new string("foo-channel"));
374
375 UpdateCheckParams result;
376 ExpectPolicyStatus(EvalStatus::kSucceeded,
377 &Policy::UpdateCheckAllowed, &result);
378 EXPECT_TRUE(result.updates_enabled);
Gilad Arnoldd4b30322014-07-21 15:35:27 -0700379 EXPECT_EQ("1.2", result.target_version_prefix);
Gilad Arnold42f253b2014-06-25 12:39:17 -0700380 EXPECT_EQ("foo-channel", result.target_channel);
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700381 EXPECT_FALSE(result.is_interactive);
Gilad Arnold42f253b2014-06-25 12:39:17 -0700382}
383
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700384TEST_F(UmChromeOSPolicyTest,
385 UpdateCheckAllowedUpdatesDisabledForUnofficialBuilds) {
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700386 // UpdateCheckAllowed should return kAskMeAgainLater if this is an unofficial
387 // build; we don't want periodic update checks on developer images.
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700388
389 fake_state_.system_provider()->var_is_official_build()->reset(
390 new bool(false));
391
392 UpdateCheckParams result;
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700393 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700394 &Policy::UpdateCheckAllowed, &result);
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700395}
396
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700397TEST_F(UmChromeOSPolicyTest,
398 UpdateCheckAllowedUpdatesDisabledForRemovableBootDevice) {
399 // UpdateCheckAllowed should return false (kSucceeded) if the image booted
400 // from a removable device.
401
402 fake_state_.system_provider()->var_is_boot_device_removable()->reset(
403 new bool(true));
404
405 UpdateCheckParams result;
406 ExpectPolicyStatus(EvalStatus::kSucceeded,
407 &Policy::UpdateCheckAllowed, &result);
408 EXPECT_FALSE(result.updates_enabled);
409}
410
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700411TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedUpdatesDisabledByPolicy) {
Gilad Arnold42f253b2014-06-25 12:39:17 -0700412 // UpdateCheckAllowed should return kAskMeAgainLater because a device policy
413 // is loaded and prohibits updates.
414
415 SetUpdateCheckAllowed(false);
416 fake_state_.device_policy_provider()->var_update_disabled()->reset(
417 new bool(true));
418
Gilad Arnold42f253b2014-06-25 12:39:17 -0700419 UpdateCheckParams result;
420 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
421 &Policy::UpdateCheckAllowed, &result);
422}
423
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700424TEST_F(UmChromeOSPolicyTest,
425 UpdateCheckAllowedForcedUpdateRequestedInteractive) {
426 // UpdateCheckAllowed should return true because a forced update request was
427 // signaled for an interactive update.
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700428
429 SetUpdateCheckAllowed(true);
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700430 fake_state_.updater_provider()->var_forced_update_requested()->reset(
431 new UpdateRequestStatus(UpdateRequestStatus::kInteractive));
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700432
433 UpdateCheckParams result;
434 ExpectPolicyStatus(EvalStatus::kSucceeded,
435 &Policy::UpdateCheckAllowed, &result);
436 EXPECT_TRUE(result.updates_enabled);
437 EXPECT_TRUE(result.is_interactive);
438}
439
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700440TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedForcedUpdateRequestedPeriodic) {
441 // UpdateCheckAllowed should return true because a forced update request was
442 // signaled for a periodic check.
443
444 SetUpdateCheckAllowed(true);
445 fake_state_.updater_provider()->var_forced_update_requested()->reset(
446 new UpdateRequestStatus(UpdateRequestStatus::kPeriodic));
447
448 UpdateCheckParams result;
449 ExpectPolicyStatus(EvalStatus::kSucceeded,
450 &Policy::UpdateCheckAllowed, &result);
451 EXPECT_TRUE(result.updates_enabled);
452 EXPECT_FALSE(result.is_interactive);
453}
454
Alex Deymo63784a52014-05-28 10:46:14 -0700455TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsCheckAllowedError) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700456 // The UpdateCanStart policy fails, not being able to query
457 // UpdateCheckAllowed.
458
459 // Configure the UpdateCheckAllowed policy to fail.
460 fake_state_.updater_provider()->var_updater_started_time()->reset(nullptr);
461
462 // Check that the UpdateCanStart fails.
463 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700464 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700465 ExpectPolicyStatus(EvalStatus::kFailed,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700466 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700467}
468
Alex Deymo63784a52014-05-28 10:46:14 -0700469TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedCheckDue) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700470 // The UpdateCanStart policy returns false because we are due for another
Gilad Arnold14a9e702014-10-08 08:09:09 -0700471 // update check. Ensure that download related values are still returned.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700472
473 SetUpdateCheckAllowed(true);
474
475 // Check that the UpdateCanStart returns false.
476 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700477 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700478 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700479 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700480 EXPECT_FALSE(result.update_can_start);
481 EXPECT_EQ(UpdateCannotStartReason::kCheckDue, result.cannot_start_reason);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700482 EXPECT_EQ(0, result.download_url_idx);
483 EXPECT_EQ(0, result.download_url_num_errors);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700484}
485
Alex Deymo63784a52014-05-28 10:46:14 -0700486TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoDevicePolicy) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700487 // The UpdateCanStart policy returns true; no device policy is loaded.
488
489 SetUpdateCheckAllowed(false);
490 fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
491 new bool(false));
492
493 // Check that the UpdateCanStart returns true with no further attributes.
494 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700495 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700496 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700497 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700498 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700499 EXPECT_FALSE(result.p2p_downloading_allowed);
500 EXPECT_FALSE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700501 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700502 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700503 EXPECT_EQ(0, result.download_url_num_errors);
504 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700505}
506
Alex Deymo63784a52014-05-28 10:46:14 -0700507TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBlankPolicy) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700508 // The UpdateCanStart policy returns true; device policy is loaded but imposes
509 // no restrictions on updating.
510
511 SetUpdateCheckAllowed(false);
512
513 // Check that the UpdateCanStart returns true.
514 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700515 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700516 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700517 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700518 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700519 EXPECT_FALSE(result.p2p_downloading_allowed);
520 EXPECT_FALSE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700521 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700522 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700523 EXPECT_EQ(0, result.download_url_num_errors);
524 EXPECT_FALSE(result.do_increment_failures);
525}
526
527TEST_F(UmChromeOSPolicyTest,
528 UpdateCanStartNotAllowedBackoffNewWaitPeriodApplies) {
529 // The UpdateCanStart policy returns false; failures are reported and a new
530 // backoff period is enacted.
531
532 SetUpdateCheckAllowed(false);
533
534 const Time curr_time = fake_clock_.GetWallclockTime();
535 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
536 update_state.download_errors_max = 1;
537 update_state.download_errors.emplace_back(
538 0, ErrorCode::kDownloadTransferError,
539 curr_time - TimeDelta::FromSeconds(8));
540 update_state.download_errors.emplace_back(
541 0, ErrorCode::kDownloadTransferError,
542 curr_time - TimeDelta::FromSeconds(2));
543
544 // Check that UpdateCanStart returns false and a new backoff expiry is
545 // generated.
546 UpdateDownloadParams result;
547 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
548 update_state);
549 EXPECT_FALSE(result.update_can_start);
550 EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
551 EXPECT_TRUE(result.do_increment_failures);
552 EXPECT_LT(curr_time, result.backoff_expiry);
553}
554
555TEST_F(UmChromeOSPolicyTest,
556 UpdateCanStartNotAllowedBackoffPrevWaitPeriodStillApplies) {
557 // The UpdateCanStart policy returns false; a previously enacted backoff
558 // period still applies.
559
560 SetUpdateCheckAllowed(false);
561
562 const Time curr_time = fake_clock_.GetWallclockTime();
563 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
564 update_state.download_errors_max = 1;
565 update_state.download_errors.emplace_back(
566 0, ErrorCode::kDownloadTransferError,
567 curr_time - TimeDelta::FromSeconds(8));
568 update_state.download_errors.emplace_back(
569 0, ErrorCode::kDownloadTransferError,
570 curr_time - TimeDelta::FromSeconds(2));
571 update_state.failures_last_updated = curr_time;
572 update_state.backoff_expiry = curr_time + TimeDelta::FromMinutes(3);
573
574 // Check that UpdateCanStart returns false and a new backoff expiry is
575 // generated.
576 UpdateDownloadParams result;
577 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::UpdateCanStart,
578 &result, update_state);
579 EXPECT_FALSE(result.update_can_start);
580 EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
581 EXPECT_FALSE(result.do_increment_failures);
582 EXPECT_LT(curr_time, result.backoff_expiry);
583}
584
585TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffSatisfied) {
586 // The UpdateCanStart policy returns true; a previously enacted backoff period
587 // has elapsed, we're good to go.
588
589 SetUpdateCheckAllowed(false);
590
591 const Time curr_time = fake_clock_.GetWallclockTime();
592 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
593 update_state.download_errors_max = 1;
594 update_state.download_errors.emplace_back(
595 0, ErrorCode::kDownloadTransferError,
596 curr_time - TimeDelta::FromSeconds(8));
597 update_state.download_errors.emplace_back(
598 0, ErrorCode::kDownloadTransferError,
599 curr_time - TimeDelta::FromSeconds(2));
600 update_state.failures_last_updated = curr_time - TimeDelta::FromSeconds(1);
601 update_state.backoff_expiry = curr_time - TimeDelta::FromSeconds(1);
602
603 // Check that UpdateCanStart returns false and a new backoff expiry is
604 // generated.
605 UpdateDownloadParams result;
606 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart,
607 &result, update_state);
608 EXPECT_TRUE(result.update_can_start);
609 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
610 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700611 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700612 EXPECT_EQ(0, result.download_url_num_errors);
613 EXPECT_FALSE(result.do_increment_failures);
614 EXPECT_EQ(Time(), result.backoff_expiry);
615}
616
617TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffDisabled) {
618 // The UpdateCanStart policy returns false; failures are reported but backoff
619 // is disabled.
620
621 SetUpdateCheckAllowed(false);
622
623 const Time curr_time = fake_clock_.GetWallclockTime();
624 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
625 update_state.download_errors_max = 1;
626 update_state.download_errors.emplace_back(
627 0, ErrorCode::kDownloadTransferError,
628 curr_time - TimeDelta::FromSeconds(8));
629 update_state.download_errors.emplace_back(
630 0, ErrorCode::kDownloadTransferError,
631 curr_time - TimeDelta::FromSeconds(2));
632 update_state.is_backoff_disabled = true;
633
634 // Check that UpdateCanStart returns false and a new backoff expiry is
635 // generated.
636 UpdateDownloadParams result;
637 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
638 update_state);
639 EXPECT_TRUE(result.update_can_start);
640 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
641 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700642 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700643 EXPECT_EQ(0, result.download_url_num_errors);
644 EXPECT_TRUE(result.do_increment_failures);
645 EXPECT_EQ(Time(), result.backoff_expiry);
646}
647
648TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffInteractive) {
649 // The UpdateCanStart policy returns false; failures are reported but this is
650 // an interactive update check.
651
652 SetUpdateCheckAllowed(false);
653
654 const Time curr_time = fake_clock_.GetWallclockTime();
655 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
656 update_state.download_errors_max = 1;
657 update_state.download_errors.emplace_back(
658 0, ErrorCode::kDownloadTransferError,
659 curr_time - TimeDelta::FromSeconds(8));
660 update_state.download_errors.emplace_back(
661 0, ErrorCode::kDownloadTransferError,
662 curr_time - TimeDelta::FromSeconds(2));
663 update_state.is_interactive = true;
664
665 // Check that UpdateCanStart returns false and a new backoff expiry is
666 // generated.
667 UpdateDownloadParams result;
668 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
669 update_state);
670 EXPECT_TRUE(result.update_can_start);
671 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
672 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700673 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700674 EXPECT_EQ(0, result.download_url_num_errors);
675 EXPECT_TRUE(result.do_increment_failures);
676 EXPECT_EQ(Time(), result.backoff_expiry);
677}
678
679TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffDelta) {
680 // The UpdateCanStart policy returns false; failures are reported but this is
681 // a delta payload.
682
683 SetUpdateCheckAllowed(false);
684
685 const Time curr_time = fake_clock_.GetWallclockTime();
686 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
687 update_state.download_errors_max = 1;
688 update_state.download_errors.emplace_back(
689 0, ErrorCode::kDownloadTransferError,
690 curr_time - TimeDelta::FromSeconds(8));
691 update_state.download_errors.emplace_back(
692 0, ErrorCode::kDownloadTransferError,
693 curr_time - TimeDelta::FromSeconds(2));
694 update_state.is_delta_payload = true;
695
696 // Check that UpdateCanStart returns false and a new backoff expiry is
697 // generated.
698 UpdateDownloadParams result;
699 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
700 update_state);
701 EXPECT_TRUE(result.update_can_start);
702 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
703 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700704 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700705 EXPECT_EQ(0, result.download_url_num_errors);
706 EXPECT_TRUE(result.do_increment_failures);
707 EXPECT_EQ(Time(), result.backoff_expiry);
708}
709
710TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffUnofficialBuild) {
711 // The UpdateCanStart policy returns false; failures are reported but this is
712 // an unofficial build.
713
714 SetUpdateCheckAllowed(false);
715
716 const Time curr_time = fake_clock_.GetWallclockTime();
717 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
718 update_state.download_errors_max = 1;
719 update_state.download_errors.emplace_back(
720 0, ErrorCode::kDownloadTransferError,
721 curr_time - TimeDelta::FromSeconds(8));
722 update_state.download_errors.emplace_back(
723 0, ErrorCode::kDownloadTransferError,
724 curr_time - TimeDelta::FromSeconds(2));
725
726 fake_state_.system_provider()->var_is_official_build()->
727 reset(new bool(false));
728
729 // Check that UpdateCanStart returns false and a new backoff expiry is
730 // generated.
731 UpdateDownloadParams result;
732 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
733 update_state);
734 EXPECT_TRUE(result.update_can_start);
735 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
736 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700737 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700738 EXPECT_EQ(0, result.download_url_num_errors);
739 EXPECT_TRUE(result.do_increment_failures);
740 EXPECT_EQ(Time(), result.backoff_expiry);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700741}
742
Alex Deymo63784a52014-05-28 10:46:14 -0700743TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsScatteringFailed) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700744 // The UpdateCanStart policy fails because the UpdateScattering policy it
745 // depends on fails (unset variable).
746
747 SetUpdateCheckAllowed(false);
748
749 // Override the default seed variable with a null value so that the policy
750 // request would fail.
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700751 // TODO(garnold) This failure may or may not fail a number
752 // sub-policies/decisions, like scattering and backoff. We'll need a more
753 // deliberate setup to ensure that we're failing what we want to be failing.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700754 fake_state_.random_provider()->var_seed()->reset(nullptr);
755
756 // Check that the UpdateCanStart fails.
757 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700758 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700759 ExpectPolicyStatus(EvalStatus::kFailed,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700760 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700761}
762
Alex Deymo63784a52014-05-28 10:46:14 -0700763TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700764 UpdateCanStartNotAllowedScatteringNewWaitPeriodApplies) {
765 // The UpdateCanStart policy returns false; device policy is loaded and
766 // scattering applies due to an unsatisfied wait period, which was newly
767 // generated.
768
769 SetUpdateCheckAllowed(false);
770 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
771 new TimeDelta(TimeDelta::FromMinutes(2)));
772
773
774 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
775
776 // Check that the UpdateCanStart returns false and a new wait period
777 // generated.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700778 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700779 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700780 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700781 EXPECT_FALSE(result.update_can_start);
782 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
783 EXPECT_LT(TimeDelta(), result.scatter_wait_period);
784 EXPECT_EQ(0, result.scatter_check_threshold);
785}
786
Alex Deymo63784a52014-05-28 10:46:14 -0700787TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700788 UpdateCanStartNotAllowedScatteringPrevWaitPeriodStillApplies) {
789 // The UpdateCanStart policy returns false w/ kAskMeAgainLater; device policy
790 // is loaded and a previously generated scattering period still applies, none
791 // of the scattering values has changed.
792
793 SetUpdateCheckAllowed(false);
794 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
795 new TimeDelta(TimeDelta::FromMinutes(2)));
796
797 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
798 update_state.scatter_wait_period = TimeDelta::FromSeconds(35);
799
800 // Check that the UpdateCanStart returns false and a new wait period
801 // generated.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700802 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700803 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::UpdateCanStart,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700804 &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700805 EXPECT_FALSE(result.update_can_start);
806 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
807 EXPECT_EQ(TimeDelta::FromSeconds(35), result.scatter_wait_period);
808 EXPECT_EQ(0, result.scatter_check_threshold);
809}
810
Alex Deymo63784a52014-05-28 10:46:14 -0700811TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700812 UpdateCanStartNotAllowedScatteringNewCountThresholdApplies) {
813 // The UpdateCanStart policy returns false; device policy is loaded and
814 // scattering applies due to an unsatisfied update check count threshold.
815 //
816 // This ensures a non-zero check threshold, which may or may not be combined
817 // with a non-zero wait period (for which we cannot reliably control).
818
819 SetUpdateCheckAllowed(false);
820 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
821 new TimeDelta(TimeDelta::FromSeconds(1)));
822
823 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
824 update_state.scatter_check_threshold_min = 2;
825 update_state.scatter_check_threshold_max = 5;
826
827 // Check that the UpdateCanStart returns false.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700828 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700829 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700830 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700831 EXPECT_FALSE(result.update_can_start);
832 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
833 EXPECT_LE(2, result.scatter_check_threshold);
834 EXPECT_GE(5, result.scatter_check_threshold);
835}
836
Alex Deymo63784a52014-05-28 10:46:14 -0700837TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700838 UpdateCanStartNotAllowedScatteringPrevCountThresholdStillApplies) {
839 // The UpdateCanStart policy returns false; device policy is loaded and
840 // scattering due to a previously generated count threshold still applies.
841
842 SetUpdateCheckAllowed(false);
843 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
844 new TimeDelta(TimeDelta::FromSeconds(1)));
845
846 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
847 update_state.scatter_check_threshold = 3;
848 update_state.scatter_check_threshold_min = 2;
849 update_state.scatter_check_threshold_max = 5;
850
851 // Check that the UpdateCanStart returns false.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700852 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700853 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700854 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700855 EXPECT_FALSE(result.update_can_start);
856 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
857 EXPECT_EQ(3, result.scatter_check_threshold);
858}
859
Alex Deymo63784a52014-05-28 10:46:14 -0700860TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedScatteringSatisfied) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700861 // The UpdateCanStart policy returns true; device policy is loaded and
862 // scattering is enabled, but both wait period and check threshold are
863 // satisfied.
864
865 SetUpdateCheckAllowed(false);
866 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
867 new TimeDelta(TimeDelta::FromSeconds(120)));
868
869 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(75));
870 update_state.num_checks = 4;
871 update_state.scatter_wait_period = TimeDelta::FromSeconds(60);
872 update_state.scatter_check_threshold = 3;
873 update_state.scatter_check_threshold_min = 2;
874 update_state.scatter_check_threshold_max = 5;
875
876 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700877 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700878 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700879 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700880 EXPECT_TRUE(result.update_can_start);
881 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
882 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700883 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700884 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700885 EXPECT_EQ(0, result.download_url_num_errors);
886 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700887}
888
Alex Deymo63784a52014-05-28 10:46:14 -0700889TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700890 UpdateCanStartAllowedInteractivePreventsScattering) {
891 // The UpdateCanStart policy returns true; device policy is loaded and
892 // scattering would have applied, except that the update check is interactive
893 // and so it is suppressed.
894
895 SetUpdateCheckAllowed(false);
896 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
897 new TimeDelta(TimeDelta::FromSeconds(1)));
898
899 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700900 update_state.is_interactive = true;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700901 update_state.scatter_check_threshold = 0;
902 update_state.scatter_check_threshold_min = 2;
903 update_state.scatter_check_threshold_max = 5;
904
905 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700906 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700907 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700908 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700909 EXPECT_TRUE(result.update_can_start);
910 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
911 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700912 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700913 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700914 EXPECT_EQ(0, result.download_url_num_errors);
915 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700916}
917
Alex Deymo63784a52014-05-28 10:46:14 -0700918TEST_F(UmChromeOSPolicyTest,
Gilad Arnold76a11f62014-05-20 09:02:12 -0700919 UpdateCanStartAllowedOobePreventsScattering) {
920 // The UpdateCanStart policy returns true; device policy is loaded and
921 // scattering would have applied, except that OOBE was not completed and so it
922 // is suppressed.
923
924 SetUpdateCheckAllowed(false);
925 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
926 new TimeDelta(TimeDelta::FromSeconds(1)));
927 fake_state_.system_provider()->var_is_oobe_complete()->reset(new bool(false));
928
929 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700930 update_state.is_interactive = true;
Gilad Arnold76a11f62014-05-20 09:02:12 -0700931 update_state.scatter_check_threshold = 0;
932 update_state.scatter_check_threshold_min = 2;
933 update_state.scatter_check_threshold_max = 5;
934
935 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700936 UpdateDownloadParams result;
Gilad Arnold76a11f62014-05-20 09:02:12 -0700937 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700938 update_state);
Gilad Arnold76a11f62014-05-20 09:02:12 -0700939 EXPECT_TRUE(result.update_can_start);
940 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
941 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700942 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700943 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700944 EXPECT_EQ(0, result.download_url_num_errors);
945 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnold76a11f62014-05-20 09:02:12 -0700946}
947
Alex Deymo63784a52014-05-28 10:46:14 -0700948TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithAttributes) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700949 // The UpdateCanStart policy returns true; device policy permits both HTTP and
950 // P2P updates, as well as a non-empty target channel string.
951
952 SetUpdateCheckAllowed(false);
953
954 // Override specific device policy attributes.
955 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
956 new bool(true));
957 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
958 new bool(true));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700959
960 // Check that the UpdateCanStart returns true.
961 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700962 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700963 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700964 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700965 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700966 EXPECT_TRUE(result.p2p_downloading_allowed);
967 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700968 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700969 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700970 EXPECT_EQ(0, result.download_url_num_errors);
971 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700972}
973
Alex Deymo63784a52014-05-28 10:46:14 -0700974TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithP2PFromUpdater) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700975 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
976 // P2P updates, but the updater is configured to allow P2P and overrules the
977 // setting.
978
979 SetUpdateCheckAllowed(false);
980
981 // Override specific device policy attributes.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700982 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
983
984 // Check that the UpdateCanStart returns true.
985 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700986 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700987 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700988 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700989 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700990 EXPECT_TRUE(result.p2p_downloading_allowed);
991 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700992 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700993 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700994 EXPECT_EQ(0, result.download_url_num_errors);
995 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700996}
997
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700998TEST_F(UmChromeOSPolicyTest,
999 UpdateCanStartAllowedP2PDownloadBlockedDueToNumAttempts) {
Gilad Arnold349ac832014-10-06 14:20:28 -07001000 // The UpdateCanStart policy returns true; device policy permits HTTP but
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001001 // blocks P2P download, because the max number of P2P downloads have been
1002 // attempted. P2P sharing is still permitted.
Gilad Arnold349ac832014-10-06 14:20:28 -07001003
1004 SetUpdateCheckAllowed(false);
1005
1006 // Override specific device policy attributes.
1007 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1008 new bool(true));
1009 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1010 new bool(true));
1011
1012 // Check that the UpdateCanStart returns true.
1013 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1014 update_state.p2p_num_attempts = ChromeOSPolicy::kMaxP2PAttempts;
1015 UpdateDownloadParams result;
1016 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1017 update_state);
1018 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001019 EXPECT_FALSE(result.p2p_downloading_allowed);
1020 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnold349ac832014-10-06 14:20:28 -07001021}
1022
1023TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001024 UpdateCanStartAllowedP2PDownloadBlockedDueToAttemptsPeriod) {
Gilad Arnold349ac832014-10-06 14:20:28 -07001025 // The UpdateCanStart policy returns true; device policy permits HTTP but
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001026 // blocks P2P download, because the max period for attempt to download via P2P
1027 // has elapsed. P2P sharing is still permitted.
Gilad Arnold349ac832014-10-06 14:20:28 -07001028
1029 SetUpdateCheckAllowed(false);
1030
1031 // Override specific device policy attributes.
1032 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1033 new bool(true));
1034 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1035 new bool(true));
1036
1037 // Check that the UpdateCanStart returns true.
1038 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1039 update_state.p2p_num_attempts = 1;
1040 update_state.p2p_first_attempted =
1041 fake_clock_.GetWallclockTime() -
Alex Deymof329b932014-10-30 01:37:48 -07001042 TimeDelta::FromSeconds(
1043 ChromeOSPolicy::kMaxP2PAttemptsPeriodInSeconds + 1);
Gilad Arnold349ac832014-10-06 14:20:28 -07001044 UpdateDownloadParams result;
1045 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1046 update_state);
1047 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001048 EXPECT_FALSE(result.p2p_downloading_allowed);
1049 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnold349ac832014-10-06 14:20:28 -07001050}
1051
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001052TEST_F(UmChromeOSPolicyTest,
1053 UpdateCanStartAllowedWithHttpUrlForUnofficialBuild) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001054 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1055 // P2P updates, but marking this an unofficial build overrules the HTTP
1056 // setting.
1057
1058 SetUpdateCheckAllowed(false);
1059
1060 // Override specific device policy attributes.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001061 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1062 new bool(false));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001063 fake_state_.system_provider()->var_is_official_build()->
1064 reset(new bool(false));
1065
1066 // Check that the UpdateCanStart returns true.
1067 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001068 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001069 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001070 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001071 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001072 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001073 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001074 EXPECT_EQ(0, result.download_url_num_errors);
1075 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001076}
1077
1078TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithHttpsUrl) {
1079 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1080 // P2P updates, but an HTTPS URL is provided and selected for download.
1081
1082 SetUpdateCheckAllowed(false);
1083
1084 // Override specific device policy attributes.
1085 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1086 new bool(false));
1087
1088 // Add an HTTPS URL.
1089 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001090 update_state.download_urls.emplace_back("https://secure/url/");
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001091
1092 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001093 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001094 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001095 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001096 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001097 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001098 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001099 EXPECT_EQ(0, result.download_url_num_errors);
1100 EXPECT_FALSE(result.do_increment_failures);
1101}
1102
1103TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedMaxErrorsNotExceeded) {
1104 // The UpdateCanStart policy returns true; the first URL has download errors
1105 // but does not exceed the maximum allowed number of failures, so it is stilli
1106 // usable.
1107
1108 SetUpdateCheckAllowed(false);
1109
1110 // Add a second URL; update with this URL attempted and failed enough times to
1111 // disqualify the current (first) URL.
1112 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1113 update_state.num_checks = 5;
1114 update_state.download_urls.emplace_back("http://another/fake/url/");
1115 Time t = fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(12);
1116 for (int i = 0; i < 5; i++) {
1117 update_state.download_errors.emplace_back(
1118 0, ErrorCode::kDownloadTransferError, t);
1119 t += TimeDelta::FromSeconds(1);
1120 }
1121
1122 // Check that the UpdateCanStart returns true.
1123 UpdateDownloadParams result;
1124 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1125 update_state);
1126 EXPECT_TRUE(result.update_can_start);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001127 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001128 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001129 EXPECT_EQ(5, result.download_url_num_errors);
1130 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001131}
1132
1133TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlMaxExceeded) {
1134 // The UpdateCanStart policy returns true; the first URL exceeded the maximum
1135 // allowed number of failures, but a second URL is available.
1136
1137 SetUpdateCheckAllowed(false);
1138
1139 // Add a second URL; update with this URL attempted and failed enough times to
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001140 // disqualify the current (first) URL.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001141 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1142 update_state.num_checks = 10;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001143 update_state.download_urls.emplace_back("http://another/fake/url/");
1144 Time t = fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(12);
1145 for (int i = 0; i < 11; i++) {
1146 update_state.download_errors.emplace_back(
1147 0, ErrorCode::kDownloadTransferError, t);
1148 t += TimeDelta::FromSeconds(1);
1149 }
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001150
1151 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001152 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001153 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001154 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001155 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001156 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001157 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001158 EXPECT_EQ(0, result.download_url_num_errors);
1159 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001160}
1161
1162TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlHardError) {
1163 // The UpdateCanStart policy returns true; the first URL fails with a hard
1164 // error, but a second URL is available.
1165
1166 SetUpdateCheckAllowed(false);
1167
1168 // Add a second URL; update with this URL attempted and failed in a way that
1169 // causes it to switch directly to the next URL.
1170 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1171 update_state.num_checks = 10;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001172 update_state.download_urls.emplace_back("http://another/fake/url/");
1173 update_state.download_errors.emplace_back(
1174 0, ErrorCode::kPayloadHashMismatchError,
1175 fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(1));
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001176
1177 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001178 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001179 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001180 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001181 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001182 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001183 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001184 EXPECT_EQ(0, result.download_url_num_errors);
1185 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001186}
1187
1188TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedUrlWrapsAround) {
1189 // The UpdateCanStart policy returns true; URL search properly wraps around
1190 // the last one on the list.
1191
1192 SetUpdateCheckAllowed(false);
1193
1194 // Add a second URL; update with this URL attempted and failed in a way that
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001195 // causes it to switch directly to the next URL. We must disable backoff in
1196 // order for it not to interfere.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001197 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001198 update_state.num_checks = 1;
1199 update_state.is_backoff_disabled = true;
1200 update_state.download_urls.emplace_back("http://another/fake/url/");
1201 update_state.download_errors.emplace_back(
1202 1, ErrorCode::kPayloadHashMismatchError,
1203 fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(1));
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001204
1205 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001206 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001207 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001208 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001209 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001210 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001211 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001212 EXPECT_EQ(0, result.download_url_num_errors);
1213 EXPECT_TRUE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001214}
1215
1216TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedNoUsableUrls) {
1217 // The UpdateCanStart policy returns false; there's a single HTTP URL but its
1218 // use is forbidden by policy.
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001219 //
1220 // Note: In the case where no usable URLs are found, the policy should not
1221 // increment the number of failed attempts! Doing so would result in a
1222 // non-idempotent semantics, and does not fall within the intended purpose of
1223 // the backoff mechanism anyway.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001224
1225 SetUpdateCheckAllowed(false);
1226
1227 // Override specific device policy attributes.
1228 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1229 new bool(false));
1230
1231 // Check that the UpdateCanStart returns false.
1232 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001233 UpdateDownloadParams result;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001234 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1235 update_state);
1236 EXPECT_FALSE(result.update_can_start);
1237 EXPECT_EQ(UpdateCannotStartReason::kCannotDownload,
1238 result.cannot_start_reason);
1239 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001240}
1241
1242TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoUsableUrlsButP2PEnabled) {
1243 // The UpdateCanStart policy returns true; there's a single HTTP URL but its
1244 // use is forbidden by policy, however P2P is enabled. The result indicates
1245 // that no URL can be used.
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001246 //
1247 // Note: The number of failed attempts should not increase in this case (see
1248 // above test).
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001249
1250 SetUpdateCheckAllowed(false);
1251
1252 // Override specific device policy attributes.
1253 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1254 new bool(true));
1255 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1256 new bool(false));
1257
1258 // Check that the UpdateCanStart returns true.
1259 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001260 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001261 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001262 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001263 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001264 EXPECT_TRUE(result.p2p_downloading_allowed);
1265 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001266 EXPECT_GT(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001267 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001268 EXPECT_EQ(0, result.download_url_num_errors);
1269 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001270}
1271
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001272TEST_F(UmChromeOSPolicyTest,
1273 UpdateCanStartAllowedNoUsableUrlsButEnterpriseEnrolled) {
1274 // The UpdateCanStart policy returns true; there's a single HTTP URL but its
1275 // use is forbidden by policy, and P2P is unset on the policy, however the
1276 // device is enterprise-enrolled so P2P is allowed. The result indicates that
1277 // no URL can be used.
1278 //
1279 // Note: The number of failed attempts should not increase in this case (see
1280 // above test).
1281
1282 SetUpdateCheckAllowed(false);
1283
1284 // Override specific device policy attributes.
1285 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(nullptr);
1286 fake_state_.device_policy_provider()->var_owner()->reset(nullptr);
1287 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1288 new bool(false));
1289
1290 // Check that the UpdateCanStart returns true.
1291 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1292 UpdateDownloadParams result;
1293 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1294 update_state);
1295 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001296 EXPECT_TRUE(result.p2p_downloading_allowed);
1297 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001298 EXPECT_GT(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001299 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001300 EXPECT_EQ(0, result.download_url_num_errors);
1301 EXPECT_FALSE(result.do_increment_failures);
1302}
1303
Gilad Arnold684219d2014-07-07 14:54:57 -07001304TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedEthernetDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001305 // Ethernet is always allowed.
1306
1307 fake_state_.shill_provider()->var_conn_type()->
1308 reset(new ConnectionType(ConnectionType::kEthernet));
1309
1310 bool result;
1311 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001312 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001313 EXPECT_TRUE(result);
1314}
1315
Gilad Arnold684219d2014-07-07 14:54:57 -07001316TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWifiDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001317 // Wifi is allowed if not tethered.
1318
1319 fake_state_.shill_provider()->var_conn_type()->
1320 reset(new ConnectionType(ConnectionType::kWifi));
1321
1322 bool result;
1323 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001324 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001325 EXPECT_TRUE(result);
1326}
1327
Alex Deymo63784a52014-05-28 10:46:14 -07001328TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001329 UpdateCurrentConnectionNotAllowedWifiTetheredDefault) {
1330 // Tethered wifi is not allowed by default.
1331
1332 fake_state_.shill_provider()->var_conn_type()->
1333 reset(new ConnectionType(ConnectionType::kWifi));
1334 fake_state_.shill_provider()->var_conn_tethering()->
1335 reset(new ConnectionTethering(ConnectionTethering::kConfirmed));
1336
1337 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001338 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001339 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001340}
1341
Alex Deymo63784a52014-05-28 10:46:14 -07001342TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001343 UpdateDownloadAllowedWifiTetheredPolicyOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001344 // Tethered wifi can be allowed by policy.
1345
1346 fake_state_.shill_provider()->var_conn_type()->
1347 reset(new ConnectionType(ConnectionType::kWifi));
1348 fake_state_.shill_provider()->var_conn_tethering()->
1349 reset(new ConnectionTethering(ConnectionTethering::kConfirmed));
1350 set<ConnectionType> allowed_connections;
1351 allowed_connections.insert(ConnectionType::kCellular);
1352 fake_state_.device_policy_provider()->
1353 var_allowed_connection_types_for_update()->
1354 reset(new set<ConnectionType>(allowed_connections));
1355
1356 bool result;
1357 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001358 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001359 EXPECT_TRUE(result);
1360}
1361
Gilad Arnold684219d2014-07-07 14:54:57 -07001362TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWimaxDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001363 // Wimax is always allowed.
1364
1365 fake_state_.shill_provider()->var_conn_type()->
1366 reset(new ConnectionType(ConnectionType::kWifi));
1367
1368 bool result;
1369 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001370 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001371 EXPECT_TRUE(result);
1372}
1373
Alex Deymo63784a52014-05-28 10:46:14 -07001374TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001375 UpdateCurrentConnectionNotAllowedBluetoothDefault) {
1376 // Bluetooth is never allowed.
1377
1378 fake_state_.shill_provider()->var_conn_type()->
1379 reset(new ConnectionType(ConnectionType::kBluetooth));
1380
1381 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001382 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001383 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001384}
1385
Alex Deymo63784a52014-05-28 10:46:14 -07001386TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001387 UpdateCurrentConnectionNotAllowedBluetoothPolicyCannotOverride) {
1388 // Bluetooth cannot be allowed even by policy.
1389
1390 fake_state_.shill_provider()->var_conn_type()->
1391 reset(new ConnectionType(ConnectionType::kBluetooth));
1392 set<ConnectionType> allowed_connections;
1393 allowed_connections.insert(ConnectionType::kBluetooth);
1394 fake_state_.device_policy_provider()->
1395 var_allowed_connection_types_for_update()->
1396 reset(new set<ConnectionType>(allowed_connections));
1397
1398 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001399 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001400 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001401}
1402
Alex Deymo63784a52014-05-28 10:46:14 -07001403TEST_F(UmChromeOSPolicyTest, UpdateCurrentConnectionNotAllowedCellularDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001404 // Cellular is not allowed by default.
1405
1406 fake_state_.shill_provider()->var_conn_type()->
1407 reset(new ConnectionType(ConnectionType::kCellular));
1408
1409 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001410 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001411 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001412}
1413
Alex Deymo63784a52014-05-28 10:46:14 -07001414TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001415 UpdateDownloadAllowedCellularPolicyOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001416 // Update over cellular can be enabled by policy.
1417
1418 fake_state_.shill_provider()->var_conn_type()->
1419 reset(new ConnectionType(ConnectionType::kCellular));
1420 set<ConnectionType> allowed_connections;
1421 allowed_connections.insert(ConnectionType::kCellular);
1422 fake_state_.device_policy_provider()->
1423 var_allowed_connection_types_for_update()->
1424 reset(new set<ConnectionType>(allowed_connections));
1425
1426 bool result;
1427 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001428 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001429 EXPECT_TRUE(result);
1430}
1431
Alex Deymo63784a52014-05-28 10:46:14 -07001432TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001433 UpdateDownloadAllowedCellularUserOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001434 // Update over cellular can be enabled by user settings, but only if policy
1435 // is present and does not determine allowed connections.
1436
1437 fake_state_.shill_provider()->var_conn_type()->
1438 reset(new ConnectionType(ConnectionType::kCellular));
1439 set<ConnectionType> allowed_connections;
1440 allowed_connections.insert(ConnectionType::kCellular);
1441 fake_state_.updater_provider()->var_cellular_enabled()->
1442 reset(new bool(true));
1443
1444 bool result;
1445 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001446 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001447 EXPECT_TRUE(result);
1448}
1449
Gilad Arnold14a9e702014-10-08 08:09:09 -07001450TEST_F(UmChromeOSPolicyTest,
1451 UpdateCanStartAllowedScatteringSupressedDueToP2P) {
1452 // The UpdateCanStart policy returns true; scattering should have applied, but
1453 // P2P download is allowed. Scattering values are nonetheless returned, and so
1454 // are download URL values, albeit the latter are not allowed to be used.
1455
1456 SetUpdateCheckAllowed(false);
1457 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
1458 new TimeDelta(TimeDelta::FromMinutes(2)));
1459 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1460
1461 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
1462 update_state.scatter_wait_period = TimeDelta::FromSeconds(35);
1463
1464 UpdateDownloadParams result;
1465 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart,
1466 &result, update_state);
1467 EXPECT_TRUE(result.update_can_start);
1468 EXPECT_EQ(0, result.download_url_idx);
1469 EXPECT_FALSE(result.download_url_allowed);
1470 EXPECT_EQ(0, result.download_url_num_errors);
1471 EXPECT_TRUE(result.p2p_downloading_allowed);
1472 EXPECT_TRUE(result.p2p_sharing_allowed);
1473 EXPECT_FALSE(result.do_increment_failures);
1474 EXPECT_EQ(TimeDelta::FromSeconds(35), result.scatter_wait_period);
1475 EXPECT_EQ(0, result.scatter_check_threshold);
1476}
1477
1478TEST_F(UmChromeOSPolicyTest,
1479 UpdateCanStartAllowedBackoffSupressedDueToP2P) {
1480 // The UpdateCanStart policy returns true; backoff should have applied, but
1481 // P2P download is allowed. Backoff values are nonetheless returned, and so
1482 // are download URL values, albeit the latter are not allowed to be used.
1483
1484 SetUpdateCheckAllowed(false);
1485
1486 const Time curr_time = fake_clock_.GetWallclockTime();
1487 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
1488 update_state.download_errors_max = 1;
1489 update_state.download_errors.emplace_back(
1490 0, ErrorCode::kDownloadTransferError,
1491 curr_time - TimeDelta::FromSeconds(8));
1492 update_state.download_errors.emplace_back(
1493 0, ErrorCode::kDownloadTransferError,
1494 curr_time - TimeDelta::FromSeconds(2));
1495 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1496
1497 UpdateDownloadParams result;
1498 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1499 update_state);
1500 EXPECT_TRUE(result.update_can_start);
1501 EXPECT_EQ(0, result.download_url_idx);
1502 EXPECT_FALSE(result.download_url_allowed);
1503 EXPECT_EQ(0, result.download_url_num_errors);
1504 EXPECT_TRUE(result.p2p_downloading_allowed);
1505 EXPECT_TRUE(result.p2p_sharing_allowed);
1506 EXPECT_TRUE(result.do_increment_failures);
1507 EXPECT_LT(curr_time, result.backoff_expiry);
1508}
1509
Alex Deymo63784a52014-05-28 10:46:14 -07001510} // namespace chromeos_update_manager