blob: 34d8150ce6041e689baec7855c42c6bb1e71ba8d [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:
Alex Deymo610277e2014-11-11 21:18:11 -080033 void SetUp() override {
Alex Deymo0d11c602014-04-23 20:12:20 -070034 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 Arnold78ecbfc2014-10-22 14:38:25 -0700145 // P2P is not disabled by Omaha.
146 update_state.p2p_downloading_disabled = false;
147 update_state.p2p_sharing_disabled = false;
Gilad Arnold349ac832014-10-06 14:20:28 -0700148 // P2P was not attempted.
149 update_state.p2p_num_attempts = 0;
150 update_state.p2p_first_attempted = Time();
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700151 // No active backoff period, backoff is not disabled by Omaha.
152 update_state.backoff_expiry = Time();
153 update_state.is_backoff_disabled = false;
154 // There is no active scattering wait period (max 7 days allowed) nor check
155 // threshold (none allowed).
156 update_state.scatter_wait_period = TimeDelta();
157 update_state.scatter_check_threshold = 0;
158 update_state.scatter_wait_period_max = TimeDelta::FromDays(7);
159 update_state.scatter_check_threshold_min = 0;
160 update_state.scatter_check_threshold_max = 0;
161
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700162 return update_state;
Alex Deymo0d11c602014-04-23 20:12:20 -0700163 }
164
165 // Runs the passed |policy_method| policy and expects it to return the
166 // |expected| return value.
167 template<typename T, typename R, typename... Args>
168 void ExpectPolicyStatus(
169 EvalStatus expected,
170 T policy_method,
171 R* result, Args... args) {
172 string error = "<None>";
173 eval_ctx_->ResetEvaluation();
174 EXPECT_EQ(expected,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700175 (policy_.*policy_method)(eval_ctx_, &fake_state_, &error, result,
176 args...))
Alex Deymoc850b4f2014-05-19 11:06:41 -0700177 << "Returned error: " << error
178 << "\nEvaluation context: " << eval_ctx_->DumpContext();
Alex Deymo0d11c602014-04-23 20:12:20 -0700179 }
180
181 FakeClock fake_clock_;
182 FakeState fake_state_;
183 scoped_refptr<EvaluationContext> eval_ctx_;
184 ChromeOSPolicy policy_; // ChromeOSPolicy under test.
185};
186
Alex Deymo63784a52014-05-28 10:46:14 -0700187TEST_F(UmChromeOSPolicyTest, FirstCheckIsAtMostInitialIntervalAfterStart) {
Alex Deymo0d11c602014-04-23 20:12:20 -0700188 Time next_update_check;
189
Gilad Arnold38b14022014-07-09 12:45:56 -0700190 // Set the last update time so it'll appear as if this is a first update check
191 // in the lifetime of the current updater.
192 fake_state_.updater_provider()->var_last_checked_time()->reset(
193 new Time(fake_clock_.GetWallclockTime() - TimeDelta::FromMinutes(10)));
194
Alex Deymo0d11c602014-04-23 20:12:20 -0700195 ExpectPolicyStatus(EvalStatus::kSucceeded,
196 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
197
198 EXPECT_LE(fake_clock_.GetWallclockTime(), next_update_check);
Gilad Arnold38b14022014-07-09 12:45:56 -0700199 EXPECT_GE(
200 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
201 ChromeOSPolicy::kTimeoutInitialInterval +
202 ChromeOSPolicy::kTimeoutRegularFuzz / 2),
203 next_update_check);
204}
205
206TEST_F(UmChromeOSPolicyTest, RecurringCheckBaseIntervalAndFuzz) {
207 // Ensure that we're using the correct interval (kPeriodicInterval) and fuzz
208 // (kTimeoutRegularFuzz) as base values for period updates.
209 Time next_update_check;
210
211 ExpectPolicyStatus(EvalStatus::kSucceeded,
212 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
213
214 EXPECT_LE(
215 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
216 ChromeOSPolicy::kTimeoutPeriodicInterval -
217 ChromeOSPolicy::kTimeoutRegularFuzz / 2),
218 next_update_check);
219 EXPECT_GE(
220 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
221 ChromeOSPolicy::kTimeoutPeriodicInterval +
222 ChromeOSPolicy::kTimeoutRegularFuzz / 2),
223 next_update_check);
224}
225
226TEST_F(UmChromeOSPolicyTest, RecurringCheckBackoffIntervalAndFuzz) {
227 // Ensure that we're properly backing off and fuzzing in the presence of
228 // failed updates attempts.
229 Time next_update_check;
230
231 fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700232 reset(new unsigned int{2});
Gilad Arnold38b14022014-07-09 12:45:56 -0700233
234 ExpectPolicyStatus(EvalStatus::kSucceeded,
235 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
236
237 int expected_interval = ChromeOSPolicy::kTimeoutPeriodicInterval * 4;
238 EXPECT_LE(
239 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
240 expected_interval - expected_interval / 2),
241 next_update_check);
242 EXPECT_GE(
243 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
244 expected_interval + expected_interval / 2),
245 next_update_check);
Alex Deymo0d11c602014-04-23 20:12:20 -0700246}
247
Gilad Arnolda0258a52014-07-10 16:21:19 -0700248TEST_F(UmChromeOSPolicyTest, RecurringCheckServerDictatedPollInterval) {
249 // Policy honors the server provided check poll interval.
250 Time next_update_check;
251
252 const unsigned int kInterval = ChromeOSPolicy::kTimeoutPeriodicInterval * 4;
253 fake_state_.updater_provider()->var_server_dictated_poll_interval()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700254 reset(new unsigned int{kInterval});
Gilad Arnolda0258a52014-07-10 16:21:19 -0700255 // We should not be backing off in this case.
256 fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700257 reset(new unsigned int{2});
Gilad Arnolda0258a52014-07-10 16:21:19 -0700258
259 ExpectPolicyStatus(EvalStatus::kSucceeded,
260 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
261
262 EXPECT_LE(
263 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
264 kInterval - kInterval / 2),
265 next_update_check);
266 EXPECT_GE(
267 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
268 kInterval + kInterval / 2),
269 next_update_check);
270}
271
Alex Deymo63784a52014-05-28 10:46:14 -0700272TEST_F(UmChromeOSPolicyTest, ExponentialBackoffIsCapped) {
Alex Deymo0d11c602014-04-23 20:12:20 -0700273 Time next_update_check;
274
Alex Deymo0d11c602014-04-23 20:12:20 -0700275 fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700276 reset(new unsigned int{100});
Gilad Arnold38b14022014-07-09 12:45:56 -0700277
Alex Deymo0d11c602014-04-23 20:12:20 -0700278 ExpectPolicyStatus(EvalStatus::kSucceeded,
279 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
280
Gilad Arnold38b14022014-07-09 12:45:56 -0700281 EXPECT_LE(
282 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
283 ChromeOSPolicy::kTimeoutMaxBackoffInterval -
284 ChromeOSPolicy::kTimeoutMaxBackoffInterval / 2),
285 next_update_check);
286 EXPECT_GE(
287 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
288 ChromeOSPolicy::kTimeoutMaxBackoffInterval +
289 ChromeOSPolicy::kTimeoutMaxBackoffInterval /2),
290 next_update_check);
Alex Deymo0d11c602014-04-23 20:12:20 -0700291}
292
Alex Deymo63784a52014-05-28 10:46:14 -0700293TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWaitsForTheTimeout) {
Alex Deymo0d11c602014-04-23 20:12:20 -0700294 // We get the next update_check timestamp from the policy's private method
295 // and then we check the public method respects that value on the normal
296 // case.
297 Time next_update_check;
298 Time last_checked_time =
299 fake_clock_.GetWallclockTime() + TimeDelta::FromMinutes(1234);
300
Alex Deymo0d11c602014-04-23 20:12:20 -0700301 fake_state_.updater_provider()->var_last_checked_time()->reset(
302 new Time(last_checked_time));
303 ExpectPolicyStatus(EvalStatus::kSucceeded,
304 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
305
306 UpdateCheckParams result;
307
308 // Check that the policy blocks until the next_update_check is reached.
309 SetUpDefaultClock();
310 SetUpDefaultState();
311 fake_state_.updater_provider()->var_last_checked_time()->reset(
312 new Time(last_checked_time));
313 fake_clock_.SetWallclockTime(next_update_check - TimeDelta::FromSeconds(1));
314 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
315 &Policy::UpdateCheckAllowed, &result);
316
317 SetUpDefaultClock();
318 SetUpDefaultState();
319 fake_state_.updater_provider()->var_last_checked_time()->reset(
320 new Time(last_checked_time));
321 fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
322 ExpectPolicyStatus(EvalStatus::kSucceeded,
323 &Policy::UpdateCheckAllowed, &result);
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700324 EXPECT_TRUE(result.updates_enabled);
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700325 EXPECT_FALSE(result.is_interactive);
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700326}
327
328TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWaitsForOOBE) {
Alex Vakulenko072359c2014-07-18 11:41:07 -0700329 // Update checks are deferred until OOBE is completed.
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700330
331 // Ensure that update is not allowed even if wait period is satisfied.
332 Time next_update_check;
333 Time last_checked_time =
334 fake_clock_.GetWallclockTime() + TimeDelta::FromMinutes(1234);
335
336 fake_state_.updater_provider()->var_last_checked_time()->reset(
337 new Time(last_checked_time));
338 ExpectPolicyStatus(EvalStatus::kSucceeded,
339 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
340
341 SetUpDefaultClock();
342 SetUpDefaultState();
343 fake_state_.updater_provider()->var_last_checked_time()->reset(
344 new Time(last_checked_time));
345 fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
346 fake_state_.system_provider()->var_is_oobe_complete()->reset(
347 new bool(false));
348
349 UpdateCheckParams result;
350 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
351 &Policy::UpdateCheckAllowed, &result);
352
353 // Now check that it is allowed if OOBE is completed.
354 SetUpDefaultClock();
355 SetUpDefaultState();
356 fake_state_.updater_provider()->var_last_checked_time()->reset(
357 new Time(last_checked_time));
358 fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
359 ExpectPolicyStatus(EvalStatus::kSucceeded,
360 &Policy::UpdateCheckAllowed, &result);
361 EXPECT_TRUE(result.updates_enabled);
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700362 EXPECT_FALSE(result.is_interactive);
Alex Deymo0d11c602014-04-23 20:12:20 -0700363}
364
Gilad Arnold42f253b2014-06-25 12:39:17 -0700365TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWithAttributes) {
Alex Vakulenko072359c2014-07-18 11:41:07 -0700366 // Update check is allowed, response includes attributes for use in the
Gilad Arnold42f253b2014-06-25 12:39:17 -0700367 // request.
368 SetUpdateCheckAllowed(true);
369
370 // Override specific device policy attributes.
Gilad Arnoldd4b30322014-07-21 15:35:27 -0700371 fake_state_.device_policy_provider()->var_target_version_prefix()->
372 reset(new string("1.2"));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700373 fake_state_.device_policy_provider()->var_release_channel_delegated()->
374 reset(new bool(false));
375 fake_state_.device_policy_provider()->var_release_channel()->
376 reset(new string("foo-channel"));
377
378 UpdateCheckParams result;
379 ExpectPolicyStatus(EvalStatus::kSucceeded,
380 &Policy::UpdateCheckAllowed, &result);
381 EXPECT_TRUE(result.updates_enabled);
Gilad Arnoldd4b30322014-07-21 15:35:27 -0700382 EXPECT_EQ("1.2", result.target_version_prefix);
Gilad Arnold42f253b2014-06-25 12:39:17 -0700383 EXPECT_EQ("foo-channel", result.target_channel);
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700384 EXPECT_FALSE(result.is_interactive);
Gilad Arnold42f253b2014-06-25 12:39:17 -0700385}
386
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700387TEST_F(UmChromeOSPolicyTest,
388 UpdateCheckAllowedUpdatesDisabledForUnofficialBuilds) {
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700389 // UpdateCheckAllowed should return kAskMeAgainLater if this is an unofficial
390 // build; we don't want periodic update checks on developer images.
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700391
392 fake_state_.system_provider()->var_is_official_build()->reset(
393 new bool(false));
394
395 UpdateCheckParams result;
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700396 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700397 &Policy::UpdateCheckAllowed, &result);
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700398}
399
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700400TEST_F(UmChromeOSPolicyTest,
401 UpdateCheckAllowedUpdatesDisabledForRemovableBootDevice) {
402 // UpdateCheckAllowed should return false (kSucceeded) if the image booted
403 // from a removable device.
404
405 fake_state_.system_provider()->var_is_boot_device_removable()->reset(
406 new bool(true));
407
408 UpdateCheckParams result;
409 ExpectPolicyStatus(EvalStatus::kSucceeded,
410 &Policy::UpdateCheckAllowed, &result);
411 EXPECT_FALSE(result.updates_enabled);
412}
413
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700414TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedUpdatesDisabledByPolicy) {
Gilad Arnold42f253b2014-06-25 12:39:17 -0700415 // UpdateCheckAllowed should return kAskMeAgainLater because a device policy
416 // is loaded and prohibits updates.
417
418 SetUpdateCheckAllowed(false);
419 fake_state_.device_policy_provider()->var_update_disabled()->reset(
420 new bool(true));
421
Gilad Arnold42f253b2014-06-25 12:39:17 -0700422 UpdateCheckParams result;
423 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
424 &Policy::UpdateCheckAllowed, &result);
425}
426
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700427TEST_F(UmChromeOSPolicyTest,
428 UpdateCheckAllowedForcedUpdateRequestedInteractive) {
429 // UpdateCheckAllowed should return true because a forced update request was
430 // signaled for an interactive update.
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700431
432 SetUpdateCheckAllowed(true);
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700433 fake_state_.updater_provider()->var_forced_update_requested()->reset(
434 new UpdateRequestStatus(UpdateRequestStatus::kInteractive));
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700435
436 UpdateCheckParams result;
437 ExpectPolicyStatus(EvalStatus::kSucceeded,
438 &Policy::UpdateCheckAllowed, &result);
439 EXPECT_TRUE(result.updates_enabled);
440 EXPECT_TRUE(result.is_interactive);
441}
442
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700443TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedForcedUpdateRequestedPeriodic) {
444 // UpdateCheckAllowed should return true because a forced update request was
445 // signaled for a periodic check.
446
447 SetUpdateCheckAllowed(true);
448 fake_state_.updater_provider()->var_forced_update_requested()->reset(
449 new UpdateRequestStatus(UpdateRequestStatus::kPeriodic));
450
451 UpdateCheckParams result;
452 ExpectPolicyStatus(EvalStatus::kSucceeded,
453 &Policy::UpdateCheckAllowed, &result);
454 EXPECT_TRUE(result.updates_enabled);
455 EXPECT_FALSE(result.is_interactive);
456}
457
Alex Deymo63784a52014-05-28 10:46:14 -0700458TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsCheckAllowedError) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700459 // The UpdateCanStart policy fails, not being able to query
460 // UpdateCheckAllowed.
461
462 // Configure the UpdateCheckAllowed policy to fail.
463 fake_state_.updater_provider()->var_updater_started_time()->reset(nullptr);
464
465 // Check that the UpdateCanStart fails.
466 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700467 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700468 ExpectPolicyStatus(EvalStatus::kFailed,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700469 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700470}
471
Alex Deymo63784a52014-05-28 10:46:14 -0700472TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedCheckDue) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700473 // The UpdateCanStart policy returns false because we are due for another
Gilad Arnold14a9e702014-10-08 08:09:09 -0700474 // update check. Ensure that download related values are still returned.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700475
476 SetUpdateCheckAllowed(true);
477
478 // Check that the UpdateCanStart returns false.
479 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700480 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700481 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700482 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700483 EXPECT_FALSE(result.update_can_start);
484 EXPECT_EQ(UpdateCannotStartReason::kCheckDue, result.cannot_start_reason);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700485 EXPECT_EQ(0, result.download_url_idx);
486 EXPECT_EQ(0, result.download_url_num_errors);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700487}
488
Alex Deymo63784a52014-05-28 10:46:14 -0700489TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoDevicePolicy) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700490 // The UpdateCanStart policy returns true; no device policy is loaded.
491
492 SetUpdateCheckAllowed(false);
493 fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
494 new bool(false));
495
496 // Check that the UpdateCanStart returns true with no further attributes.
497 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700498 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700499 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700500 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700501 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700502 EXPECT_FALSE(result.p2p_downloading_allowed);
503 EXPECT_FALSE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700504 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700505 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700506 EXPECT_EQ(0, result.download_url_num_errors);
507 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700508}
509
Alex Deymo63784a52014-05-28 10:46:14 -0700510TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBlankPolicy) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700511 // The UpdateCanStart policy returns true; device policy is loaded but imposes
512 // no restrictions on updating.
513
514 SetUpdateCheckAllowed(false);
515
516 // Check that the UpdateCanStart returns true.
517 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700518 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700519 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700520 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700521 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700522 EXPECT_FALSE(result.p2p_downloading_allowed);
523 EXPECT_FALSE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700524 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700525 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700526 EXPECT_EQ(0, result.download_url_num_errors);
527 EXPECT_FALSE(result.do_increment_failures);
528}
529
530TEST_F(UmChromeOSPolicyTest,
531 UpdateCanStartNotAllowedBackoffNewWaitPeriodApplies) {
532 // The UpdateCanStart policy returns false; failures are reported and a new
533 // backoff period is enacted.
534
535 SetUpdateCheckAllowed(false);
536
537 const Time curr_time = fake_clock_.GetWallclockTime();
538 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
539 update_state.download_errors_max = 1;
540 update_state.download_errors.emplace_back(
541 0, ErrorCode::kDownloadTransferError,
542 curr_time - TimeDelta::FromSeconds(8));
543 update_state.download_errors.emplace_back(
544 0, ErrorCode::kDownloadTransferError,
545 curr_time - TimeDelta::FromSeconds(2));
546
547 // Check that UpdateCanStart returns false and a new backoff expiry is
548 // generated.
549 UpdateDownloadParams result;
550 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
551 update_state);
552 EXPECT_FALSE(result.update_can_start);
553 EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
554 EXPECT_TRUE(result.do_increment_failures);
555 EXPECT_LT(curr_time, result.backoff_expiry);
556}
557
558TEST_F(UmChromeOSPolicyTest,
559 UpdateCanStartNotAllowedBackoffPrevWaitPeriodStillApplies) {
560 // The UpdateCanStart policy returns false; a previously enacted backoff
561 // period still applies.
562
563 SetUpdateCheckAllowed(false);
564
565 const Time curr_time = fake_clock_.GetWallclockTime();
566 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
567 update_state.download_errors_max = 1;
568 update_state.download_errors.emplace_back(
569 0, ErrorCode::kDownloadTransferError,
570 curr_time - TimeDelta::FromSeconds(8));
571 update_state.download_errors.emplace_back(
572 0, ErrorCode::kDownloadTransferError,
573 curr_time - TimeDelta::FromSeconds(2));
574 update_state.failures_last_updated = curr_time;
575 update_state.backoff_expiry = curr_time + TimeDelta::FromMinutes(3);
576
577 // Check that UpdateCanStart returns false and a new backoff expiry is
578 // generated.
579 UpdateDownloadParams result;
580 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::UpdateCanStart,
581 &result, update_state);
582 EXPECT_FALSE(result.update_can_start);
583 EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
584 EXPECT_FALSE(result.do_increment_failures);
585 EXPECT_LT(curr_time, result.backoff_expiry);
586}
587
588TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffSatisfied) {
589 // The UpdateCanStart policy returns true; a previously enacted backoff period
590 // has elapsed, we're good to go.
591
592 SetUpdateCheckAllowed(false);
593
594 const Time curr_time = fake_clock_.GetWallclockTime();
595 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
596 update_state.download_errors_max = 1;
597 update_state.download_errors.emplace_back(
598 0, ErrorCode::kDownloadTransferError,
599 curr_time - TimeDelta::FromSeconds(8));
600 update_state.download_errors.emplace_back(
601 0, ErrorCode::kDownloadTransferError,
602 curr_time - TimeDelta::FromSeconds(2));
603 update_state.failures_last_updated = curr_time - TimeDelta::FromSeconds(1);
604 update_state.backoff_expiry = curr_time - TimeDelta::FromSeconds(1);
605
606 // Check that UpdateCanStart returns false and a new backoff expiry is
607 // generated.
608 UpdateDownloadParams result;
609 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart,
610 &result, update_state);
611 EXPECT_TRUE(result.update_can_start);
612 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
613 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700614 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700615 EXPECT_EQ(0, result.download_url_num_errors);
616 EXPECT_FALSE(result.do_increment_failures);
617 EXPECT_EQ(Time(), result.backoff_expiry);
618}
619
620TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffDisabled) {
621 // The UpdateCanStart policy returns false; failures are reported but backoff
622 // is disabled.
623
624 SetUpdateCheckAllowed(false);
625
626 const Time curr_time = fake_clock_.GetWallclockTime();
627 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
628 update_state.download_errors_max = 1;
629 update_state.download_errors.emplace_back(
630 0, ErrorCode::kDownloadTransferError,
631 curr_time - TimeDelta::FromSeconds(8));
632 update_state.download_errors.emplace_back(
633 0, ErrorCode::kDownloadTransferError,
634 curr_time - TimeDelta::FromSeconds(2));
635 update_state.is_backoff_disabled = true;
636
637 // Check that UpdateCanStart returns false and a new backoff expiry is
638 // generated.
639 UpdateDownloadParams result;
640 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
641 update_state);
642 EXPECT_TRUE(result.update_can_start);
643 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
644 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700645 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700646 EXPECT_EQ(0, result.download_url_num_errors);
647 EXPECT_TRUE(result.do_increment_failures);
648 EXPECT_EQ(Time(), result.backoff_expiry);
649}
650
651TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffInteractive) {
652 // The UpdateCanStart policy returns false; failures are reported but this is
653 // an interactive update check.
654
655 SetUpdateCheckAllowed(false);
656
657 const Time curr_time = fake_clock_.GetWallclockTime();
658 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
659 update_state.download_errors_max = 1;
660 update_state.download_errors.emplace_back(
661 0, ErrorCode::kDownloadTransferError,
662 curr_time - TimeDelta::FromSeconds(8));
663 update_state.download_errors.emplace_back(
664 0, ErrorCode::kDownloadTransferError,
665 curr_time - TimeDelta::FromSeconds(2));
666 update_state.is_interactive = true;
667
668 // Check that UpdateCanStart returns false and a new backoff expiry is
669 // generated.
670 UpdateDownloadParams result;
671 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
672 update_state);
673 EXPECT_TRUE(result.update_can_start);
674 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
675 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700676 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700677 EXPECT_EQ(0, result.download_url_num_errors);
678 EXPECT_TRUE(result.do_increment_failures);
679 EXPECT_EQ(Time(), result.backoff_expiry);
680}
681
682TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffDelta) {
683 // The UpdateCanStart policy returns false; failures are reported but this is
684 // a delta payload.
685
686 SetUpdateCheckAllowed(false);
687
688 const Time curr_time = fake_clock_.GetWallclockTime();
689 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
690 update_state.download_errors_max = 1;
691 update_state.download_errors.emplace_back(
692 0, ErrorCode::kDownloadTransferError,
693 curr_time - TimeDelta::FromSeconds(8));
694 update_state.download_errors.emplace_back(
695 0, ErrorCode::kDownloadTransferError,
696 curr_time - TimeDelta::FromSeconds(2));
697 update_state.is_delta_payload = true;
698
699 // Check that UpdateCanStart returns false and a new backoff expiry is
700 // generated.
701 UpdateDownloadParams result;
702 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
703 update_state);
704 EXPECT_TRUE(result.update_can_start);
705 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
706 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700707 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700708 EXPECT_EQ(0, result.download_url_num_errors);
709 EXPECT_TRUE(result.do_increment_failures);
710 EXPECT_EQ(Time(), result.backoff_expiry);
711}
712
713TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffUnofficialBuild) {
714 // The UpdateCanStart policy returns false; failures are reported but this is
715 // an unofficial build.
716
717 SetUpdateCheckAllowed(false);
718
719 const Time curr_time = fake_clock_.GetWallclockTime();
720 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
721 update_state.download_errors_max = 1;
722 update_state.download_errors.emplace_back(
723 0, ErrorCode::kDownloadTransferError,
724 curr_time - TimeDelta::FromSeconds(8));
725 update_state.download_errors.emplace_back(
726 0, ErrorCode::kDownloadTransferError,
727 curr_time - TimeDelta::FromSeconds(2));
728
729 fake_state_.system_provider()->var_is_official_build()->
730 reset(new bool(false));
731
732 // Check that UpdateCanStart returns false and a new backoff expiry is
733 // generated.
734 UpdateDownloadParams result;
735 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
736 update_state);
737 EXPECT_TRUE(result.update_can_start);
738 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
739 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700740 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700741 EXPECT_EQ(0, result.download_url_num_errors);
742 EXPECT_TRUE(result.do_increment_failures);
743 EXPECT_EQ(Time(), result.backoff_expiry);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700744}
745
Alex Deymo63784a52014-05-28 10:46:14 -0700746TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsScatteringFailed) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700747 // The UpdateCanStart policy fails because the UpdateScattering policy it
748 // depends on fails (unset variable).
749
750 SetUpdateCheckAllowed(false);
751
752 // Override the default seed variable with a null value so that the policy
753 // request would fail.
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700754 // TODO(garnold) This failure may or may not fail a number
755 // sub-policies/decisions, like scattering and backoff. We'll need a more
756 // deliberate setup to ensure that we're failing what we want to be failing.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700757 fake_state_.random_provider()->var_seed()->reset(nullptr);
758
759 // Check that the UpdateCanStart fails.
760 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700761 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700762 ExpectPolicyStatus(EvalStatus::kFailed,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700763 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700764}
765
Alex Deymo63784a52014-05-28 10:46:14 -0700766TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700767 UpdateCanStartNotAllowedScatteringNewWaitPeriodApplies) {
768 // The UpdateCanStart policy returns false; device policy is loaded and
769 // scattering applies due to an unsatisfied wait period, which was newly
770 // generated.
771
772 SetUpdateCheckAllowed(false);
773 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
774 new TimeDelta(TimeDelta::FromMinutes(2)));
775
776
777 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
778
779 // Check that the UpdateCanStart returns false and a new wait period
780 // generated.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700781 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700782 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700783 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700784 EXPECT_FALSE(result.update_can_start);
785 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
786 EXPECT_LT(TimeDelta(), result.scatter_wait_period);
787 EXPECT_EQ(0, result.scatter_check_threshold);
788}
789
Alex Deymo63784a52014-05-28 10:46:14 -0700790TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700791 UpdateCanStartNotAllowedScatteringPrevWaitPeriodStillApplies) {
792 // The UpdateCanStart policy returns false w/ kAskMeAgainLater; device policy
793 // is loaded and a previously generated scattering period still applies, none
794 // of the scattering values has changed.
795
796 SetUpdateCheckAllowed(false);
797 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
798 new TimeDelta(TimeDelta::FromMinutes(2)));
799
800 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
801 update_state.scatter_wait_period = TimeDelta::FromSeconds(35);
802
803 // Check that the UpdateCanStart returns false and a new wait period
804 // generated.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700805 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700806 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::UpdateCanStart,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700807 &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700808 EXPECT_FALSE(result.update_can_start);
809 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
810 EXPECT_EQ(TimeDelta::FromSeconds(35), result.scatter_wait_period);
811 EXPECT_EQ(0, result.scatter_check_threshold);
812}
813
Alex Deymo63784a52014-05-28 10:46:14 -0700814TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700815 UpdateCanStartNotAllowedScatteringNewCountThresholdApplies) {
816 // The UpdateCanStart policy returns false; device policy is loaded and
817 // scattering applies due to an unsatisfied update check count threshold.
818 //
819 // This ensures a non-zero check threshold, which may or may not be combined
820 // with a non-zero wait period (for which we cannot reliably control).
821
822 SetUpdateCheckAllowed(false);
823 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
824 new TimeDelta(TimeDelta::FromSeconds(1)));
825
826 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
827 update_state.scatter_check_threshold_min = 2;
828 update_state.scatter_check_threshold_max = 5;
829
830 // Check that the UpdateCanStart returns false.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700831 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700832 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700833 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700834 EXPECT_FALSE(result.update_can_start);
835 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
836 EXPECT_LE(2, result.scatter_check_threshold);
837 EXPECT_GE(5, result.scatter_check_threshold);
838}
839
Alex Deymo63784a52014-05-28 10:46:14 -0700840TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700841 UpdateCanStartNotAllowedScatteringPrevCountThresholdStillApplies) {
842 // The UpdateCanStart policy returns false; device policy is loaded and
843 // scattering due to a previously generated count threshold still applies.
844
845 SetUpdateCheckAllowed(false);
846 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
847 new TimeDelta(TimeDelta::FromSeconds(1)));
848
849 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
850 update_state.scatter_check_threshold = 3;
851 update_state.scatter_check_threshold_min = 2;
852 update_state.scatter_check_threshold_max = 5;
853
854 // Check that the UpdateCanStart returns false.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700855 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700856 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700857 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700858 EXPECT_FALSE(result.update_can_start);
859 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
860 EXPECT_EQ(3, result.scatter_check_threshold);
861}
862
Alex Deymo63784a52014-05-28 10:46:14 -0700863TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedScatteringSatisfied) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700864 // The UpdateCanStart policy returns true; device policy is loaded and
865 // scattering is enabled, but both wait period and check threshold are
866 // satisfied.
867
868 SetUpdateCheckAllowed(false);
869 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
870 new TimeDelta(TimeDelta::FromSeconds(120)));
871
872 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(75));
873 update_state.num_checks = 4;
874 update_state.scatter_wait_period = TimeDelta::FromSeconds(60);
875 update_state.scatter_check_threshold = 3;
876 update_state.scatter_check_threshold_min = 2;
877 update_state.scatter_check_threshold_max = 5;
878
879 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700880 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700881 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700882 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700883 EXPECT_TRUE(result.update_can_start);
884 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
885 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700886 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700887 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700888 EXPECT_EQ(0, result.download_url_num_errors);
889 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700890}
891
Alex Deymo63784a52014-05-28 10:46:14 -0700892TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700893 UpdateCanStartAllowedInteractivePreventsScattering) {
894 // The UpdateCanStart policy returns true; device policy is loaded and
895 // scattering would have applied, except that the update check is interactive
896 // and so it is suppressed.
897
898 SetUpdateCheckAllowed(false);
899 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
900 new TimeDelta(TimeDelta::FromSeconds(1)));
901
902 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700903 update_state.is_interactive = true;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700904 update_state.scatter_check_threshold = 0;
905 update_state.scatter_check_threshold_min = 2;
906 update_state.scatter_check_threshold_max = 5;
907
908 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700909 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700910 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700911 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700912 EXPECT_TRUE(result.update_can_start);
913 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
914 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700915 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700916 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700917 EXPECT_EQ(0, result.download_url_num_errors);
918 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700919}
920
Alex Deymo63784a52014-05-28 10:46:14 -0700921TEST_F(UmChromeOSPolicyTest,
Gilad Arnold76a11f62014-05-20 09:02:12 -0700922 UpdateCanStartAllowedOobePreventsScattering) {
923 // The UpdateCanStart policy returns true; device policy is loaded and
924 // scattering would have applied, except that OOBE was not completed and so it
925 // is suppressed.
926
927 SetUpdateCheckAllowed(false);
928 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
929 new TimeDelta(TimeDelta::FromSeconds(1)));
930 fake_state_.system_provider()->var_is_oobe_complete()->reset(new bool(false));
931
932 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700933 update_state.is_interactive = true;
Gilad Arnold76a11f62014-05-20 09:02:12 -0700934 update_state.scatter_check_threshold = 0;
935 update_state.scatter_check_threshold_min = 2;
936 update_state.scatter_check_threshold_max = 5;
937
938 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700939 UpdateDownloadParams result;
Gilad Arnold76a11f62014-05-20 09:02:12 -0700940 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700941 update_state);
Gilad Arnold76a11f62014-05-20 09:02:12 -0700942 EXPECT_TRUE(result.update_can_start);
943 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
944 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700945 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700946 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700947 EXPECT_EQ(0, result.download_url_num_errors);
948 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnold76a11f62014-05-20 09:02:12 -0700949}
950
Alex Deymo63784a52014-05-28 10:46:14 -0700951TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithAttributes) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700952 // The UpdateCanStart policy returns true; device policy permits both HTTP and
953 // P2P updates, as well as a non-empty target channel string.
954
955 SetUpdateCheckAllowed(false);
956
957 // Override specific device policy attributes.
958 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
959 new bool(true));
960 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
961 new bool(true));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700962
963 // Check that the UpdateCanStart returns true.
964 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700965 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700966 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700967 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700968 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700969 EXPECT_TRUE(result.p2p_downloading_allowed);
970 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700971 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700972 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700973 EXPECT_EQ(0, result.download_url_num_errors);
974 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700975}
976
Alex Deymo63784a52014-05-28 10:46:14 -0700977TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithP2PFromUpdater) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700978 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
979 // P2P updates, but the updater is configured to allow P2P and overrules the
980 // setting.
981
982 SetUpdateCheckAllowed(false);
983
984 // Override specific device policy attributes.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700985 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
986
987 // Check that the UpdateCanStart returns true.
988 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700989 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700990 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700991 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700992 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700993 EXPECT_TRUE(result.p2p_downloading_allowed);
994 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700995 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700996 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700997 EXPECT_EQ(0, result.download_url_num_errors);
998 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700999}
1000
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001001TEST_F(UmChromeOSPolicyTest,
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001002 UpdateCanStartAllowedP2PDownloadingBlockedDueToOmaha) {
1003 // The UpdateCanStart policy returns true; device policy permits HTTP, but
1004 // policy blocks P2P downloading because Omaha forbids it. P2P sharing is
1005 // still permitted.
1006
1007 SetUpdateCheckAllowed(false);
1008
1009 // Override specific device policy attributes.
1010 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1011 new bool(true));
1012 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1013 new bool(true));
1014
1015 // Check that the UpdateCanStart returns true.
1016 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1017 update_state.p2p_downloading_disabled = true;
1018 UpdateDownloadParams result;
1019 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1020 update_state);
1021 EXPECT_TRUE(result.update_can_start);
1022 EXPECT_FALSE(result.p2p_downloading_allowed);
1023 EXPECT_TRUE(result.p2p_sharing_allowed);
1024}
1025
1026TEST_F(UmChromeOSPolicyTest,
1027 UpdateCanStartAllowedP2PSharingBlockedDueToOmaha) {
1028 // The UpdateCanStart policy returns true; device policy permits HTTP, but
1029 // policy blocks P2P sharing because Omaha forbids it. P2P downloading is
1030 // still permitted.
1031
1032 SetUpdateCheckAllowed(false);
1033
1034 // Override specific device policy attributes.
1035 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1036 new bool(true));
1037 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1038 new bool(true));
1039
1040 // Check that the UpdateCanStart returns true.
1041 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1042 update_state.p2p_sharing_disabled = true;
1043 UpdateDownloadParams result;
1044 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1045 update_state);
1046 EXPECT_TRUE(result.update_can_start);
1047 EXPECT_TRUE(result.p2p_downloading_allowed);
1048 EXPECT_FALSE(result.p2p_sharing_allowed);
1049}
1050
1051TEST_F(UmChromeOSPolicyTest,
1052 UpdateCanStartAllowedP2PDownloadingBlockedDueToNumAttempts) {
Gilad Arnold349ac832014-10-06 14:20:28 -07001053 // The UpdateCanStart policy returns true; device policy permits HTTP but
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001054 // blocks P2P download, because the max number of P2P downloads have been
1055 // attempted. P2P sharing is still permitted.
Gilad Arnold349ac832014-10-06 14:20:28 -07001056
1057 SetUpdateCheckAllowed(false);
1058
1059 // Override specific device policy attributes.
1060 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1061 new bool(true));
1062 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1063 new bool(true));
1064
1065 // Check that the UpdateCanStart returns true.
1066 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1067 update_state.p2p_num_attempts = ChromeOSPolicy::kMaxP2PAttempts;
1068 UpdateDownloadParams result;
1069 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1070 update_state);
1071 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001072 EXPECT_FALSE(result.p2p_downloading_allowed);
1073 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnold349ac832014-10-06 14:20:28 -07001074}
1075
1076TEST_F(UmChromeOSPolicyTest,
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001077 UpdateCanStartAllowedP2PDownloadingBlockedDueToAttemptsPeriod) {
Gilad Arnold349ac832014-10-06 14:20:28 -07001078 // The UpdateCanStart policy returns true; device policy permits HTTP but
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001079 // blocks P2P download, because the max period for attempt to download via P2P
1080 // has elapsed. P2P sharing is still permitted.
Gilad Arnold349ac832014-10-06 14:20:28 -07001081
1082 SetUpdateCheckAllowed(false);
1083
1084 // Override specific device policy attributes.
1085 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1086 new bool(true));
1087 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1088 new bool(true));
1089
1090 // Check that the UpdateCanStart returns true.
1091 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1092 update_state.p2p_num_attempts = 1;
1093 update_state.p2p_first_attempted =
1094 fake_clock_.GetWallclockTime() -
Alex Deymof329b932014-10-30 01:37:48 -07001095 TimeDelta::FromSeconds(
1096 ChromeOSPolicy::kMaxP2PAttemptsPeriodInSeconds + 1);
Gilad Arnold349ac832014-10-06 14:20:28 -07001097 UpdateDownloadParams result;
1098 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1099 update_state);
1100 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001101 EXPECT_FALSE(result.p2p_downloading_allowed);
1102 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnold349ac832014-10-06 14:20:28 -07001103}
1104
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001105TEST_F(UmChromeOSPolicyTest,
1106 UpdateCanStartAllowedWithHttpUrlForUnofficialBuild) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001107 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1108 // P2P updates, but marking this an unofficial build overrules the HTTP
1109 // setting.
1110
1111 SetUpdateCheckAllowed(false);
1112
1113 // Override specific device policy attributes.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001114 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1115 new bool(false));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001116 fake_state_.system_provider()->var_is_official_build()->
1117 reset(new bool(false));
1118
1119 // Check that the UpdateCanStart returns true.
1120 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001121 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001122 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001123 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001124 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001125 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001126 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001127 EXPECT_EQ(0, result.download_url_num_errors);
1128 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001129}
1130
1131TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithHttpsUrl) {
1132 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1133 // P2P updates, but an HTTPS URL is provided and selected for download.
1134
1135 SetUpdateCheckAllowed(false);
1136
1137 // Override specific device policy attributes.
1138 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1139 new bool(false));
1140
1141 // Add an HTTPS URL.
1142 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001143 update_state.download_urls.emplace_back("https://secure/url/");
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001144
1145 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001146 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001147 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001148 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001149 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001150 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001151 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001152 EXPECT_EQ(0, result.download_url_num_errors);
1153 EXPECT_FALSE(result.do_increment_failures);
1154}
1155
1156TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedMaxErrorsNotExceeded) {
1157 // The UpdateCanStart policy returns true; the first URL has download errors
1158 // but does not exceed the maximum allowed number of failures, so it is stilli
1159 // usable.
1160
1161 SetUpdateCheckAllowed(false);
1162
1163 // Add a second URL; update with this URL attempted and failed enough times to
1164 // disqualify the current (first) URL.
1165 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1166 update_state.num_checks = 5;
1167 update_state.download_urls.emplace_back("http://another/fake/url/");
1168 Time t = fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(12);
1169 for (int i = 0; i < 5; i++) {
1170 update_state.download_errors.emplace_back(
1171 0, ErrorCode::kDownloadTransferError, t);
1172 t += TimeDelta::FromSeconds(1);
1173 }
1174
1175 // Check that the UpdateCanStart returns true.
1176 UpdateDownloadParams result;
1177 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1178 update_state);
1179 EXPECT_TRUE(result.update_can_start);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001180 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001181 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001182 EXPECT_EQ(5, result.download_url_num_errors);
1183 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001184}
1185
1186TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlMaxExceeded) {
1187 // The UpdateCanStart policy returns true; the first URL exceeded the maximum
1188 // allowed number of failures, but a second URL is available.
1189
1190 SetUpdateCheckAllowed(false);
1191
1192 // Add a second URL; update with this URL attempted and failed enough times to
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001193 // disqualify the current (first) URL.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001194 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1195 update_state.num_checks = 10;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001196 update_state.download_urls.emplace_back("http://another/fake/url/");
1197 Time t = fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(12);
1198 for (int i = 0; i < 11; i++) {
1199 update_state.download_errors.emplace_back(
1200 0, ErrorCode::kDownloadTransferError, t);
1201 t += TimeDelta::FromSeconds(1);
1202 }
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001203
1204 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001205 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001206 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001207 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001208 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001209 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001210 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001211 EXPECT_EQ(0, result.download_url_num_errors);
1212 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001213}
1214
1215TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlHardError) {
1216 // The UpdateCanStart policy returns true; the first URL fails with a hard
1217 // error, but a second URL is available.
1218
1219 SetUpdateCheckAllowed(false);
1220
1221 // Add a second URL; update with this URL attempted and failed in a way that
1222 // causes it to switch directly to the next URL.
1223 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1224 update_state.num_checks = 10;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001225 update_state.download_urls.emplace_back("http://another/fake/url/");
1226 update_state.download_errors.emplace_back(
1227 0, ErrorCode::kPayloadHashMismatchError,
1228 fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(1));
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001229
1230 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001231 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001232 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001233 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001234 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001235 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001236 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001237 EXPECT_EQ(0, result.download_url_num_errors);
1238 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001239}
1240
1241TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedUrlWrapsAround) {
1242 // The UpdateCanStart policy returns true; URL search properly wraps around
1243 // the last one on the list.
1244
1245 SetUpdateCheckAllowed(false);
1246
1247 // Add a second URL; update with this URL attempted and failed in a way that
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001248 // causes it to switch directly to the next URL. We must disable backoff in
1249 // order for it not to interfere.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001250 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001251 update_state.num_checks = 1;
1252 update_state.is_backoff_disabled = true;
1253 update_state.download_urls.emplace_back("http://another/fake/url/");
1254 update_state.download_errors.emplace_back(
1255 1, ErrorCode::kPayloadHashMismatchError,
1256 fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(1));
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001257
1258 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001259 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001260 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001261 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001262 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001263 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001264 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001265 EXPECT_EQ(0, result.download_url_num_errors);
1266 EXPECT_TRUE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001267}
1268
1269TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedNoUsableUrls) {
1270 // The UpdateCanStart policy returns false; there's a single HTTP URL but its
1271 // use is forbidden by policy.
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001272 //
1273 // Note: In the case where no usable URLs are found, the policy should not
1274 // increment the number of failed attempts! Doing so would result in a
1275 // non-idempotent semantics, and does not fall within the intended purpose of
1276 // the backoff mechanism anyway.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001277
1278 SetUpdateCheckAllowed(false);
1279
1280 // Override specific device policy attributes.
1281 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1282 new bool(false));
1283
1284 // Check that the UpdateCanStart returns false.
1285 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001286 UpdateDownloadParams result;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001287 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1288 update_state);
1289 EXPECT_FALSE(result.update_can_start);
1290 EXPECT_EQ(UpdateCannotStartReason::kCannotDownload,
1291 result.cannot_start_reason);
1292 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001293}
1294
1295TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoUsableUrlsButP2PEnabled) {
1296 // The UpdateCanStart policy returns true; there's a single HTTP URL but its
1297 // use is forbidden by policy, however P2P is enabled. The result indicates
1298 // that no URL can be used.
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001299 //
1300 // Note: The number of failed attempts should not increase in this case (see
1301 // above test).
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001302
1303 SetUpdateCheckAllowed(false);
1304
1305 // Override specific device policy attributes.
1306 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1307 new bool(true));
1308 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1309 new bool(false));
1310
1311 // Check that the UpdateCanStart returns true.
1312 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001313 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001314 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001315 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001316 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001317 EXPECT_TRUE(result.p2p_downloading_allowed);
1318 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001319 EXPECT_GT(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001320 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001321 EXPECT_EQ(0, result.download_url_num_errors);
1322 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001323}
1324
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001325TEST_F(UmChromeOSPolicyTest,
1326 UpdateCanStartAllowedNoUsableUrlsButEnterpriseEnrolled) {
1327 // The UpdateCanStart policy returns true; there's a single HTTP URL but its
1328 // use is forbidden by policy, and P2P is unset on the policy, however the
1329 // device is enterprise-enrolled so P2P is allowed. The result indicates that
1330 // no URL can be used.
1331 //
1332 // Note: The number of failed attempts should not increase in this case (see
1333 // above test).
1334
1335 SetUpdateCheckAllowed(false);
1336
1337 // Override specific device policy attributes.
1338 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(nullptr);
1339 fake_state_.device_policy_provider()->var_owner()->reset(nullptr);
1340 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1341 new bool(false));
1342
1343 // Check that the UpdateCanStart returns true.
1344 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1345 UpdateDownloadParams result;
1346 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1347 update_state);
1348 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001349 EXPECT_TRUE(result.p2p_downloading_allowed);
1350 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001351 EXPECT_GT(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001352 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001353 EXPECT_EQ(0, result.download_url_num_errors);
1354 EXPECT_FALSE(result.do_increment_failures);
1355}
1356
Gilad Arnold684219d2014-07-07 14:54:57 -07001357TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedEthernetDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001358 // Ethernet is always allowed.
1359
1360 fake_state_.shill_provider()->var_conn_type()->
1361 reset(new ConnectionType(ConnectionType::kEthernet));
1362
1363 bool result;
1364 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001365 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001366 EXPECT_TRUE(result);
1367}
1368
Gilad Arnold684219d2014-07-07 14:54:57 -07001369TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWifiDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001370 // Wifi is allowed if not tethered.
1371
1372 fake_state_.shill_provider()->var_conn_type()->
1373 reset(new ConnectionType(ConnectionType::kWifi));
1374
1375 bool result;
1376 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001377 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001378 EXPECT_TRUE(result);
1379}
1380
Alex Deymo63784a52014-05-28 10:46:14 -07001381TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001382 UpdateCurrentConnectionNotAllowedWifiTetheredDefault) {
1383 // Tethered wifi is not allowed by default.
1384
1385 fake_state_.shill_provider()->var_conn_type()->
1386 reset(new ConnectionType(ConnectionType::kWifi));
1387 fake_state_.shill_provider()->var_conn_tethering()->
1388 reset(new ConnectionTethering(ConnectionTethering::kConfirmed));
1389
1390 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001391 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001392 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001393}
1394
Alex Deymo63784a52014-05-28 10:46:14 -07001395TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001396 UpdateDownloadAllowedWifiTetheredPolicyOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001397 // Tethered wifi can be allowed by policy.
1398
1399 fake_state_.shill_provider()->var_conn_type()->
1400 reset(new ConnectionType(ConnectionType::kWifi));
1401 fake_state_.shill_provider()->var_conn_tethering()->
1402 reset(new ConnectionTethering(ConnectionTethering::kConfirmed));
1403 set<ConnectionType> allowed_connections;
1404 allowed_connections.insert(ConnectionType::kCellular);
1405 fake_state_.device_policy_provider()->
1406 var_allowed_connection_types_for_update()->
1407 reset(new set<ConnectionType>(allowed_connections));
1408
1409 bool result;
1410 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001411 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001412 EXPECT_TRUE(result);
1413}
1414
Gilad Arnold684219d2014-07-07 14:54:57 -07001415TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWimaxDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001416 // Wimax is always allowed.
1417
1418 fake_state_.shill_provider()->var_conn_type()->
1419 reset(new ConnectionType(ConnectionType::kWifi));
1420
1421 bool result;
1422 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001423 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001424 EXPECT_TRUE(result);
1425}
1426
Alex Deymo63784a52014-05-28 10:46:14 -07001427TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001428 UpdateCurrentConnectionNotAllowedBluetoothDefault) {
1429 // Bluetooth is never allowed.
1430
1431 fake_state_.shill_provider()->var_conn_type()->
1432 reset(new ConnectionType(ConnectionType::kBluetooth));
1433
1434 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001435 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001436 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001437}
1438
Alex Deymo63784a52014-05-28 10:46:14 -07001439TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001440 UpdateCurrentConnectionNotAllowedBluetoothPolicyCannotOverride) {
1441 // Bluetooth cannot be allowed even by policy.
1442
1443 fake_state_.shill_provider()->var_conn_type()->
1444 reset(new ConnectionType(ConnectionType::kBluetooth));
1445 set<ConnectionType> allowed_connections;
1446 allowed_connections.insert(ConnectionType::kBluetooth);
1447 fake_state_.device_policy_provider()->
1448 var_allowed_connection_types_for_update()->
1449 reset(new set<ConnectionType>(allowed_connections));
1450
1451 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001452 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001453 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001454}
1455
Alex Deymo63784a52014-05-28 10:46:14 -07001456TEST_F(UmChromeOSPolicyTest, UpdateCurrentConnectionNotAllowedCellularDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001457 // Cellular is not allowed by default.
1458
1459 fake_state_.shill_provider()->var_conn_type()->
1460 reset(new ConnectionType(ConnectionType::kCellular));
1461
1462 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001463 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001464 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001465}
1466
Alex Deymo63784a52014-05-28 10:46:14 -07001467TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001468 UpdateDownloadAllowedCellularPolicyOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001469 // Update over cellular can be enabled by policy.
1470
1471 fake_state_.shill_provider()->var_conn_type()->
1472 reset(new ConnectionType(ConnectionType::kCellular));
1473 set<ConnectionType> allowed_connections;
1474 allowed_connections.insert(ConnectionType::kCellular);
1475 fake_state_.device_policy_provider()->
1476 var_allowed_connection_types_for_update()->
1477 reset(new set<ConnectionType>(allowed_connections));
1478
1479 bool result;
1480 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001481 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001482 EXPECT_TRUE(result);
1483}
1484
Alex Deymo63784a52014-05-28 10:46:14 -07001485TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001486 UpdateDownloadAllowedCellularUserOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001487 // Update over cellular can be enabled by user settings, but only if policy
1488 // is present and does not determine allowed connections.
1489
1490 fake_state_.shill_provider()->var_conn_type()->
1491 reset(new ConnectionType(ConnectionType::kCellular));
1492 set<ConnectionType> allowed_connections;
1493 allowed_connections.insert(ConnectionType::kCellular);
1494 fake_state_.updater_provider()->var_cellular_enabled()->
1495 reset(new bool(true));
1496
1497 bool result;
1498 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001499 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001500 EXPECT_TRUE(result);
1501}
1502
Gilad Arnold14a9e702014-10-08 08:09:09 -07001503TEST_F(UmChromeOSPolicyTest,
1504 UpdateCanStartAllowedScatteringSupressedDueToP2P) {
1505 // The UpdateCanStart policy returns true; scattering should have applied, but
1506 // P2P download is allowed. Scattering values are nonetheless returned, and so
1507 // are download URL values, albeit the latter are not allowed to be used.
1508
1509 SetUpdateCheckAllowed(false);
1510 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
1511 new TimeDelta(TimeDelta::FromMinutes(2)));
1512 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1513
1514 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
1515 update_state.scatter_wait_period = TimeDelta::FromSeconds(35);
1516
1517 UpdateDownloadParams result;
1518 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart,
1519 &result, update_state);
1520 EXPECT_TRUE(result.update_can_start);
1521 EXPECT_EQ(0, result.download_url_idx);
1522 EXPECT_FALSE(result.download_url_allowed);
1523 EXPECT_EQ(0, result.download_url_num_errors);
1524 EXPECT_TRUE(result.p2p_downloading_allowed);
1525 EXPECT_TRUE(result.p2p_sharing_allowed);
1526 EXPECT_FALSE(result.do_increment_failures);
1527 EXPECT_EQ(TimeDelta::FromSeconds(35), result.scatter_wait_period);
1528 EXPECT_EQ(0, result.scatter_check_threshold);
1529}
1530
1531TEST_F(UmChromeOSPolicyTest,
1532 UpdateCanStartAllowedBackoffSupressedDueToP2P) {
1533 // The UpdateCanStart policy returns true; backoff should have applied, but
1534 // P2P download is allowed. Backoff values are nonetheless returned, and so
1535 // are download URL values, albeit the latter are not allowed to be used.
1536
1537 SetUpdateCheckAllowed(false);
1538
1539 const Time curr_time = fake_clock_.GetWallclockTime();
1540 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
1541 update_state.download_errors_max = 1;
1542 update_state.download_errors.emplace_back(
1543 0, ErrorCode::kDownloadTransferError,
1544 curr_time - TimeDelta::FromSeconds(8));
1545 update_state.download_errors.emplace_back(
1546 0, ErrorCode::kDownloadTransferError,
1547 curr_time - TimeDelta::FromSeconds(2));
1548 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1549
1550 UpdateDownloadParams result;
1551 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1552 update_state);
1553 EXPECT_TRUE(result.update_can_start);
1554 EXPECT_EQ(0, result.download_url_idx);
1555 EXPECT_FALSE(result.download_url_allowed);
1556 EXPECT_EQ(0, result.download_url_num_errors);
1557 EXPECT_TRUE(result.p2p_downloading_allowed);
1558 EXPECT_TRUE(result.p2p_sharing_allowed);
1559 EXPECT_TRUE(result.do_increment_failures);
1560 EXPECT_LT(curr_time, result.backoff_expiry);
1561}
1562
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001563TEST_F(UmChromeOSPolicyTest, P2PEnabledNotAllowed) {
1564 bool result;
1565 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1566 EXPECT_FALSE(result);
1567}
1568
1569TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedByDevicePolicy) {
1570 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1571 new bool(true));
1572
1573 bool result;
1574 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1575 EXPECT_TRUE(result);
1576}
1577
1578TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedByUpdater) {
1579 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1580
1581 bool result;
1582 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1583 EXPECT_TRUE(result);
1584}
1585
1586TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedDeviceEnterpriseEnrolled) {
1587 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(nullptr);
1588 fake_state_.device_policy_provider()->var_owner()->reset(nullptr);
1589
1590 bool result;
1591 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1592 EXPECT_TRUE(result);
1593}
1594
1595TEST_F(UmChromeOSPolicyTest, P2PEnabledChangedBlocks) {
1596 bool result;
1597 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::P2PEnabledChanged,
1598 &result, false);
1599}
1600
Alex Deymo63784a52014-05-28 10:46:14 -07001601} // namespace chromeos_update_manager