blob: ae741e74ae464b625cf0f8d2e89a70d016835041 [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 Arnolddc4bb262014-07-23 10:45:19 -070024using std::make_tuple;
Gilad Arnold0adbc942014-05-12 10:35:43 -070025using std::set;
Alex Deymo0d11c602014-04-23 20:12:20 -070026using std::string;
Gilad Arnolddc4bb262014-07-23 10:45:19 -070027using std::tuple;
Gilad Arnoldb3b05442014-05-30 14:25:05 -070028using std::vector;
Alex Deymo0d11c602014-04-23 20:12:20 -070029
Alex Deymo63784a52014-05-28 10:46:14 -070030namespace chromeos_update_manager {
Alex Deymo0d11c602014-04-23 20:12:20 -070031
Alex Deymo63784a52014-05-28 10:46:14 -070032class UmChromeOSPolicyTest : public ::testing::Test {
Alex Deymo0d11c602014-04-23 20:12:20 -070033 protected:
34 virtual void SetUp() {
35 SetUpDefaultClock();
Gilad Arnoldb2271992014-06-19 12:35:24 -070036 eval_ctx_ = new EvaluationContext(&fake_clock_, TimeDelta::FromSeconds(5));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070037 SetUpDefaultState();
38 SetUpDefaultDevicePolicy();
Alex Deymo0d11c602014-04-23 20:12:20 -070039 }
40
41 // Sets the clock to fixed values.
42 void SetUpDefaultClock() {
43 fake_clock_.SetMonotonicTime(Time::FromInternalValue(12345678L));
44 fake_clock_.SetWallclockTime(Time::FromInternalValue(12345678901234L));
45 }
46
47 void SetUpDefaultState() {
48 fake_state_.updater_provider()->var_updater_started_time()->reset(
49 new Time(fake_clock_.GetWallclockTime()));
50 fake_state_.updater_provider()->var_last_checked_time()->reset(
51 new Time(fake_clock_.GetWallclockTime()));
52 fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -070053 reset(new unsigned int{0});
Gilad Arnolda0258a52014-07-10 16:21:19 -070054 fake_state_.updater_provider()->var_server_dictated_poll_interval()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -070055 reset(new unsigned int{0});
56 fake_state_.updater_provider()->var_forced_update_requested()->
57 reset(new UpdateRequestStatus{UpdateRequestStatus::kNone});
Alex Deymo0d11c602014-04-23 20:12:20 -070058
59 fake_state_.random_provider()->var_seed()->reset(
60 new uint64_t(4)); // chosen by fair dice roll.
61 // guaranteed to be random.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070062
63 // No device policy loaded by default.
64 fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
65 new bool(false));
66
Gilad Arnolda1eabcd2014-07-09 15:42:40 -070067 // OOBE is enabled by default.
68 fake_state_.config_provider()->var_is_oobe_enabled()->reset(
69 new bool(true));
70
Gilad Arnold76a11f62014-05-20 09:02:12 -070071 // For the purpose of the tests, this is an official build and OOBE was
72 // completed.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070073 fake_state_.system_provider()->var_is_official_build()->reset(
74 new bool(true));
Gilad Arnold76a11f62014-05-20 09:02:12 -070075 fake_state_.system_provider()->var_is_oobe_complete()->reset(
76 new bool(true));
Gilad Arnoldbfc44f72014-07-09 14:41:39 -070077 fake_state_.system_provider()->var_is_boot_device_removable()->reset(
78 new bool(false));
Gilad Arnold0adbc942014-05-12 10:35:43 -070079
80 // Connection is wifi, untethered.
81 fake_state_.shill_provider()->var_conn_type()->
82 reset(new ConnectionType(ConnectionType::kWifi));
83 fake_state_.shill_provider()->var_conn_tethering()->
84 reset(new ConnectionTethering(ConnectionTethering::kNotDetected));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070085 }
86
Gilad Arnoldb3b05442014-05-30 14:25:05 -070087 // Sets up a default device policy that does not impose any restrictions
88 // (HTTP) nor enables any features (P2P).
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070089 void SetUpDefaultDevicePolicy() {
90 fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
91 new bool(true));
92 fake_state_.device_policy_provider()->var_update_disabled()->reset(
93 new bool(false));
94 fake_state_.device_policy_provider()->
95 var_allowed_connection_types_for_update()->reset(nullptr);
96 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
97 new TimeDelta());
98 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
Gilad Arnoldb3b05442014-05-30 14:25:05 -070099 new bool(true));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700100 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
101 new bool(false));
102 fake_state_.device_policy_provider()->var_release_channel_delegated()->
103 reset(new bool(true));
104 }
105
106 // Configures the UpdateCheckAllowed policy to return a desired value by
107 // faking the current wall clock time as needed. Restores the default state.
108 // This is used when testing policies that depend on this one.
109 void SetUpdateCheckAllowed(bool allow_check) {
110 Time next_update_check;
111 ExpectPolicyStatus(EvalStatus::kSucceeded,
112 &ChromeOSPolicy::NextUpdateCheckTime,
113 &next_update_check);
114 SetUpDefaultState();
115 SetUpDefaultDevicePolicy();
116 Time curr_time = next_update_check;
117 if (allow_check)
118 curr_time += TimeDelta::FromSeconds(1);
119 else
120 curr_time -= TimeDelta::FromSeconds(1);
121 fake_clock_.SetWallclockTime(curr_time);
122 }
123
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700124 // Returns a default UpdateState structure:
125 UpdateState GetDefaultUpdateState(TimeDelta first_seen_period) {
126 Time first_seen_time = fake_clock_.GetWallclockTime() - first_seen_period;
127 UpdateState update_state = UpdateState();
128
129 // This is a non-interactive check returning a delta payload, seen for the
130 // first time (|first_seen_period| ago). Clearly, there were no failed
131 // attempts so far.
132 update_state.is_interactive = false;
133 update_state.is_delta_payload = false;
134 update_state.first_seen = first_seen_time;
135 update_state.num_checks = 1;
136 update_state.num_failures = 0;
137 update_state.failures_last_updated = Time(); // Needs to be zero.
138 // There's a single HTTP download URL with a maximum of 10 retries.
139 update_state.download_urls = vector<string>{"http://fake/url/"};
140 update_state.download_errors_max = 10;
141 // Download was never attempted.
142 update_state.last_download_url_idx = -1;
143 update_state.last_download_url_num_errors = 0;
144 // There were no download errors.
145 update_state.download_errors = vector<tuple<int, ErrorCode, Time>>();
146 // No active backoff period, backoff is not disabled by Omaha.
147 update_state.backoff_expiry = Time();
148 update_state.is_backoff_disabled = false;
149 // There is no active scattering wait period (max 7 days allowed) nor check
150 // threshold (none allowed).
151 update_state.scatter_wait_period = TimeDelta();
152 update_state.scatter_check_threshold = 0;
153 update_state.scatter_wait_period_max = TimeDelta::FromDays(7);
154 update_state.scatter_check_threshold_min = 0;
155 update_state.scatter_check_threshold_max = 0;
156
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700157 return update_state;
Alex Deymo0d11c602014-04-23 20:12:20 -0700158 }
159
160 // Runs the passed |policy_method| policy and expects it to return the
161 // |expected| return value.
162 template<typename T, typename R, typename... Args>
163 void ExpectPolicyStatus(
164 EvalStatus expected,
165 T policy_method,
166 R* result, Args... args) {
167 string error = "<None>";
168 eval_ctx_->ResetEvaluation();
169 EXPECT_EQ(expected,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700170 (policy_.*policy_method)(eval_ctx_, &fake_state_, &error, result,
171 args...))
Alex Deymoc850b4f2014-05-19 11:06:41 -0700172 << "Returned error: " << error
173 << "\nEvaluation context: " << eval_ctx_->DumpContext();
Alex Deymo0d11c602014-04-23 20:12:20 -0700174 }
175
176 FakeClock fake_clock_;
177 FakeState fake_state_;
178 scoped_refptr<EvaluationContext> eval_ctx_;
179 ChromeOSPolicy policy_; // ChromeOSPolicy under test.
180};
181
Alex Deymo63784a52014-05-28 10:46:14 -0700182TEST_F(UmChromeOSPolicyTest, FirstCheckIsAtMostInitialIntervalAfterStart) {
Alex Deymo0d11c602014-04-23 20:12:20 -0700183 Time next_update_check;
184
Gilad Arnold38b14022014-07-09 12:45:56 -0700185 // Set the last update time so it'll appear as if this is a first update check
186 // in the lifetime of the current updater.
187 fake_state_.updater_provider()->var_last_checked_time()->reset(
188 new Time(fake_clock_.GetWallclockTime() - TimeDelta::FromMinutes(10)));
189
Alex Deymo0d11c602014-04-23 20:12:20 -0700190 ExpectPolicyStatus(EvalStatus::kSucceeded,
191 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
192
193 EXPECT_LE(fake_clock_.GetWallclockTime(), next_update_check);
Gilad Arnold38b14022014-07-09 12:45:56 -0700194 EXPECT_GE(
195 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
196 ChromeOSPolicy::kTimeoutInitialInterval +
197 ChromeOSPolicy::kTimeoutRegularFuzz / 2),
198 next_update_check);
199}
200
201TEST_F(UmChromeOSPolicyTest, RecurringCheckBaseIntervalAndFuzz) {
202 // Ensure that we're using the correct interval (kPeriodicInterval) and fuzz
203 // (kTimeoutRegularFuzz) as base values for period updates.
204 Time next_update_check;
205
206 ExpectPolicyStatus(EvalStatus::kSucceeded,
207 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
208
209 EXPECT_LE(
210 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
211 ChromeOSPolicy::kTimeoutPeriodicInterval -
212 ChromeOSPolicy::kTimeoutRegularFuzz / 2),
213 next_update_check);
214 EXPECT_GE(
215 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
216 ChromeOSPolicy::kTimeoutPeriodicInterval +
217 ChromeOSPolicy::kTimeoutRegularFuzz / 2),
218 next_update_check);
219}
220
221TEST_F(UmChromeOSPolicyTest, RecurringCheckBackoffIntervalAndFuzz) {
222 // Ensure that we're properly backing off and fuzzing in the presence of
223 // failed updates attempts.
224 Time next_update_check;
225
226 fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700227 reset(new unsigned int{2});
Gilad Arnold38b14022014-07-09 12:45:56 -0700228
229 ExpectPolicyStatus(EvalStatus::kSucceeded,
230 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
231
232 int expected_interval = ChromeOSPolicy::kTimeoutPeriodicInterval * 4;
233 EXPECT_LE(
234 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
235 expected_interval - expected_interval / 2),
236 next_update_check);
237 EXPECT_GE(
238 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
239 expected_interval + expected_interval / 2),
240 next_update_check);
Alex Deymo0d11c602014-04-23 20:12:20 -0700241}
242
Gilad Arnolda0258a52014-07-10 16:21:19 -0700243TEST_F(UmChromeOSPolicyTest, RecurringCheckServerDictatedPollInterval) {
244 // Policy honors the server provided check poll interval.
245 Time next_update_check;
246
247 const unsigned int kInterval = ChromeOSPolicy::kTimeoutPeriodicInterval * 4;
248 fake_state_.updater_provider()->var_server_dictated_poll_interval()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700249 reset(new unsigned int{kInterval});
Gilad Arnolda0258a52014-07-10 16:21:19 -0700250 // We should not be backing off in this case.
251 fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700252 reset(new unsigned int{2});
Gilad Arnolda0258a52014-07-10 16:21:19 -0700253
254 ExpectPolicyStatus(EvalStatus::kSucceeded,
255 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
256
257 EXPECT_LE(
258 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
259 kInterval - kInterval / 2),
260 next_update_check);
261 EXPECT_GE(
262 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
263 kInterval + kInterval / 2),
264 next_update_check);
265}
266
Alex Deymo63784a52014-05-28 10:46:14 -0700267TEST_F(UmChromeOSPolicyTest, ExponentialBackoffIsCapped) {
Alex Deymo0d11c602014-04-23 20:12:20 -0700268 Time next_update_check;
269
Alex Deymo0d11c602014-04-23 20:12:20 -0700270 fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700271 reset(new unsigned int{100});
Gilad Arnold38b14022014-07-09 12:45:56 -0700272
Alex Deymo0d11c602014-04-23 20:12:20 -0700273 ExpectPolicyStatus(EvalStatus::kSucceeded,
274 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
275
Gilad Arnold38b14022014-07-09 12:45:56 -0700276 EXPECT_LE(
277 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
278 ChromeOSPolicy::kTimeoutMaxBackoffInterval -
279 ChromeOSPolicy::kTimeoutMaxBackoffInterval / 2),
280 next_update_check);
281 EXPECT_GE(
282 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
283 ChromeOSPolicy::kTimeoutMaxBackoffInterval +
284 ChromeOSPolicy::kTimeoutMaxBackoffInterval /2),
285 next_update_check);
Alex Deymo0d11c602014-04-23 20:12:20 -0700286}
287
Alex Deymo63784a52014-05-28 10:46:14 -0700288TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWaitsForTheTimeout) {
Alex Deymo0d11c602014-04-23 20:12:20 -0700289 // We get the next update_check timestamp from the policy's private method
290 // and then we check the public method respects that value on the normal
291 // case.
292 Time next_update_check;
293 Time last_checked_time =
294 fake_clock_.GetWallclockTime() + TimeDelta::FromMinutes(1234);
295
Alex Deymo0d11c602014-04-23 20:12:20 -0700296 fake_state_.updater_provider()->var_last_checked_time()->reset(
297 new Time(last_checked_time));
298 ExpectPolicyStatus(EvalStatus::kSucceeded,
299 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
300
301 UpdateCheckParams result;
302
303 // Check that the policy blocks until the next_update_check is reached.
304 SetUpDefaultClock();
305 SetUpDefaultState();
306 fake_state_.updater_provider()->var_last_checked_time()->reset(
307 new Time(last_checked_time));
308 fake_clock_.SetWallclockTime(next_update_check - TimeDelta::FromSeconds(1));
309 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
310 &Policy::UpdateCheckAllowed, &result);
311
312 SetUpDefaultClock();
313 SetUpDefaultState();
314 fake_state_.updater_provider()->var_last_checked_time()->reset(
315 new Time(last_checked_time));
316 fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
317 ExpectPolicyStatus(EvalStatus::kSucceeded,
318 &Policy::UpdateCheckAllowed, &result);
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700319 EXPECT_TRUE(result.updates_enabled);
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700320 EXPECT_FALSE(result.is_interactive);
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700321}
322
323TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWaitsForOOBE) {
Alex Vakulenko072359c2014-07-18 11:41:07 -0700324 // Update checks are deferred until OOBE is completed.
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700325
326 // Ensure that update is not allowed even if wait period is satisfied.
327 Time next_update_check;
328 Time last_checked_time =
329 fake_clock_.GetWallclockTime() + TimeDelta::FromMinutes(1234);
330
331 fake_state_.updater_provider()->var_last_checked_time()->reset(
332 new Time(last_checked_time));
333 ExpectPolicyStatus(EvalStatus::kSucceeded,
334 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
335
336 SetUpDefaultClock();
337 SetUpDefaultState();
338 fake_state_.updater_provider()->var_last_checked_time()->reset(
339 new Time(last_checked_time));
340 fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
341 fake_state_.system_provider()->var_is_oobe_complete()->reset(
342 new bool(false));
343
344 UpdateCheckParams result;
345 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
346 &Policy::UpdateCheckAllowed, &result);
347
348 // Now check that it is allowed if OOBE is completed.
349 SetUpDefaultClock();
350 SetUpDefaultState();
351 fake_state_.updater_provider()->var_last_checked_time()->reset(
352 new Time(last_checked_time));
353 fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
354 ExpectPolicyStatus(EvalStatus::kSucceeded,
355 &Policy::UpdateCheckAllowed, &result);
356 EXPECT_TRUE(result.updates_enabled);
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700357 EXPECT_FALSE(result.is_interactive);
Alex Deymo0d11c602014-04-23 20:12:20 -0700358}
359
Gilad Arnold42f253b2014-06-25 12:39:17 -0700360TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWithAttributes) {
Alex Vakulenko072359c2014-07-18 11:41:07 -0700361 // Update check is allowed, response includes attributes for use in the
Gilad Arnold42f253b2014-06-25 12:39:17 -0700362 // request.
363 SetUpdateCheckAllowed(true);
364
365 // Override specific device policy attributes.
Gilad Arnoldd4b30322014-07-21 15:35:27 -0700366 fake_state_.device_policy_provider()->var_target_version_prefix()->
367 reset(new string("1.2"));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700368 fake_state_.device_policy_provider()->var_release_channel_delegated()->
369 reset(new bool(false));
370 fake_state_.device_policy_provider()->var_release_channel()->
371 reset(new string("foo-channel"));
372
373 UpdateCheckParams result;
374 ExpectPolicyStatus(EvalStatus::kSucceeded,
375 &Policy::UpdateCheckAllowed, &result);
376 EXPECT_TRUE(result.updates_enabled);
Gilad Arnoldd4b30322014-07-21 15:35:27 -0700377 EXPECT_EQ("1.2", result.target_version_prefix);
Gilad Arnold42f253b2014-06-25 12:39:17 -0700378 EXPECT_EQ("foo-channel", result.target_channel);
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700379 EXPECT_FALSE(result.is_interactive);
Gilad Arnold42f253b2014-06-25 12:39:17 -0700380}
381
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700382TEST_F(UmChromeOSPolicyTest,
383 UpdateCheckAllowedUpdatesDisabledForUnofficialBuilds) {
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700384 // UpdateCheckAllowed should return kAskMeAgainLater if this is an unofficial
385 // build; we don't want periodic update checks on developer images.
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700386
387 fake_state_.system_provider()->var_is_official_build()->reset(
388 new bool(false));
389
390 UpdateCheckParams result;
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700391 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700392 &Policy::UpdateCheckAllowed, &result);
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700393}
394
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700395TEST_F(UmChromeOSPolicyTest,
396 UpdateCheckAllowedUpdatesDisabledForRemovableBootDevice) {
397 // UpdateCheckAllowed should return false (kSucceeded) if the image booted
398 // from a removable device.
399
400 fake_state_.system_provider()->var_is_boot_device_removable()->reset(
401 new bool(true));
402
403 UpdateCheckParams result;
404 ExpectPolicyStatus(EvalStatus::kSucceeded,
405 &Policy::UpdateCheckAllowed, &result);
406 EXPECT_FALSE(result.updates_enabled);
407}
408
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700409TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedUpdatesDisabledByPolicy) {
Gilad Arnold42f253b2014-06-25 12:39:17 -0700410 // UpdateCheckAllowed should return kAskMeAgainLater because a device policy
411 // is loaded and prohibits updates.
412
413 SetUpdateCheckAllowed(false);
414 fake_state_.device_policy_provider()->var_update_disabled()->reset(
415 new bool(true));
416
Gilad Arnold42f253b2014-06-25 12:39:17 -0700417 UpdateCheckParams result;
418 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
419 &Policy::UpdateCheckAllowed, &result);
420}
421
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700422TEST_F(UmChromeOSPolicyTest,
423 UpdateCheckAllowedForcedUpdateRequestedInteractive) {
424 // UpdateCheckAllowed should return true because a forced update request was
425 // signaled for an interactive update.
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700426
427 SetUpdateCheckAllowed(true);
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700428 fake_state_.updater_provider()->var_forced_update_requested()->reset(
429 new UpdateRequestStatus(UpdateRequestStatus::kInteractive));
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700430
431 UpdateCheckParams result;
432 ExpectPolicyStatus(EvalStatus::kSucceeded,
433 &Policy::UpdateCheckAllowed, &result);
434 EXPECT_TRUE(result.updates_enabled);
435 EXPECT_TRUE(result.is_interactive);
436}
437
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700438TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedForcedUpdateRequestedPeriodic) {
439 // UpdateCheckAllowed should return true because a forced update request was
440 // signaled for a periodic check.
441
442 SetUpdateCheckAllowed(true);
443 fake_state_.updater_provider()->var_forced_update_requested()->reset(
444 new UpdateRequestStatus(UpdateRequestStatus::kPeriodic));
445
446 UpdateCheckParams result;
447 ExpectPolicyStatus(EvalStatus::kSucceeded,
448 &Policy::UpdateCheckAllowed, &result);
449 EXPECT_TRUE(result.updates_enabled);
450 EXPECT_FALSE(result.is_interactive);
451}
452
Alex Deymo63784a52014-05-28 10:46:14 -0700453TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsCheckAllowedError) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700454 // The UpdateCanStart policy fails, not being able to query
455 // UpdateCheckAllowed.
456
457 // Configure the UpdateCheckAllowed policy to fail.
458 fake_state_.updater_provider()->var_updater_started_time()->reset(nullptr);
459
460 // Check that the UpdateCanStart fails.
461 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700462 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700463 ExpectPolicyStatus(EvalStatus::kFailed,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700464 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700465}
466
Alex Deymo63784a52014-05-28 10:46:14 -0700467TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedCheckDue) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700468 // The UpdateCanStart policy returns false because we are due for another
469 // update check.
470
471 SetUpdateCheckAllowed(true);
472
473 // Check that the UpdateCanStart returns false.
474 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700475 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700476 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700477 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700478 EXPECT_FALSE(result.update_can_start);
479 EXPECT_EQ(UpdateCannotStartReason::kCheckDue, result.cannot_start_reason);
480}
481
Alex Deymo63784a52014-05-28 10:46:14 -0700482TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoDevicePolicy) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700483 // The UpdateCanStart policy returns true; no device policy is loaded.
484
485 SetUpdateCheckAllowed(false);
486 fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
487 new bool(false));
488
489 // Check that the UpdateCanStart returns true with no further attributes.
490 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700491 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700492 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700493 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700494 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700495 EXPECT_FALSE(result.p2p_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700496 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700497 EXPECT_EQ(0, result.download_url_num_errors);
498 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700499}
500
Alex Deymo63784a52014-05-28 10:46:14 -0700501TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBlankPolicy) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700502 // The UpdateCanStart policy returns true; device policy is loaded but imposes
503 // no restrictions on updating.
504
505 SetUpdateCheckAllowed(false);
506
507 // Check that the UpdateCanStart returns true.
508 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700509 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700510 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700511 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700512 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700513 EXPECT_FALSE(result.p2p_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700514 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700515 EXPECT_EQ(0, result.download_url_num_errors);
516 EXPECT_FALSE(result.do_increment_failures);
517}
518
519TEST_F(UmChromeOSPolicyTest,
520 UpdateCanStartNotAllowedBackoffNewWaitPeriodApplies) {
521 // The UpdateCanStart policy returns false; failures are reported and a new
522 // backoff period is enacted.
523
524 SetUpdateCheckAllowed(false);
525
526 const Time curr_time = fake_clock_.GetWallclockTime();
527 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
528 update_state.download_errors_max = 1;
529 update_state.download_errors.emplace_back(
530 0, ErrorCode::kDownloadTransferError,
531 curr_time - TimeDelta::FromSeconds(8));
532 update_state.download_errors.emplace_back(
533 0, ErrorCode::kDownloadTransferError,
534 curr_time - TimeDelta::FromSeconds(2));
535
536 // Check that UpdateCanStart returns false and a new backoff expiry is
537 // generated.
538 UpdateDownloadParams result;
539 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
540 update_state);
541 EXPECT_FALSE(result.update_can_start);
542 EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
543 EXPECT_TRUE(result.do_increment_failures);
544 EXPECT_LT(curr_time, result.backoff_expiry);
545}
546
547TEST_F(UmChromeOSPolicyTest,
548 UpdateCanStartNotAllowedBackoffPrevWaitPeriodStillApplies) {
549 // The UpdateCanStart policy returns false; a previously enacted backoff
550 // period still applies.
551
552 SetUpdateCheckAllowed(false);
553
554 const Time curr_time = fake_clock_.GetWallclockTime();
555 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
556 update_state.download_errors_max = 1;
557 update_state.download_errors.emplace_back(
558 0, ErrorCode::kDownloadTransferError,
559 curr_time - TimeDelta::FromSeconds(8));
560 update_state.download_errors.emplace_back(
561 0, ErrorCode::kDownloadTransferError,
562 curr_time - TimeDelta::FromSeconds(2));
563 update_state.failures_last_updated = curr_time;
564 update_state.backoff_expiry = curr_time + TimeDelta::FromMinutes(3);
565
566 // Check that UpdateCanStart returns false and a new backoff expiry is
567 // generated.
568 UpdateDownloadParams result;
569 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::UpdateCanStart,
570 &result, update_state);
571 EXPECT_FALSE(result.update_can_start);
572 EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
573 EXPECT_FALSE(result.do_increment_failures);
574 EXPECT_LT(curr_time, result.backoff_expiry);
575}
576
577TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffSatisfied) {
578 // The UpdateCanStart policy returns true; a previously enacted backoff period
579 // has elapsed, we're good to go.
580
581 SetUpdateCheckAllowed(false);
582
583 const Time curr_time = fake_clock_.GetWallclockTime();
584 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
585 update_state.download_errors_max = 1;
586 update_state.download_errors.emplace_back(
587 0, ErrorCode::kDownloadTransferError,
588 curr_time - TimeDelta::FromSeconds(8));
589 update_state.download_errors.emplace_back(
590 0, ErrorCode::kDownloadTransferError,
591 curr_time - TimeDelta::FromSeconds(2));
592 update_state.failures_last_updated = curr_time - TimeDelta::FromSeconds(1);
593 update_state.backoff_expiry = curr_time - TimeDelta::FromSeconds(1);
594
595 // Check that UpdateCanStart returns false and a new backoff expiry is
596 // generated.
597 UpdateDownloadParams result;
598 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart,
599 &result, update_state);
600 EXPECT_TRUE(result.update_can_start);
601 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
602 EXPECT_EQ(0, result.download_url_idx);
603 EXPECT_EQ(0, result.download_url_num_errors);
604 EXPECT_FALSE(result.do_increment_failures);
605 EXPECT_EQ(Time(), result.backoff_expiry);
606}
607
608TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffDisabled) {
609 // The UpdateCanStart policy returns false; failures are reported but backoff
610 // is disabled.
611
612 SetUpdateCheckAllowed(false);
613
614 const Time curr_time = fake_clock_.GetWallclockTime();
615 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
616 update_state.download_errors_max = 1;
617 update_state.download_errors.emplace_back(
618 0, ErrorCode::kDownloadTransferError,
619 curr_time - TimeDelta::FromSeconds(8));
620 update_state.download_errors.emplace_back(
621 0, ErrorCode::kDownloadTransferError,
622 curr_time - TimeDelta::FromSeconds(2));
623 update_state.is_backoff_disabled = true;
624
625 // Check that UpdateCanStart returns false and a new backoff expiry is
626 // generated.
627 UpdateDownloadParams result;
628 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
629 update_state);
630 EXPECT_TRUE(result.update_can_start);
631 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
632 EXPECT_EQ(0, result.download_url_idx);
633 EXPECT_EQ(0, result.download_url_num_errors);
634 EXPECT_TRUE(result.do_increment_failures);
635 EXPECT_EQ(Time(), result.backoff_expiry);
636}
637
638TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffInteractive) {
639 // The UpdateCanStart policy returns false; failures are reported but this is
640 // an interactive update check.
641
642 SetUpdateCheckAllowed(false);
643
644 const Time curr_time = fake_clock_.GetWallclockTime();
645 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
646 update_state.download_errors_max = 1;
647 update_state.download_errors.emplace_back(
648 0, ErrorCode::kDownloadTransferError,
649 curr_time - TimeDelta::FromSeconds(8));
650 update_state.download_errors.emplace_back(
651 0, ErrorCode::kDownloadTransferError,
652 curr_time - TimeDelta::FromSeconds(2));
653 update_state.is_interactive = true;
654
655 // Check that UpdateCanStart returns false and a new backoff expiry is
656 // generated.
657 UpdateDownloadParams result;
658 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
659 update_state);
660 EXPECT_TRUE(result.update_can_start);
661 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
662 EXPECT_EQ(0, result.download_url_idx);
663 EXPECT_EQ(0, result.download_url_num_errors);
664 EXPECT_TRUE(result.do_increment_failures);
665 EXPECT_EQ(Time(), result.backoff_expiry);
666}
667
668TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffDelta) {
669 // The UpdateCanStart policy returns false; failures are reported but this is
670 // a delta payload.
671
672 SetUpdateCheckAllowed(false);
673
674 const Time curr_time = fake_clock_.GetWallclockTime();
675 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
676 update_state.download_errors_max = 1;
677 update_state.download_errors.emplace_back(
678 0, ErrorCode::kDownloadTransferError,
679 curr_time - TimeDelta::FromSeconds(8));
680 update_state.download_errors.emplace_back(
681 0, ErrorCode::kDownloadTransferError,
682 curr_time - TimeDelta::FromSeconds(2));
683 update_state.is_delta_payload = true;
684
685 // Check that UpdateCanStart returns false and a new backoff expiry is
686 // generated.
687 UpdateDownloadParams result;
688 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
689 update_state);
690 EXPECT_TRUE(result.update_can_start);
691 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
692 EXPECT_EQ(0, result.download_url_idx);
693 EXPECT_EQ(0, result.download_url_num_errors);
694 EXPECT_TRUE(result.do_increment_failures);
695 EXPECT_EQ(Time(), result.backoff_expiry);
696}
697
698TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffUnofficialBuild) {
699 // The UpdateCanStart policy returns false; failures are reported but this is
700 // an unofficial build.
701
702 SetUpdateCheckAllowed(false);
703
704 const Time curr_time = fake_clock_.GetWallclockTime();
705 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
706 update_state.download_errors_max = 1;
707 update_state.download_errors.emplace_back(
708 0, ErrorCode::kDownloadTransferError,
709 curr_time - TimeDelta::FromSeconds(8));
710 update_state.download_errors.emplace_back(
711 0, ErrorCode::kDownloadTransferError,
712 curr_time - TimeDelta::FromSeconds(2));
713
714 fake_state_.system_provider()->var_is_official_build()->
715 reset(new bool(false));
716
717 // Check that UpdateCanStart returns false and a new backoff expiry is
718 // generated.
719 UpdateDownloadParams result;
720 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
721 update_state);
722 EXPECT_TRUE(result.update_can_start);
723 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
724 EXPECT_EQ(0, result.download_url_idx);
725 EXPECT_EQ(0, result.download_url_num_errors);
726 EXPECT_TRUE(result.do_increment_failures);
727 EXPECT_EQ(Time(), result.backoff_expiry);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700728}
729
Alex Deymo63784a52014-05-28 10:46:14 -0700730TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsScatteringFailed) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700731 // The UpdateCanStart policy fails because the UpdateScattering policy it
732 // depends on fails (unset variable).
733
734 SetUpdateCheckAllowed(false);
735
736 // Override the default seed variable with a null value so that the policy
737 // request would fail.
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700738 // TODO(garnold) This failure may or may not fail a number
739 // sub-policies/decisions, like scattering and backoff. We'll need a more
740 // deliberate setup to ensure that we're failing what we want to be failing.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700741 fake_state_.random_provider()->var_seed()->reset(nullptr);
742
743 // Check that the UpdateCanStart fails.
744 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700745 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700746 ExpectPolicyStatus(EvalStatus::kFailed,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700747 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700748}
749
Alex Deymo63784a52014-05-28 10:46:14 -0700750TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700751 UpdateCanStartNotAllowedScatteringNewWaitPeriodApplies) {
752 // The UpdateCanStart policy returns false; device policy is loaded and
753 // scattering applies due to an unsatisfied wait period, which was newly
754 // generated.
755
756 SetUpdateCheckAllowed(false);
757 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
758 new TimeDelta(TimeDelta::FromMinutes(2)));
759
760
761 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
762
763 // Check that the UpdateCanStart returns false and a new wait period
764 // generated.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700765 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700766 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700767 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700768 EXPECT_FALSE(result.update_can_start);
769 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
770 EXPECT_LT(TimeDelta(), result.scatter_wait_period);
771 EXPECT_EQ(0, result.scatter_check_threshold);
772}
773
Alex Deymo63784a52014-05-28 10:46:14 -0700774TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700775 UpdateCanStartNotAllowedScatteringPrevWaitPeriodStillApplies) {
776 // The UpdateCanStart policy returns false w/ kAskMeAgainLater; device policy
777 // is loaded and a previously generated scattering period still applies, none
778 // of the scattering values has changed.
779
780 SetUpdateCheckAllowed(false);
781 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
782 new TimeDelta(TimeDelta::FromMinutes(2)));
783
784 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
785 update_state.scatter_wait_period = TimeDelta::FromSeconds(35);
786
787 // Check that the UpdateCanStart returns false and a new wait period
788 // generated.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700789 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700790 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::UpdateCanStart,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700791 &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700792 EXPECT_FALSE(result.update_can_start);
793 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
794 EXPECT_EQ(TimeDelta::FromSeconds(35), result.scatter_wait_period);
795 EXPECT_EQ(0, result.scatter_check_threshold);
796}
797
Alex Deymo63784a52014-05-28 10:46:14 -0700798TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700799 UpdateCanStartNotAllowedScatteringNewCountThresholdApplies) {
800 // The UpdateCanStart policy returns false; device policy is loaded and
801 // scattering applies due to an unsatisfied update check count threshold.
802 //
803 // This ensures a non-zero check threshold, which may or may not be combined
804 // with a non-zero wait period (for which we cannot reliably control).
805
806 SetUpdateCheckAllowed(false);
807 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
808 new TimeDelta(TimeDelta::FromSeconds(1)));
809
810 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
811 update_state.scatter_check_threshold_min = 2;
812 update_state.scatter_check_threshold_max = 5;
813
814 // Check that the UpdateCanStart returns false.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700815 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700816 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700817 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700818 EXPECT_FALSE(result.update_can_start);
819 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
820 EXPECT_LE(2, result.scatter_check_threshold);
821 EXPECT_GE(5, result.scatter_check_threshold);
822}
823
Alex Deymo63784a52014-05-28 10:46:14 -0700824TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700825 UpdateCanStartNotAllowedScatteringPrevCountThresholdStillApplies) {
826 // The UpdateCanStart policy returns false; device policy is loaded and
827 // scattering due to a previously generated count threshold still applies.
828
829 SetUpdateCheckAllowed(false);
830 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
831 new TimeDelta(TimeDelta::FromSeconds(1)));
832
833 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
834 update_state.scatter_check_threshold = 3;
835 update_state.scatter_check_threshold_min = 2;
836 update_state.scatter_check_threshold_max = 5;
837
838 // Check that the UpdateCanStart returns false.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700839 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700840 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700841 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700842 EXPECT_FALSE(result.update_can_start);
843 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
844 EXPECT_EQ(3, result.scatter_check_threshold);
845}
846
Alex Deymo63784a52014-05-28 10:46:14 -0700847TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedScatteringSatisfied) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700848 // The UpdateCanStart policy returns true; device policy is loaded and
849 // scattering is enabled, but both wait period and check threshold are
850 // satisfied.
851
852 SetUpdateCheckAllowed(false);
853 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
854 new TimeDelta(TimeDelta::FromSeconds(120)));
855
856 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(75));
857 update_state.num_checks = 4;
858 update_state.scatter_wait_period = TimeDelta::FromSeconds(60);
859 update_state.scatter_check_threshold = 3;
860 update_state.scatter_check_threshold_min = 2;
861 update_state.scatter_check_threshold_max = 5;
862
863 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700864 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700865 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700866 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700867 EXPECT_TRUE(result.update_can_start);
868 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
869 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700870 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700871 EXPECT_EQ(0, result.download_url_num_errors);
872 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700873}
874
Alex Deymo63784a52014-05-28 10:46:14 -0700875TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700876 UpdateCanStartAllowedInteractivePreventsScattering) {
877 // The UpdateCanStart policy returns true; device policy is loaded and
878 // scattering would have applied, except that the update check is interactive
879 // and so it is suppressed.
880
881 SetUpdateCheckAllowed(false);
882 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
883 new TimeDelta(TimeDelta::FromSeconds(1)));
884
885 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700886 update_state.is_interactive = true;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700887 update_state.scatter_check_threshold = 0;
888 update_state.scatter_check_threshold_min = 2;
889 update_state.scatter_check_threshold_max = 5;
890
891 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700892 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700893 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700894 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700895 EXPECT_TRUE(result.update_can_start);
896 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
897 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700898 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700899 EXPECT_EQ(0, result.download_url_num_errors);
900 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700901}
902
Alex Deymo63784a52014-05-28 10:46:14 -0700903TEST_F(UmChromeOSPolicyTest,
Gilad Arnold76a11f62014-05-20 09:02:12 -0700904 UpdateCanStartAllowedOobePreventsScattering) {
905 // The UpdateCanStart policy returns true; device policy is loaded and
906 // scattering would have applied, except that OOBE was not completed and so it
907 // is suppressed.
908
909 SetUpdateCheckAllowed(false);
910 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
911 new TimeDelta(TimeDelta::FromSeconds(1)));
912 fake_state_.system_provider()->var_is_oobe_complete()->reset(new bool(false));
913
914 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700915 update_state.is_interactive = true;
Gilad Arnold76a11f62014-05-20 09:02:12 -0700916 update_state.scatter_check_threshold = 0;
917 update_state.scatter_check_threshold_min = 2;
918 update_state.scatter_check_threshold_max = 5;
919
920 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700921 UpdateDownloadParams result;
Gilad Arnold76a11f62014-05-20 09:02:12 -0700922 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700923 update_state);
Gilad Arnold76a11f62014-05-20 09:02:12 -0700924 EXPECT_TRUE(result.update_can_start);
925 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
926 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700927 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700928 EXPECT_EQ(0, result.download_url_num_errors);
929 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnold76a11f62014-05-20 09:02:12 -0700930}
931
Alex Deymo63784a52014-05-28 10:46:14 -0700932TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithAttributes) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700933 // The UpdateCanStart policy returns true; device policy permits both HTTP and
934 // P2P updates, as well as a non-empty target channel string.
935
936 SetUpdateCheckAllowed(false);
937
938 // Override specific device policy attributes.
939 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
940 new bool(true));
941 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
942 new bool(true));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700943
944 // Check that the UpdateCanStart returns true.
945 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700946 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700947 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700948 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700949 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700950 EXPECT_TRUE(result.p2p_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700951 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700952 EXPECT_EQ(0, result.download_url_num_errors);
953 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700954}
955
Alex Deymo63784a52014-05-28 10:46:14 -0700956TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithP2PFromUpdater) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700957 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
958 // P2P updates, but the updater is configured to allow P2P and overrules the
959 // setting.
960
961 SetUpdateCheckAllowed(false);
962
963 // Override specific device policy attributes.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700964 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
965
966 // Check that the UpdateCanStart returns true.
967 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700968 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700969 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700970 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700971 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700972 EXPECT_TRUE(result.p2p_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700973 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700974 EXPECT_EQ(0, result.download_url_num_errors);
975 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700976}
977
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700978TEST_F(UmChromeOSPolicyTest,
979 UpdateCanStartAllowedWithHttpUrlForUnofficialBuild) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700980 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
981 // P2P updates, but marking this an unofficial build overrules the HTTP
982 // setting.
983
984 SetUpdateCheckAllowed(false);
985
986 // Override specific device policy attributes.
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700987 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
988 new bool(false));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700989 fake_state_.system_provider()->var_is_official_build()->
990 reset(new bool(false));
991
992 // Check that the UpdateCanStart returns true.
993 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700994 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700995 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700996 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700997 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700998 EXPECT_FALSE(result.p2p_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700999 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001000 EXPECT_EQ(0, result.download_url_num_errors);
1001 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001002}
1003
1004TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithHttpsUrl) {
1005 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1006 // P2P updates, but an HTTPS URL is provided and selected for download.
1007
1008 SetUpdateCheckAllowed(false);
1009
1010 // Override specific device policy attributes.
1011 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1012 new bool(false));
1013
1014 // Add an HTTPS URL.
1015 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001016 update_state.download_urls.emplace_back("https://secure/url/");
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001017
1018 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001019 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001020 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001021 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001022 EXPECT_TRUE(result.update_can_start);
1023 EXPECT_FALSE(result.p2p_allowed);
1024 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001025 EXPECT_EQ(0, result.download_url_num_errors);
1026 EXPECT_FALSE(result.do_increment_failures);
1027}
1028
1029TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedMaxErrorsNotExceeded) {
1030 // The UpdateCanStart policy returns true; the first URL has download errors
1031 // but does not exceed the maximum allowed number of failures, so it is stilli
1032 // usable.
1033
1034 SetUpdateCheckAllowed(false);
1035
1036 // Add a second URL; update with this URL attempted and failed enough times to
1037 // disqualify the current (first) URL.
1038 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1039 update_state.num_checks = 5;
1040 update_state.download_urls.emplace_back("http://another/fake/url/");
1041 Time t = fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(12);
1042 for (int i = 0; i < 5; i++) {
1043 update_state.download_errors.emplace_back(
1044 0, ErrorCode::kDownloadTransferError, t);
1045 t += TimeDelta::FromSeconds(1);
1046 }
1047
1048 // Check that the UpdateCanStart returns true.
1049 UpdateDownloadParams result;
1050 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1051 update_state);
1052 EXPECT_TRUE(result.update_can_start);
1053 EXPECT_FALSE(result.p2p_allowed);
1054 EXPECT_EQ(0, result.download_url_idx);
1055 EXPECT_EQ(5, result.download_url_num_errors);
1056 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001057}
1058
1059TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlMaxExceeded) {
1060 // The UpdateCanStart policy returns true; the first URL exceeded the maximum
1061 // allowed number of failures, but a second URL is available.
1062
1063 SetUpdateCheckAllowed(false);
1064
1065 // Add a second URL; update with this URL attempted and failed enough times to
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001066 // disqualify the current (first) URL.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001067 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1068 update_state.num_checks = 10;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001069 update_state.download_urls.emplace_back("http://another/fake/url/");
1070 Time t = fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(12);
1071 for (int i = 0; i < 11; i++) {
1072 update_state.download_errors.emplace_back(
1073 0, ErrorCode::kDownloadTransferError, t);
1074 t += TimeDelta::FromSeconds(1);
1075 }
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001076
1077 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001078 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001079 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001080 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001081 EXPECT_TRUE(result.update_can_start);
1082 EXPECT_FALSE(result.p2p_allowed);
1083 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001084 EXPECT_EQ(0, result.download_url_num_errors);
1085 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001086}
1087
1088TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlHardError) {
1089 // The UpdateCanStart policy returns true; the first URL fails with a hard
1090 // error, but a second URL is available.
1091
1092 SetUpdateCheckAllowed(false);
1093
1094 // Add a second URL; update with this URL attempted and failed in a way that
1095 // causes it to switch directly to the next URL.
1096 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1097 update_state.num_checks = 10;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001098 update_state.download_urls.emplace_back("http://another/fake/url/");
1099 update_state.download_errors.emplace_back(
1100 0, ErrorCode::kPayloadHashMismatchError,
1101 fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(1));
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001102
1103 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001104 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001105 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001106 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001107 EXPECT_TRUE(result.update_can_start);
1108 EXPECT_FALSE(result.p2p_allowed);
1109 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001110 EXPECT_EQ(0, result.download_url_num_errors);
1111 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001112}
1113
1114TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedUrlWrapsAround) {
1115 // The UpdateCanStart policy returns true; URL search properly wraps around
1116 // the last one on the list.
1117
1118 SetUpdateCheckAllowed(false);
1119
1120 // Add a second URL; update with this URL attempted and failed in a way that
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001121 // causes it to switch directly to the next URL. We must disable backoff in
1122 // order for it not to interfere.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001123 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001124 update_state.num_checks = 1;
1125 update_state.is_backoff_disabled = true;
1126 update_state.download_urls.emplace_back("http://another/fake/url/");
1127 update_state.download_errors.emplace_back(
1128 1, ErrorCode::kPayloadHashMismatchError,
1129 fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(1));
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001130
1131 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001132 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001133 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001134 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001135 EXPECT_TRUE(result.update_can_start);
1136 EXPECT_FALSE(result.p2p_allowed);
1137 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001138 EXPECT_EQ(0, result.download_url_num_errors);
1139 EXPECT_TRUE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001140}
1141
1142TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedNoUsableUrls) {
1143 // The UpdateCanStart policy returns false; there's a single HTTP URL but its
1144 // use is forbidden by policy.
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001145 //
1146 // Note: In the case where no usable URLs are found, the policy should not
1147 // increment the number of failed attempts! Doing so would result in a
1148 // non-idempotent semantics, and does not fall within the intended purpose of
1149 // the backoff mechanism anyway.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001150
1151 SetUpdateCheckAllowed(false);
1152
1153 // Override specific device policy attributes.
1154 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1155 new bool(false));
1156
1157 // Check that the UpdateCanStart returns false.
1158 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001159 UpdateDownloadParams result;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001160 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1161 update_state);
1162 EXPECT_FALSE(result.update_can_start);
1163 EXPECT_EQ(UpdateCannotStartReason::kCannotDownload,
1164 result.cannot_start_reason);
1165 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001166}
1167
1168TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoUsableUrlsButP2PEnabled) {
1169 // The UpdateCanStart policy returns true; there's a single HTTP URL but its
1170 // use is forbidden by policy, however P2P is enabled. The result indicates
1171 // that no URL can be used.
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001172 //
1173 // Note: The number of failed attempts should not increase in this case (see
1174 // above test).
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001175
1176 SetUpdateCheckAllowed(false);
1177
1178 // Override specific device policy attributes.
1179 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1180 new bool(true));
1181 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1182 new bool(false));
1183
1184 // Check that the UpdateCanStart returns true.
1185 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001186 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001187 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001188 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001189 EXPECT_TRUE(result.update_can_start);
1190 EXPECT_TRUE(result.p2p_allowed);
1191 EXPECT_GT(0, result.download_url_idx);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001192 EXPECT_EQ(0, result.download_url_num_errors);
1193 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001194}
1195
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001196TEST_F(UmChromeOSPolicyTest,
1197 UpdateCanStartAllowedNoUsableUrlsButEnterpriseEnrolled) {
1198 // The UpdateCanStart policy returns true; there's a single HTTP URL but its
1199 // use is forbidden by policy, and P2P is unset on the policy, however the
1200 // device is enterprise-enrolled so P2P is allowed. The result indicates that
1201 // no URL can be used.
1202 //
1203 // Note: The number of failed attempts should not increase in this case (see
1204 // above test).
1205
1206 SetUpdateCheckAllowed(false);
1207
1208 // Override specific device policy attributes.
1209 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(nullptr);
1210 fake_state_.device_policy_provider()->var_owner()->reset(nullptr);
1211 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1212 new bool(false));
1213
1214 // Check that the UpdateCanStart returns true.
1215 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1216 UpdateDownloadParams result;
1217 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1218 update_state);
1219 EXPECT_TRUE(result.update_can_start);
1220 EXPECT_TRUE(result.p2p_allowed);
1221 EXPECT_GT(0, result.download_url_idx);
1222 EXPECT_EQ(0, result.download_url_num_errors);
1223 EXPECT_FALSE(result.do_increment_failures);
1224}
1225
Gilad Arnold684219d2014-07-07 14:54:57 -07001226TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedEthernetDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001227 // Ethernet is always allowed.
1228
1229 fake_state_.shill_provider()->var_conn_type()->
1230 reset(new ConnectionType(ConnectionType::kEthernet));
1231
1232 bool result;
1233 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001234 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001235 EXPECT_TRUE(result);
1236}
1237
Gilad Arnold684219d2014-07-07 14:54:57 -07001238TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWifiDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001239 // Wifi is allowed if not tethered.
1240
1241 fake_state_.shill_provider()->var_conn_type()->
1242 reset(new ConnectionType(ConnectionType::kWifi));
1243
1244 bool result;
1245 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001246 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001247 EXPECT_TRUE(result);
1248}
1249
Alex Deymo63784a52014-05-28 10:46:14 -07001250TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001251 UpdateCurrentConnectionNotAllowedWifiTetheredDefault) {
1252 // Tethered wifi is not allowed by default.
1253
1254 fake_state_.shill_provider()->var_conn_type()->
1255 reset(new ConnectionType(ConnectionType::kWifi));
1256 fake_state_.shill_provider()->var_conn_tethering()->
1257 reset(new ConnectionTethering(ConnectionTethering::kConfirmed));
1258
1259 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001260 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001261 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001262}
1263
Alex Deymo63784a52014-05-28 10:46:14 -07001264TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001265 UpdateDownloadAllowedWifiTetheredPolicyOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001266 // Tethered wifi can be allowed by policy.
1267
1268 fake_state_.shill_provider()->var_conn_type()->
1269 reset(new ConnectionType(ConnectionType::kWifi));
1270 fake_state_.shill_provider()->var_conn_tethering()->
1271 reset(new ConnectionTethering(ConnectionTethering::kConfirmed));
1272 set<ConnectionType> allowed_connections;
1273 allowed_connections.insert(ConnectionType::kCellular);
1274 fake_state_.device_policy_provider()->
1275 var_allowed_connection_types_for_update()->
1276 reset(new set<ConnectionType>(allowed_connections));
1277
1278 bool result;
1279 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001280 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001281 EXPECT_TRUE(result);
1282}
1283
Gilad Arnold684219d2014-07-07 14:54:57 -07001284TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWimaxDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001285 // Wimax is always allowed.
1286
1287 fake_state_.shill_provider()->var_conn_type()->
1288 reset(new ConnectionType(ConnectionType::kWifi));
1289
1290 bool result;
1291 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001292 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001293 EXPECT_TRUE(result);
1294}
1295
Alex Deymo63784a52014-05-28 10:46:14 -07001296TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001297 UpdateCurrentConnectionNotAllowedBluetoothDefault) {
1298 // Bluetooth is never allowed.
1299
1300 fake_state_.shill_provider()->var_conn_type()->
1301 reset(new ConnectionType(ConnectionType::kBluetooth));
1302
1303 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001304 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001305 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001306}
1307
Alex Deymo63784a52014-05-28 10:46:14 -07001308TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001309 UpdateCurrentConnectionNotAllowedBluetoothPolicyCannotOverride) {
1310 // Bluetooth cannot be allowed even by policy.
1311
1312 fake_state_.shill_provider()->var_conn_type()->
1313 reset(new ConnectionType(ConnectionType::kBluetooth));
1314 set<ConnectionType> allowed_connections;
1315 allowed_connections.insert(ConnectionType::kBluetooth);
1316 fake_state_.device_policy_provider()->
1317 var_allowed_connection_types_for_update()->
1318 reset(new set<ConnectionType>(allowed_connections));
1319
1320 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001321 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001322 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001323}
1324
Alex Deymo63784a52014-05-28 10:46:14 -07001325TEST_F(UmChromeOSPolicyTest, UpdateCurrentConnectionNotAllowedCellularDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001326 // Cellular is not allowed by default.
1327
1328 fake_state_.shill_provider()->var_conn_type()->
1329 reset(new ConnectionType(ConnectionType::kCellular));
1330
1331 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001332 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001333 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001334}
1335
Alex Deymo63784a52014-05-28 10:46:14 -07001336TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001337 UpdateDownloadAllowedCellularPolicyOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001338 // Update over cellular can be enabled by policy.
1339
1340 fake_state_.shill_provider()->var_conn_type()->
1341 reset(new ConnectionType(ConnectionType::kCellular));
1342 set<ConnectionType> allowed_connections;
1343 allowed_connections.insert(ConnectionType::kCellular);
1344 fake_state_.device_policy_provider()->
1345 var_allowed_connection_types_for_update()->
1346 reset(new set<ConnectionType>(allowed_connections));
1347
1348 bool result;
1349 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001350 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001351 EXPECT_TRUE(result);
1352}
1353
Alex Deymo63784a52014-05-28 10:46:14 -07001354TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001355 UpdateDownloadAllowedCellularUserOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001356 // Update over cellular can be enabled by user settings, but only if policy
1357 // is present and does not determine allowed connections.
1358
1359 fake_state_.shill_provider()->var_conn_type()->
1360 reset(new ConnectionType(ConnectionType::kCellular));
1361 set<ConnectionType> allowed_connections;
1362 allowed_connections.insert(ConnectionType::kCellular);
1363 fake_state_.updater_provider()->var_cellular_enabled()->
1364 reset(new bool(true));
1365
1366 bool result;
1367 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001368 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001369 EXPECT_TRUE(result);
1370}
1371
Alex Deymo63784a52014-05-28 10:46:14 -07001372} // namespace chromeos_update_manager