blob: 0c387000aa6fa826c94655e64ae32f2422e03681 [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));
Alex Deymo763e7db2015-08-27 21:08:08 -070096 fake_state_.system_provider()->var_num_slots()->reset(new unsigned int(2));
Gilad Arnold0adbc942014-05-12 10:35:43 -070097
98 // Connection is wifi, untethered.
99 fake_state_.shill_provider()->var_conn_type()->
100 reset(new ConnectionType(ConnectionType::kWifi));
101 fake_state_.shill_provider()->var_conn_tethering()->
102 reset(new ConnectionTethering(ConnectionTethering::kNotDetected));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700103 }
104
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700105 // Sets up a default device policy that does not impose any restrictions
106 // (HTTP) nor enables any features (P2P).
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700107 void SetUpDefaultDevicePolicy() {
108 fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
109 new bool(true));
110 fake_state_.device_policy_provider()->var_update_disabled()->reset(
111 new bool(false));
112 fake_state_.device_policy_provider()->
113 var_allowed_connection_types_for_update()->reset(nullptr);
114 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
115 new TimeDelta());
116 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700117 new bool(true));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700118 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
119 new bool(false));
120 fake_state_.device_policy_provider()->var_release_channel_delegated()->
121 reset(new bool(true));
122 }
123
124 // Configures the UpdateCheckAllowed policy to return a desired value by
125 // faking the current wall clock time as needed. Restores the default state.
126 // This is used when testing policies that depend on this one.
127 void SetUpdateCheckAllowed(bool allow_check) {
128 Time next_update_check;
129 ExpectPolicyStatus(EvalStatus::kSucceeded,
130 &ChromeOSPolicy::NextUpdateCheckTime,
131 &next_update_check);
132 SetUpDefaultState();
133 SetUpDefaultDevicePolicy();
134 Time curr_time = next_update_check;
135 if (allow_check)
136 curr_time += TimeDelta::FromSeconds(1);
137 else
138 curr_time -= TimeDelta::FromSeconds(1);
139 fake_clock_.SetWallclockTime(curr_time);
140 }
141
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700142 // Returns a default UpdateState structure:
143 UpdateState GetDefaultUpdateState(TimeDelta first_seen_period) {
144 Time first_seen_time = fake_clock_.GetWallclockTime() - first_seen_period;
145 UpdateState update_state = UpdateState();
146
147 // This is a non-interactive check returning a delta payload, seen for the
148 // first time (|first_seen_period| ago). Clearly, there were no failed
149 // attempts so far.
150 update_state.is_interactive = false;
151 update_state.is_delta_payload = false;
152 update_state.first_seen = first_seen_time;
153 update_state.num_checks = 1;
154 update_state.num_failures = 0;
155 update_state.failures_last_updated = Time(); // Needs to be zero.
156 // There's a single HTTP download URL with a maximum of 10 retries.
157 update_state.download_urls = vector<string>{"http://fake/url/"};
158 update_state.download_errors_max = 10;
159 // Download was never attempted.
160 update_state.last_download_url_idx = -1;
161 update_state.last_download_url_num_errors = 0;
162 // There were no download errors.
163 update_state.download_errors = vector<tuple<int, ErrorCode, Time>>();
Gilad Arnold78ecbfc2014-10-22 14:38:25 -0700164 // P2P is not disabled by Omaha.
165 update_state.p2p_downloading_disabled = false;
166 update_state.p2p_sharing_disabled = false;
Gilad Arnold349ac832014-10-06 14:20:28 -0700167 // P2P was not attempted.
168 update_state.p2p_num_attempts = 0;
169 update_state.p2p_first_attempted = Time();
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700170 // No active backoff period, backoff is not disabled by Omaha.
171 update_state.backoff_expiry = Time();
172 update_state.is_backoff_disabled = false;
173 // There is no active scattering wait period (max 7 days allowed) nor check
174 // threshold (none allowed).
175 update_state.scatter_wait_period = TimeDelta();
176 update_state.scatter_check_threshold = 0;
177 update_state.scatter_wait_period_max = TimeDelta::FromDays(7);
178 update_state.scatter_check_threshold_min = 0;
179 update_state.scatter_check_threshold_max = 0;
180
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700181 return update_state;
Alex Deymo0d11c602014-04-23 20:12:20 -0700182 }
183
184 // Runs the passed |policy_method| policy and expects it to return the
185 // |expected| return value.
186 template<typename T, typename R, typename... Args>
187 void ExpectPolicyStatus(
188 EvalStatus expected,
189 T policy_method,
190 R* result, Args... args) {
191 string error = "<None>";
192 eval_ctx_->ResetEvaluation();
193 EXPECT_EQ(expected,
Alex Vakulenko9c155d22014-12-10 12:52:31 -0800194 (policy_.*policy_method)(eval_ctx_.get(), &fake_state_, &error,
195 result, args...))
Alex Deymoc850b4f2014-05-19 11:06:41 -0700196 << "Returned error: " << error
197 << "\nEvaluation context: " << eval_ctx_->DumpContext();
Alex Deymo0d11c602014-04-23 20:12:20 -0700198 }
199
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700200 brillo::FakeMessageLoop loop_{nullptr};
Alex Deymo0d11c602014-04-23 20:12:20 -0700201 FakeClock fake_clock_;
202 FakeState fake_state_;
203 scoped_refptr<EvaluationContext> eval_ctx_;
204 ChromeOSPolicy policy_; // ChromeOSPolicy under test.
205};
206
Alex Deymo63784a52014-05-28 10:46:14 -0700207TEST_F(UmChromeOSPolicyTest, FirstCheckIsAtMostInitialIntervalAfterStart) {
Alex Deymo0d11c602014-04-23 20:12:20 -0700208 Time next_update_check;
209
Gilad Arnold38b14022014-07-09 12:45:56 -0700210 // Set the last update time so it'll appear as if this is a first update check
211 // in the lifetime of the current updater.
212 fake_state_.updater_provider()->var_last_checked_time()->reset(
213 new Time(fake_clock_.GetWallclockTime() - TimeDelta::FromMinutes(10)));
214
Alex Deymo0d11c602014-04-23 20:12:20 -0700215 ExpectPolicyStatus(EvalStatus::kSucceeded,
216 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
217
218 EXPECT_LE(fake_clock_.GetWallclockTime(), next_update_check);
Gilad Arnold38b14022014-07-09 12:45:56 -0700219 EXPECT_GE(
220 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
221 ChromeOSPolicy::kTimeoutInitialInterval +
222 ChromeOSPolicy::kTimeoutRegularFuzz / 2),
223 next_update_check);
224}
225
226TEST_F(UmChromeOSPolicyTest, RecurringCheckBaseIntervalAndFuzz) {
227 // Ensure that we're using the correct interval (kPeriodicInterval) and fuzz
228 // (kTimeoutRegularFuzz) as base values for period updates.
229 Time next_update_check;
230
231 ExpectPolicyStatus(EvalStatus::kSucceeded,
232 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
233
234 EXPECT_LE(
235 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
236 ChromeOSPolicy::kTimeoutPeriodicInterval -
237 ChromeOSPolicy::kTimeoutRegularFuzz / 2),
238 next_update_check);
239 EXPECT_GE(
240 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
241 ChromeOSPolicy::kTimeoutPeriodicInterval +
242 ChromeOSPolicy::kTimeoutRegularFuzz / 2),
243 next_update_check);
244}
245
246TEST_F(UmChromeOSPolicyTest, RecurringCheckBackoffIntervalAndFuzz) {
247 // Ensure that we're properly backing off and fuzzing in the presence of
248 // failed updates attempts.
249 Time next_update_check;
250
251 fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700252 reset(new unsigned int{2});
Gilad Arnold38b14022014-07-09 12:45:56 -0700253
254 ExpectPolicyStatus(EvalStatus::kSucceeded,
255 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
256
257 int expected_interval = ChromeOSPolicy::kTimeoutPeriodicInterval * 4;
258 EXPECT_LE(
259 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
260 expected_interval - expected_interval / 2),
261 next_update_check);
262 EXPECT_GE(
263 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
264 expected_interval + expected_interval / 2),
265 next_update_check);
Alex Deymo0d11c602014-04-23 20:12:20 -0700266}
267
Gilad Arnolda0258a52014-07-10 16:21:19 -0700268TEST_F(UmChromeOSPolicyTest, RecurringCheckServerDictatedPollInterval) {
269 // Policy honors the server provided check poll interval.
270 Time next_update_check;
271
272 const unsigned int kInterval = ChromeOSPolicy::kTimeoutPeriodicInterval * 4;
273 fake_state_.updater_provider()->var_server_dictated_poll_interval()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700274 reset(new unsigned int{kInterval});
Gilad Arnolda0258a52014-07-10 16:21:19 -0700275 // We should not be backing off in this case.
276 fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700277 reset(new unsigned int{2});
Gilad Arnolda0258a52014-07-10 16:21:19 -0700278
279 ExpectPolicyStatus(EvalStatus::kSucceeded,
280 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
281
282 EXPECT_LE(
283 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
284 kInterval - kInterval / 2),
285 next_update_check);
286 EXPECT_GE(
287 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
288 kInterval + kInterval / 2),
289 next_update_check);
290}
291
Alex Deymo63784a52014-05-28 10:46:14 -0700292TEST_F(UmChromeOSPolicyTest, ExponentialBackoffIsCapped) {
Alex Deymo0d11c602014-04-23 20:12:20 -0700293 Time next_update_check;
294
Alex Deymo0d11c602014-04-23 20:12:20 -0700295 fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700296 reset(new unsigned int{100});
Gilad Arnold38b14022014-07-09 12:45:56 -0700297
Alex Deymo0d11c602014-04-23 20:12:20 -0700298 ExpectPolicyStatus(EvalStatus::kSucceeded,
299 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
300
Gilad Arnold38b14022014-07-09 12:45:56 -0700301 EXPECT_LE(
302 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
303 ChromeOSPolicy::kTimeoutMaxBackoffInterval -
304 ChromeOSPolicy::kTimeoutMaxBackoffInterval / 2),
305 next_update_check);
306 EXPECT_GE(
307 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
308 ChromeOSPolicy::kTimeoutMaxBackoffInterval +
309 ChromeOSPolicy::kTimeoutMaxBackoffInterval /2),
310 next_update_check);
Alex Deymo0d11c602014-04-23 20:12:20 -0700311}
312
Alex Deymo63784a52014-05-28 10:46:14 -0700313TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWaitsForTheTimeout) {
Alex Deymo0d11c602014-04-23 20:12:20 -0700314 // We get the next update_check timestamp from the policy's private method
315 // and then we check the public method respects that value on the normal
316 // case.
317 Time next_update_check;
318 Time last_checked_time =
319 fake_clock_.GetWallclockTime() + TimeDelta::FromMinutes(1234);
320
Alex Deymo0d11c602014-04-23 20:12:20 -0700321 fake_state_.updater_provider()->var_last_checked_time()->reset(
322 new Time(last_checked_time));
323 ExpectPolicyStatus(EvalStatus::kSucceeded,
324 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
325
326 UpdateCheckParams result;
327
328 // Check that the policy blocks until the next_update_check is reached.
329 SetUpDefaultClock();
330 SetUpDefaultState();
331 fake_state_.updater_provider()->var_last_checked_time()->reset(
332 new Time(last_checked_time));
333 fake_clock_.SetWallclockTime(next_update_check - TimeDelta::FromSeconds(1));
334 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
335 &Policy::UpdateCheckAllowed, &result);
336
337 SetUpDefaultClock();
338 SetUpDefaultState();
339 fake_state_.updater_provider()->var_last_checked_time()->reset(
340 new Time(last_checked_time));
341 fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
342 ExpectPolicyStatus(EvalStatus::kSucceeded,
343 &Policy::UpdateCheckAllowed, &result);
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700344 EXPECT_TRUE(result.updates_enabled);
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700345 EXPECT_FALSE(result.is_interactive);
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700346}
347
348TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWaitsForOOBE) {
Alex Vakulenko072359c2014-07-18 11:41:07 -0700349 // Update checks are deferred until OOBE is completed.
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700350
351 // Ensure that update is not allowed even if wait period is satisfied.
352 Time next_update_check;
353 Time last_checked_time =
354 fake_clock_.GetWallclockTime() + TimeDelta::FromMinutes(1234);
355
356 fake_state_.updater_provider()->var_last_checked_time()->reset(
357 new Time(last_checked_time));
358 ExpectPolicyStatus(EvalStatus::kSucceeded,
359 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
360
361 SetUpDefaultClock();
362 SetUpDefaultState();
363 fake_state_.updater_provider()->var_last_checked_time()->reset(
364 new Time(last_checked_time));
365 fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
366 fake_state_.system_provider()->var_is_oobe_complete()->reset(
367 new bool(false));
368
369 UpdateCheckParams result;
370 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
371 &Policy::UpdateCheckAllowed, &result);
372
373 // Now check that it is allowed if OOBE is completed.
374 SetUpDefaultClock();
375 SetUpDefaultState();
376 fake_state_.updater_provider()->var_last_checked_time()->reset(
377 new Time(last_checked_time));
378 fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
379 ExpectPolicyStatus(EvalStatus::kSucceeded,
380 &Policy::UpdateCheckAllowed, &result);
381 EXPECT_TRUE(result.updates_enabled);
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700382 EXPECT_FALSE(result.is_interactive);
Alex Deymo0d11c602014-04-23 20:12:20 -0700383}
384
Gilad Arnold42f253b2014-06-25 12:39:17 -0700385TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWithAttributes) {
Alex Vakulenko072359c2014-07-18 11:41:07 -0700386 // Update check is allowed, response includes attributes for use in the
Gilad Arnold42f253b2014-06-25 12:39:17 -0700387 // request.
388 SetUpdateCheckAllowed(true);
389
390 // Override specific device policy attributes.
Gilad Arnoldd4b30322014-07-21 15:35:27 -0700391 fake_state_.device_policy_provider()->var_target_version_prefix()->
392 reset(new string("1.2"));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700393 fake_state_.device_policy_provider()->var_release_channel_delegated()->
394 reset(new bool(false));
395 fake_state_.device_policy_provider()->var_release_channel()->
396 reset(new string("foo-channel"));
397
398 UpdateCheckParams result;
399 ExpectPolicyStatus(EvalStatus::kSucceeded,
400 &Policy::UpdateCheckAllowed, &result);
401 EXPECT_TRUE(result.updates_enabled);
Gilad Arnoldd4b30322014-07-21 15:35:27 -0700402 EXPECT_EQ("1.2", result.target_version_prefix);
Gilad Arnold42f253b2014-06-25 12:39:17 -0700403 EXPECT_EQ("foo-channel", result.target_channel);
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700404 EXPECT_FALSE(result.is_interactive);
Gilad Arnold42f253b2014-06-25 12:39:17 -0700405}
406
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700407TEST_F(UmChromeOSPolicyTest,
408 UpdateCheckAllowedUpdatesDisabledForUnofficialBuilds) {
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700409 // UpdateCheckAllowed should return kAskMeAgainLater if this is an unofficial
410 // build; we don't want periodic update checks on developer images.
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700411
412 fake_state_.system_provider()->var_is_official_build()->reset(
413 new bool(false));
414
415 UpdateCheckParams result;
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700416 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700417 &Policy::UpdateCheckAllowed, &result);
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700418}
419
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700420TEST_F(UmChromeOSPolicyTest,
421 UpdateCheckAllowedUpdatesDisabledForRemovableBootDevice) {
422 // UpdateCheckAllowed should return false (kSucceeded) if the image booted
423 // from a removable device.
424
Alex Deymo763e7db2015-08-27 21:08:08 -0700425 fake_state_.system_provider()->var_num_slots()->reset(new unsigned int(1));
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700426
427 UpdateCheckParams result;
428 ExpectPolicyStatus(EvalStatus::kSucceeded,
429 &Policy::UpdateCheckAllowed, &result);
430 EXPECT_FALSE(result.updates_enabled);
431}
432
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700433TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedUpdatesDisabledByPolicy) {
Gilad Arnold42f253b2014-06-25 12:39:17 -0700434 // UpdateCheckAllowed should return kAskMeAgainLater because a device policy
435 // is loaded and prohibits updates.
436
437 SetUpdateCheckAllowed(false);
438 fake_state_.device_policy_provider()->var_update_disabled()->reset(
439 new bool(true));
440
Gilad Arnold42f253b2014-06-25 12:39:17 -0700441 UpdateCheckParams result;
442 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
443 &Policy::UpdateCheckAllowed, &result);
444}
445
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700446TEST_F(UmChromeOSPolicyTest,
447 UpdateCheckAllowedForcedUpdateRequestedInteractive) {
448 // UpdateCheckAllowed should return true because a forced update request was
449 // signaled for an interactive update.
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700450
451 SetUpdateCheckAllowed(true);
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700452 fake_state_.updater_provider()->var_forced_update_requested()->reset(
453 new UpdateRequestStatus(UpdateRequestStatus::kInteractive));
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700454
455 UpdateCheckParams result;
456 ExpectPolicyStatus(EvalStatus::kSucceeded,
457 &Policy::UpdateCheckAllowed, &result);
458 EXPECT_TRUE(result.updates_enabled);
459 EXPECT_TRUE(result.is_interactive);
460}
461
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700462TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedForcedUpdateRequestedPeriodic) {
463 // UpdateCheckAllowed should return true because a forced update request was
464 // signaled for a periodic check.
465
466 SetUpdateCheckAllowed(true);
467 fake_state_.updater_provider()->var_forced_update_requested()->reset(
468 new UpdateRequestStatus(UpdateRequestStatus::kPeriodic));
469
470 UpdateCheckParams result;
471 ExpectPolicyStatus(EvalStatus::kSucceeded,
472 &Policy::UpdateCheckAllowed, &result);
473 EXPECT_TRUE(result.updates_enabled);
474 EXPECT_FALSE(result.is_interactive);
475}
476
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800477TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskPin) {
478 // Update check is allowed.
479 SetUpdateCheckAllowed(true);
480
481 // A typical setup for kiosk pin policy: AU disabled, allow kiosk to pin
482 // and there is a kiosk required platform version.
483 fake_state_.device_policy_provider()->var_update_disabled()->reset(
484 new bool(true));
485 fake_state_.device_policy_provider()
486 ->var_allow_kiosk_app_control_chrome_version()
487 ->reset(new bool(true));
488 fake_state_.system_provider()->var_kiosk_required_platform_version()->reset(
489 new string("1234.0.0"));
490
491 UpdateCheckParams result;
492 ExpectPolicyStatus(EvalStatus::kSucceeded,
493 &Policy::UpdateCheckAllowed, &result);
494 EXPECT_TRUE(result.updates_enabled);
495 EXPECT_EQ("1234.0.0", result.target_version_prefix);
496 EXPECT_FALSE(result.is_interactive);
497}
498
499TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedDisabledWhenNoKioskPin) {
500 // Update check is allowed.
501 SetUpdateCheckAllowed(true);
502
503 // Disable AU policy is set but kiosk pin policy is set to false. Update is
504 // disabled in such case.
505 fake_state_.device_policy_provider()->var_update_disabled()->reset(
506 new bool(true));
507 fake_state_.device_policy_provider()
508 ->var_allow_kiosk_app_control_chrome_version()
509 ->reset(new bool(false));
510
511 UpdateCheckParams result;
512 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
513 &Policy::UpdateCheckAllowed, &result);
514}
515
516TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskPinWithNoRequiredVersion) {
517 // Update check is allowed.
518 SetUpdateCheckAllowed(true);
519
520 // AU disabled, allow kiosk to pin but there is no kiosk required platform
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700521 // version (i.e. app does not provide the info). Update to latest in such
522 // case.
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800523 fake_state_.device_policy_provider()->var_update_disabled()->reset(
524 new bool(true));
525 fake_state_.device_policy_provider()
526 ->var_allow_kiosk_app_control_chrome_version()
527 ->reset(new bool(true));
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700528 fake_state_.system_provider()->var_kiosk_required_platform_version()->reset(
529 new string());
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800530
531 UpdateCheckParams result;
532 ExpectPolicyStatus(EvalStatus::kSucceeded,
533 &Policy::UpdateCheckAllowed, &result);
534 EXPECT_TRUE(result.updates_enabled);
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700535 EXPECT_TRUE(result.target_version_prefix.empty());
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800536 EXPECT_FALSE(result.is_interactive);
537}
538
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700539TEST_F(UmChromeOSPolicyTest,
540 UpdateCheckAllowedKioskPinWithFailedGetRequiredVersionCall) {
541 // AU disabled, allow kiosk to pin but D-Bus call to get required platform
542 // version failed. Defer update check in this case.
543 fake_state_.device_policy_provider()->var_update_disabled()->reset(
544 new bool(true));
545 fake_state_.device_policy_provider()
546 ->var_allow_kiosk_app_control_chrome_version()
547 ->reset(new bool(true));
548 fake_state_.system_provider()->var_kiosk_required_platform_version()->reset(
549 nullptr);
550
551 UpdateCheckParams result;
552 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
553 &Policy::UpdateCheckAllowed, &result);
554}
555
Alex Deymo63784a52014-05-28 10:46:14 -0700556TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsCheckAllowedError) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700557 // The UpdateCanStart policy fails, not being able to query
558 // UpdateCheckAllowed.
559
560 // Configure the UpdateCheckAllowed policy to fail.
561 fake_state_.updater_provider()->var_updater_started_time()->reset(nullptr);
562
563 // Check that the UpdateCanStart fails.
564 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700565 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700566 ExpectPolicyStatus(EvalStatus::kFailed,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700567 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700568}
569
Alex Deymo63784a52014-05-28 10:46:14 -0700570TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedCheckDue) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700571 // The UpdateCanStart policy returns false because we are due for another
Gilad Arnold14a9e702014-10-08 08:09:09 -0700572 // update check. Ensure that download related values are still returned.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700573
574 SetUpdateCheckAllowed(true);
575
576 // Check that the UpdateCanStart returns false.
577 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700578 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700579 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700580 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700581 EXPECT_FALSE(result.update_can_start);
582 EXPECT_EQ(UpdateCannotStartReason::kCheckDue, result.cannot_start_reason);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700583 EXPECT_EQ(0, result.download_url_idx);
584 EXPECT_EQ(0, result.download_url_num_errors);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700585}
586
Alex Deymo63784a52014-05-28 10:46:14 -0700587TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoDevicePolicy) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700588 // The UpdateCanStart policy returns true; no device policy is loaded.
589
590 SetUpdateCheckAllowed(false);
591 fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
592 new bool(false));
593
594 // Check that the UpdateCanStart returns true with no further attributes.
595 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700596 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700597 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700598 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700599 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700600 EXPECT_FALSE(result.p2p_downloading_allowed);
601 EXPECT_FALSE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700602 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700603 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700604 EXPECT_EQ(0, result.download_url_num_errors);
605 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700606}
607
Alex Deymo63784a52014-05-28 10:46:14 -0700608TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBlankPolicy) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700609 // The UpdateCanStart policy returns true; device policy is loaded but imposes
610 // no restrictions on updating.
611
612 SetUpdateCheckAllowed(false);
613
614 // Check that the UpdateCanStart returns true.
615 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700616 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700617 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700618 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700619 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700620 EXPECT_FALSE(result.p2p_downloading_allowed);
621 EXPECT_FALSE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700622 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700623 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700624 EXPECT_EQ(0, result.download_url_num_errors);
625 EXPECT_FALSE(result.do_increment_failures);
626}
627
628TEST_F(UmChromeOSPolicyTest,
629 UpdateCanStartNotAllowedBackoffNewWaitPeriodApplies) {
630 // The UpdateCanStart policy returns false; failures are reported and a new
631 // backoff period is enacted.
632
633 SetUpdateCheckAllowed(false);
634
635 const Time curr_time = fake_clock_.GetWallclockTime();
636 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
637 update_state.download_errors_max = 1;
638 update_state.download_errors.emplace_back(
639 0, ErrorCode::kDownloadTransferError,
640 curr_time - TimeDelta::FromSeconds(8));
641 update_state.download_errors.emplace_back(
642 0, ErrorCode::kDownloadTransferError,
643 curr_time - TimeDelta::FromSeconds(2));
644
645 // Check that UpdateCanStart returns false and a new backoff expiry is
646 // generated.
647 UpdateDownloadParams result;
648 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
649 update_state);
650 EXPECT_FALSE(result.update_can_start);
651 EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
652 EXPECT_TRUE(result.do_increment_failures);
653 EXPECT_LT(curr_time, result.backoff_expiry);
654}
655
656TEST_F(UmChromeOSPolicyTest,
657 UpdateCanStartNotAllowedBackoffPrevWaitPeriodStillApplies) {
658 // The UpdateCanStart policy returns false; a previously enacted backoff
659 // period still applies.
660
661 SetUpdateCheckAllowed(false);
662
663 const Time curr_time = fake_clock_.GetWallclockTime();
664 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
665 update_state.download_errors_max = 1;
666 update_state.download_errors.emplace_back(
667 0, ErrorCode::kDownloadTransferError,
668 curr_time - TimeDelta::FromSeconds(8));
669 update_state.download_errors.emplace_back(
670 0, ErrorCode::kDownloadTransferError,
671 curr_time - TimeDelta::FromSeconds(2));
672 update_state.failures_last_updated = curr_time;
673 update_state.backoff_expiry = curr_time + TimeDelta::FromMinutes(3);
674
675 // Check that UpdateCanStart returns false and a new backoff expiry is
676 // generated.
677 UpdateDownloadParams result;
678 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::UpdateCanStart,
679 &result, update_state);
680 EXPECT_FALSE(result.update_can_start);
681 EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
682 EXPECT_FALSE(result.do_increment_failures);
683 EXPECT_LT(curr_time, result.backoff_expiry);
684}
685
686TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffSatisfied) {
687 // The UpdateCanStart policy returns true; a previously enacted backoff period
688 // has elapsed, we're good to go.
689
690 SetUpdateCheckAllowed(false);
691
692 const Time curr_time = fake_clock_.GetWallclockTime();
693 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
694 update_state.download_errors_max = 1;
695 update_state.download_errors.emplace_back(
696 0, ErrorCode::kDownloadTransferError,
697 curr_time - TimeDelta::FromSeconds(8));
698 update_state.download_errors.emplace_back(
699 0, ErrorCode::kDownloadTransferError,
700 curr_time - TimeDelta::FromSeconds(2));
701 update_state.failures_last_updated = curr_time - TimeDelta::FromSeconds(1);
702 update_state.backoff_expiry = curr_time - TimeDelta::FromSeconds(1);
703
704 // Check that UpdateCanStart returns false and a new backoff expiry is
705 // generated.
706 UpdateDownloadParams result;
707 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart,
708 &result, update_state);
709 EXPECT_TRUE(result.update_can_start);
710 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
711 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700712 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700713 EXPECT_EQ(0, result.download_url_num_errors);
714 EXPECT_FALSE(result.do_increment_failures);
715 EXPECT_EQ(Time(), result.backoff_expiry);
716}
717
718TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffDisabled) {
719 // The UpdateCanStart policy returns false; failures are reported but backoff
720 // is disabled.
721
722 SetUpdateCheckAllowed(false);
723
724 const Time curr_time = fake_clock_.GetWallclockTime();
725 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
726 update_state.download_errors_max = 1;
727 update_state.download_errors.emplace_back(
728 0, ErrorCode::kDownloadTransferError,
729 curr_time - TimeDelta::FromSeconds(8));
730 update_state.download_errors.emplace_back(
731 0, ErrorCode::kDownloadTransferError,
732 curr_time - TimeDelta::FromSeconds(2));
733 update_state.is_backoff_disabled = true;
734
735 // Check that UpdateCanStart returns false and a new backoff expiry is
736 // generated.
737 UpdateDownloadParams result;
738 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
739 update_state);
740 EXPECT_TRUE(result.update_can_start);
741 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
742 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700743 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700744 EXPECT_EQ(0, result.download_url_num_errors);
745 EXPECT_TRUE(result.do_increment_failures);
746 EXPECT_EQ(Time(), result.backoff_expiry);
747}
748
749TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffInteractive) {
750 // The UpdateCanStart policy returns false; failures are reported but this is
751 // an interactive update check.
752
753 SetUpdateCheckAllowed(false);
754
755 const Time curr_time = fake_clock_.GetWallclockTime();
756 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
757 update_state.download_errors_max = 1;
758 update_state.download_errors.emplace_back(
759 0, ErrorCode::kDownloadTransferError,
760 curr_time - TimeDelta::FromSeconds(8));
761 update_state.download_errors.emplace_back(
762 0, ErrorCode::kDownloadTransferError,
763 curr_time - TimeDelta::FromSeconds(2));
764 update_state.is_interactive = true;
765
766 // Check that UpdateCanStart returns false and a new backoff expiry is
767 // generated.
768 UpdateDownloadParams result;
769 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
770 update_state);
771 EXPECT_TRUE(result.update_can_start);
772 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
773 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700774 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700775 EXPECT_EQ(0, result.download_url_num_errors);
776 EXPECT_TRUE(result.do_increment_failures);
777 EXPECT_EQ(Time(), result.backoff_expiry);
778}
779
780TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffDelta) {
781 // The UpdateCanStart policy returns false; failures are reported but this is
782 // a delta payload.
783
784 SetUpdateCheckAllowed(false);
785
786 const Time curr_time = fake_clock_.GetWallclockTime();
787 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
788 update_state.download_errors_max = 1;
789 update_state.download_errors.emplace_back(
790 0, ErrorCode::kDownloadTransferError,
791 curr_time - TimeDelta::FromSeconds(8));
792 update_state.download_errors.emplace_back(
793 0, ErrorCode::kDownloadTransferError,
794 curr_time - TimeDelta::FromSeconds(2));
795 update_state.is_delta_payload = true;
796
797 // Check that UpdateCanStart returns false and a new backoff expiry is
798 // generated.
799 UpdateDownloadParams result;
800 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
801 update_state);
802 EXPECT_TRUE(result.update_can_start);
803 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
804 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700805 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700806 EXPECT_EQ(0, result.download_url_num_errors);
807 EXPECT_TRUE(result.do_increment_failures);
808 EXPECT_EQ(Time(), result.backoff_expiry);
809}
810
811TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffUnofficialBuild) {
812 // The UpdateCanStart policy returns false; failures are reported but this is
813 // an unofficial build.
814
815 SetUpdateCheckAllowed(false);
816
817 const Time curr_time = fake_clock_.GetWallclockTime();
818 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
819 update_state.download_errors_max = 1;
820 update_state.download_errors.emplace_back(
821 0, ErrorCode::kDownloadTransferError,
822 curr_time - TimeDelta::FromSeconds(8));
823 update_state.download_errors.emplace_back(
824 0, ErrorCode::kDownloadTransferError,
825 curr_time - TimeDelta::FromSeconds(2));
826
827 fake_state_.system_provider()->var_is_official_build()->
828 reset(new bool(false));
829
830 // Check that UpdateCanStart returns false and a new backoff expiry is
831 // generated.
832 UpdateDownloadParams result;
833 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
834 update_state);
835 EXPECT_TRUE(result.update_can_start);
836 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
837 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700838 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700839 EXPECT_EQ(0, result.download_url_num_errors);
840 EXPECT_TRUE(result.do_increment_failures);
841 EXPECT_EQ(Time(), result.backoff_expiry);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700842}
843
Alex Deymo63784a52014-05-28 10:46:14 -0700844TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsScatteringFailed) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700845 // The UpdateCanStart policy fails because the UpdateScattering policy it
846 // depends on fails (unset variable).
847
848 SetUpdateCheckAllowed(false);
849
850 // Override the default seed variable with a null value so that the policy
851 // request would fail.
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700852 // TODO(garnold) This failure may or may not fail a number
853 // sub-policies/decisions, like scattering and backoff. We'll need a more
854 // deliberate setup to ensure that we're failing what we want to be failing.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700855 fake_state_.random_provider()->var_seed()->reset(nullptr);
856
857 // Check that the UpdateCanStart fails.
858 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700859 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700860 ExpectPolicyStatus(EvalStatus::kFailed,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700861 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700862}
863
Alex Deymo63784a52014-05-28 10:46:14 -0700864TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700865 UpdateCanStartNotAllowedScatteringNewWaitPeriodApplies) {
866 // The UpdateCanStart policy returns false; device policy is loaded and
867 // scattering applies due to an unsatisfied wait period, which was newly
868 // generated.
869
870 SetUpdateCheckAllowed(false);
871 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
872 new TimeDelta(TimeDelta::FromMinutes(2)));
873
874
875 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
876
877 // Check that the UpdateCanStart returns false and a new wait period
878 // generated.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700879 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700880 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700881 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700882 EXPECT_FALSE(result.update_can_start);
883 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
884 EXPECT_LT(TimeDelta(), result.scatter_wait_period);
885 EXPECT_EQ(0, result.scatter_check_threshold);
886}
887
Alex Deymo63784a52014-05-28 10:46:14 -0700888TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700889 UpdateCanStartNotAllowedScatteringPrevWaitPeriodStillApplies) {
890 // The UpdateCanStart policy returns false w/ kAskMeAgainLater; device policy
891 // is loaded and a previously generated scattering period still applies, none
892 // of the scattering values has changed.
893
894 SetUpdateCheckAllowed(false);
895 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
896 new TimeDelta(TimeDelta::FromMinutes(2)));
897
898 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
899 update_state.scatter_wait_period = TimeDelta::FromSeconds(35);
900
901 // Check that the UpdateCanStart returns false and a new wait period
902 // generated.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700903 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700904 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::UpdateCanStart,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700905 &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700906 EXPECT_FALSE(result.update_can_start);
907 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
908 EXPECT_EQ(TimeDelta::FromSeconds(35), result.scatter_wait_period);
909 EXPECT_EQ(0, result.scatter_check_threshold);
910}
911
Alex Deymo63784a52014-05-28 10:46:14 -0700912TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700913 UpdateCanStartNotAllowedScatteringNewCountThresholdApplies) {
914 // The UpdateCanStart policy returns false; device policy is loaded and
915 // scattering applies due to an unsatisfied update check count threshold.
916 //
917 // This ensures a non-zero check threshold, which may or may not be combined
918 // with a non-zero wait period (for which we cannot reliably control).
919
920 SetUpdateCheckAllowed(false);
921 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
922 new TimeDelta(TimeDelta::FromSeconds(1)));
923
924 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
925 update_state.scatter_check_threshold_min = 2;
926 update_state.scatter_check_threshold_max = 5;
927
928 // Check that the UpdateCanStart returns false.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700929 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700930 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700931 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700932 EXPECT_FALSE(result.update_can_start);
933 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
934 EXPECT_LE(2, result.scatter_check_threshold);
935 EXPECT_GE(5, result.scatter_check_threshold);
936}
937
Alex Deymo63784a52014-05-28 10:46:14 -0700938TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700939 UpdateCanStartNotAllowedScatteringPrevCountThresholdStillApplies) {
940 // The UpdateCanStart policy returns false; device policy is loaded and
941 // scattering due to a previously generated count threshold still applies.
942
943 SetUpdateCheckAllowed(false);
944 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
945 new TimeDelta(TimeDelta::FromSeconds(1)));
946
947 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
948 update_state.scatter_check_threshold = 3;
949 update_state.scatter_check_threshold_min = 2;
950 update_state.scatter_check_threshold_max = 5;
951
952 // Check that the UpdateCanStart returns false.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700953 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700954 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700955 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700956 EXPECT_FALSE(result.update_can_start);
957 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
958 EXPECT_EQ(3, result.scatter_check_threshold);
959}
960
Alex Deymo63784a52014-05-28 10:46:14 -0700961TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedScatteringSatisfied) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700962 // The UpdateCanStart policy returns true; device policy is loaded and
963 // scattering is enabled, but both wait period and check threshold are
964 // satisfied.
965
966 SetUpdateCheckAllowed(false);
967 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
968 new TimeDelta(TimeDelta::FromSeconds(120)));
969
970 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(75));
971 update_state.num_checks = 4;
972 update_state.scatter_wait_period = TimeDelta::FromSeconds(60);
973 update_state.scatter_check_threshold = 3;
974 update_state.scatter_check_threshold_min = 2;
975 update_state.scatter_check_threshold_max = 5;
976
977 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700978 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700979 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700980 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700981 EXPECT_TRUE(result.update_can_start);
982 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
983 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700984 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700985 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700986 EXPECT_EQ(0, result.download_url_num_errors);
987 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700988}
989
Alex Deymo63784a52014-05-28 10:46:14 -0700990TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700991 UpdateCanStartAllowedInteractivePreventsScattering) {
992 // The UpdateCanStart policy returns true; device policy is loaded and
993 // scattering would have applied, except that the update check is interactive
994 // and so it is suppressed.
995
996 SetUpdateCheckAllowed(false);
997 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
998 new TimeDelta(TimeDelta::FromSeconds(1)));
999
1000 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001001 update_state.is_interactive = true;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001002 update_state.scatter_check_threshold = 0;
1003 update_state.scatter_check_threshold_min = 2;
1004 update_state.scatter_check_threshold_max = 5;
1005
1006 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001007 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001008 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001009 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001010 EXPECT_TRUE(result.update_can_start);
1011 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
1012 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001013 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001014 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001015 EXPECT_EQ(0, result.download_url_num_errors);
1016 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001017}
1018
Alex Deymo63784a52014-05-28 10:46:14 -07001019TEST_F(UmChromeOSPolicyTest,
Gilad Arnold76a11f62014-05-20 09:02:12 -07001020 UpdateCanStartAllowedOobePreventsScattering) {
1021 // The UpdateCanStart policy returns true; device policy is loaded and
1022 // scattering would have applied, except that OOBE was not completed and so it
1023 // is suppressed.
1024
1025 SetUpdateCheckAllowed(false);
1026 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
1027 new TimeDelta(TimeDelta::FromSeconds(1)));
1028 fake_state_.system_provider()->var_is_oobe_complete()->reset(new bool(false));
1029
1030 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001031 update_state.is_interactive = true;
Gilad Arnold76a11f62014-05-20 09:02:12 -07001032 update_state.scatter_check_threshold = 0;
1033 update_state.scatter_check_threshold_min = 2;
1034 update_state.scatter_check_threshold_max = 5;
1035
1036 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001037 UpdateDownloadParams result;
Gilad Arnold76a11f62014-05-20 09:02:12 -07001038 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001039 update_state);
Gilad Arnold76a11f62014-05-20 09:02:12 -07001040 EXPECT_TRUE(result.update_can_start);
1041 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
1042 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001043 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001044 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001045 EXPECT_EQ(0, result.download_url_num_errors);
1046 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnold76a11f62014-05-20 09:02:12 -07001047}
1048
Alex Deymo63784a52014-05-28 10:46:14 -07001049TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithAttributes) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001050 // The UpdateCanStart policy returns true; device policy permits both HTTP and
1051 // P2P updates, as well as a non-empty target channel string.
1052
1053 SetUpdateCheckAllowed(false);
1054
1055 // Override specific device policy attributes.
1056 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1057 new bool(true));
1058 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1059 new bool(true));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001060
1061 // Check that the UpdateCanStart returns true.
1062 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001063 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001064 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001065 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001066 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001067 EXPECT_TRUE(result.p2p_downloading_allowed);
1068 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001069 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001070 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001071 EXPECT_EQ(0, result.download_url_num_errors);
1072 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001073}
1074
Alex Deymo63784a52014-05-28 10:46:14 -07001075TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithP2PFromUpdater) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001076 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1077 // P2P updates, but the updater is configured to allow P2P and overrules the
1078 // setting.
1079
1080 SetUpdateCheckAllowed(false);
1081
1082 // Override specific device policy attributes.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001083 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1084
1085 // Check that the UpdateCanStart returns true.
1086 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001087 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001088 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001089 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001090 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001091 EXPECT_TRUE(result.p2p_downloading_allowed);
1092 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001093 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001094 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001095 EXPECT_EQ(0, result.download_url_num_errors);
1096 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001097}
1098
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001099TEST_F(UmChromeOSPolicyTest,
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001100 UpdateCanStartAllowedP2PDownloadingBlockedDueToOmaha) {
1101 // The UpdateCanStart policy returns true; device policy permits HTTP, but
1102 // policy blocks P2P downloading because Omaha forbids it. P2P sharing is
1103 // still permitted.
1104
1105 SetUpdateCheckAllowed(false);
1106
1107 // Override specific device policy attributes.
1108 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1109 new bool(true));
1110 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1111 new bool(true));
1112
1113 // Check that the UpdateCanStart returns true.
1114 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1115 update_state.p2p_downloading_disabled = true;
1116 UpdateDownloadParams result;
1117 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1118 update_state);
1119 EXPECT_TRUE(result.update_can_start);
1120 EXPECT_FALSE(result.p2p_downloading_allowed);
1121 EXPECT_TRUE(result.p2p_sharing_allowed);
1122}
1123
1124TEST_F(UmChromeOSPolicyTest,
1125 UpdateCanStartAllowedP2PSharingBlockedDueToOmaha) {
1126 // The UpdateCanStart policy returns true; device policy permits HTTP, but
1127 // policy blocks P2P sharing because Omaha forbids it. P2P downloading is
1128 // still permitted.
1129
1130 SetUpdateCheckAllowed(false);
1131
1132 // Override specific device policy attributes.
1133 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1134 new bool(true));
1135 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1136 new bool(true));
1137
1138 // Check that the UpdateCanStart returns true.
1139 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1140 update_state.p2p_sharing_disabled = true;
1141 UpdateDownloadParams result;
1142 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1143 update_state);
1144 EXPECT_TRUE(result.update_can_start);
1145 EXPECT_TRUE(result.p2p_downloading_allowed);
1146 EXPECT_FALSE(result.p2p_sharing_allowed);
1147}
1148
1149TEST_F(UmChromeOSPolicyTest,
1150 UpdateCanStartAllowedP2PDownloadingBlockedDueToNumAttempts) {
Gilad Arnold349ac832014-10-06 14:20:28 -07001151 // The UpdateCanStart policy returns true; device policy permits HTTP but
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001152 // blocks P2P download, because the max number of P2P downloads have been
1153 // attempted. P2P sharing is still permitted.
Gilad Arnold349ac832014-10-06 14:20:28 -07001154
1155 SetUpdateCheckAllowed(false);
1156
1157 // Override specific device policy attributes.
1158 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1159 new bool(true));
1160 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1161 new bool(true));
1162
1163 // Check that the UpdateCanStart returns true.
1164 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1165 update_state.p2p_num_attempts = ChromeOSPolicy::kMaxP2PAttempts;
1166 UpdateDownloadParams result;
1167 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1168 update_state);
1169 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001170 EXPECT_FALSE(result.p2p_downloading_allowed);
1171 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnold349ac832014-10-06 14:20:28 -07001172}
1173
1174TEST_F(UmChromeOSPolicyTest,
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001175 UpdateCanStartAllowedP2PDownloadingBlockedDueToAttemptsPeriod) {
Gilad Arnold349ac832014-10-06 14:20:28 -07001176 // The UpdateCanStart policy returns true; device policy permits HTTP but
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001177 // blocks P2P download, because the max period for attempt to download via P2P
1178 // has elapsed. P2P sharing is still permitted.
Gilad Arnold349ac832014-10-06 14:20:28 -07001179
1180 SetUpdateCheckAllowed(false);
1181
1182 // Override specific device policy attributes.
1183 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1184 new bool(true));
1185 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1186 new bool(true));
1187
1188 // Check that the UpdateCanStart returns true.
1189 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1190 update_state.p2p_num_attempts = 1;
1191 update_state.p2p_first_attempted =
1192 fake_clock_.GetWallclockTime() -
Alex Deymof329b932014-10-30 01:37:48 -07001193 TimeDelta::FromSeconds(
1194 ChromeOSPolicy::kMaxP2PAttemptsPeriodInSeconds + 1);
Gilad Arnold349ac832014-10-06 14:20:28 -07001195 UpdateDownloadParams result;
1196 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1197 update_state);
1198 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001199 EXPECT_FALSE(result.p2p_downloading_allowed);
1200 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnold349ac832014-10-06 14:20:28 -07001201}
1202
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001203TEST_F(UmChromeOSPolicyTest,
1204 UpdateCanStartAllowedWithHttpUrlForUnofficialBuild) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001205 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1206 // P2P updates, but marking this an unofficial build overrules the HTTP
1207 // setting.
1208
1209 SetUpdateCheckAllowed(false);
1210
1211 // Override specific device policy attributes.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001212 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1213 new bool(false));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001214 fake_state_.system_provider()->var_is_official_build()->
1215 reset(new bool(false));
1216
1217 // Check that the UpdateCanStart returns true.
1218 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001219 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001220 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001221 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001222 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001223 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001224 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001225 EXPECT_EQ(0, result.download_url_num_errors);
1226 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001227}
1228
1229TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithHttpsUrl) {
1230 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1231 // P2P updates, but an HTTPS URL is provided and selected for download.
1232
1233 SetUpdateCheckAllowed(false);
1234
1235 // Override specific device policy attributes.
1236 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1237 new bool(false));
1238
1239 // Add an HTTPS URL.
1240 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001241 update_state.download_urls.emplace_back("https://secure/url/");
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001242
1243 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001244 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001245 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001246 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001247 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001248 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001249 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001250 EXPECT_EQ(0, result.download_url_num_errors);
1251 EXPECT_FALSE(result.do_increment_failures);
1252}
1253
1254TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedMaxErrorsNotExceeded) {
1255 // The UpdateCanStart policy returns true; the first URL has download errors
1256 // but does not exceed the maximum allowed number of failures, so it is stilli
1257 // usable.
1258
1259 SetUpdateCheckAllowed(false);
1260
1261 // Add a second URL; update with this URL attempted and failed enough times to
1262 // disqualify the current (first) URL.
1263 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1264 update_state.num_checks = 5;
1265 update_state.download_urls.emplace_back("http://another/fake/url/");
1266 Time t = fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(12);
1267 for (int i = 0; i < 5; i++) {
1268 update_state.download_errors.emplace_back(
1269 0, ErrorCode::kDownloadTransferError, t);
1270 t += TimeDelta::FromSeconds(1);
1271 }
1272
1273 // Check that the UpdateCanStart returns true.
1274 UpdateDownloadParams result;
1275 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1276 update_state);
1277 EXPECT_TRUE(result.update_can_start);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001278 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001279 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001280 EXPECT_EQ(5, result.download_url_num_errors);
1281 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001282}
1283
1284TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlMaxExceeded) {
1285 // The UpdateCanStart policy returns true; the first URL exceeded the maximum
1286 // allowed number of failures, but a second URL is available.
1287
1288 SetUpdateCheckAllowed(false);
1289
1290 // Add a second URL; update with this URL attempted and failed enough times to
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001291 // disqualify the current (first) URL.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001292 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1293 update_state.num_checks = 10;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001294 update_state.download_urls.emplace_back("http://another/fake/url/");
1295 Time t = fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(12);
1296 for (int i = 0; i < 11; i++) {
1297 update_state.download_errors.emplace_back(
1298 0, ErrorCode::kDownloadTransferError, t);
1299 t += TimeDelta::FromSeconds(1);
1300 }
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001301
1302 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001303 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001304 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001305 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001306 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001307 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001308 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001309 EXPECT_EQ(0, result.download_url_num_errors);
1310 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001311}
1312
1313TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlHardError) {
1314 // The UpdateCanStart policy returns true; the first URL fails with a hard
1315 // error, but a second URL is available.
1316
1317 SetUpdateCheckAllowed(false);
1318
1319 // Add a second URL; update with this URL attempted and failed in a way that
1320 // causes it to switch directly to the next URL.
1321 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1322 update_state.num_checks = 10;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001323 update_state.download_urls.emplace_back("http://another/fake/url/");
1324 update_state.download_errors.emplace_back(
1325 0, ErrorCode::kPayloadHashMismatchError,
1326 fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(1));
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001327
1328 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001329 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001330 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001331 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001332 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001333 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001334 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001335 EXPECT_EQ(0, result.download_url_num_errors);
1336 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001337}
1338
1339TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedUrlWrapsAround) {
1340 // The UpdateCanStart policy returns true; URL search properly wraps around
1341 // the last one on the list.
1342
1343 SetUpdateCheckAllowed(false);
1344
1345 // Add a second URL; update with this URL attempted and failed in a way that
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001346 // causes it to switch directly to the next URL. We must disable backoff in
1347 // order for it not to interfere.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001348 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001349 update_state.num_checks = 1;
1350 update_state.is_backoff_disabled = true;
1351 update_state.download_urls.emplace_back("http://another/fake/url/");
1352 update_state.download_errors.emplace_back(
1353 1, ErrorCode::kPayloadHashMismatchError,
1354 fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(1));
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001355
1356 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001357 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001358 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001359 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001360 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001361 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001362 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001363 EXPECT_EQ(0, result.download_url_num_errors);
1364 EXPECT_TRUE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001365}
1366
1367TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedNoUsableUrls) {
1368 // The UpdateCanStart policy returns false; there's a single HTTP URL but its
1369 // use is forbidden by policy.
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001370 //
1371 // Note: In the case where no usable URLs are found, the policy should not
1372 // increment the number of failed attempts! Doing so would result in a
1373 // non-idempotent semantics, and does not fall within the intended purpose of
1374 // the backoff mechanism anyway.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001375
1376 SetUpdateCheckAllowed(false);
1377
1378 // Override specific device policy attributes.
1379 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1380 new bool(false));
1381
1382 // Check that the UpdateCanStart returns false.
1383 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001384 UpdateDownloadParams result;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001385 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1386 update_state);
1387 EXPECT_FALSE(result.update_can_start);
1388 EXPECT_EQ(UpdateCannotStartReason::kCannotDownload,
1389 result.cannot_start_reason);
1390 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001391}
1392
1393TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoUsableUrlsButP2PEnabled) {
1394 // The UpdateCanStart policy returns true; there's a single HTTP URL but its
1395 // use is forbidden by policy, however P2P is enabled. The result indicates
1396 // that no URL can be used.
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001397 //
1398 // Note: The number of failed attempts should not increase in this case (see
1399 // above test).
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001400
1401 SetUpdateCheckAllowed(false);
1402
1403 // Override specific device policy attributes.
1404 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1405 new bool(true));
1406 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1407 new bool(false));
1408
1409 // Check that the UpdateCanStart returns true.
1410 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001411 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001412 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001413 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001414 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001415 EXPECT_TRUE(result.p2p_downloading_allowed);
1416 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001417 EXPECT_GT(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001418 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001419 EXPECT_EQ(0, result.download_url_num_errors);
1420 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001421}
1422
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001423TEST_F(UmChromeOSPolicyTest,
1424 UpdateCanStartAllowedNoUsableUrlsButEnterpriseEnrolled) {
1425 // The UpdateCanStart policy returns true; there's a single HTTP URL but its
1426 // use is forbidden by policy, and P2P is unset on the policy, however the
1427 // device is enterprise-enrolled so P2P is allowed. The result indicates that
1428 // no URL can be used.
1429 //
1430 // Note: The number of failed attempts should not increase in this case (see
1431 // above test).
1432
1433 SetUpdateCheckAllowed(false);
1434
1435 // Override specific device policy attributes.
1436 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(nullptr);
1437 fake_state_.device_policy_provider()->var_owner()->reset(nullptr);
1438 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1439 new bool(false));
1440
1441 // Check that the UpdateCanStart returns true.
1442 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1443 UpdateDownloadParams result;
1444 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1445 update_state);
1446 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001447 EXPECT_TRUE(result.p2p_downloading_allowed);
1448 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001449 EXPECT_GT(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001450 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001451 EXPECT_EQ(0, result.download_url_num_errors);
1452 EXPECT_FALSE(result.do_increment_failures);
1453}
1454
Gilad Arnold684219d2014-07-07 14:54:57 -07001455TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedEthernetDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001456 // Ethernet is always allowed.
1457
1458 fake_state_.shill_provider()->var_conn_type()->
1459 reset(new ConnectionType(ConnectionType::kEthernet));
1460
1461 bool result;
1462 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001463 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001464 EXPECT_TRUE(result);
1465}
1466
Gilad Arnold684219d2014-07-07 14:54:57 -07001467TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWifiDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001468 // Wifi is allowed if not tethered.
1469
1470 fake_state_.shill_provider()->var_conn_type()->
1471 reset(new ConnectionType(ConnectionType::kWifi));
1472
1473 bool result;
1474 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001475 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001476 EXPECT_TRUE(result);
1477}
1478
Alex Deymo63784a52014-05-28 10:46:14 -07001479TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001480 UpdateCurrentConnectionNotAllowedWifiTetheredDefault) {
1481 // Tethered wifi is not allowed by default.
1482
1483 fake_state_.shill_provider()->var_conn_type()->
1484 reset(new ConnectionType(ConnectionType::kWifi));
1485 fake_state_.shill_provider()->var_conn_tethering()->
1486 reset(new ConnectionTethering(ConnectionTethering::kConfirmed));
1487
1488 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001489 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001490 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001491}
1492
Alex Deymo63784a52014-05-28 10:46:14 -07001493TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001494 UpdateDownloadAllowedWifiTetheredPolicyOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001495 // Tethered wifi can be allowed by policy.
1496
1497 fake_state_.shill_provider()->var_conn_type()->
1498 reset(new ConnectionType(ConnectionType::kWifi));
1499 fake_state_.shill_provider()->var_conn_tethering()->
1500 reset(new ConnectionTethering(ConnectionTethering::kConfirmed));
1501 set<ConnectionType> allowed_connections;
1502 allowed_connections.insert(ConnectionType::kCellular);
1503 fake_state_.device_policy_provider()->
1504 var_allowed_connection_types_for_update()->
1505 reset(new set<ConnectionType>(allowed_connections));
1506
1507 bool result;
1508 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001509 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001510 EXPECT_TRUE(result);
1511}
1512
Gilad Arnold684219d2014-07-07 14:54:57 -07001513TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWimaxDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001514 // Wimax is always allowed.
1515
1516 fake_state_.shill_provider()->var_conn_type()->
1517 reset(new ConnectionType(ConnectionType::kWifi));
1518
1519 bool result;
1520 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001521 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001522 EXPECT_TRUE(result);
1523}
1524
Alex Deymo63784a52014-05-28 10:46:14 -07001525TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001526 UpdateCurrentConnectionNotAllowedBluetoothDefault) {
1527 // Bluetooth is never allowed.
1528
1529 fake_state_.shill_provider()->var_conn_type()->
1530 reset(new ConnectionType(ConnectionType::kBluetooth));
1531
1532 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001533 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001534 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001535}
1536
Alex Deymo63784a52014-05-28 10:46:14 -07001537TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001538 UpdateCurrentConnectionNotAllowedBluetoothPolicyCannotOverride) {
1539 // Bluetooth cannot be allowed even by policy.
1540
1541 fake_state_.shill_provider()->var_conn_type()->
1542 reset(new ConnectionType(ConnectionType::kBluetooth));
1543 set<ConnectionType> allowed_connections;
1544 allowed_connections.insert(ConnectionType::kBluetooth);
1545 fake_state_.device_policy_provider()->
1546 var_allowed_connection_types_for_update()->
1547 reset(new set<ConnectionType>(allowed_connections));
1548
1549 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001550 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001551 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001552}
1553
Alex Deymo63784a52014-05-28 10:46:14 -07001554TEST_F(UmChromeOSPolicyTest, UpdateCurrentConnectionNotAllowedCellularDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001555 // Cellular is not allowed by default.
1556
1557 fake_state_.shill_provider()->var_conn_type()->
1558 reset(new ConnectionType(ConnectionType::kCellular));
1559
1560 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001561 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001562 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001563}
1564
Alex Deymo63784a52014-05-28 10:46:14 -07001565TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001566 UpdateDownloadAllowedCellularPolicyOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001567 // Update over cellular can be enabled by policy.
1568
1569 fake_state_.shill_provider()->var_conn_type()->
1570 reset(new ConnectionType(ConnectionType::kCellular));
1571 set<ConnectionType> allowed_connections;
1572 allowed_connections.insert(ConnectionType::kCellular);
1573 fake_state_.device_policy_provider()->
1574 var_allowed_connection_types_for_update()->
1575 reset(new set<ConnectionType>(allowed_connections));
1576
1577 bool result;
1578 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001579 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001580 EXPECT_TRUE(result);
1581}
1582
Alex Deymo63784a52014-05-28 10:46:14 -07001583TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001584 UpdateDownloadAllowedCellularUserOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001585 // Update over cellular can be enabled by user settings, but only if policy
1586 // is present and does not determine allowed connections.
1587
1588 fake_state_.shill_provider()->var_conn_type()->
1589 reset(new ConnectionType(ConnectionType::kCellular));
1590 set<ConnectionType> allowed_connections;
1591 allowed_connections.insert(ConnectionType::kCellular);
1592 fake_state_.updater_provider()->var_cellular_enabled()->
1593 reset(new bool(true));
1594
1595 bool result;
1596 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001597 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001598 EXPECT_TRUE(result);
1599}
1600
Gilad Arnold14a9e702014-10-08 08:09:09 -07001601TEST_F(UmChromeOSPolicyTest,
1602 UpdateCanStartAllowedScatteringSupressedDueToP2P) {
1603 // The UpdateCanStart policy returns true; scattering should have applied, but
1604 // P2P download is allowed. Scattering values are nonetheless returned, and so
1605 // are download URL values, albeit the latter are not allowed to be used.
1606
1607 SetUpdateCheckAllowed(false);
1608 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
1609 new TimeDelta(TimeDelta::FromMinutes(2)));
1610 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1611
1612 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
1613 update_state.scatter_wait_period = TimeDelta::FromSeconds(35);
1614
1615 UpdateDownloadParams result;
1616 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart,
1617 &result, update_state);
1618 EXPECT_TRUE(result.update_can_start);
1619 EXPECT_EQ(0, result.download_url_idx);
1620 EXPECT_FALSE(result.download_url_allowed);
1621 EXPECT_EQ(0, result.download_url_num_errors);
1622 EXPECT_TRUE(result.p2p_downloading_allowed);
1623 EXPECT_TRUE(result.p2p_sharing_allowed);
1624 EXPECT_FALSE(result.do_increment_failures);
1625 EXPECT_EQ(TimeDelta::FromSeconds(35), result.scatter_wait_period);
1626 EXPECT_EQ(0, result.scatter_check_threshold);
1627}
1628
1629TEST_F(UmChromeOSPolicyTest,
1630 UpdateCanStartAllowedBackoffSupressedDueToP2P) {
1631 // The UpdateCanStart policy returns true; backoff should have applied, but
1632 // P2P download is allowed. Backoff values are nonetheless returned, and so
1633 // are download URL values, albeit the latter are not allowed to be used.
1634
1635 SetUpdateCheckAllowed(false);
1636
1637 const Time curr_time = fake_clock_.GetWallclockTime();
1638 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
1639 update_state.download_errors_max = 1;
1640 update_state.download_errors.emplace_back(
1641 0, ErrorCode::kDownloadTransferError,
1642 curr_time - TimeDelta::FromSeconds(8));
1643 update_state.download_errors.emplace_back(
1644 0, ErrorCode::kDownloadTransferError,
1645 curr_time - TimeDelta::FromSeconds(2));
1646 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1647
1648 UpdateDownloadParams result;
1649 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1650 update_state);
1651 EXPECT_TRUE(result.update_can_start);
1652 EXPECT_EQ(0, result.download_url_idx);
1653 EXPECT_FALSE(result.download_url_allowed);
1654 EXPECT_EQ(0, result.download_url_num_errors);
1655 EXPECT_TRUE(result.p2p_downloading_allowed);
1656 EXPECT_TRUE(result.p2p_sharing_allowed);
1657 EXPECT_TRUE(result.do_increment_failures);
1658 EXPECT_LT(curr_time, result.backoff_expiry);
1659}
1660
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001661TEST_F(UmChromeOSPolicyTest, P2PEnabledNotAllowed) {
1662 bool result;
1663 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1664 EXPECT_FALSE(result);
1665}
1666
1667TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedByDevicePolicy) {
1668 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1669 new bool(true));
1670
1671 bool result;
1672 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1673 EXPECT_TRUE(result);
1674}
1675
1676TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedByUpdater) {
1677 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1678
1679 bool result;
1680 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1681 EXPECT_TRUE(result);
1682}
1683
1684TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedDeviceEnterpriseEnrolled) {
1685 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(nullptr);
1686 fake_state_.device_policy_provider()->var_owner()->reset(nullptr);
1687
1688 bool result;
1689 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1690 EXPECT_TRUE(result);
1691}
1692
1693TEST_F(UmChromeOSPolicyTest, P2PEnabledChangedBlocks) {
1694 bool result;
1695 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::P2PEnabledChanged,
1696 &result, false);
1697}
1698
Alex Deymo63784a52014-05-28 10:46:14 -07001699} // namespace chromeos_update_manager