blob: 63fa0f7408781d78e7f439127316ba58c9c156e8 [file] [log] [blame]
Alex Deymoaea4c1c2015-08-19 20:24:43 -07001//
2// Copyright (C) 2014 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
Alex Deymo0d11c602014-04-23 20:12:20 -070016
Alex Deymo63784a52014-05-28 10:46:14 -070017#include "update_engine/update_manager/chromeos_policy.h"
Alex Deymo0d11c602014-04-23 20:12:20 -070018
Gilad Arnold0adbc942014-05-12 10:35:43 -070019#include <set>
Alex Deymo0d11c602014-04-23 20:12:20 -070020#include <string>
Gilad Arnolddc4bb262014-07-23 10:45:19 -070021#include <tuple>
Gilad Arnoldb3b05442014-05-30 14:25:05 -070022#include <vector>
Alex Deymo0d11c602014-04-23 20:12:20 -070023
24#include <base/time/time.h>
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070025#include <brillo/message_loops/fake_message_loop.h>
Alex Deymo0d11c602014-04-23 20:12:20 -070026#include <gtest/gtest.h>
27
Alex Deymo39910dc2015-11-09 17:04:30 -080028#include "update_engine/common/fake_clock.h"
Alex Deymo63784a52014-05-28 10:46:14 -070029#include "update_engine/update_manager/evaluation_context.h"
30#include "update_engine/update_manager/fake_state.h"
31#include "update_engine/update_manager/umtest_utils.h"
Alex Deymo0d11c602014-04-23 20:12:20 -070032
33using base::Time;
34using base::TimeDelta;
Sen Jiang255e22b2016-05-20 16:15:29 -070035using chromeos_update_engine::ConnectionTethering;
36using chromeos_update_engine::ConnectionType;
Gilad Arnoldb3b05442014-05-30 14:25:05 -070037using chromeos_update_engine::ErrorCode;
Alex Deymo0d11c602014-04-23 20:12:20 -070038using chromeos_update_engine::FakeClock;
Gilad Arnold0adbc942014-05-12 10:35:43 -070039using std::set;
Alex Deymo0d11c602014-04-23 20:12:20 -070040using std::string;
Gilad Arnolddc4bb262014-07-23 10:45:19 -070041using std::tuple;
Gilad Arnoldb3b05442014-05-30 14:25:05 -070042using std::vector;
Alex Deymo0d11c602014-04-23 20:12:20 -070043
Alex Deymo63784a52014-05-28 10:46:14 -070044namespace chromeos_update_manager {
Alex Deymo0d11c602014-04-23 20:12:20 -070045
Alex Deymo63784a52014-05-28 10:46:14 -070046class UmChromeOSPolicyTest : public ::testing::Test {
Alex Deymo0d11c602014-04-23 20:12:20 -070047 protected:
Alex Deymo610277e2014-11-11 21:18:11 -080048 void SetUp() override {
Alex Deymo509dd532015-06-10 14:11:05 -070049 loop_.SetAsCurrent();
Alex Deymo0d11c602014-04-23 20:12:20 -070050 SetUpDefaultClock();
Gilad Arnoldb2271992014-06-19 12:35:24 -070051 eval_ctx_ = new EvaluationContext(&fake_clock_, TimeDelta::FromSeconds(5));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070052 SetUpDefaultState();
53 SetUpDefaultDevicePolicy();
Alex Deymo0d11c602014-04-23 20:12:20 -070054 }
55
Alex Deymo509dd532015-06-10 14:11:05 -070056 void TearDown() override {
57 EXPECT_FALSE(loop_.PendingTasks());
58 }
59
Alex Deymo0d11c602014-04-23 20:12:20 -070060 // Sets the clock to fixed values.
61 void SetUpDefaultClock() {
62 fake_clock_.SetMonotonicTime(Time::FromInternalValue(12345678L));
63 fake_clock_.SetWallclockTime(Time::FromInternalValue(12345678901234L));
64 }
65
66 void SetUpDefaultState() {
67 fake_state_.updater_provider()->var_updater_started_time()->reset(
68 new Time(fake_clock_.GetWallclockTime()));
69 fake_state_.updater_provider()->var_last_checked_time()->reset(
70 new Time(fake_clock_.GetWallclockTime()));
71 fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -070072 reset(new unsigned int{0});
Gilad Arnolda0258a52014-07-10 16:21:19 -070073 fake_state_.updater_provider()->var_server_dictated_poll_interval()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -070074 reset(new unsigned int{0});
75 fake_state_.updater_provider()->var_forced_update_requested()->
76 reset(new UpdateRequestStatus{UpdateRequestStatus::kNone});
Alex Deymo0d11c602014-04-23 20:12:20 -070077
78 fake_state_.random_provider()->var_seed()->reset(
79 new uint64_t(4)); // chosen by fair dice roll.
80 // guaranteed to be random.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070081
82 // No device policy loaded by default.
83 fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
84 new bool(false));
85
Gilad Arnolda1eabcd2014-07-09 15:42:40 -070086 // OOBE is enabled by default.
87 fake_state_.config_provider()->var_is_oobe_enabled()->reset(
88 new bool(true));
89
Gilad Arnold76a11f62014-05-20 09:02:12 -070090 // For the purpose of the tests, this is an official build and OOBE was
91 // completed.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070092 fake_state_.system_provider()->var_is_official_build()->reset(
93 new bool(true));
Gilad Arnold76a11f62014-05-20 09:02:12 -070094 fake_state_.system_provider()->var_is_oobe_complete()->reset(
95 new bool(true));
Aaron Woodc73fdc12017-12-06 11:09:15 -080096 // NOLINTNEXTLINE(readability/casting)
Alex Deymo763e7db2015-08-27 21:08:08 -070097 fake_state_.system_provider()->var_num_slots()->reset(new unsigned int(2));
Gilad Arnold0adbc942014-05-12 10:35:43 -070098
99 // Connection is wifi, untethered.
100 fake_state_.shill_provider()->var_conn_type()->
101 reset(new ConnectionType(ConnectionType::kWifi));
102 fake_state_.shill_provider()->var_conn_tethering()->
103 reset(new ConnectionTethering(ConnectionTethering::kNotDetected));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700104 }
105
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700106 // Sets up a default device policy that does not impose any restrictions
107 // (HTTP) nor enables any features (P2P).
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700108 void SetUpDefaultDevicePolicy() {
109 fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
110 new bool(true));
111 fake_state_.device_policy_provider()->var_update_disabled()->reset(
112 new bool(false));
113 fake_state_.device_policy_provider()->
114 var_allowed_connection_types_for_update()->reset(nullptr);
115 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
116 new TimeDelta());
117 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700118 new bool(true));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700119 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
120 new bool(false));
121 fake_state_.device_policy_provider()->var_release_channel_delegated()->
122 reset(new bool(true));
123 }
124
125 // Configures the UpdateCheckAllowed policy to return a desired value by
126 // faking the current wall clock time as needed. Restores the default state.
127 // This is used when testing policies that depend on this one.
128 void SetUpdateCheckAllowed(bool allow_check) {
129 Time next_update_check;
130 ExpectPolicyStatus(EvalStatus::kSucceeded,
131 &ChromeOSPolicy::NextUpdateCheckTime,
132 &next_update_check);
133 SetUpDefaultState();
134 SetUpDefaultDevicePolicy();
135 Time curr_time = next_update_check;
136 if (allow_check)
137 curr_time += TimeDelta::FromSeconds(1);
138 else
139 curr_time -= TimeDelta::FromSeconds(1);
140 fake_clock_.SetWallclockTime(curr_time);
141 }
142
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700143 // Returns a default UpdateState structure:
144 UpdateState GetDefaultUpdateState(TimeDelta first_seen_period) {
145 Time first_seen_time = fake_clock_.GetWallclockTime() - first_seen_period;
146 UpdateState update_state = UpdateState();
147
148 // This is a non-interactive check returning a delta payload, seen for the
149 // first time (|first_seen_period| ago). Clearly, there were no failed
150 // attempts so far.
151 update_state.is_interactive = false;
152 update_state.is_delta_payload = false;
153 update_state.first_seen = first_seen_time;
154 update_state.num_checks = 1;
155 update_state.num_failures = 0;
156 update_state.failures_last_updated = Time(); // Needs to be zero.
157 // There's a single HTTP download URL with a maximum of 10 retries.
158 update_state.download_urls = vector<string>{"http://fake/url/"};
159 update_state.download_errors_max = 10;
160 // Download was never attempted.
161 update_state.last_download_url_idx = -1;
162 update_state.last_download_url_num_errors = 0;
163 // There were no download errors.
164 update_state.download_errors = vector<tuple<int, ErrorCode, Time>>();
Gilad Arnold78ecbfc2014-10-22 14:38:25 -0700165 // P2P is not disabled by Omaha.
166 update_state.p2p_downloading_disabled = false;
167 update_state.p2p_sharing_disabled = false;
Gilad Arnold349ac832014-10-06 14:20:28 -0700168 // P2P was not attempted.
169 update_state.p2p_num_attempts = 0;
170 update_state.p2p_first_attempted = Time();
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700171 // No active backoff period, backoff is not disabled by Omaha.
172 update_state.backoff_expiry = Time();
173 update_state.is_backoff_disabled = false;
174 // There is no active scattering wait period (max 7 days allowed) nor check
175 // threshold (none allowed).
176 update_state.scatter_wait_period = TimeDelta();
177 update_state.scatter_check_threshold = 0;
178 update_state.scatter_wait_period_max = TimeDelta::FromDays(7);
179 update_state.scatter_check_threshold_min = 0;
180 update_state.scatter_check_threshold_max = 0;
181
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700182 return update_state;
Alex Deymo0d11c602014-04-23 20:12:20 -0700183 }
184
185 // Runs the passed |policy_method| policy and expects it to return the
186 // |expected| return value.
187 template<typename T, typename R, typename... Args>
188 void ExpectPolicyStatus(
189 EvalStatus expected,
190 T policy_method,
191 R* result, Args... args) {
192 string error = "<None>";
193 eval_ctx_->ResetEvaluation();
194 EXPECT_EQ(expected,
Alex Vakulenko9c155d22014-12-10 12:52:31 -0800195 (policy_.*policy_method)(eval_ctx_.get(), &fake_state_, &error,
196 result, args...))
Alex Deymoc850b4f2014-05-19 11:06:41 -0700197 << "Returned error: " << error
198 << "\nEvaluation context: " << eval_ctx_->DumpContext();
Alex Deymo0d11c602014-04-23 20:12:20 -0700199 }
200
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700201 brillo::FakeMessageLoop loop_{nullptr};
Alex Deymo0d11c602014-04-23 20:12:20 -0700202 FakeClock fake_clock_;
203 FakeState fake_state_;
204 scoped_refptr<EvaluationContext> eval_ctx_;
205 ChromeOSPolicy policy_; // ChromeOSPolicy under test.
206};
207
Alex Deymo63784a52014-05-28 10:46:14 -0700208TEST_F(UmChromeOSPolicyTest, FirstCheckIsAtMostInitialIntervalAfterStart) {
Alex Deymo0d11c602014-04-23 20:12:20 -0700209 Time next_update_check;
210
Gilad Arnold38b14022014-07-09 12:45:56 -0700211 // Set the last update time so it'll appear as if this is a first update check
212 // in the lifetime of the current updater.
213 fake_state_.updater_provider()->var_last_checked_time()->reset(
214 new Time(fake_clock_.GetWallclockTime() - TimeDelta::FromMinutes(10)));
215
Alex Deymo0d11c602014-04-23 20:12:20 -0700216 ExpectPolicyStatus(EvalStatus::kSucceeded,
217 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
218
219 EXPECT_LE(fake_clock_.GetWallclockTime(), next_update_check);
Gilad Arnold38b14022014-07-09 12:45:56 -0700220 EXPECT_GE(
221 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
222 ChromeOSPolicy::kTimeoutInitialInterval +
223 ChromeOSPolicy::kTimeoutRegularFuzz / 2),
224 next_update_check);
225}
226
227TEST_F(UmChromeOSPolicyTest, RecurringCheckBaseIntervalAndFuzz) {
228 // Ensure that we're using the correct interval (kPeriodicInterval) and fuzz
229 // (kTimeoutRegularFuzz) as base values for period updates.
230 Time next_update_check;
231
232 ExpectPolicyStatus(EvalStatus::kSucceeded,
233 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
234
235 EXPECT_LE(
236 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
237 ChromeOSPolicy::kTimeoutPeriodicInterval -
238 ChromeOSPolicy::kTimeoutRegularFuzz / 2),
239 next_update_check);
240 EXPECT_GE(
241 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
242 ChromeOSPolicy::kTimeoutPeriodicInterval +
243 ChromeOSPolicy::kTimeoutRegularFuzz / 2),
244 next_update_check);
245}
246
247TEST_F(UmChromeOSPolicyTest, RecurringCheckBackoffIntervalAndFuzz) {
248 // Ensure that we're properly backing off and fuzzing in the presence of
249 // failed updates attempts.
250 Time next_update_check;
251
252 fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700253 reset(new unsigned int{2});
Gilad Arnold38b14022014-07-09 12:45:56 -0700254
255 ExpectPolicyStatus(EvalStatus::kSucceeded,
256 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
257
258 int expected_interval = ChromeOSPolicy::kTimeoutPeriodicInterval * 4;
259 EXPECT_LE(
260 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
261 expected_interval - expected_interval / 2),
262 next_update_check);
263 EXPECT_GE(
264 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
265 expected_interval + expected_interval / 2),
266 next_update_check);
Alex Deymo0d11c602014-04-23 20:12:20 -0700267}
268
Gilad Arnolda0258a52014-07-10 16:21:19 -0700269TEST_F(UmChromeOSPolicyTest, RecurringCheckServerDictatedPollInterval) {
270 // Policy honors the server provided check poll interval.
271 Time next_update_check;
272
273 const unsigned int kInterval = ChromeOSPolicy::kTimeoutPeriodicInterval * 4;
274 fake_state_.updater_provider()->var_server_dictated_poll_interval()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700275 reset(new unsigned int{kInterval});
Gilad Arnolda0258a52014-07-10 16:21:19 -0700276 // We should not be backing off in this case.
277 fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700278 reset(new unsigned int{2});
Gilad Arnolda0258a52014-07-10 16:21:19 -0700279
280 ExpectPolicyStatus(EvalStatus::kSucceeded,
281 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
282
283 EXPECT_LE(
284 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
285 kInterval - kInterval / 2),
286 next_update_check);
287 EXPECT_GE(
288 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
289 kInterval + kInterval / 2),
290 next_update_check);
291}
292
Alex Deymo63784a52014-05-28 10:46:14 -0700293TEST_F(UmChromeOSPolicyTest, ExponentialBackoffIsCapped) {
Alex Deymo0d11c602014-04-23 20:12:20 -0700294 Time next_update_check;
295
Alex Deymo0d11c602014-04-23 20:12:20 -0700296 fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700297 reset(new unsigned int{100});
Gilad Arnold38b14022014-07-09 12:45:56 -0700298
Alex Deymo0d11c602014-04-23 20:12:20 -0700299 ExpectPolicyStatus(EvalStatus::kSucceeded,
300 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
301
Gilad Arnold38b14022014-07-09 12:45:56 -0700302 EXPECT_LE(
303 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
304 ChromeOSPolicy::kTimeoutMaxBackoffInterval -
305 ChromeOSPolicy::kTimeoutMaxBackoffInterval / 2),
306 next_update_check);
307 EXPECT_GE(
308 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
309 ChromeOSPolicy::kTimeoutMaxBackoffInterval +
310 ChromeOSPolicy::kTimeoutMaxBackoffInterval /2),
311 next_update_check);
Alex Deymo0d11c602014-04-23 20:12:20 -0700312}
313
Alex Deymo63784a52014-05-28 10:46:14 -0700314TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWaitsForTheTimeout) {
Alex Deymo0d11c602014-04-23 20:12:20 -0700315 // We get the next update_check timestamp from the policy's private method
316 // and then we check the public method respects that value on the normal
317 // case.
318 Time next_update_check;
319 Time last_checked_time =
320 fake_clock_.GetWallclockTime() + TimeDelta::FromMinutes(1234);
321
Alex Deymo0d11c602014-04-23 20:12:20 -0700322 fake_state_.updater_provider()->var_last_checked_time()->reset(
323 new Time(last_checked_time));
324 ExpectPolicyStatus(EvalStatus::kSucceeded,
325 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
326
327 UpdateCheckParams result;
328
329 // Check that the policy blocks until the next_update_check is reached.
330 SetUpDefaultClock();
331 SetUpDefaultState();
332 fake_state_.updater_provider()->var_last_checked_time()->reset(
333 new Time(last_checked_time));
334 fake_clock_.SetWallclockTime(next_update_check - TimeDelta::FromSeconds(1));
335 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
336 &Policy::UpdateCheckAllowed, &result);
337
338 SetUpDefaultClock();
339 SetUpDefaultState();
340 fake_state_.updater_provider()->var_last_checked_time()->reset(
341 new Time(last_checked_time));
342 fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
343 ExpectPolicyStatus(EvalStatus::kSucceeded,
344 &Policy::UpdateCheckAllowed, &result);
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700345 EXPECT_TRUE(result.updates_enabled);
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700346 EXPECT_FALSE(result.is_interactive);
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700347}
348
349TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWaitsForOOBE) {
Alex Vakulenko072359c2014-07-18 11:41:07 -0700350 // Update checks are deferred until OOBE is completed.
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700351
352 // Ensure that update is not allowed even if wait period is satisfied.
353 Time next_update_check;
354 Time last_checked_time =
355 fake_clock_.GetWallclockTime() + TimeDelta::FromMinutes(1234);
356
357 fake_state_.updater_provider()->var_last_checked_time()->reset(
358 new Time(last_checked_time));
359 ExpectPolicyStatus(EvalStatus::kSucceeded,
360 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
361
362 SetUpDefaultClock();
363 SetUpDefaultState();
364 fake_state_.updater_provider()->var_last_checked_time()->reset(
365 new Time(last_checked_time));
366 fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
367 fake_state_.system_provider()->var_is_oobe_complete()->reset(
368 new bool(false));
369
370 UpdateCheckParams result;
371 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
372 &Policy::UpdateCheckAllowed, &result);
373
374 // Now check that it is allowed if OOBE is completed.
375 SetUpDefaultClock();
376 SetUpDefaultState();
377 fake_state_.updater_provider()->var_last_checked_time()->reset(
378 new Time(last_checked_time));
379 fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
380 ExpectPolicyStatus(EvalStatus::kSucceeded,
381 &Policy::UpdateCheckAllowed, &result);
382 EXPECT_TRUE(result.updates_enabled);
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700383 EXPECT_FALSE(result.is_interactive);
Alex Deymo0d11c602014-04-23 20:12:20 -0700384}
385
Gilad Arnold42f253b2014-06-25 12:39:17 -0700386TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWithAttributes) {
Alex Vakulenko072359c2014-07-18 11:41:07 -0700387 // Update check is allowed, response includes attributes for use in the
Gilad Arnold42f253b2014-06-25 12:39:17 -0700388 // request.
389 SetUpdateCheckAllowed(true);
390
391 // Override specific device policy attributes.
Gilad Arnoldd4b30322014-07-21 15:35:27 -0700392 fake_state_.device_policy_provider()->var_target_version_prefix()->
393 reset(new string("1.2"));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700394 fake_state_.device_policy_provider()->var_release_channel_delegated()->
395 reset(new bool(false));
396 fake_state_.device_policy_provider()->var_release_channel()->
397 reset(new string("foo-channel"));
398
399 UpdateCheckParams result;
400 ExpectPolicyStatus(EvalStatus::kSucceeded,
401 &Policy::UpdateCheckAllowed, &result);
402 EXPECT_TRUE(result.updates_enabled);
Gilad Arnoldd4b30322014-07-21 15:35:27 -0700403 EXPECT_EQ("1.2", result.target_version_prefix);
Gilad Arnold42f253b2014-06-25 12:39:17 -0700404 EXPECT_EQ("foo-channel", result.target_channel);
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700405 EXPECT_FALSE(result.is_interactive);
Gilad Arnold42f253b2014-06-25 12:39:17 -0700406}
407
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700408TEST_F(UmChromeOSPolicyTest,
409 UpdateCheckAllowedUpdatesDisabledForUnofficialBuilds) {
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700410 // UpdateCheckAllowed should return kAskMeAgainLater if this is an unofficial
411 // build; we don't want periodic update checks on developer images.
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700412
413 fake_state_.system_provider()->var_is_official_build()->reset(
414 new bool(false));
415
416 UpdateCheckParams result;
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700417 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700418 &Policy::UpdateCheckAllowed, &result);
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700419}
420
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700421TEST_F(UmChromeOSPolicyTest,
Aaron Wood56d8ab32017-09-22 15:56:18 -0700422 UpdateCheckAllowedUpdatesDisabledWhenNotEnoughSlotsAbUpdates) {
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700423 // UpdateCheckAllowed should return false (kSucceeded) if the image booted
Aaron Wood56d8ab32017-09-22 15:56:18 -0700424 // without enough slots to do A/B updates.
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700425
Aaron Woodc73fdc12017-12-06 11:09:15 -0800426 // NOLINTNEXTLINE(readability/casting)
Alex Deymo763e7db2015-08-27 21:08:08 -0700427 fake_state_.system_provider()->var_num_slots()->reset(new unsigned int(1));
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700428
429 UpdateCheckParams result;
430 ExpectPolicyStatus(EvalStatus::kSucceeded,
431 &Policy::UpdateCheckAllowed, &result);
432 EXPECT_FALSE(result.updates_enabled);
433}
434
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700435TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedUpdatesDisabledByPolicy) {
Gilad Arnold42f253b2014-06-25 12:39:17 -0700436 // UpdateCheckAllowed should return kAskMeAgainLater because a device policy
437 // is loaded and prohibits updates.
438
439 SetUpdateCheckAllowed(false);
440 fake_state_.device_policy_provider()->var_update_disabled()->reset(
441 new bool(true));
442
Gilad Arnold42f253b2014-06-25 12:39:17 -0700443 UpdateCheckParams result;
444 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
445 &Policy::UpdateCheckAllowed, &result);
446}
447
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700448TEST_F(UmChromeOSPolicyTest,
449 UpdateCheckAllowedForcedUpdateRequestedInteractive) {
450 // UpdateCheckAllowed should return true because a forced update request was
451 // signaled for an interactive update.
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700452
453 SetUpdateCheckAllowed(true);
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700454 fake_state_.updater_provider()->var_forced_update_requested()->reset(
455 new UpdateRequestStatus(UpdateRequestStatus::kInteractive));
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700456
457 UpdateCheckParams result;
458 ExpectPolicyStatus(EvalStatus::kSucceeded,
459 &Policy::UpdateCheckAllowed, &result);
460 EXPECT_TRUE(result.updates_enabled);
461 EXPECT_TRUE(result.is_interactive);
462}
463
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700464TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedForcedUpdateRequestedPeriodic) {
465 // UpdateCheckAllowed should return true because a forced update request was
466 // signaled for a periodic check.
467
468 SetUpdateCheckAllowed(true);
469 fake_state_.updater_provider()->var_forced_update_requested()->reset(
470 new UpdateRequestStatus(UpdateRequestStatus::kPeriodic));
471
472 UpdateCheckParams result;
473 ExpectPolicyStatus(EvalStatus::kSucceeded,
474 &Policy::UpdateCheckAllowed, &result);
475 EXPECT_TRUE(result.updates_enabled);
476 EXPECT_FALSE(result.is_interactive);
477}
478
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800479TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskPin) {
480 // Update check is allowed.
481 SetUpdateCheckAllowed(true);
482
483 // A typical setup for kiosk pin policy: AU disabled, allow kiosk to pin
484 // and there is a kiosk required platform version.
485 fake_state_.device_policy_provider()->var_update_disabled()->reset(
486 new bool(true));
487 fake_state_.device_policy_provider()
488 ->var_allow_kiosk_app_control_chrome_version()
489 ->reset(new bool(true));
490 fake_state_.system_provider()->var_kiosk_required_platform_version()->reset(
491 new string("1234.0.0"));
492
493 UpdateCheckParams result;
494 ExpectPolicyStatus(EvalStatus::kSucceeded,
495 &Policy::UpdateCheckAllowed, &result);
496 EXPECT_TRUE(result.updates_enabled);
497 EXPECT_EQ("1234.0.0", result.target_version_prefix);
498 EXPECT_FALSE(result.is_interactive);
499}
500
501TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedDisabledWhenNoKioskPin) {
502 // Update check is allowed.
503 SetUpdateCheckAllowed(true);
504
505 // Disable AU policy is set but kiosk pin policy is set to false. Update is
506 // disabled in such case.
507 fake_state_.device_policy_provider()->var_update_disabled()->reset(
508 new bool(true));
509 fake_state_.device_policy_provider()
510 ->var_allow_kiosk_app_control_chrome_version()
511 ->reset(new bool(false));
512
513 UpdateCheckParams result;
514 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
515 &Policy::UpdateCheckAllowed, &result);
516}
517
518TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskPinWithNoRequiredVersion) {
519 // Update check is allowed.
520 SetUpdateCheckAllowed(true);
521
522 // AU disabled, allow kiosk to pin but there is no kiosk required platform
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700523 // version (i.e. app does not provide the info). Update to latest in such
524 // case.
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800525 fake_state_.device_policy_provider()->var_update_disabled()->reset(
526 new bool(true));
527 fake_state_.device_policy_provider()
528 ->var_allow_kiosk_app_control_chrome_version()
529 ->reset(new bool(true));
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700530 fake_state_.system_provider()->var_kiosk_required_platform_version()->reset(
531 new string());
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800532
533 UpdateCheckParams result;
534 ExpectPolicyStatus(EvalStatus::kSucceeded,
535 &Policy::UpdateCheckAllowed, &result);
536 EXPECT_TRUE(result.updates_enabled);
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700537 EXPECT_TRUE(result.target_version_prefix.empty());
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800538 EXPECT_FALSE(result.is_interactive);
539}
540
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700541TEST_F(UmChromeOSPolicyTest,
542 UpdateCheckAllowedKioskPinWithFailedGetRequiredVersionCall) {
543 // AU disabled, allow kiosk to pin but D-Bus call to get required platform
544 // version failed. Defer update check in this case.
545 fake_state_.device_policy_provider()->var_update_disabled()->reset(
546 new bool(true));
547 fake_state_.device_policy_provider()
548 ->var_allow_kiosk_app_control_chrome_version()
549 ->reset(new bool(true));
550 fake_state_.system_provider()->var_kiosk_required_platform_version()->reset(
551 nullptr);
552
553 UpdateCheckParams result;
554 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
555 &Policy::UpdateCheckAllowed, &result);
556}
557
Alex Deymo63784a52014-05-28 10:46:14 -0700558TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsCheckAllowedError) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700559 // The UpdateCanStart policy fails, not being able to query
560 // UpdateCheckAllowed.
561
562 // Configure the UpdateCheckAllowed policy to fail.
563 fake_state_.updater_provider()->var_updater_started_time()->reset(nullptr);
564
565 // Check that the UpdateCanStart fails.
566 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700567 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700568 ExpectPolicyStatus(EvalStatus::kFailed,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700569 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700570}
571
Alex Deymo63784a52014-05-28 10:46:14 -0700572TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedCheckDue) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700573 // The UpdateCanStart policy returns false because we are due for another
Gilad Arnold14a9e702014-10-08 08:09:09 -0700574 // update check. Ensure that download related values are still returned.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700575
576 SetUpdateCheckAllowed(true);
577
578 // Check that the UpdateCanStart returns false.
579 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700580 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700581 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700582 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700583 EXPECT_FALSE(result.update_can_start);
584 EXPECT_EQ(UpdateCannotStartReason::kCheckDue, result.cannot_start_reason);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700585 EXPECT_EQ(0, result.download_url_idx);
586 EXPECT_EQ(0, result.download_url_num_errors);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700587}
588
Alex Deymo63784a52014-05-28 10:46:14 -0700589TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoDevicePolicy) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700590 // The UpdateCanStart policy returns true; no device policy is loaded.
591
592 SetUpdateCheckAllowed(false);
593 fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
594 new bool(false));
595
596 // Check that the UpdateCanStart returns true with no further attributes.
597 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700598 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700599 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700600 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700601 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700602 EXPECT_FALSE(result.p2p_downloading_allowed);
603 EXPECT_FALSE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700604 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700605 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700606 EXPECT_EQ(0, result.download_url_num_errors);
607 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700608}
609
Alex Deymo63784a52014-05-28 10:46:14 -0700610TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBlankPolicy) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700611 // The UpdateCanStart policy returns true; device policy is loaded but imposes
612 // no restrictions on updating.
613
614 SetUpdateCheckAllowed(false);
615
616 // Check that the UpdateCanStart returns true.
617 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700618 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700619 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700620 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700621 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700622 EXPECT_FALSE(result.p2p_downloading_allowed);
623 EXPECT_FALSE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700624 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700625 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700626 EXPECT_EQ(0, result.download_url_num_errors);
627 EXPECT_FALSE(result.do_increment_failures);
628}
629
630TEST_F(UmChromeOSPolicyTest,
631 UpdateCanStartNotAllowedBackoffNewWaitPeriodApplies) {
632 // The UpdateCanStart policy returns false; failures are reported and a new
633 // backoff period is enacted.
634
635 SetUpdateCheckAllowed(false);
636
637 const Time curr_time = fake_clock_.GetWallclockTime();
638 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
639 update_state.download_errors_max = 1;
640 update_state.download_errors.emplace_back(
641 0, ErrorCode::kDownloadTransferError,
642 curr_time - TimeDelta::FromSeconds(8));
643 update_state.download_errors.emplace_back(
644 0, ErrorCode::kDownloadTransferError,
645 curr_time - TimeDelta::FromSeconds(2));
646
647 // Check that UpdateCanStart returns false and a new backoff expiry is
648 // generated.
649 UpdateDownloadParams result;
650 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
651 update_state);
652 EXPECT_FALSE(result.update_can_start);
653 EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
654 EXPECT_TRUE(result.do_increment_failures);
655 EXPECT_LT(curr_time, result.backoff_expiry);
656}
657
658TEST_F(UmChromeOSPolicyTest,
659 UpdateCanStartNotAllowedBackoffPrevWaitPeriodStillApplies) {
660 // The UpdateCanStart policy returns false; a previously enacted backoff
661 // period still applies.
662
663 SetUpdateCheckAllowed(false);
664
665 const Time curr_time = fake_clock_.GetWallclockTime();
666 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
667 update_state.download_errors_max = 1;
668 update_state.download_errors.emplace_back(
669 0, ErrorCode::kDownloadTransferError,
670 curr_time - TimeDelta::FromSeconds(8));
671 update_state.download_errors.emplace_back(
672 0, ErrorCode::kDownloadTransferError,
673 curr_time - TimeDelta::FromSeconds(2));
674 update_state.failures_last_updated = curr_time;
675 update_state.backoff_expiry = curr_time + TimeDelta::FromMinutes(3);
676
677 // Check that UpdateCanStart returns false and a new backoff expiry is
678 // generated.
679 UpdateDownloadParams result;
680 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::UpdateCanStart,
681 &result, update_state);
682 EXPECT_FALSE(result.update_can_start);
683 EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
684 EXPECT_FALSE(result.do_increment_failures);
685 EXPECT_LT(curr_time, result.backoff_expiry);
686}
687
688TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffSatisfied) {
689 // The UpdateCanStart policy returns true; a previously enacted backoff period
690 // has elapsed, we're good to go.
691
692 SetUpdateCheckAllowed(false);
693
694 const Time curr_time = fake_clock_.GetWallclockTime();
695 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
696 update_state.download_errors_max = 1;
697 update_state.download_errors.emplace_back(
698 0, ErrorCode::kDownloadTransferError,
699 curr_time - TimeDelta::FromSeconds(8));
700 update_state.download_errors.emplace_back(
701 0, ErrorCode::kDownloadTransferError,
702 curr_time - TimeDelta::FromSeconds(2));
703 update_state.failures_last_updated = curr_time - TimeDelta::FromSeconds(1);
704 update_state.backoff_expiry = curr_time - TimeDelta::FromSeconds(1);
705
706 // Check that UpdateCanStart returns false and a new backoff expiry is
707 // generated.
708 UpdateDownloadParams result;
709 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart,
710 &result, update_state);
711 EXPECT_TRUE(result.update_can_start);
712 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
713 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700714 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700715 EXPECT_EQ(0, result.download_url_num_errors);
716 EXPECT_FALSE(result.do_increment_failures);
717 EXPECT_EQ(Time(), result.backoff_expiry);
718}
719
720TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffDisabled) {
721 // The UpdateCanStart policy returns false; failures are reported but backoff
722 // is disabled.
723
724 SetUpdateCheckAllowed(false);
725
726 const Time curr_time = fake_clock_.GetWallclockTime();
727 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
728 update_state.download_errors_max = 1;
729 update_state.download_errors.emplace_back(
730 0, ErrorCode::kDownloadTransferError,
731 curr_time - TimeDelta::FromSeconds(8));
732 update_state.download_errors.emplace_back(
733 0, ErrorCode::kDownloadTransferError,
734 curr_time - TimeDelta::FromSeconds(2));
735 update_state.is_backoff_disabled = true;
736
737 // Check that UpdateCanStart returns false and a new backoff expiry is
738 // generated.
739 UpdateDownloadParams result;
740 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
741 update_state);
742 EXPECT_TRUE(result.update_can_start);
743 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
744 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700745 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700746 EXPECT_EQ(0, result.download_url_num_errors);
747 EXPECT_TRUE(result.do_increment_failures);
748 EXPECT_EQ(Time(), result.backoff_expiry);
749}
750
751TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffInteractive) {
752 // The UpdateCanStart policy returns false; failures are reported but this is
753 // an interactive update check.
754
755 SetUpdateCheckAllowed(false);
756
757 const Time curr_time = fake_clock_.GetWallclockTime();
758 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
759 update_state.download_errors_max = 1;
760 update_state.download_errors.emplace_back(
761 0, ErrorCode::kDownloadTransferError,
762 curr_time - TimeDelta::FromSeconds(8));
763 update_state.download_errors.emplace_back(
764 0, ErrorCode::kDownloadTransferError,
765 curr_time - TimeDelta::FromSeconds(2));
766 update_state.is_interactive = true;
767
768 // Check that UpdateCanStart returns false and a new backoff expiry is
769 // generated.
770 UpdateDownloadParams result;
771 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
772 update_state);
773 EXPECT_TRUE(result.update_can_start);
774 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
775 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700776 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700777 EXPECT_EQ(0, result.download_url_num_errors);
778 EXPECT_TRUE(result.do_increment_failures);
779 EXPECT_EQ(Time(), result.backoff_expiry);
780}
781
782TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffDelta) {
783 // The UpdateCanStart policy returns false; failures are reported but this is
784 // a delta payload.
785
786 SetUpdateCheckAllowed(false);
787
788 const Time curr_time = fake_clock_.GetWallclockTime();
789 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
790 update_state.download_errors_max = 1;
791 update_state.download_errors.emplace_back(
792 0, ErrorCode::kDownloadTransferError,
793 curr_time - TimeDelta::FromSeconds(8));
794 update_state.download_errors.emplace_back(
795 0, ErrorCode::kDownloadTransferError,
796 curr_time - TimeDelta::FromSeconds(2));
797 update_state.is_delta_payload = true;
798
799 // Check that UpdateCanStart returns false and a new backoff expiry is
800 // generated.
801 UpdateDownloadParams result;
802 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
803 update_state);
804 EXPECT_TRUE(result.update_can_start);
805 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
806 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700807 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700808 EXPECT_EQ(0, result.download_url_num_errors);
809 EXPECT_TRUE(result.do_increment_failures);
810 EXPECT_EQ(Time(), result.backoff_expiry);
811}
812
813TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffUnofficialBuild) {
814 // The UpdateCanStart policy returns false; failures are reported but this is
815 // an unofficial build.
816
817 SetUpdateCheckAllowed(false);
818
819 const Time curr_time = fake_clock_.GetWallclockTime();
820 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
821 update_state.download_errors_max = 1;
822 update_state.download_errors.emplace_back(
823 0, ErrorCode::kDownloadTransferError,
824 curr_time - TimeDelta::FromSeconds(8));
825 update_state.download_errors.emplace_back(
826 0, ErrorCode::kDownloadTransferError,
827 curr_time - TimeDelta::FromSeconds(2));
828
829 fake_state_.system_provider()->var_is_official_build()->
830 reset(new bool(false));
831
832 // Check that UpdateCanStart returns false and a new backoff expiry is
833 // generated.
834 UpdateDownloadParams result;
835 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
836 update_state);
837 EXPECT_TRUE(result.update_can_start);
838 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
839 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700840 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700841 EXPECT_EQ(0, result.download_url_num_errors);
842 EXPECT_TRUE(result.do_increment_failures);
843 EXPECT_EQ(Time(), result.backoff_expiry);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700844}
845
Alex Deymo63784a52014-05-28 10:46:14 -0700846TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsScatteringFailed) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700847 // The UpdateCanStart policy fails because the UpdateScattering policy it
848 // depends on fails (unset variable).
849
850 SetUpdateCheckAllowed(false);
851
852 // Override the default seed variable with a null value so that the policy
853 // request would fail.
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700854 // TODO(garnold) This failure may or may not fail a number
855 // sub-policies/decisions, like scattering and backoff. We'll need a more
856 // deliberate setup to ensure that we're failing what we want to be failing.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700857 fake_state_.random_provider()->var_seed()->reset(nullptr);
858
859 // Check that the UpdateCanStart fails.
860 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700861 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700862 ExpectPolicyStatus(EvalStatus::kFailed,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700863 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700864}
865
Alex Deymo63784a52014-05-28 10:46:14 -0700866TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700867 UpdateCanStartNotAllowedScatteringNewWaitPeriodApplies) {
868 // The UpdateCanStart policy returns false; device policy is loaded and
869 // scattering applies due to an unsatisfied wait period, which was newly
870 // generated.
871
872 SetUpdateCheckAllowed(false);
873 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
874 new TimeDelta(TimeDelta::FromMinutes(2)));
875
876
877 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
878
879 // Check that the UpdateCanStart returns false and a new wait period
880 // generated.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700881 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700882 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700883 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700884 EXPECT_FALSE(result.update_can_start);
885 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
886 EXPECT_LT(TimeDelta(), result.scatter_wait_period);
887 EXPECT_EQ(0, result.scatter_check_threshold);
888}
889
Alex Deymo63784a52014-05-28 10:46:14 -0700890TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700891 UpdateCanStartNotAllowedScatteringPrevWaitPeriodStillApplies) {
892 // The UpdateCanStart policy returns false w/ kAskMeAgainLater; device policy
893 // is loaded and a previously generated scattering period still applies, none
894 // of the scattering values has changed.
895
896 SetUpdateCheckAllowed(false);
897 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
898 new TimeDelta(TimeDelta::FromMinutes(2)));
899
900 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
901 update_state.scatter_wait_period = TimeDelta::FromSeconds(35);
902
903 // Check that the UpdateCanStart returns false and a new wait period
904 // generated.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700905 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700906 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::UpdateCanStart,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700907 &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700908 EXPECT_FALSE(result.update_can_start);
909 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
910 EXPECT_EQ(TimeDelta::FromSeconds(35), result.scatter_wait_period);
911 EXPECT_EQ(0, result.scatter_check_threshold);
912}
913
Alex Deymo63784a52014-05-28 10:46:14 -0700914TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700915 UpdateCanStartNotAllowedScatteringNewCountThresholdApplies) {
916 // The UpdateCanStart policy returns false; device policy is loaded and
917 // scattering applies due to an unsatisfied update check count threshold.
918 //
919 // This ensures a non-zero check threshold, which may or may not be combined
920 // with a non-zero wait period (for which we cannot reliably control).
921
922 SetUpdateCheckAllowed(false);
923 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
924 new TimeDelta(TimeDelta::FromSeconds(1)));
925
926 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
927 update_state.scatter_check_threshold_min = 2;
928 update_state.scatter_check_threshold_max = 5;
929
930 // Check that the UpdateCanStart returns false.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700931 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700932 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700933 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700934 EXPECT_FALSE(result.update_can_start);
935 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
936 EXPECT_LE(2, result.scatter_check_threshold);
937 EXPECT_GE(5, result.scatter_check_threshold);
938}
939
Alex Deymo63784a52014-05-28 10:46:14 -0700940TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700941 UpdateCanStartNotAllowedScatteringPrevCountThresholdStillApplies) {
942 // The UpdateCanStart policy returns false; device policy is loaded and
943 // scattering due to a previously generated count threshold still applies.
944
945 SetUpdateCheckAllowed(false);
946 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
947 new TimeDelta(TimeDelta::FromSeconds(1)));
948
949 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
950 update_state.scatter_check_threshold = 3;
951 update_state.scatter_check_threshold_min = 2;
952 update_state.scatter_check_threshold_max = 5;
953
954 // Check that the UpdateCanStart returns false.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700955 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700956 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700957 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700958 EXPECT_FALSE(result.update_can_start);
959 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
960 EXPECT_EQ(3, result.scatter_check_threshold);
961}
962
Alex Deymo63784a52014-05-28 10:46:14 -0700963TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedScatteringSatisfied) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700964 // The UpdateCanStart policy returns true; device policy is loaded and
965 // scattering is enabled, but both wait period and check threshold are
966 // satisfied.
967
968 SetUpdateCheckAllowed(false);
969 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
970 new TimeDelta(TimeDelta::FromSeconds(120)));
971
972 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(75));
973 update_state.num_checks = 4;
974 update_state.scatter_wait_period = TimeDelta::FromSeconds(60);
975 update_state.scatter_check_threshold = 3;
976 update_state.scatter_check_threshold_min = 2;
977 update_state.scatter_check_threshold_max = 5;
978
979 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700980 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700981 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700982 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700983 EXPECT_TRUE(result.update_can_start);
984 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
985 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700986 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700987 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700988 EXPECT_EQ(0, result.download_url_num_errors);
989 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700990}
991
Alex Deymo63784a52014-05-28 10:46:14 -0700992TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700993 UpdateCanStartAllowedInteractivePreventsScattering) {
994 // The UpdateCanStart policy returns true; device policy is loaded and
995 // scattering would have applied, except that the update check is interactive
996 // and so it is suppressed.
997
998 SetUpdateCheckAllowed(false);
999 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
1000 new TimeDelta(TimeDelta::FromSeconds(1)));
1001
1002 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001003 update_state.is_interactive = true;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001004 update_state.scatter_check_threshold = 0;
1005 update_state.scatter_check_threshold_min = 2;
1006 update_state.scatter_check_threshold_max = 5;
1007
1008 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001009 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001010 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001011 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001012 EXPECT_TRUE(result.update_can_start);
1013 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
1014 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001015 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001016 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001017 EXPECT_EQ(0, result.download_url_num_errors);
1018 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001019}
1020
Alex Deymo63784a52014-05-28 10:46:14 -07001021TEST_F(UmChromeOSPolicyTest,
Gilad Arnold76a11f62014-05-20 09:02:12 -07001022 UpdateCanStartAllowedOobePreventsScattering) {
1023 // The UpdateCanStart policy returns true; device policy is loaded and
1024 // scattering would have applied, except that OOBE was not completed and so it
1025 // is suppressed.
1026
1027 SetUpdateCheckAllowed(false);
1028 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
1029 new TimeDelta(TimeDelta::FromSeconds(1)));
1030 fake_state_.system_provider()->var_is_oobe_complete()->reset(new bool(false));
1031
1032 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001033 update_state.is_interactive = true;
Gilad Arnold76a11f62014-05-20 09:02:12 -07001034 update_state.scatter_check_threshold = 0;
1035 update_state.scatter_check_threshold_min = 2;
1036 update_state.scatter_check_threshold_max = 5;
1037
1038 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001039 UpdateDownloadParams result;
Gilad Arnold76a11f62014-05-20 09:02:12 -07001040 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001041 update_state);
Gilad Arnold76a11f62014-05-20 09:02:12 -07001042 EXPECT_TRUE(result.update_can_start);
1043 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
1044 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001045 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001046 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001047 EXPECT_EQ(0, result.download_url_num_errors);
1048 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnold76a11f62014-05-20 09:02:12 -07001049}
1050
Alex Deymo63784a52014-05-28 10:46:14 -07001051TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithAttributes) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001052 // The UpdateCanStart policy returns true; device policy permits both HTTP and
1053 // P2P updates, as well as a non-empty target channel string.
1054
1055 SetUpdateCheckAllowed(false);
1056
1057 // Override specific device policy attributes.
1058 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1059 new bool(true));
1060 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1061 new bool(true));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001062
1063 // Check that the UpdateCanStart returns true.
1064 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001065 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001066 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001067 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001068 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001069 EXPECT_TRUE(result.p2p_downloading_allowed);
1070 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001071 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001072 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001073 EXPECT_EQ(0, result.download_url_num_errors);
1074 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001075}
1076
Alex Deymo63784a52014-05-28 10:46:14 -07001077TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithP2PFromUpdater) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001078 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1079 // P2P updates, but the updater is configured to allow P2P and overrules the
1080 // setting.
1081
1082 SetUpdateCheckAllowed(false);
1083
1084 // Override specific device policy attributes.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001085 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1086
1087 // Check that the UpdateCanStart returns true.
1088 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001089 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001090 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001091 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001092 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001093 EXPECT_TRUE(result.p2p_downloading_allowed);
1094 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001095 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001096 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001097 EXPECT_EQ(0, result.download_url_num_errors);
1098 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001099}
1100
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001101TEST_F(UmChromeOSPolicyTest,
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001102 UpdateCanStartAllowedP2PDownloadingBlockedDueToOmaha) {
1103 // The UpdateCanStart policy returns true; device policy permits HTTP, but
1104 // policy blocks P2P downloading because Omaha forbids it. P2P sharing is
1105 // still permitted.
1106
1107 SetUpdateCheckAllowed(false);
1108
1109 // Override specific device policy attributes.
1110 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1111 new bool(true));
1112 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1113 new bool(true));
1114
1115 // Check that the UpdateCanStart returns true.
1116 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1117 update_state.p2p_downloading_disabled = true;
1118 UpdateDownloadParams result;
1119 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1120 update_state);
1121 EXPECT_TRUE(result.update_can_start);
1122 EXPECT_FALSE(result.p2p_downloading_allowed);
1123 EXPECT_TRUE(result.p2p_sharing_allowed);
1124}
1125
1126TEST_F(UmChromeOSPolicyTest,
1127 UpdateCanStartAllowedP2PSharingBlockedDueToOmaha) {
1128 // The UpdateCanStart policy returns true; device policy permits HTTP, but
1129 // policy blocks P2P sharing because Omaha forbids it. P2P downloading is
1130 // still permitted.
1131
1132 SetUpdateCheckAllowed(false);
1133
1134 // Override specific device policy attributes.
1135 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1136 new bool(true));
1137 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1138 new bool(true));
1139
1140 // Check that the UpdateCanStart returns true.
1141 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1142 update_state.p2p_sharing_disabled = true;
1143 UpdateDownloadParams result;
1144 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1145 update_state);
1146 EXPECT_TRUE(result.update_can_start);
1147 EXPECT_TRUE(result.p2p_downloading_allowed);
1148 EXPECT_FALSE(result.p2p_sharing_allowed);
1149}
1150
1151TEST_F(UmChromeOSPolicyTest,
1152 UpdateCanStartAllowedP2PDownloadingBlockedDueToNumAttempts) {
Gilad Arnold349ac832014-10-06 14:20:28 -07001153 // The UpdateCanStart policy returns true; device policy permits HTTP but
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001154 // blocks P2P download, because the max number of P2P downloads have been
1155 // attempted. P2P sharing is still permitted.
Gilad Arnold349ac832014-10-06 14:20:28 -07001156
1157 SetUpdateCheckAllowed(false);
1158
1159 // Override specific device policy attributes.
1160 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1161 new bool(true));
1162 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1163 new bool(true));
1164
1165 // Check that the UpdateCanStart returns true.
1166 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1167 update_state.p2p_num_attempts = ChromeOSPolicy::kMaxP2PAttempts;
1168 UpdateDownloadParams result;
1169 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1170 update_state);
1171 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001172 EXPECT_FALSE(result.p2p_downloading_allowed);
1173 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnold349ac832014-10-06 14:20:28 -07001174}
1175
1176TEST_F(UmChromeOSPolicyTest,
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001177 UpdateCanStartAllowedP2PDownloadingBlockedDueToAttemptsPeriod) {
Gilad Arnold349ac832014-10-06 14:20:28 -07001178 // The UpdateCanStart policy returns true; device policy permits HTTP but
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001179 // blocks P2P download, because the max period for attempt to download via P2P
1180 // has elapsed. P2P sharing is still permitted.
Gilad Arnold349ac832014-10-06 14:20:28 -07001181
1182 SetUpdateCheckAllowed(false);
1183
1184 // Override specific device policy attributes.
1185 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1186 new bool(true));
1187 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1188 new bool(true));
1189
1190 // Check that the UpdateCanStart returns true.
1191 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1192 update_state.p2p_num_attempts = 1;
1193 update_state.p2p_first_attempted =
1194 fake_clock_.GetWallclockTime() -
Alex Deymof329b932014-10-30 01:37:48 -07001195 TimeDelta::FromSeconds(
1196 ChromeOSPolicy::kMaxP2PAttemptsPeriodInSeconds + 1);
Gilad Arnold349ac832014-10-06 14:20:28 -07001197 UpdateDownloadParams result;
1198 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1199 update_state);
1200 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001201 EXPECT_FALSE(result.p2p_downloading_allowed);
1202 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnold349ac832014-10-06 14:20:28 -07001203}
1204
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001205TEST_F(UmChromeOSPolicyTest,
1206 UpdateCanStartAllowedWithHttpUrlForUnofficialBuild) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001207 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1208 // P2P updates, but marking this an unofficial build overrules the HTTP
1209 // setting.
1210
1211 SetUpdateCheckAllowed(false);
1212
1213 // Override specific device policy attributes.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001214 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1215 new bool(false));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001216 fake_state_.system_provider()->var_is_official_build()->
1217 reset(new bool(false));
1218
1219 // Check that the UpdateCanStart returns true.
1220 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001221 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001222 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001223 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001224 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001225 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001226 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001227 EXPECT_EQ(0, result.download_url_num_errors);
1228 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001229}
1230
1231TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithHttpsUrl) {
1232 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1233 // P2P updates, but an HTTPS URL is provided and selected for download.
1234
1235 SetUpdateCheckAllowed(false);
1236
1237 // Override specific device policy attributes.
1238 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1239 new bool(false));
1240
1241 // Add an HTTPS URL.
1242 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001243 update_state.download_urls.emplace_back("https://secure/url/");
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001244
1245 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001246 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001247 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001248 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001249 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001250 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001251 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001252 EXPECT_EQ(0, result.download_url_num_errors);
1253 EXPECT_FALSE(result.do_increment_failures);
1254}
1255
1256TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedMaxErrorsNotExceeded) {
1257 // The UpdateCanStart policy returns true; the first URL has download errors
1258 // but does not exceed the maximum allowed number of failures, so it is stilli
1259 // usable.
1260
1261 SetUpdateCheckAllowed(false);
1262
1263 // Add a second URL; update with this URL attempted and failed enough times to
1264 // disqualify the current (first) URL.
1265 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1266 update_state.num_checks = 5;
1267 update_state.download_urls.emplace_back("http://another/fake/url/");
1268 Time t = fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(12);
1269 for (int i = 0; i < 5; i++) {
1270 update_state.download_errors.emplace_back(
1271 0, ErrorCode::kDownloadTransferError, t);
1272 t += TimeDelta::FromSeconds(1);
1273 }
1274
1275 // Check that the UpdateCanStart returns true.
1276 UpdateDownloadParams result;
1277 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1278 update_state);
1279 EXPECT_TRUE(result.update_can_start);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001280 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001281 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001282 EXPECT_EQ(5, result.download_url_num_errors);
1283 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001284}
1285
1286TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlMaxExceeded) {
1287 // The UpdateCanStart policy returns true; the first URL exceeded the maximum
1288 // allowed number of failures, but a second URL is available.
1289
1290 SetUpdateCheckAllowed(false);
1291
1292 // Add a second URL; update with this URL attempted and failed enough times to
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001293 // disqualify the current (first) URL.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001294 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1295 update_state.num_checks = 10;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001296 update_state.download_urls.emplace_back("http://another/fake/url/");
1297 Time t = fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(12);
1298 for (int i = 0; i < 11; i++) {
1299 update_state.download_errors.emplace_back(
1300 0, ErrorCode::kDownloadTransferError, t);
1301 t += TimeDelta::FromSeconds(1);
1302 }
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001303
1304 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001305 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001306 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001307 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001308 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001309 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001310 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001311 EXPECT_EQ(0, result.download_url_num_errors);
1312 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001313}
1314
1315TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlHardError) {
1316 // The UpdateCanStart policy returns true; the first URL fails with a hard
1317 // error, but a second URL is available.
1318
1319 SetUpdateCheckAllowed(false);
1320
1321 // Add a second URL; update with this URL attempted and failed in a way that
1322 // causes it to switch directly to the next URL.
1323 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1324 update_state.num_checks = 10;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001325 update_state.download_urls.emplace_back("http://another/fake/url/");
1326 update_state.download_errors.emplace_back(
1327 0, ErrorCode::kPayloadHashMismatchError,
1328 fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(1));
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001329
1330 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001331 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001332 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001333 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001334 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001335 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001336 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001337 EXPECT_EQ(0, result.download_url_num_errors);
1338 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001339}
1340
1341TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedUrlWrapsAround) {
1342 // The UpdateCanStart policy returns true; URL search properly wraps around
1343 // the last one on the list.
1344
1345 SetUpdateCheckAllowed(false);
1346
1347 // Add a second URL; update with this URL attempted and failed in a way that
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001348 // causes it to switch directly to the next URL. We must disable backoff in
1349 // order for it not to interfere.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001350 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001351 update_state.num_checks = 1;
1352 update_state.is_backoff_disabled = true;
1353 update_state.download_urls.emplace_back("http://another/fake/url/");
1354 update_state.download_errors.emplace_back(
1355 1, ErrorCode::kPayloadHashMismatchError,
1356 fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(1));
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001357
1358 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001359 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001360 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001361 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001362 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001363 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001364 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001365 EXPECT_EQ(0, result.download_url_num_errors);
1366 EXPECT_TRUE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001367}
1368
1369TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedNoUsableUrls) {
1370 // The UpdateCanStart policy returns false; there's a single HTTP URL but its
1371 // use is forbidden by policy.
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001372 //
1373 // Note: In the case where no usable URLs are found, the policy should not
1374 // increment the number of failed attempts! Doing so would result in a
1375 // non-idempotent semantics, and does not fall within the intended purpose of
1376 // the backoff mechanism anyway.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001377
1378 SetUpdateCheckAllowed(false);
1379
1380 // Override specific device policy attributes.
1381 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1382 new bool(false));
1383
1384 // Check that the UpdateCanStart returns false.
1385 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001386 UpdateDownloadParams result;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001387 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1388 update_state);
1389 EXPECT_FALSE(result.update_can_start);
1390 EXPECT_EQ(UpdateCannotStartReason::kCannotDownload,
1391 result.cannot_start_reason);
1392 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001393}
1394
1395TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoUsableUrlsButP2PEnabled) {
1396 // The UpdateCanStart policy returns true; there's a single HTTP URL but its
1397 // use is forbidden by policy, however P2P is enabled. The result indicates
1398 // that no URL can be used.
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001399 //
1400 // Note: The number of failed attempts should not increase in this case (see
1401 // above test).
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001402
1403 SetUpdateCheckAllowed(false);
1404
1405 // Override specific device policy attributes.
1406 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1407 new bool(true));
1408 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1409 new bool(false));
1410
1411 // Check that the UpdateCanStart returns true.
1412 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001413 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001414 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001415 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001416 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001417 EXPECT_TRUE(result.p2p_downloading_allowed);
1418 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001419 EXPECT_GT(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001420 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001421 EXPECT_EQ(0, result.download_url_num_errors);
1422 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001423}
1424
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001425TEST_F(UmChromeOSPolicyTest,
1426 UpdateCanStartAllowedNoUsableUrlsButEnterpriseEnrolled) {
1427 // The UpdateCanStart policy returns true; there's a single HTTP URL but its
1428 // use is forbidden by policy, and P2P is unset on the policy, however the
1429 // device is enterprise-enrolled so P2P is allowed. The result indicates that
1430 // no URL can be used.
1431 //
1432 // Note: The number of failed attempts should not increase in this case (see
1433 // above test).
1434
1435 SetUpdateCheckAllowed(false);
1436
1437 // Override specific device policy attributes.
1438 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(nullptr);
1439 fake_state_.device_policy_provider()->var_owner()->reset(nullptr);
1440 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1441 new bool(false));
1442
1443 // Check that the UpdateCanStart returns true.
1444 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1445 UpdateDownloadParams result;
1446 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1447 update_state);
1448 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001449 EXPECT_TRUE(result.p2p_downloading_allowed);
1450 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001451 EXPECT_GT(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001452 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001453 EXPECT_EQ(0, result.download_url_num_errors);
1454 EXPECT_FALSE(result.do_increment_failures);
1455}
1456
Gilad Arnold684219d2014-07-07 14:54:57 -07001457TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedEthernetDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001458 // Ethernet is always allowed.
1459
1460 fake_state_.shill_provider()->var_conn_type()->
1461 reset(new ConnectionType(ConnectionType::kEthernet));
1462
1463 bool result;
1464 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001465 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001466 EXPECT_TRUE(result);
1467}
1468
Gilad Arnold684219d2014-07-07 14:54:57 -07001469TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWifiDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001470 // Wifi is allowed if not tethered.
1471
1472 fake_state_.shill_provider()->var_conn_type()->
1473 reset(new ConnectionType(ConnectionType::kWifi));
1474
1475 bool result;
1476 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001477 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001478 EXPECT_TRUE(result);
1479}
1480
Alex Deymo63784a52014-05-28 10:46:14 -07001481TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001482 UpdateCurrentConnectionNotAllowedWifiTetheredDefault) {
1483 // Tethered wifi is not allowed by default.
1484
1485 fake_state_.shill_provider()->var_conn_type()->
1486 reset(new ConnectionType(ConnectionType::kWifi));
1487 fake_state_.shill_provider()->var_conn_tethering()->
1488 reset(new ConnectionTethering(ConnectionTethering::kConfirmed));
1489
1490 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001491 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001492 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001493}
1494
Alex Deymo63784a52014-05-28 10:46:14 -07001495TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001496 UpdateDownloadAllowedWifiTetheredPolicyOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001497 // Tethered wifi can be allowed by policy.
1498
1499 fake_state_.shill_provider()->var_conn_type()->
1500 reset(new ConnectionType(ConnectionType::kWifi));
1501 fake_state_.shill_provider()->var_conn_tethering()->
1502 reset(new ConnectionTethering(ConnectionTethering::kConfirmed));
1503 set<ConnectionType> allowed_connections;
1504 allowed_connections.insert(ConnectionType::kCellular);
1505 fake_state_.device_policy_provider()->
1506 var_allowed_connection_types_for_update()->
1507 reset(new set<ConnectionType>(allowed_connections));
1508
1509 bool result;
1510 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001511 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001512 EXPECT_TRUE(result);
1513}
1514
Gilad Arnold684219d2014-07-07 14:54:57 -07001515TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWimaxDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001516 // Wimax is always allowed.
1517
1518 fake_state_.shill_provider()->var_conn_type()->
1519 reset(new ConnectionType(ConnectionType::kWifi));
1520
1521 bool result;
1522 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001523 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001524 EXPECT_TRUE(result);
1525}
1526
Alex Deymo63784a52014-05-28 10:46:14 -07001527TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001528 UpdateCurrentConnectionNotAllowedBluetoothDefault) {
1529 // Bluetooth is never allowed.
1530
1531 fake_state_.shill_provider()->var_conn_type()->
1532 reset(new ConnectionType(ConnectionType::kBluetooth));
1533
1534 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001535 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001536 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001537}
1538
Alex Deymo63784a52014-05-28 10:46:14 -07001539TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001540 UpdateCurrentConnectionNotAllowedBluetoothPolicyCannotOverride) {
1541 // Bluetooth cannot be allowed even by policy.
1542
1543 fake_state_.shill_provider()->var_conn_type()->
1544 reset(new ConnectionType(ConnectionType::kBluetooth));
1545 set<ConnectionType> allowed_connections;
1546 allowed_connections.insert(ConnectionType::kBluetooth);
1547 fake_state_.device_policy_provider()->
1548 var_allowed_connection_types_for_update()->
1549 reset(new set<ConnectionType>(allowed_connections));
1550
1551 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001552 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001553 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001554}
1555
Alex Deymo63784a52014-05-28 10:46:14 -07001556TEST_F(UmChromeOSPolicyTest, UpdateCurrentConnectionNotAllowedCellularDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001557 // Cellular is not allowed by default.
1558
1559 fake_state_.shill_provider()->var_conn_type()->
1560 reset(new ConnectionType(ConnectionType::kCellular));
1561
1562 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001563 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001564 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001565}
1566
Alex Deymo63784a52014-05-28 10:46:14 -07001567TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001568 UpdateDownloadAllowedCellularPolicyOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001569 // Update over cellular can be enabled by policy.
1570
1571 fake_state_.shill_provider()->var_conn_type()->
1572 reset(new ConnectionType(ConnectionType::kCellular));
1573 set<ConnectionType> allowed_connections;
1574 allowed_connections.insert(ConnectionType::kCellular);
1575 fake_state_.device_policy_provider()->
1576 var_allowed_connection_types_for_update()->
1577 reset(new set<ConnectionType>(allowed_connections));
1578
1579 bool result;
1580 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001581 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001582 EXPECT_TRUE(result);
1583}
1584
Alex Deymo63784a52014-05-28 10:46:14 -07001585TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001586 UpdateDownloadAllowedCellularUserOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001587 // Update over cellular can be enabled by user settings, but only if policy
1588 // is present and does not determine allowed connections.
1589
1590 fake_state_.shill_provider()->var_conn_type()->
1591 reset(new ConnectionType(ConnectionType::kCellular));
1592 set<ConnectionType> allowed_connections;
1593 allowed_connections.insert(ConnectionType::kCellular);
1594 fake_state_.updater_provider()->var_cellular_enabled()->
1595 reset(new bool(true));
1596
1597 bool result;
1598 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001599 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001600 EXPECT_TRUE(result);
1601}
1602
Gilad Arnold14a9e702014-10-08 08:09:09 -07001603TEST_F(UmChromeOSPolicyTest,
1604 UpdateCanStartAllowedScatteringSupressedDueToP2P) {
1605 // The UpdateCanStart policy returns true; scattering should have applied, but
1606 // P2P download is allowed. Scattering values are nonetheless returned, and so
1607 // are download URL values, albeit the latter are not allowed to be used.
1608
1609 SetUpdateCheckAllowed(false);
1610 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
1611 new TimeDelta(TimeDelta::FromMinutes(2)));
1612 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1613
1614 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
1615 update_state.scatter_wait_period = TimeDelta::FromSeconds(35);
1616
1617 UpdateDownloadParams result;
1618 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart,
1619 &result, update_state);
1620 EXPECT_TRUE(result.update_can_start);
1621 EXPECT_EQ(0, result.download_url_idx);
1622 EXPECT_FALSE(result.download_url_allowed);
1623 EXPECT_EQ(0, result.download_url_num_errors);
1624 EXPECT_TRUE(result.p2p_downloading_allowed);
1625 EXPECT_TRUE(result.p2p_sharing_allowed);
1626 EXPECT_FALSE(result.do_increment_failures);
1627 EXPECT_EQ(TimeDelta::FromSeconds(35), result.scatter_wait_period);
1628 EXPECT_EQ(0, result.scatter_check_threshold);
1629}
1630
1631TEST_F(UmChromeOSPolicyTest,
1632 UpdateCanStartAllowedBackoffSupressedDueToP2P) {
1633 // The UpdateCanStart policy returns true; backoff should have applied, but
1634 // P2P download is allowed. Backoff values are nonetheless returned, and so
1635 // are download URL values, albeit the latter are not allowed to be used.
1636
1637 SetUpdateCheckAllowed(false);
1638
1639 const Time curr_time = fake_clock_.GetWallclockTime();
1640 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
1641 update_state.download_errors_max = 1;
1642 update_state.download_errors.emplace_back(
1643 0, ErrorCode::kDownloadTransferError,
1644 curr_time - TimeDelta::FromSeconds(8));
1645 update_state.download_errors.emplace_back(
1646 0, ErrorCode::kDownloadTransferError,
1647 curr_time - TimeDelta::FromSeconds(2));
1648 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1649
1650 UpdateDownloadParams result;
1651 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1652 update_state);
1653 EXPECT_TRUE(result.update_can_start);
1654 EXPECT_EQ(0, result.download_url_idx);
1655 EXPECT_FALSE(result.download_url_allowed);
1656 EXPECT_EQ(0, result.download_url_num_errors);
1657 EXPECT_TRUE(result.p2p_downloading_allowed);
1658 EXPECT_TRUE(result.p2p_sharing_allowed);
1659 EXPECT_TRUE(result.do_increment_failures);
1660 EXPECT_LT(curr_time, result.backoff_expiry);
1661}
1662
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001663TEST_F(UmChromeOSPolicyTest, P2PEnabledNotAllowed) {
1664 bool result;
1665 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1666 EXPECT_FALSE(result);
1667}
1668
1669TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedByDevicePolicy) {
1670 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1671 new bool(true));
1672
1673 bool result;
1674 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1675 EXPECT_TRUE(result);
1676}
1677
1678TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedByUpdater) {
1679 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1680
1681 bool result;
1682 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1683 EXPECT_TRUE(result);
1684}
1685
1686TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedDeviceEnterpriseEnrolled) {
1687 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(nullptr);
1688 fake_state_.device_policy_provider()->var_owner()->reset(nullptr);
1689
1690 bool result;
1691 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1692 EXPECT_TRUE(result);
1693}
1694
1695TEST_F(UmChromeOSPolicyTest, P2PEnabledChangedBlocks) {
1696 bool result;
1697 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::P2PEnabledChanged,
1698 &result, false);
1699}
1700
Alex Deymo63784a52014-05-28 10:46:14 -07001701} // namespace chromeos_update_manager