blob: 96f3d79dc5b5b5d0804f4292399e797c8591204a [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
Amin Hassani186ff6a2018-02-27 11:06:03 -080019#include <memory>
Gilad Arnold0adbc942014-05-12 10:35:43 -070020#include <set>
Alex Deymo0d11c602014-04-23 20:12:20 -070021
Amin Hassani186ff6a2018-02-27 11:06:03 -080022#include "update_engine/update_manager/next_update_check_policy_impl.h"
23#include "update_engine/update_manager/policy_test_utils.h"
Adolfo Victoria94ffe132018-06-28 16:14:56 -070024#include "update_engine/update_manager/weekly_time.h"
Alex Deymo0d11c602014-04-23 20:12:20 -070025
26using base::Time;
27using base::TimeDelta;
Sen Jiang255e22b2016-05-20 16:15:29 -070028using chromeos_update_engine::ConnectionTethering;
29using chromeos_update_engine::ConnectionType;
Gilad Arnoldb3b05442014-05-30 14:25:05 -070030using chromeos_update_engine::ErrorCode;
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -070031using chromeos_update_engine::InstallPlan;
Gilad Arnold0adbc942014-05-12 10:35:43 -070032using std::set;
Alex Deymo0d11c602014-04-23 20:12:20 -070033using std::string;
34
Alex Deymo63784a52014-05-28 10:46:14 -070035namespace chromeos_update_manager {
Alex Deymo0d11c602014-04-23 20:12:20 -070036
Amin Hassani186ff6a2018-02-27 11:06:03 -080037class UmChromeOSPolicyTest : public UmPolicyTestBase {
Alex Deymo0d11c602014-04-23 20:12:20 -070038 protected:
Amin Hassani186ff6a2018-02-27 11:06:03 -080039 UmChromeOSPolicyTest() : UmPolicyTestBase() {
40 policy_ = std::make_unique<ChromeOSPolicy>();
41 }
42
Alex Deymo610277e2014-11-11 21:18:11 -080043 void SetUp() override {
Amin Hassani186ff6a2018-02-27 11:06:03 -080044 UmPolicyTestBase::SetUp();
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070045 SetUpDefaultDevicePolicy();
Alex Deymo0d11c602014-04-23 20:12:20 -070046 }
47
Amin Hassani186ff6a2018-02-27 11:06:03 -080048 void SetUpDefaultState() override {
49 UmPolicyTestBase::SetUpDefaultState();
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070050
Gilad Arnolda1eabcd2014-07-09 15:42:40 -070051 // OOBE is enabled by default.
52 fake_state_.config_provider()->var_is_oobe_enabled()->reset(
53 new bool(true));
54
Gilad Arnold76a11f62014-05-20 09:02:12 -070055 // For the purpose of the tests, this is an official build and OOBE was
56 // completed.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070057 fake_state_.system_provider()->var_is_official_build()->reset(
58 new bool(true));
Gilad Arnold76a11f62014-05-20 09:02:12 -070059 fake_state_.system_provider()->var_is_oobe_complete()->reset(
60 new bool(true));
Aaron Woodc73fdc12017-12-06 11:09:15 -080061 // NOLINTNEXTLINE(readability/casting)
Alex Deymo763e7db2015-08-27 21:08:08 -070062 fake_state_.system_provider()->var_num_slots()->reset(new unsigned int(2));
Gilad Arnold0adbc942014-05-12 10:35:43 -070063
64 // Connection is wifi, untethered.
65 fake_state_.shill_provider()->var_conn_type()->
66 reset(new ConnectionType(ConnectionType::kWifi));
67 fake_state_.shill_provider()->var_conn_tethering()->
68 reset(new ConnectionTethering(ConnectionTethering::kNotDetected));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070069 }
70
Gilad Arnoldb3b05442014-05-30 14:25:05 -070071 // Sets up a default device policy that does not impose any restrictions
72 // (HTTP) nor enables any features (P2P).
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070073 void SetUpDefaultDevicePolicy() {
74 fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
75 new bool(true));
76 fake_state_.device_policy_provider()->var_update_disabled()->reset(
77 new bool(false));
78 fake_state_.device_policy_provider()->
79 var_allowed_connection_types_for_update()->reset(nullptr);
80 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
81 new TimeDelta());
82 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
Gilad Arnoldb3b05442014-05-30 14:25:05 -070083 new bool(true));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070084 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
85 new bool(false));
86 fake_state_.device_policy_provider()->var_release_channel_delegated()->
87 reset(new bool(true));
Adolfo Victoria94ffe132018-06-28 16:14:56 -070088 fake_state_.device_policy_provider()
89 ->var_disallowed_time_intervals()
90 ->reset(new WeeklyTimeIntervalVector());
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070091 }
92
Amin Hassani186ff6a2018-02-27 11:06:03 -080093 // Configures the policy to return a desired value from UpdateCheckAllowed by
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070094 // faking the current wall clock time as needed. Restores the default state.
95 // This is used when testing policies that depend on this one.
Amin Hassani186ff6a2018-02-27 11:06:03 -080096 //
97 // Note that the default implementation relies on NextUpdateCheckPolicyImpl to
98 // set the FakeClock to the appropriate time.
99 virtual void SetUpdateCheckAllowed(bool allow_check) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700100 Time next_update_check;
Amin Hassani186ff6a2018-02-27 11:06:03 -0800101 CallMethodWithContext(&NextUpdateCheckTimePolicyImpl::NextUpdateCheckTime,
102 &next_update_check,
103 ChromeOSPolicy::kNextUpdateCheckPolicyConstants);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700104 SetUpDefaultState();
105 SetUpDefaultDevicePolicy();
106 Time curr_time = next_update_check;
107 if (allow_check)
108 curr_time += TimeDelta::FromSeconds(1);
109 else
110 curr_time -= TimeDelta::FromSeconds(1);
111 fake_clock_.SetWallclockTime(curr_time);
112 }
Marton Hunyady8b936f22018-06-15 16:44:37 +0200113
114 // Sets the policies required for a kiosk app to control Chrome OS version:
115 // - AllowKioskAppControlChromeVersion = True
116 // - UpdateDisabled = True
117 // In the kiosk app manifest:
118 // - RequiredPlatformVersion = 1234.
119 void SetKioskAppControlsChromeOsVersion() {
120 fake_state_.device_policy_provider()
121 ->var_allow_kiosk_app_control_chrome_version()
122 ->reset(new bool(true));
123 fake_state_.device_policy_provider()->var_update_disabled()->reset(
124 new bool(true));
125 fake_state_.system_provider()->var_kiosk_required_platform_version()->reset(
126 new string("1234."));
127 }
128
129 // Sets up a test with the value of RollbackToTargetVersion policy (and
130 // whether it's set), and returns the value of
131 // UpdateCheckParams.rollback_allowed.
132 bool TestRollbackAllowed(bool set_policy,
133 RollbackToTargetVersion rollback_to_target_version) {
134 // Update check is allowed, response includes attributes for use in the
135 // request.
136 SetUpdateCheckAllowed(true);
137
138 if (set_policy) {
139 // Override RollbackToTargetVersion device policy attribute.
140 fake_state_.device_policy_provider()
141 ->var_rollback_to_target_version()
142 ->reset(new RollbackToTargetVersion(rollback_to_target_version));
143 }
144
145 UpdateCheckParams result;
146 ExpectPolicyStatus(
147 EvalStatus::kSucceeded, &Policy::UpdateCheckAllowed, &result);
148 return result.rollback_allowed;
149 }
Adolfo Victoria94ffe132018-06-28 16:14:56 -0700150
151 // Sets up a test with the given intervals and the current fake wallclock
152 // time.
153 void TestDisallowedTimeIntervals(const WeeklyTimeIntervalVector& intervals,
Adolfo Victoria7a7a0822018-07-27 13:35:24 -0700154 const ErrorCode& expected_error_code,
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -0700155 bool kiosk) {
Adolfo Victoria94ffe132018-06-28 16:14:56 -0700156 SetUpDefaultTimeProvider();
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -0700157 if (kiosk)
158 fake_state_.device_policy_provider()
159 ->var_auto_launched_kiosk_app_id()
160 ->reset(new string("myapp"));
Adolfo Victoria94ffe132018-06-28 16:14:56 -0700161 fake_state_.device_policy_provider()
162 ->var_disallowed_time_intervals()
163 ->reset(new WeeklyTimeIntervalVector(intervals));
164
165 // Check that |expected_status| matches the value of UpdateCheckAllowed
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -0700166 ErrorCode result;
167 InstallPlan install_plan;
Adolfo Victoria7a7a0822018-07-27 13:35:24 -0700168 ExpectPolicyStatus(EvalStatus::kSucceeded,
169 &Policy::UpdateCanBeApplied,
170 &result,
171 &install_plan);
172 EXPECT_EQ(result, expected_error_code);
Adolfo Victoria94ffe132018-06-28 16:14:56 -0700173 }
Alex Deymo0d11c602014-04-23 20:12:20 -0700174};
175
Alex Deymo63784a52014-05-28 10:46:14 -0700176TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWaitsForTheTimeout) {
Alex Deymo0d11c602014-04-23 20:12:20 -0700177 // We get the next update_check timestamp from the policy's private method
178 // and then we check the public method respects that value on the normal
179 // case.
180 Time next_update_check;
181 Time last_checked_time =
182 fake_clock_.GetWallclockTime() + TimeDelta::FromMinutes(1234);
183
Alex Deymo0d11c602014-04-23 20:12:20 -0700184 fake_state_.updater_provider()->var_last_checked_time()->reset(
185 new Time(last_checked_time));
Amin Hassani186ff6a2018-02-27 11:06:03 -0800186 CallMethodWithContext(&NextUpdateCheckTimePolicyImpl::NextUpdateCheckTime,
187 &next_update_check,
188 ChromeOSPolicy::kNextUpdateCheckPolicyConstants);
Alex Deymo0d11c602014-04-23 20:12:20 -0700189
190 UpdateCheckParams result;
191
192 // Check that the policy blocks until the next_update_check is reached.
193 SetUpDefaultClock();
194 SetUpDefaultState();
195 fake_state_.updater_provider()->var_last_checked_time()->reset(
196 new Time(last_checked_time));
197 fake_clock_.SetWallclockTime(next_update_check - TimeDelta::FromSeconds(1));
198 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
199 &Policy::UpdateCheckAllowed, &result);
200
201 SetUpDefaultClock();
202 SetUpDefaultState();
203 fake_state_.updater_provider()->var_last_checked_time()->reset(
204 new Time(last_checked_time));
205 fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
206 ExpectPolicyStatus(EvalStatus::kSucceeded,
207 &Policy::UpdateCheckAllowed, &result);
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700208 EXPECT_TRUE(result.updates_enabled);
Amin Hassanied37d682018-04-06 13:22:00 -0700209 EXPECT_FALSE(result.interactive);
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700210}
211
212TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWaitsForOOBE) {
Alex Vakulenko072359c2014-07-18 11:41:07 -0700213 // Update checks are deferred until OOBE is completed.
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700214
215 // Ensure that update is not allowed even if wait period is satisfied.
216 Time next_update_check;
217 Time last_checked_time =
218 fake_clock_.GetWallclockTime() + TimeDelta::FromMinutes(1234);
219
220 fake_state_.updater_provider()->var_last_checked_time()->reset(
221 new Time(last_checked_time));
Amin Hassani186ff6a2018-02-27 11:06:03 -0800222 CallMethodWithContext(&NextUpdateCheckTimePolicyImpl::NextUpdateCheckTime,
223 &next_update_check,
224 ChromeOSPolicy::kNextUpdateCheckPolicyConstants);
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700225
226 SetUpDefaultClock();
227 SetUpDefaultState();
228 fake_state_.updater_provider()->var_last_checked_time()->reset(
229 new Time(last_checked_time));
230 fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
231 fake_state_.system_provider()->var_is_oobe_complete()->reset(
232 new bool(false));
233
234 UpdateCheckParams result;
235 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
236 &Policy::UpdateCheckAllowed, &result);
237
238 // Now check that it is allowed if OOBE is completed.
239 SetUpDefaultClock();
240 SetUpDefaultState();
241 fake_state_.updater_provider()->var_last_checked_time()->reset(
242 new Time(last_checked_time));
243 fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
244 ExpectPolicyStatus(EvalStatus::kSucceeded,
245 &Policy::UpdateCheckAllowed, &result);
246 EXPECT_TRUE(result.updates_enabled);
Amin Hassanied37d682018-04-06 13:22:00 -0700247 EXPECT_FALSE(result.interactive);
Alex Deymo0d11c602014-04-23 20:12:20 -0700248}
249
Gilad Arnold42f253b2014-06-25 12:39:17 -0700250TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWithAttributes) {
Alex Vakulenko072359c2014-07-18 11:41:07 -0700251 // Update check is allowed, response includes attributes for use in the
Gilad Arnold42f253b2014-06-25 12:39:17 -0700252 // request.
253 SetUpdateCheckAllowed(true);
254
255 // Override specific device policy attributes.
Gilad Arnoldd4b30322014-07-21 15:35:27 -0700256 fake_state_.device_policy_provider()->var_target_version_prefix()->
257 reset(new string("1.2"));
Marton Hunyady0e0e3542018-02-21 18:51:39 +0100258 fake_state_.device_policy_provider()
259 ->var_rollback_allowed_milestones()
260 ->reset(new int(5));
261 fake_state_.device_policy_provider()->var_release_channel_delegated()->reset(
262 new bool(false));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700263 fake_state_.device_policy_provider()->var_release_channel()->
264 reset(new string("foo-channel"));
265
266 UpdateCheckParams result;
267 ExpectPolicyStatus(EvalStatus::kSucceeded,
268 &Policy::UpdateCheckAllowed, &result);
269 EXPECT_TRUE(result.updates_enabled);
Gilad Arnoldd4b30322014-07-21 15:35:27 -0700270 EXPECT_EQ("1.2", result.target_version_prefix);
Marton Hunyady0e0e3542018-02-21 18:51:39 +0100271 EXPECT_EQ(5, result.rollback_allowed_milestones);
Gilad Arnold42f253b2014-06-25 12:39:17 -0700272 EXPECT_EQ("foo-channel", result.target_channel);
Amin Hassanied37d682018-04-06 13:22:00 -0700273 EXPECT_FALSE(result.interactive);
Gilad Arnold42f253b2014-06-25 12:39:17 -0700274}
275
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200276TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedRollbackAllowed) {
Marton Hunyady8b936f22018-06-15 16:44:37 +0200277 EXPECT_TRUE(TestRollbackAllowed(
278 true, RollbackToTargetVersion::kRollbackWithFullPowerwash));
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200279}
280
281TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedRollbackDisabled) {
Marton Hunyady8b936f22018-06-15 16:44:37 +0200282 EXPECT_FALSE(TestRollbackAllowed(true, RollbackToTargetVersion::kDisabled));
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200283}
284
285TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedRollbackUnspecified) {
Marton Hunyady8b936f22018-06-15 16:44:37 +0200286 EXPECT_FALSE(
287 TestRollbackAllowed(true, RollbackToTargetVersion::kUnspecified));
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200288}
289
290TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedRollbackNotSet) {
Marton Hunyady8b936f22018-06-15 16:44:37 +0200291 EXPECT_FALSE(
292 TestRollbackAllowed(false, RollbackToTargetVersion::kUnspecified));
293}
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200294
Marton Hunyady8b936f22018-06-15 16:44:37 +0200295TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskRollbackAllowed) {
296 SetKioskAppControlsChromeOsVersion();
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200297
Marton Hunyady8b936f22018-06-15 16:44:37 +0200298 EXPECT_TRUE(TestRollbackAllowed(
299 true, RollbackToTargetVersion::kRollbackWithFullPowerwash));
300}
301
302TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskRollbackDisabled) {
303 SetKioskAppControlsChromeOsVersion();
304
305 EXPECT_FALSE(TestRollbackAllowed(true, RollbackToTargetVersion::kDisabled));
306}
307
308TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskRollbackUnspecified) {
309 SetKioskAppControlsChromeOsVersion();
310
311 EXPECT_FALSE(
312 TestRollbackAllowed(true, RollbackToTargetVersion::kUnspecified));
313}
314
315TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskRollbackNotSet) {
316 SetKioskAppControlsChromeOsVersion();
317
318 EXPECT_FALSE(
319 TestRollbackAllowed(false, RollbackToTargetVersion::kUnspecified));
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200320}
321
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700322TEST_F(UmChromeOSPolicyTest,
323 UpdateCheckAllowedUpdatesDisabledForUnofficialBuilds) {
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700324 // UpdateCheckAllowed should return kAskMeAgainLater if this is an unofficial
325 // build; we don't want periodic update checks on developer images.
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700326
327 fake_state_.system_provider()->var_is_official_build()->reset(
328 new bool(false));
329
330 UpdateCheckParams result;
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700331 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700332 &Policy::UpdateCheckAllowed, &result);
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700333}
334
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700335TEST_F(UmChromeOSPolicyTest,
Aaron Wood56d8ab32017-09-22 15:56:18 -0700336 UpdateCheckAllowedUpdatesDisabledWhenNotEnoughSlotsAbUpdates) {
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700337 // UpdateCheckAllowed should return false (kSucceeded) if the image booted
Aaron Wood56d8ab32017-09-22 15:56:18 -0700338 // without enough slots to do A/B updates.
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700339
Aaron Woodc73fdc12017-12-06 11:09:15 -0800340 // NOLINTNEXTLINE(readability/casting)
Alex Deymo763e7db2015-08-27 21:08:08 -0700341 fake_state_.system_provider()->var_num_slots()->reset(new unsigned int(1));
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700342
343 UpdateCheckParams result;
344 ExpectPolicyStatus(EvalStatus::kSucceeded,
345 &Policy::UpdateCheckAllowed, &result);
346 EXPECT_FALSE(result.updates_enabled);
347}
348
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700349TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedUpdatesDisabledByPolicy) {
Gilad Arnold42f253b2014-06-25 12:39:17 -0700350 // UpdateCheckAllowed should return kAskMeAgainLater because a device policy
351 // is loaded and prohibits updates.
352
353 SetUpdateCheckAllowed(false);
354 fake_state_.device_policy_provider()->var_update_disabled()->reset(
355 new bool(true));
356
Gilad Arnold42f253b2014-06-25 12:39:17 -0700357 UpdateCheckParams result;
358 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
359 &Policy::UpdateCheckAllowed, &result);
360}
361
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700362TEST_F(UmChromeOSPolicyTest,
363 UpdateCheckAllowedForcedUpdateRequestedInteractive) {
364 // UpdateCheckAllowed should return true because a forced update request was
365 // signaled for an interactive update.
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700366
367 SetUpdateCheckAllowed(true);
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700368 fake_state_.updater_provider()->var_forced_update_requested()->reset(
369 new UpdateRequestStatus(UpdateRequestStatus::kInteractive));
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700370
371 UpdateCheckParams result;
372 ExpectPolicyStatus(EvalStatus::kSucceeded,
373 &Policy::UpdateCheckAllowed, &result);
374 EXPECT_TRUE(result.updates_enabled);
Amin Hassanied37d682018-04-06 13:22:00 -0700375 EXPECT_TRUE(result.interactive);
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700376}
377
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700378TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedForcedUpdateRequestedPeriodic) {
379 // UpdateCheckAllowed should return true because a forced update request was
380 // signaled for a periodic check.
381
382 SetUpdateCheckAllowed(true);
383 fake_state_.updater_provider()->var_forced_update_requested()->reset(
384 new UpdateRequestStatus(UpdateRequestStatus::kPeriodic));
385
386 UpdateCheckParams result;
387 ExpectPolicyStatus(EvalStatus::kSucceeded,
388 &Policy::UpdateCheckAllowed, &result);
389 EXPECT_TRUE(result.updates_enabled);
Amin Hassanied37d682018-04-06 13:22:00 -0700390 EXPECT_FALSE(result.interactive);
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700391}
392
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800393TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskPin) {
394 // Update check is allowed.
395 SetUpdateCheckAllowed(true);
396
Marton Hunyady8b936f22018-06-15 16:44:37 +0200397 SetKioskAppControlsChromeOsVersion();
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800398
399 UpdateCheckParams result;
400 ExpectPolicyStatus(EvalStatus::kSucceeded,
401 &Policy::UpdateCheckAllowed, &result);
402 EXPECT_TRUE(result.updates_enabled);
Marton Hunyady8b936f22018-06-15 16:44:37 +0200403 EXPECT_EQ("1234.", result.target_version_prefix);
Amin Hassanied37d682018-04-06 13:22:00 -0700404 EXPECT_FALSE(result.interactive);
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800405}
406
407TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedDisabledWhenNoKioskPin) {
408 // Update check is allowed.
409 SetUpdateCheckAllowed(true);
410
411 // Disable AU policy is set but kiosk pin policy is set to false. Update is
412 // disabled in such case.
413 fake_state_.device_policy_provider()->var_update_disabled()->reset(
414 new bool(true));
415 fake_state_.device_policy_provider()
416 ->var_allow_kiosk_app_control_chrome_version()
417 ->reset(new bool(false));
418
419 UpdateCheckParams result;
420 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
421 &Policy::UpdateCheckAllowed, &result);
422}
423
424TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskPinWithNoRequiredVersion) {
425 // Update check is allowed.
426 SetUpdateCheckAllowed(true);
427
428 // AU disabled, allow kiosk to pin but there is no kiosk required platform
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700429 // version (i.e. app does not provide the info). Update to latest in such
430 // case.
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800431 fake_state_.device_policy_provider()->var_update_disabled()->reset(
432 new bool(true));
433 fake_state_.device_policy_provider()
434 ->var_allow_kiosk_app_control_chrome_version()
435 ->reset(new bool(true));
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700436 fake_state_.system_provider()->var_kiosk_required_platform_version()->reset(
437 new string());
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800438
439 UpdateCheckParams result;
440 ExpectPolicyStatus(EvalStatus::kSucceeded,
441 &Policy::UpdateCheckAllowed, &result);
442 EXPECT_TRUE(result.updates_enabled);
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700443 EXPECT_TRUE(result.target_version_prefix.empty());
Amin Hassanied37d682018-04-06 13:22:00 -0700444 EXPECT_FALSE(result.interactive);
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800445}
446
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700447TEST_F(UmChromeOSPolicyTest,
448 UpdateCheckAllowedKioskPinWithFailedGetRequiredVersionCall) {
449 // AU disabled, allow kiosk to pin but D-Bus call to get required platform
450 // version failed. Defer update check in this case.
451 fake_state_.device_policy_provider()->var_update_disabled()->reset(
452 new bool(true));
453 fake_state_.device_policy_provider()
454 ->var_allow_kiosk_app_control_chrome_version()
455 ->reset(new bool(true));
456 fake_state_.system_provider()->var_kiosk_required_platform_version()->reset(
457 nullptr);
458
459 UpdateCheckParams result;
460 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
461 &Policy::UpdateCheckAllowed, &result);
462}
463
Alex Deymo63784a52014-05-28 10:46:14 -0700464TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsCheckAllowedError) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700465 // The UpdateCanStart policy fails, not being able to query
466 // UpdateCheckAllowed.
467
468 // Configure the UpdateCheckAllowed policy to fail.
469 fake_state_.updater_provider()->var_updater_started_time()->reset(nullptr);
470
471 // Check that the UpdateCanStart fails.
472 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700473 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700474 ExpectPolicyStatus(EvalStatus::kFailed,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700475 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700476}
477
Alex Deymo63784a52014-05-28 10:46:14 -0700478TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedCheckDue) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700479 // The UpdateCanStart policy returns false because we are due for another
Gilad Arnold14a9e702014-10-08 08:09:09 -0700480 // update check. Ensure that download related values are still returned.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700481
482 SetUpdateCheckAllowed(true);
483
484 // Check that the UpdateCanStart returns false.
485 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700486 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700487 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700488 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700489 EXPECT_FALSE(result.update_can_start);
490 EXPECT_EQ(UpdateCannotStartReason::kCheckDue, result.cannot_start_reason);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700491 EXPECT_EQ(0, result.download_url_idx);
492 EXPECT_EQ(0, result.download_url_num_errors);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700493}
494
Alex Deymo63784a52014-05-28 10:46:14 -0700495TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoDevicePolicy) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700496 // The UpdateCanStart policy returns true; no device policy is loaded.
497
498 SetUpdateCheckAllowed(false);
499 fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
500 new bool(false));
501
502 // Check that the UpdateCanStart returns true with no further attributes.
503 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700504 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700505 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700506 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700507 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700508 EXPECT_FALSE(result.p2p_downloading_allowed);
509 EXPECT_FALSE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700510 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700511 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700512 EXPECT_EQ(0, result.download_url_num_errors);
513 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700514}
515
Alex Deymo63784a52014-05-28 10:46:14 -0700516TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBlankPolicy) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700517 // The UpdateCanStart policy returns true; device policy is loaded but imposes
518 // no restrictions on updating.
519
520 SetUpdateCheckAllowed(false);
521
522 // Check that the UpdateCanStart returns true.
523 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700524 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700525 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700526 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700527 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700528 EXPECT_FALSE(result.p2p_downloading_allowed);
529 EXPECT_FALSE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700530 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700531 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700532 EXPECT_EQ(0, result.download_url_num_errors);
533 EXPECT_FALSE(result.do_increment_failures);
534}
535
536TEST_F(UmChromeOSPolicyTest,
537 UpdateCanStartNotAllowedBackoffNewWaitPeriodApplies) {
538 // The UpdateCanStart policy returns false; failures are reported and a new
539 // backoff period is enacted.
540
541 SetUpdateCheckAllowed(false);
542
543 const Time curr_time = fake_clock_.GetWallclockTime();
544 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
545 update_state.download_errors_max = 1;
546 update_state.download_errors.emplace_back(
547 0, ErrorCode::kDownloadTransferError,
548 curr_time - TimeDelta::FromSeconds(8));
549 update_state.download_errors.emplace_back(
550 0, ErrorCode::kDownloadTransferError,
551 curr_time - TimeDelta::FromSeconds(2));
552
553 // Check that UpdateCanStart returns false and a new backoff expiry is
554 // generated.
555 UpdateDownloadParams result;
556 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
557 update_state);
558 EXPECT_FALSE(result.update_can_start);
559 EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
560 EXPECT_TRUE(result.do_increment_failures);
561 EXPECT_LT(curr_time, result.backoff_expiry);
562}
563
564TEST_F(UmChromeOSPolicyTest,
565 UpdateCanStartNotAllowedBackoffPrevWaitPeriodStillApplies) {
566 // The UpdateCanStart policy returns false; a previously enacted backoff
567 // period still applies.
568
569 SetUpdateCheckAllowed(false);
570
571 const Time curr_time = fake_clock_.GetWallclockTime();
572 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
573 update_state.download_errors_max = 1;
574 update_state.download_errors.emplace_back(
575 0, ErrorCode::kDownloadTransferError,
576 curr_time - TimeDelta::FromSeconds(8));
577 update_state.download_errors.emplace_back(
578 0, ErrorCode::kDownloadTransferError,
579 curr_time - TimeDelta::FromSeconds(2));
580 update_state.failures_last_updated = curr_time;
581 update_state.backoff_expiry = curr_time + TimeDelta::FromMinutes(3);
582
583 // Check that UpdateCanStart returns false and a new backoff expiry is
584 // generated.
585 UpdateDownloadParams result;
586 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::UpdateCanStart,
587 &result, update_state);
588 EXPECT_FALSE(result.update_can_start);
589 EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
590 EXPECT_FALSE(result.do_increment_failures);
591 EXPECT_LT(curr_time, result.backoff_expiry);
592}
593
594TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffSatisfied) {
595 // The UpdateCanStart policy returns true; a previously enacted backoff period
596 // has elapsed, we're good to go.
597
598 SetUpdateCheckAllowed(false);
599
600 const Time curr_time = fake_clock_.GetWallclockTime();
601 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
602 update_state.download_errors_max = 1;
603 update_state.download_errors.emplace_back(
604 0, ErrorCode::kDownloadTransferError,
605 curr_time - TimeDelta::FromSeconds(8));
606 update_state.download_errors.emplace_back(
607 0, ErrorCode::kDownloadTransferError,
608 curr_time - TimeDelta::FromSeconds(2));
609 update_state.failures_last_updated = curr_time - TimeDelta::FromSeconds(1);
610 update_state.backoff_expiry = curr_time - TimeDelta::FromSeconds(1);
611
612 // Check that UpdateCanStart returns false and a new backoff expiry is
613 // generated.
614 UpdateDownloadParams result;
615 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart,
616 &result, update_state);
617 EXPECT_TRUE(result.update_can_start);
618 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
619 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700620 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700621 EXPECT_EQ(0, result.download_url_num_errors);
622 EXPECT_FALSE(result.do_increment_failures);
623 EXPECT_EQ(Time(), result.backoff_expiry);
624}
625
626TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffDisabled) {
627 // The UpdateCanStart policy returns false; failures are reported but backoff
628 // is disabled.
629
630 SetUpdateCheckAllowed(false);
631
632 const Time curr_time = fake_clock_.GetWallclockTime();
633 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
634 update_state.download_errors_max = 1;
635 update_state.download_errors.emplace_back(
636 0, ErrorCode::kDownloadTransferError,
637 curr_time - TimeDelta::FromSeconds(8));
638 update_state.download_errors.emplace_back(
639 0, ErrorCode::kDownloadTransferError,
640 curr_time - TimeDelta::FromSeconds(2));
641 update_state.is_backoff_disabled = true;
642
643 // Check that UpdateCanStart returns false and a new backoff expiry is
644 // generated.
645 UpdateDownloadParams result;
646 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
647 update_state);
648 EXPECT_TRUE(result.update_can_start);
649 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
650 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700651 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700652 EXPECT_EQ(0, result.download_url_num_errors);
653 EXPECT_TRUE(result.do_increment_failures);
654 EXPECT_EQ(Time(), result.backoff_expiry);
655}
656
657TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffInteractive) {
658 // The UpdateCanStart policy returns false; failures are reported but this is
659 // an interactive update check.
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));
Amin Hassanied37d682018-04-06 13:22:00 -0700672 update_state.interactive = true;
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700673
674 // Check that UpdateCanStart returns false and a new backoff expiry is
675 // generated.
676 UpdateDownloadParams result;
677 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
678 update_state);
679 EXPECT_TRUE(result.update_can_start);
680 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
681 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700682 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700683 EXPECT_EQ(0, result.download_url_num_errors);
684 EXPECT_TRUE(result.do_increment_failures);
685 EXPECT_EQ(Time(), result.backoff_expiry);
686}
687
688TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffDelta) {
689 // The UpdateCanStart policy returns false; failures are reported but this is
690 // a delta payload.
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.is_delta_payload = true;
704
705 // Check that UpdateCanStart returns false and a new backoff expiry is
706 // generated.
707 UpdateDownloadParams result;
708 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
709 update_state);
710 EXPECT_TRUE(result.update_can_start);
711 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
712 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700713 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700714 EXPECT_EQ(0, result.download_url_num_errors);
715 EXPECT_TRUE(result.do_increment_failures);
716 EXPECT_EQ(Time(), result.backoff_expiry);
717}
718
719TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffUnofficialBuild) {
720 // The UpdateCanStart policy returns false; failures are reported but this is
721 // an unofficial build.
722
723 SetUpdateCheckAllowed(false);
724
725 const Time curr_time = fake_clock_.GetWallclockTime();
726 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
727 update_state.download_errors_max = 1;
728 update_state.download_errors.emplace_back(
729 0, ErrorCode::kDownloadTransferError,
730 curr_time - TimeDelta::FromSeconds(8));
731 update_state.download_errors.emplace_back(
732 0, ErrorCode::kDownloadTransferError,
733 curr_time - TimeDelta::FromSeconds(2));
734
735 fake_state_.system_provider()->var_is_official_build()->
736 reset(new bool(false));
737
738 // Check that UpdateCanStart returns false and a new backoff expiry is
739 // generated.
740 UpdateDownloadParams result;
741 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
742 update_state);
743 EXPECT_TRUE(result.update_can_start);
744 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
745 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700746 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700747 EXPECT_EQ(0, result.download_url_num_errors);
748 EXPECT_TRUE(result.do_increment_failures);
749 EXPECT_EQ(Time(), result.backoff_expiry);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700750}
751
Alex Deymo63784a52014-05-28 10:46:14 -0700752TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsScatteringFailed) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700753 // The UpdateCanStart policy fails because the UpdateScattering policy it
754 // depends on fails (unset variable).
755
756 SetUpdateCheckAllowed(false);
757
758 // Override the default seed variable with a null value so that the policy
759 // request would fail.
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700760 // TODO(garnold) This failure may or may not fail a number
761 // sub-policies/decisions, like scattering and backoff. We'll need a more
762 // deliberate setup to ensure that we're failing what we want to be failing.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700763 fake_state_.random_provider()->var_seed()->reset(nullptr);
764
765 // Check that the UpdateCanStart fails.
766 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700767 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700768 ExpectPolicyStatus(EvalStatus::kFailed,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700769 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700770}
771
Alex Deymo63784a52014-05-28 10:46:14 -0700772TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700773 UpdateCanStartNotAllowedScatteringNewWaitPeriodApplies) {
774 // The UpdateCanStart policy returns false; device policy is loaded and
775 // scattering applies due to an unsatisfied wait period, which was newly
776 // generated.
777
778 SetUpdateCheckAllowed(false);
779 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
780 new TimeDelta(TimeDelta::FromMinutes(2)));
781
782
783 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
784
785 // Check that the UpdateCanStart returns false and a new wait period
786 // generated.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700787 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700788 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700789 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700790 EXPECT_FALSE(result.update_can_start);
791 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
792 EXPECT_LT(TimeDelta(), result.scatter_wait_period);
793 EXPECT_EQ(0, result.scatter_check_threshold);
794}
795
Alex Deymo63784a52014-05-28 10:46:14 -0700796TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700797 UpdateCanStartNotAllowedScatteringPrevWaitPeriodStillApplies) {
798 // The UpdateCanStart policy returns false w/ kAskMeAgainLater; device policy
799 // is loaded and a previously generated scattering period still applies, none
800 // of the scattering values has changed.
801
802 SetUpdateCheckAllowed(false);
803 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
804 new TimeDelta(TimeDelta::FromMinutes(2)));
805
806 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
807 update_state.scatter_wait_period = TimeDelta::FromSeconds(35);
808
809 // Check that the UpdateCanStart returns false and a new wait period
810 // generated.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700811 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700812 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::UpdateCanStart,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700813 &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700814 EXPECT_FALSE(result.update_can_start);
815 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
816 EXPECT_EQ(TimeDelta::FromSeconds(35), result.scatter_wait_period);
817 EXPECT_EQ(0, result.scatter_check_threshold);
818}
819
Alex Deymo63784a52014-05-28 10:46:14 -0700820TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700821 UpdateCanStartNotAllowedScatteringNewCountThresholdApplies) {
822 // The UpdateCanStart policy returns false; device policy is loaded and
823 // scattering applies due to an unsatisfied update check count threshold.
824 //
825 // This ensures a non-zero check threshold, which may or may not be combined
826 // with a non-zero wait period (for which we cannot reliably control).
827
828 SetUpdateCheckAllowed(false);
829 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
830 new TimeDelta(TimeDelta::FromSeconds(1)));
831
832 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
833 update_state.scatter_check_threshold_min = 2;
834 update_state.scatter_check_threshold_max = 5;
835
836 // Check that the UpdateCanStart returns false.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700837 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700838 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700839 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700840 EXPECT_FALSE(result.update_can_start);
841 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
842 EXPECT_LE(2, result.scatter_check_threshold);
843 EXPECT_GE(5, result.scatter_check_threshold);
844}
845
Alex Deymo63784a52014-05-28 10:46:14 -0700846TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700847 UpdateCanStartNotAllowedScatteringPrevCountThresholdStillApplies) {
848 // The UpdateCanStart policy returns false; device policy is loaded and
849 // scattering due to a previously generated count threshold still applies.
850
851 SetUpdateCheckAllowed(false);
852 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
853 new TimeDelta(TimeDelta::FromSeconds(1)));
854
855 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
856 update_state.scatter_check_threshold = 3;
857 update_state.scatter_check_threshold_min = 2;
858 update_state.scatter_check_threshold_max = 5;
859
860 // Check that the UpdateCanStart returns false.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700861 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700862 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700863 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700864 EXPECT_FALSE(result.update_can_start);
865 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
866 EXPECT_EQ(3, result.scatter_check_threshold);
867}
868
Alex Deymo63784a52014-05-28 10:46:14 -0700869TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedScatteringSatisfied) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700870 // The UpdateCanStart policy returns true; device policy is loaded and
871 // scattering is enabled, but both wait period and check threshold are
872 // satisfied.
873
874 SetUpdateCheckAllowed(false);
875 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
876 new TimeDelta(TimeDelta::FromSeconds(120)));
877
878 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(75));
879 update_state.num_checks = 4;
880 update_state.scatter_wait_period = TimeDelta::FromSeconds(60);
881 update_state.scatter_check_threshold = 3;
882 update_state.scatter_check_threshold_min = 2;
883 update_state.scatter_check_threshold_max = 5;
884
885 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700886 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700887 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700888 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700889 EXPECT_TRUE(result.update_can_start);
890 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
891 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700892 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700893 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700894 EXPECT_EQ(0, result.download_url_num_errors);
895 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700896}
897
Alex Deymo63784a52014-05-28 10:46:14 -0700898TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700899 UpdateCanStartAllowedInteractivePreventsScattering) {
900 // The UpdateCanStart policy returns true; device policy is loaded and
901 // scattering would have applied, except that the update check is interactive
902 // and so it is suppressed.
903
904 SetUpdateCheckAllowed(false);
905 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
906 new TimeDelta(TimeDelta::FromSeconds(1)));
907
908 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Amin Hassanied37d682018-04-06 13:22:00 -0700909 update_state.interactive = true;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700910 update_state.scatter_check_threshold = 0;
911 update_state.scatter_check_threshold_min = 2;
912 update_state.scatter_check_threshold_max = 5;
913
914 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700915 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700916 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700917 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700918 EXPECT_TRUE(result.update_can_start);
919 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
920 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700921 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700922 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700923 EXPECT_EQ(0, result.download_url_num_errors);
924 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700925}
926
Alex Deymo63784a52014-05-28 10:46:14 -0700927TEST_F(UmChromeOSPolicyTest,
Gilad Arnold76a11f62014-05-20 09:02:12 -0700928 UpdateCanStartAllowedOobePreventsScattering) {
929 // The UpdateCanStart policy returns true; device policy is loaded and
930 // scattering would have applied, except that OOBE was not completed and so it
931 // is suppressed.
932
933 SetUpdateCheckAllowed(false);
934 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
935 new TimeDelta(TimeDelta::FromSeconds(1)));
936 fake_state_.system_provider()->var_is_oobe_complete()->reset(new bool(false));
937
938 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Amin Hassanied37d682018-04-06 13:22:00 -0700939 update_state.interactive = true;
Gilad Arnold76a11f62014-05-20 09:02:12 -0700940 update_state.scatter_check_threshold = 0;
941 update_state.scatter_check_threshold_min = 2;
942 update_state.scatter_check_threshold_max = 5;
943
944 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700945 UpdateDownloadParams result;
Gilad Arnold76a11f62014-05-20 09:02:12 -0700946 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700947 update_state);
Gilad Arnold76a11f62014-05-20 09:02:12 -0700948 EXPECT_TRUE(result.update_can_start);
949 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
950 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700951 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700952 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700953 EXPECT_EQ(0, result.download_url_num_errors);
954 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnold76a11f62014-05-20 09:02:12 -0700955}
956
Alex Deymo63784a52014-05-28 10:46:14 -0700957TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithAttributes) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700958 // The UpdateCanStart policy returns true; device policy permits both HTTP and
959 // P2P updates, as well as a non-empty target channel string.
960
961 SetUpdateCheckAllowed(false);
962
963 // Override specific device policy attributes.
964 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
965 new bool(true));
966 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
967 new bool(true));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700968
969 // Check that the UpdateCanStart returns true.
970 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700971 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700972 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700973 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700974 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700975 EXPECT_TRUE(result.p2p_downloading_allowed);
976 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700977 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700978 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700979 EXPECT_EQ(0, result.download_url_num_errors);
980 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700981}
982
Alex Deymo63784a52014-05-28 10:46:14 -0700983TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithP2PFromUpdater) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700984 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
985 // P2P updates, but the updater is configured to allow P2P and overrules the
986 // setting.
987
988 SetUpdateCheckAllowed(false);
989
990 // Override specific device policy attributes.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700991 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
992
993 // Check that the UpdateCanStart returns true.
994 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700995 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700996 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700997 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700998 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700999 EXPECT_TRUE(result.p2p_downloading_allowed);
1000 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001001 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001002 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001003 EXPECT_EQ(0, result.download_url_num_errors);
1004 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001005}
1006
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001007TEST_F(UmChromeOSPolicyTest,
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001008 UpdateCanStartAllowedP2PDownloadingBlockedDueToOmaha) {
1009 // The UpdateCanStart policy returns true; device policy permits HTTP, but
1010 // policy blocks P2P downloading because Omaha forbids it. P2P sharing is
1011 // still permitted.
1012
1013 SetUpdateCheckAllowed(false);
1014
1015 // Override specific device policy attributes.
1016 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1017 new bool(true));
1018 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1019 new bool(true));
1020
1021 // Check that the UpdateCanStart returns true.
1022 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1023 update_state.p2p_downloading_disabled = true;
1024 UpdateDownloadParams result;
1025 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1026 update_state);
1027 EXPECT_TRUE(result.update_can_start);
1028 EXPECT_FALSE(result.p2p_downloading_allowed);
1029 EXPECT_TRUE(result.p2p_sharing_allowed);
1030}
1031
1032TEST_F(UmChromeOSPolicyTest,
1033 UpdateCanStartAllowedP2PSharingBlockedDueToOmaha) {
1034 // The UpdateCanStart policy returns true; device policy permits HTTP, but
1035 // policy blocks P2P sharing because Omaha forbids it. P2P downloading is
1036 // still permitted.
1037
1038 SetUpdateCheckAllowed(false);
1039
1040 // Override specific device policy attributes.
1041 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1042 new bool(true));
1043 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1044 new bool(true));
1045
1046 // Check that the UpdateCanStart returns true.
1047 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1048 update_state.p2p_sharing_disabled = true;
1049 UpdateDownloadParams result;
1050 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1051 update_state);
1052 EXPECT_TRUE(result.update_can_start);
1053 EXPECT_TRUE(result.p2p_downloading_allowed);
1054 EXPECT_FALSE(result.p2p_sharing_allowed);
1055}
1056
1057TEST_F(UmChromeOSPolicyTest,
1058 UpdateCanStartAllowedP2PDownloadingBlockedDueToNumAttempts) {
Gilad Arnold349ac832014-10-06 14:20:28 -07001059 // The UpdateCanStart policy returns true; device policy permits HTTP but
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001060 // blocks P2P download, because the max number of P2P downloads have been
1061 // attempted. P2P sharing is still permitted.
Gilad Arnold349ac832014-10-06 14:20:28 -07001062
1063 SetUpdateCheckAllowed(false);
1064
1065 // Override specific device policy attributes.
1066 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1067 new bool(true));
1068 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1069 new bool(true));
1070
1071 // Check that the UpdateCanStart returns true.
1072 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1073 update_state.p2p_num_attempts = ChromeOSPolicy::kMaxP2PAttempts;
1074 UpdateDownloadParams result;
1075 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1076 update_state);
1077 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001078 EXPECT_FALSE(result.p2p_downloading_allowed);
1079 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnold349ac832014-10-06 14:20:28 -07001080}
1081
1082TEST_F(UmChromeOSPolicyTest,
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001083 UpdateCanStartAllowedP2PDownloadingBlockedDueToAttemptsPeriod) {
Gilad Arnold349ac832014-10-06 14:20:28 -07001084 // The UpdateCanStart policy returns true; device policy permits HTTP but
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001085 // blocks P2P download, because the max period for attempt to download via P2P
1086 // has elapsed. P2P sharing is still permitted.
Gilad Arnold349ac832014-10-06 14:20:28 -07001087
1088 SetUpdateCheckAllowed(false);
1089
1090 // Override specific device policy attributes.
1091 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1092 new bool(true));
1093 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1094 new bool(true));
1095
1096 // Check that the UpdateCanStart returns true.
1097 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1098 update_state.p2p_num_attempts = 1;
1099 update_state.p2p_first_attempted =
1100 fake_clock_.GetWallclockTime() -
Alex Deymof329b932014-10-30 01:37:48 -07001101 TimeDelta::FromSeconds(
1102 ChromeOSPolicy::kMaxP2PAttemptsPeriodInSeconds + 1);
Gilad Arnold349ac832014-10-06 14:20:28 -07001103 UpdateDownloadParams result;
1104 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1105 update_state);
1106 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001107 EXPECT_FALSE(result.p2p_downloading_allowed);
1108 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnold349ac832014-10-06 14:20:28 -07001109}
1110
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001111TEST_F(UmChromeOSPolicyTest,
1112 UpdateCanStartAllowedWithHttpUrlForUnofficialBuild) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001113 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1114 // P2P updates, but marking this an unofficial build overrules the HTTP
1115 // setting.
1116
1117 SetUpdateCheckAllowed(false);
1118
1119 // Override specific device policy attributes.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001120 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1121 new bool(false));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001122 fake_state_.system_provider()->var_is_official_build()->
1123 reset(new bool(false));
1124
1125 // Check that the UpdateCanStart returns true.
1126 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001127 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001128 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001129 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001130 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001131 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001132 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001133 EXPECT_EQ(0, result.download_url_num_errors);
1134 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001135}
1136
1137TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithHttpsUrl) {
1138 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1139 // P2P updates, but an HTTPS URL is provided and selected for download.
1140
1141 SetUpdateCheckAllowed(false);
1142
1143 // Override specific device policy attributes.
1144 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1145 new bool(false));
1146
1147 // Add an HTTPS URL.
1148 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001149 update_state.download_urls.emplace_back("https://secure/url/");
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001150
1151 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001152 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001153 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001154 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001155 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001156 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001157 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001158 EXPECT_EQ(0, result.download_url_num_errors);
1159 EXPECT_FALSE(result.do_increment_failures);
1160}
1161
1162TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedMaxErrorsNotExceeded) {
1163 // The UpdateCanStart policy returns true; the first URL has download errors
1164 // but does not exceed the maximum allowed number of failures, so it is stilli
1165 // usable.
1166
1167 SetUpdateCheckAllowed(false);
1168
1169 // Add a second URL; update with this URL attempted and failed enough times to
1170 // disqualify the current (first) URL.
1171 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1172 update_state.num_checks = 5;
1173 update_state.download_urls.emplace_back("http://another/fake/url/");
1174 Time t = fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(12);
1175 for (int i = 0; i < 5; i++) {
1176 update_state.download_errors.emplace_back(
1177 0, ErrorCode::kDownloadTransferError, t);
1178 t += TimeDelta::FromSeconds(1);
1179 }
1180
1181 // Check that the UpdateCanStart returns true.
1182 UpdateDownloadParams result;
1183 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1184 update_state);
1185 EXPECT_TRUE(result.update_can_start);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001186 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001187 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001188 EXPECT_EQ(5, result.download_url_num_errors);
1189 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001190}
1191
1192TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlMaxExceeded) {
1193 // The UpdateCanStart policy returns true; the first URL exceeded the maximum
1194 // allowed number of failures, but a second URL is available.
1195
1196 SetUpdateCheckAllowed(false);
1197
1198 // Add a second URL; update with this URL attempted and failed enough times to
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001199 // disqualify the current (first) URL.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001200 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1201 update_state.num_checks = 10;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001202 update_state.download_urls.emplace_back("http://another/fake/url/");
1203 Time t = fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(12);
1204 for (int i = 0; i < 11; i++) {
1205 update_state.download_errors.emplace_back(
1206 0, ErrorCode::kDownloadTransferError, t);
1207 t += TimeDelta::FromSeconds(1);
1208 }
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001209
1210 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001211 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001212 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001213 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001214 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001215 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001216 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001217 EXPECT_EQ(0, result.download_url_num_errors);
1218 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001219}
1220
1221TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlHardError) {
1222 // The UpdateCanStart policy returns true; the first URL fails with a hard
1223 // error, but a second URL is available.
1224
1225 SetUpdateCheckAllowed(false);
1226
1227 // Add a second URL; update with this URL attempted and failed in a way that
1228 // causes it to switch directly to the next URL.
1229 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1230 update_state.num_checks = 10;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001231 update_state.download_urls.emplace_back("http://another/fake/url/");
1232 update_state.download_errors.emplace_back(
1233 0, ErrorCode::kPayloadHashMismatchError,
1234 fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(1));
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001235
1236 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001237 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001238 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001239 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001240 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001241 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001242 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001243 EXPECT_EQ(0, result.download_url_num_errors);
1244 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001245}
1246
1247TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedUrlWrapsAround) {
1248 // The UpdateCanStart policy returns true; URL search properly wraps around
1249 // the last one on the list.
1250
1251 SetUpdateCheckAllowed(false);
1252
1253 // Add a second URL; update with this URL attempted and failed in a way that
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001254 // causes it to switch directly to the next URL. We must disable backoff in
1255 // order for it not to interfere.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001256 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001257 update_state.num_checks = 1;
1258 update_state.is_backoff_disabled = true;
1259 update_state.download_urls.emplace_back("http://another/fake/url/");
1260 update_state.download_errors.emplace_back(
1261 1, ErrorCode::kPayloadHashMismatchError,
1262 fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(1));
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001263
1264 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001265 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001266 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001267 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001268 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001269 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001270 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001271 EXPECT_EQ(0, result.download_url_num_errors);
1272 EXPECT_TRUE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001273}
1274
1275TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedNoUsableUrls) {
1276 // The UpdateCanStart policy returns false; there's a single HTTP URL but its
1277 // use is forbidden by policy.
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001278 //
1279 // Note: In the case where no usable URLs are found, the policy should not
1280 // increment the number of failed attempts! Doing so would result in a
1281 // non-idempotent semantics, and does not fall within the intended purpose of
1282 // the backoff mechanism anyway.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001283
1284 SetUpdateCheckAllowed(false);
1285
1286 // Override specific device policy attributes.
1287 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1288 new bool(false));
1289
1290 // Check that the UpdateCanStart returns false.
1291 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001292 UpdateDownloadParams result;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001293 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1294 update_state);
1295 EXPECT_FALSE(result.update_can_start);
1296 EXPECT_EQ(UpdateCannotStartReason::kCannotDownload,
1297 result.cannot_start_reason);
1298 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001299}
1300
1301TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoUsableUrlsButP2PEnabled) {
1302 // The UpdateCanStart policy returns true; there's a single HTTP URL but its
1303 // use is forbidden by policy, however P2P is enabled. The result indicates
1304 // that no URL can be used.
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001305 //
1306 // Note: The number of failed attempts should not increase in this case (see
1307 // above test).
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001308
1309 SetUpdateCheckAllowed(false);
1310
1311 // Override specific device policy attributes.
1312 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1313 new bool(true));
1314 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1315 new bool(false));
1316
1317 // Check that the UpdateCanStart returns true.
1318 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001319 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001320 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001321 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001322 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001323 EXPECT_TRUE(result.p2p_downloading_allowed);
1324 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001325 EXPECT_GT(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001326 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001327 EXPECT_EQ(0, result.download_url_num_errors);
1328 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001329}
1330
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001331TEST_F(UmChromeOSPolicyTest,
1332 UpdateCanStartAllowedNoUsableUrlsButEnterpriseEnrolled) {
1333 // The UpdateCanStart policy returns true; there's a single HTTP URL but its
1334 // use is forbidden by policy, and P2P is unset on the policy, however the
1335 // device is enterprise-enrolled so P2P is allowed. The result indicates that
1336 // no URL can be used.
1337 //
1338 // Note: The number of failed attempts should not increase in this case (see
1339 // above test).
1340
1341 SetUpdateCheckAllowed(false);
1342
1343 // Override specific device policy attributes.
1344 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(nullptr);
1345 fake_state_.device_policy_provider()->var_owner()->reset(nullptr);
1346 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1347 new bool(false));
1348
1349 // Check that the UpdateCanStart returns true.
1350 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1351 UpdateDownloadParams result;
1352 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1353 update_state);
1354 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001355 EXPECT_TRUE(result.p2p_downloading_allowed);
1356 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001357 EXPECT_GT(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001358 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001359 EXPECT_EQ(0, result.download_url_num_errors);
1360 EXPECT_FALSE(result.do_increment_failures);
1361}
1362
Gilad Arnold684219d2014-07-07 14:54:57 -07001363TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedEthernetDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001364 // Ethernet is always allowed.
1365
1366 fake_state_.shill_provider()->var_conn_type()->
1367 reset(new ConnectionType(ConnectionType::kEthernet));
1368
1369 bool result;
1370 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001371 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001372 EXPECT_TRUE(result);
1373}
1374
Gilad Arnold684219d2014-07-07 14:54:57 -07001375TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWifiDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001376 // Wifi is allowed if not tethered.
1377
1378 fake_state_.shill_provider()->var_conn_type()->
1379 reset(new ConnectionType(ConnectionType::kWifi));
1380
1381 bool result;
1382 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001383 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001384 EXPECT_TRUE(result);
1385}
1386
Alex Deymo63784a52014-05-28 10:46:14 -07001387TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001388 UpdateCurrentConnectionNotAllowedWifiTetheredDefault) {
1389 // Tethered wifi is not allowed by default.
1390
1391 fake_state_.shill_provider()->var_conn_type()->
1392 reset(new ConnectionType(ConnectionType::kWifi));
1393 fake_state_.shill_provider()->var_conn_tethering()->
1394 reset(new ConnectionTethering(ConnectionTethering::kConfirmed));
1395
1396 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001397 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001398 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001399}
1400
Alex Deymo63784a52014-05-28 10:46:14 -07001401TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001402 UpdateDownloadAllowedWifiTetheredPolicyOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001403 // Tethered wifi can be allowed by policy.
1404
1405 fake_state_.shill_provider()->var_conn_type()->
1406 reset(new ConnectionType(ConnectionType::kWifi));
1407 fake_state_.shill_provider()->var_conn_tethering()->
1408 reset(new ConnectionTethering(ConnectionTethering::kConfirmed));
1409 set<ConnectionType> allowed_connections;
1410 allowed_connections.insert(ConnectionType::kCellular);
1411 fake_state_.device_policy_provider()->
1412 var_allowed_connection_types_for_update()->
1413 reset(new set<ConnectionType>(allowed_connections));
1414
1415 bool result;
1416 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001417 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001418 EXPECT_TRUE(result);
1419}
1420
Gilad Arnold684219d2014-07-07 14:54:57 -07001421TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWimaxDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001422 // Wimax is always allowed.
1423
1424 fake_state_.shill_provider()->var_conn_type()->
1425 reset(new ConnectionType(ConnectionType::kWifi));
1426
1427 bool result;
1428 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001429 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001430 EXPECT_TRUE(result);
1431}
1432
Alex Deymo63784a52014-05-28 10:46:14 -07001433TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001434 UpdateCurrentConnectionNotAllowedBluetoothDefault) {
1435 // Bluetooth is never allowed.
1436
1437 fake_state_.shill_provider()->var_conn_type()->
1438 reset(new ConnectionType(ConnectionType::kBluetooth));
1439
1440 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001441 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001442 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001443}
1444
Alex Deymo63784a52014-05-28 10:46:14 -07001445TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001446 UpdateCurrentConnectionNotAllowedBluetoothPolicyCannotOverride) {
1447 // Bluetooth cannot be allowed even by policy.
1448
1449 fake_state_.shill_provider()->var_conn_type()->
1450 reset(new ConnectionType(ConnectionType::kBluetooth));
1451 set<ConnectionType> allowed_connections;
1452 allowed_connections.insert(ConnectionType::kBluetooth);
1453 fake_state_.device_policy_provider()->
1454 var_allowed_connection_types_for_update()->
1455 reset(new set<ConnectionType>(allowed_connections));
1456
1457 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001458 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001459 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001460}
1461
Alex Deymo63784a52014-05-28 10:46:14 -07001462TEST_F(UmChromeOSPolicyTest, UpdateCurrentConnectionNotAllowedCellularDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001463 // Cellular is not allowed by default.
1464
1465 fake_state_.shill_provider()->var_conn_type()->
1466 reset(new ConnectionType(ConnectionType::kCellular));
1467
1468 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001469 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001470 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001471}
1472
Alex Deymo63784a52014-05-28 10:46:14 -07001473TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001474 UpdateDownloadAllowedCellularPolicyOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001475 // Update over cellular can be enabled by policy.
1476
1477 fake_state_.shill_provider()->var_conn_type()->
1478 reset(new ConnectionType(ConnectionType::kCellular));
1479 set<ConnectionType> allowed_connections;
1480 allowed_connections.insert(ConnectionType::kCellular);
1481 fake_state_.device_policy_provider()->
1482 var_allowed_connection_types_for_update()->
1483 reset(new set<ConnectionType>(allowed_connections));
1484
1485 bool result;
1486 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001487 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001488 EXPECT_TRUE(result);
1489}
1490
Alex Deymo63784a52014-05-28 10:46:14 -07001491TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001492 UpdateDownloadAllowedCellularUserOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001493 // Update over cellular can be enabled by user settings, but only if policy
1494 // is present and does not determine allowed connections.
1495
1496 fake_state_.shill_provider()->var_conn_type()->
1497 reset(new ConnectionType(ConnectionType::kCellular));
1498 set<ConnectionType> allowed_connections;
1499 allowed_connections.insert(ConnectionType::kCellular);
1500 fake_state_.updater_provider()->var_cellular_enabled()->
1501 reset(new bool(true));
1502
1503 bool result;
1504 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001505 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001506 EXPECT_TRUE(result);
1507}
1508
Gilad Arnold14a9e702014-10-08 08:09:09 -07001509TEST_F(UmChromeOSPolicyTest,
1510 UpdateCanStartAllowedScatteringSupressedDueToP2P) {
1511 // The UpdateCanStart policy returns true; scattering should have applied, but
1512 // P2P download is allowed. Scattering values are nonetheless returned, and so
1513 // are download URL values, albeit the latter are not allowed to be used.
1514
1515 SetUpdateCheckAllowed(false);
1516 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
1517 new TimeDelta(TimeDelta::FromMinutes(2)));
1518 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1519
1520 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
1521 update_state.scatter_wait_period = TimeDelta::FromSeconds(35);
1522
1523 UpdateDownloadParams result;
1524 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart,
1525 &result, update_state);
1526 EXPECT_TRUE(result.update_can_start);
1527 EXPECT_EQ(0, result.download_url_idx);
1528 EXPECT_FALSE(result.download_url_allowed);
1529 EXPECT_EQ(0, result.download_url_num_errors);
1530 EXPECT_TRUE(result.p2p_downloading_allowed);
1531 EXPECT_TRUE(result.p2p_sharing_allowed);
1532 EXPECT_FALSE(result.do_increment_failures);
1533 EXPECT_EQ(TimeDelta::FromSeconds(35), result.scatter_wait_period);
1534 EXPECT_EQ(0, result.scatter_check_threshold);
1535}
1536
1537TEST_F(UmChromeOSPolicyTest,
1538 UpdateCanStartAllowedBackoffSupressedDueToP2P) {
1539 // The UpdateCanStart policy returns true; backoff should have applied, but
1540 // P2P download is allowed. Backoff values are nonetheless returned, and so
1541 // are download URL values, albeit the latter are not allowed to be used.
1542
1543 SetUpdateCheckAllowed(false);
1544
1545 const Time curr_time = fake_clock_.GetWallclockTime();
1546 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
1547 update_state.download_errors_max = 1;
1548 update_state.download_errors.emplace_back(
1549 0, ErrorCode::kDownloadTransferError,
1550 curr_time - TimeDelta::FromSeconds(8));
1551 update_state.download_errors.emplace_back(
1552 0, ErrorCode::kDownloadTransferError,
1553 curr_time - TimeDelta::FromSeconds(2));
1554 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1555
1556 UpdateDownloadParams result;
1557 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1558 update_state);
1559 EXPECT_TRUE(result.update_can_start);
1560 EXPECT_EQ(0, result.download_url_idx);
1561 EXPECT_FALSE(result.download_url_allowed);
1562 EXPECT_EQ(0, result.download_url_num_errors);
1563 EXPECT_TRUE(result.p2p_downloading_allowed);
1564 EXPECT_TRUE(result.p2p_sharing_allowed);
1565 EXPECT_TRUE(result.do_increment_failures);
1566 EXPECT_LT(curr_time, result.backoff_expiry);
1567}
1568
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001569TEST_F(UmChromeOSPolicyTest, P2PEnabledNotAllowed) {
1570 bool result;
1571 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1572 EXPECT_FALSE(result);
1573}
1574
1575TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedByDevicePolicy) {
1576 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1577 new bool(true));
1578
1579 bool result;
1580 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1581 EXPECT_TRUE(result);
1582}
1583
1584TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedByUpdater) {
1585 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1586
1587 bool result;
1588 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1589 EXPECT_TRUE(result);
1590}
1591
1592TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedDeviceEnterpriseEnrolled) {
1593 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(nullptr);
1594 fake_state_.device_policy_provider()->var_owner()->reset(nullptr);
1595
1596 bool result;
1597 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1598 EXPECT_TRUE(result);
1599}
1600
1601TEST_F(UmChromeOSPolicyTest, P2PEnabledChangedBlocks) {
1602 bool result;
1603 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::P2PEnabledChanged,
1604 &result, false);
1605}
1606
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -07001607TEST_F(UmChromeOSPolicyTest,
1608 UpdateCanBeAppliedForcedUpdatesDisablesTimeRestrictions) {
1609 Time curr_time = fake_clock_.GetWallclockTime();
1610 fake_state_.updater_provider()->var_forced_update_requested()->reset(
1611 new UpdateRequestStatus(UpdateRequestStatus::kInteractive));
1612 // Should return kAskMeAgainLater when updated are not forced.
1613 TestDisallowedTimeIntervals(
1614 {WeeklyTimeInterval(
1615 WeeklyTime::FromTime(curr_time),
1616 WeeklyTime::FromTime(curr_time + TimeDelta::FromMinutes(1)))},
Adolfo Victoria7a7a0822018-07-27 13:35:24 -07001617 ErrorCode::kSuccess,
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -07001618 /* kiosk = */ true);
1619}
1620
1621TEST_F(UmChromeOSPolicyTest, UpdateCanBeAppliedFailsInDisallowedTime) {
1622 Time curr_time = fake_clock_.GetWallclockTime();
1623 TestDisallowedTimeIntervals(
1624 {WeeklyTimeInterval(
1625 WeeklyTime::FromTime(curr_time),
1626 WeeklyTime::FromTime(curr_time + TimeDelta::FromMinutes(1)))},
Adolfo Victoria7a7a0822018-07-27 13:35:24 -07001627 ErrorCode::kOmahaUpdateDeferredPerPolicy,
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -07001628 /* kiosk = */ true);
1629}
1630
1631TEST_F(UmChromeOSPolicyTest, UpdateCanBeAppliedOutsideDisallowedTime) {
1632 Time curr_time = fake_clock_.GetWallclockTime();
1633 TestDisallowedTimeIntervals(
1634 {WeeklyTimeInterval(
1635 WeeklyTime::FromTime(curr_time - TimeDelta::FromHours(3)),
1636 WeeklyTime::FromTime(curr_time))},
Adolfo Victoria7a7a0822018-07-27 13:35:24 -07001637 ErrorCode::kSuccess,
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -07001638 /* kiosk = */ true);
1639}
1640
1641TEST_F(UmChromeOSPolicyTest, UpdateCanBeAppliedPassesOnNonKiosk) {
1642 Time curr_time = fake_clock_.GetWallclockTime();
1643 TestDisallowedTimeIntervals(
1644 {WeeklyTimeInterval(
1645 WeeklyTime::FromTime(curr_time),
1646 WeeklyTime::FromTime(curr_time + TimeDelta::FromMinutes(1)))},
Adolfo Victoria7a7a0822018-07-27 13:35:24 -07001647 ErrorCode::kSuccess,
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -07001648 /* kiosk = */ false);
1649}
1650
Alex Deymo63784a52014-05-28 10:46:14 -07001651} // namespace chromeos_update_manager