blob: 095f516b8f43e914346db9832bf050298e4a0b17 [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"
Alex Deymo0d11c602014-04-23 20:12:20 -070024
25using base::Time;
26using base::TimeDelta;
Sen Jiang255e22b2016-05-20 16:15:29 -070027using chromeos_update_engine::ConnectionTethering;
28using chromeos_update_engine::ConnectionType;
Gilad Arnoldb3b05442014-05-30 14:25:05 -070029using chromeos_update_engine::ErrorCode;
Gilad Arnold0adbc942014-05-12 10:35:43 -070030using std::set;
Alex Deymo0d11c602014-04-23 20:12:20 -070031using std::string;
32
Alex Deymo63784a52014-05-28 10:46:14 -070033namespace chromeos_update_manager {
Alex Deymo0d11c602014-04-23 20:12:20 -070034
Amin Hassani186ff6a2018-02-27 11:06:03 -080035class UmChromeOSPolicyTest : public UmPolicyTestBase {
Alex Deymo0d11c602014-04-23 20:12:20 -070036 protected:
Amin Hassani186ff6a2018-02-27 11:06:03 -080037 UmChromeOSPolicyTest() : UmPolicyTestBase() {
38 policy_ = std::make_unique<ChromeOSPolicy>();
39 }
40
Alex Deymo610277e2014-11-11 21:18:11 -080041 void SetUp() override {
Amin Hassani186ff6a2018-02-27 11:06:03 -080042 UmPolicyTestBase::SetUp();
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070043 SetUpDefaultDevicePolicy();
Alex Deymo0d11c602014-04-23 20:12:20 -070044 }
45
Amin Hassani186ff6a2018-02-27 11:06:03 -080046 void SetUpDefaultState() override {
47 UmPolicyTestBase::SetUpDefaultState();
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070048
Gilad Arnolda1eabcd2014-07-09 15:42:40 -070049 // OOBE is enabled by default.
50 fake_state_.config_provider()->var_is_oobe_enabled()->reset(
51 new bool(true));
52
Gilad Arnold76a11f62014-05-20 09:02:12 -070053 // For the purpose of the tests, this is an official build and OOBE was
54 // completed.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070055 fake_state_.system_provider()->var_is_official_build()->reset(
56 new bool(true));
Gilad Arnold76a11f62014-05-20 09:02:12 -070057 fake_state_.system_provider()->var_is_oobe_complete()->reset(
58 new bool(true));
Aaron Woodc73fdc12017-12-06 11:09:15 -080059 // NOLINTNEXTLINE(readability/casting)
Alex Deymo763e7db2015-08-27 21:08:08 -070060 fake_state_.system_provider()->var_num_slots()->reset(new unsigned int(2));
Gilad Arnold0adbc942014-05-12 10:35:43 -070061
62 // Connection is wifi, untethered.
63 fake_state_.shill_provider()->var_conn_type()->
64 reset(new ConnectionType(ConnectionType::kWifi));
65 fake_state_.shill_provider()->var_conn_tethering()->
66 reset(new ConnectionTethering(ConnectionTethering::kNotDetected));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070067 }
68
Gilad Arnoldb3b05442014-05-30 14:25:05 -070069 // Sets up a default device policy that does not impose any restrictions
70 // (HTTP) nor enables any features (P2P).
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070071 void SetUpDefaultDevicePolicy() {
72 fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
73 new bool(true));
74 fake_state_.device_policy_provider()->var_update_disabled()->reset(
75 new bool(false));
76 fake_state_.device_policy_provider()->
77 var_allowed_connection_types_for_update()->reset(nullptr);
78 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
79 new TimeDelta());
80 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
Gilad Arnoldb3b05442014-05-30 14:25:05 -070081 new bool(true));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070082 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
83 new bool(false));
84 fake_state_.device_policy_provider()->var_release_channel_delegated()->
85 reset(new bool(true));
86 }
87
Amin Hassani186ff6a2018-02-27 11:06:03 -080088 // Configures the policy to return a desired value from UpdateCheckAllowed by
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070089 // faking the current wall clock time as needed. Restores the default state.
90 // This is used when testing policies that depend on this one.
Amin Hassani186ff6a2018-02-27 11:06:03 -080091 //
92 // Note that the default implementation relies on NextUpdateCheckPolicyImpl to
93 // set the FakeClock to the appropriate time.
94 virtual void SetUpdateCheckAllowed(bool allow_check) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070095 Time next_update_check;
Amin Hassani186ff6a2018-02-27 11:06:03 -080096 CallMethodWithContext(&NextUpdateCheckTimePolicyImpl::NextUpdateCheckTime,
97 &next_update_check,
98 ChromeOSPolicy::kNextUpdateCheckPolicyConstants);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070099 SetUpDefaultState();
100 SetUpDefaultDevicePolicy();
101 Time curr_time = next_update_check;
102 if (allow_check)
103 curr_time += TimeDelta::FromSeconds(1);
104 else
105 curr_time -= TimeDelta::FromSeconds(1);
106 fake_clock_.SetWallclockTime(curr_time);
107 }
Alex Deymo0d11c602014-04-23 20:12:20 -0700108};
109
Alex Deymo63784a52014-05-28 10:46:14 -0700110TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWaitsForTheTimeout) {
Alex Deymo0d11c602014-04-23 20:12:20 -0700111 // We get the next update_check timestamp from the policy's private method
112 // and then we check the public method respects that value on the normal
113 // case.
114 Time next_update_check;
115 Time last_checked_time =
116 fake_clock_.GetWallclockTime() + TimeDelta::FromMinutes(1234);
117
Alex Deymo0d11c602014-04-23 20:12:20 -0700118 fake_state_.updater_provider()->var_last_checked_time()->reset(
119 new Time(last_checked_time));
Amin Hassani186ff6a2018-02-27 11:06:03 -0800120 CallMethodWithContext(&NextUpdateCheckTimePolicyImpl::NextUpdateCheckTime,
121 &next_update_check,
122 ChromeOSPolicy::kNextUpdateCheckPolicyConstants);
Alex Deymo0d11c602014-04-23 20:12:20 -0700123
124 UpdateCheckParams result;
125
126 // Check that the policy blocks until the next_update_check is reached.
127 SetUpDefaultClock();
128 SetUpDefaultState();
129 fake_state_.updater_provider()->var_last_checked_time()->reset(
130 new Time(last_checked_time));
131 fake_clock_.SetWallclockTime(next_update_check - TimeDelta::FromSeconds(1));
132 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
133 &Policy::UpdateCheckAllowed, &result);
134
135 SetUpDefaultClock();
136 SetUpDefaultState();
137 fake_state_.updater_provider()->var_last_checked_time()->reset(
138 new Time(last_checked_time));
139 fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
140 ExpectPolicyStatus(EvalStatus::kSucceeded,
141 &Policy::UpdateCheckAllowed, &result);
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700142 EXPECT_TRUE(result.updates_enabled);
Amin Hassanied37d682018-04-06 13:22:00 -0700143 EXPECT_FALSE(result.interactive);
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700144}
145
146TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWaitsForOOBE) {
Alex Vakulenko072359c2014-07-18 11:41:07 -0700147 // Update checks are deferred until OOBE is completed.
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700148
149 // Ensure that update is not allowed even if wait period is satisfied.
150 Time next_update_check;
151 Time last_checked_time =
152 fake_clock_.GetWallclockTime() + TimeDelta::FromMinutes(1234);
153
154 fake_state_.updater_provider()->var_last_checked_time()->reset(
155 new Time(last_checked_time));
Amin Hassani186ff6a2018-02-27 11:06:03 -0800156 CallMethodWithContext(&NextUpdateCheckTimePolicyImpl::NextUpdateCheckTime,
157 &next_update_check,
158 ChromeOSPolicy::kNextUpdateCheckPolicyConstants);
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700159
160 SetUpDefaultClock();
161 SetUpDefaultState();
162 fake_state_.updater_provider()->var_last_checked_time()->reset(
163 new Time(last_checked_time));
164 fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
165 fake_state_.system_provider()->var_is_oobe_complete()->reset(
166 new bool(false));
167
168 UpdateCheckParams result;
169 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
170 &Policy::UpdateCheckAllowed, &result);
171
172 // Now check that it is allowed if OOBE is completed.
173 SetUpDefaultClock();
174 SetUpDefaultState();
175 fake_state_.updater_provider()->var_last_checked_time()->reset(
176 new Time(last_checked_time));
177 fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
178 ExpectPolicyStatus(EvalStatus::kSucceeded,
179 &Policy::UpdateCheckAllowed, &result);
180 EXPECT_TRUE(result.updates_enabled);
Amin Hassanied37d682018-04-06 13:22:00 -0700181 EXPECT_FALSE(result.interactive);
Alex Deymo0d11c602014-04-23 20:12:20 -0700182}
183
Gilad Arnold42f253b2014-06-25 12:39:17 -0700184TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWithAttributes) {
Alex Vakulenko072359c2014-07-18 11:41:07 -0700185 // Update check is allowed, response includes attributes for use in the
Gilad Arnold42f253b2014-06-25 12:39:17 -0700186 // request.
187 SetUpdateCheckAllowed(true);
188
189 // Override specific device policy attributes.
Gilad Arnoldd4b30322014-07-21 15:35:27 -0700190 fake_state_.device_policy_provider()->var_target_version_prefix()->
191 reset(new string("1.2"));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700192 fake_state_.device_policy_provider()->var_release_channel_delegated()->
193 reset(new bool(false));
194 fake_state_.device_policy_provider()->var_release_channel()->
195 reset(new string("foo-channel"));
196
197 UpdateCheckParams result;
198 ExpectPolicyStatus(EvalStatus::kSucceeded,
199 &Policy::UpdateCheckAllowed, &result);
200 EXPECT_TRUE(result.updates_enabled);
Gilad Arnoldd4b30322014-07-21 15:35:27 -0700201 EXPECT_EQ("1.2", result.target_version_prefix);
Gilad Arnold42f253b2014-06-25 12:39:17 -0700202 EXPECT_EQ("foo-channel", result.target_channel);
Amin Hassanied37d682018-04-06 13:22:00 -0700203 EXPECT_FALSE(result.interactive);
Gilad Arnold42f253b2014-06-25 12:39:17 -0700204}
205
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700206TEST_F(UmChromeOSPolicyTest,
207 UpdateCheckAllowedUpdatesDisabledForUnofficialBuilds) {
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700208 // UpdateCheckAllowed should return kAskMeAgainLater if this is an unofficial
209 // build; we don't want periodic update checks on developer images.
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700210
211 fake_state_.system_provider()->var_is_official_build()->reset(
212 new bool(false));
213
214 UpdateCheckParams result;
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700215 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700216 &Policy::UpdateCheckAllowed, &result);
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700217}
218
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700219TEST_F(UmChromeOSPolicyTest,
Aaron Wood56d8ab32017-09-22 15:56:18 -0700220 UpdateCheckAllowedUpdatesDisabledWhenNotEnoughSlotsAbUpdates) {
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700221 // UpdateCheckAllowed should return false (kSucceeded) if the image booted
Aaron Wood56d8ab32017-09-22 15:56:18 -0700222 // without enough slots to do A/B updates.
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700223
Aaron Woodc73fdc12017-12-06 11:09:15 -0800224 // NOLINTNEXTLINE(readability/casting)
Alex Deymo763e7db2015-08-27 21:08:08 -0700225 fake_state_.system_provider()->var_num_slots()->reset(new unsigned int(1));
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700226
227 UpdateCheckParams result;
228 ExpectPolicyStatus(EvalStatus::kSucceeded,
229 &Policy::UpdateCheckAllowed, &result);
230 EXPECT_FALSE(result.updates_enabled);
231}
232
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700233TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedUpdatesDisabledByPolicy) {
Gilad Arnold42f253b2014-06-25 12:39:17 -0700234 // UpdateCheckAllowed should return kAskMeAgainLater because a device policy
235 // is loaded and prohibits updates.
236
237 SetUpdateCheckAllowed(false);
238 fake_state_.device_policy_provider()->var_update_disabled()->reset(
239 new bool(true));
240
Gilad Arnold42f253b2014-06-25 12:39:17 -0700241 UpdateCheckParams result;
242 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
243 &Policy::UpdateCheckAllowed, &result);
244}
245
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700246TEST_F(UmChromeOSPolicyTest,
247 UpdateCheckAllowedForcedUpdateRequestedInteractive) {
248 // UpdateCheckAllowed should return true because a forced update request was
249 // signaled for an interactive update.
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700250
251 SetUpdateCheckAllowed(true);
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700252 fake_state_.updater_provider()->var_forced_update_requested()->reset(
253 new UpdateRequestStatus(UpdateRequestStatus::kInteractive));
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700254
255 UpdateCheckParams result;
256 ExpectPolicyStatus(EvalStatus::kSucceeded,
257 &Policy::UpdateCheckAllowed, &result);
258 EXPECT_TRUE(result.updates_enabled);
Amin Hassanied37d682018-04-06 13:22:00 -0700259 EXPECT_TRUE(result.interactive);
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700260}
261
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700262TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedForcedUpdateRequestedPeriodic) {
263 // UpdateCheckAllowed should return true because a forced update request was
264 // signaled for a periodic check.
265
266 SetUpdateCheckAllowed(true);
267 fake_state_.updater_provider()->var_forced_update_requested()->reset(
268 new UpdateRequestStatus(UpdateRequestStatus::kPeriodic));
269
270 UpdateCheckParams result;
271 ExpectPolicyStatus(EvalStatus::kSucceeded,
272 &Policy::UpdateCheckAllowed, &result);
273 EXPECT_TRUE(result.updates_enabled);
Amin Hassanied37d682018-04-06 13:22:00 -0700274 EXPECT_FALSE(result.interactive);
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700275}
276
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800277TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskPin) {
278 // Update check is allowed.
279 SetUpdateCheckAllowed(true);
280
281 // A typical setup for kiosk pin policy: AU disabled, allow kiosk to pin
282 // and there is a kiosk required platform version.
283 fake_state_.device_policy_provider()->var_update_disabled()->reset(
284 new bool(true));
285 fake_state_.device_policy_provider()
286 ->var_allow_kiosk_app_control_chrome_version()
287 ->reset(new bool(true));
288 fake_state_.system_provider()->var_kiosk_required_platform_version()->reset(
289 new string("1234.0.0"));
290
291 UpdateCheckParams result;
292 ExpectPolicyStatus(EvalStatus::kSucceeded,
293 &Policy::UpdateCheckAllowed, &result);
294 EXPECT_TRUE(result.updates_enabled);
295 EXPECT_EQ("1234.0.0", result.target_version_prefix);
Amin Hassanied37d682018-04-06 13:22:00 -0700296 EXPECT_FALSE(result.interactive);
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800297}
298
299TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedDisabledWhenNoKioskPin) {
300 // Update check is allowed.
301 SetUpdateCheckAllowed(true);
302
303 // Disable AU policy is set but kiosk pin policy is set to false. Update is
304 // disabled in such case.
305 fake_state_.device_policy_provider()->var_update_disabled()->reset(
306 new bool(true));
307 fake_state_.device_policy_provider()
308 ->var_allow_kiosk_app_control_chrome_version()
309 ->reset(new bool(false));
310
311 UpdateCheckParams result;
312 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
313 &Policy::UpdateCheckAllowed, &result);
314}
315
316TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskPinWithNoRequiredVersion) {
317 // Update check is allowed.
318 SetUpdateCheckAllowed(true);
319
320 // AU disabled, allow kiosk to pin but there is no kiosk required platform
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700321 // version (i.e. app does not provide the info). Update to latest in such
322 // case.
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800323 fake_state_.device_policy_provider()->var_update_disabled()->reset(
324 new bool(true));
325 fake_state_.device_policy_provider()
326 ->var_allow_kiosk_app_control_chrome_version()
327 ->reset(new bool(true));
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700328 fake_state_.system_provider()->var_kiosk_required_platform_version()->reset(
329 new string());
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800330
331 UpdateCheckParams result;
332 ExpectPolicyStatus(EvalStatus::kSucceeded,
333 &Policy::UpdateCheckAllowed, &result);
334 EXPECT_TRUE(result.updates_enabled);
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700335 EXPECT_TRUE(result.target_version_prefix.empty());
Amin Hassanied37d682018-04-06 13:22:00 -0700336 EXPECT_FALSE(result.interactive);
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800337}
338
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700339TEST_F(UmChromeOSPolicyTest,
340 UpdateCheckAllowedKioskPinWithFailedGetRequiredVersionCall) {
341 // AU disabled, allow kiosk to pin but D-Bus call to get required platform
342 // version failed. Defer update check in this case.
343 fake_state_.device_policy_provider()->var_update_disabled()->reset(
344 new bool(true));
345 fake_state_.device_policy_provider()
346 ->var_allow_kiosk_app_control_chrome_version()
347 ->reset(new bool(true));
348 fake_state_.system_provider()->var_kiosk_required_platform_version()->reset(
349 nullptr);
350
351 UpdateCheckParams result;
352 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
353 &Policy::UpdateCheckAllowed, &result);
354}
355
Alex Deymo63784a52014-05-28 10:46:14 -0700356TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsCheckAllowedError) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700357 // The UpdateCanStart policy fails, not being able to query
358 // UpdateCheckAllowed.
359
360 // Configure the UpdateCheckAllowed policy to fail.
361 fake_state_.updater_provider()->var_updater_started_time()->reset(nullptr);
362
363 // Check that the UpdateCanStart fails.
364 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700365 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700366 ExpectPolicyStatus(EvalStatus::kFailed,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700367 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700368}
369
Alex Deymo63784a52014-05-28 10:46:14 -0700370TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedCheckDue) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700371 // The UpdateCanStart policy returns false because we are due for another
Gilad Arnold14a9e702014-10-08 08:09:09 -0700372 // update check. Ensure that download related values are still returned.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700373
374 SetUpdateCheckAllowed(true);
375
376 // Check that the UpdateCanStart returns false.
377 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700378 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700379 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700380 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700381 EXPECT_FALSE(result.update_can_start);
382 EXPECT_EQ(UpdateCannotStartReason::kCheckDue, result.cannot_start_reason);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700383 EXPECT_EQ(0, result.download_url_idx);
384 EXPECT_EQ(0, result.download_url_num_errors);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700385}
386
Alex Deymo63784a52014-05-28 10:46:14 -0700387TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoDevicePolicy) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700388 // The UpdateCanStart policy returns true; no device policy is loaded.
389
390 SetUpdateCheckAllowed(false);
391 fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
392 new bool(false));
393
394 // Check that the UpdateCanStart returns true with no further attributes.
395 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700396 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700397 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700398 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700399 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700400 EXPECT_FALSE(result.p2p_downloading_allowed);
401 EXPECT_FALSE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700402 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700403 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700404 EXPECT_EQ(0, result.download_url_num_errors);
405 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700406}
407
Alex Deymo63784a52014-05-28 10:46:14 -0700408TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBlankPolicy) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700409 // The UpdateCanStart policy returns true; device policy is loaded but imposes
410 // no restrictions on updating.
411
412 SetUpdateCheckAllowed(false);
413
414 // Check that the UpdateCanStart returns true.
415 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700416 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700417 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700418 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700419 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700420 EXPECT_FALSE(result.p2p_downloading_allowed);
421 EXPECT_FALSE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700422 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700423 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700424 EXPECT_EQ(0, result.download_url_num_errors);
425 EXPECT_FALSE(result.do_increment_failures);
426}
427
428TEST_F(UmChromeOSPolicyTest,
429 UpdateCanStartNotAllowedBackoffNewWaitPeriodApplies) {
430 // The UpdateCanStart policy returns false; failures are reported and a new
431 // backoff period is enacted.
432
433 SetUpdateCheckAllowed(false);
434
435 const Time curr_time = fake_clock_.GetWallclockTime();
436 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
437 update_state.download_errors_max = 1;
438 update_state.download_errors.emplace_back(
439 0, ErrorCode::kDownloadTransferError,
440 curr_time - TimeDelta::FromSeconds(8));
441 update_state.download_errors.emplace_back(
442 0, ErrorCode::kDownloadTransferError,
443 curr_time - TimeDelta::FromSeconds(2));
444
445 // Check that UpdateCanStart returns false and a new backoff expiry is
446 // generated.
447 UpdateDownloadParams result;
448 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
449 update_state);
450 EXPECT_FALSE(result.update_can_start);
451 EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
452 EXPECT_TRUE(result.do_increment_failures);
453 EXPECT_LT(curr_time, result.backoff_expiry);
454}
455
456TEST_F(UmChromeOSPolicyTest,
457 UpdateCanStartNotAllowedBackoffPrevWaitPeriodStillApplies) {
458 // The UpdateCanStart policy returns false; a previously enacted backoff
459 // period still applies.
460
461 SetUpdateCheckAllowed(false);
462
463 const Time curr_time = fake_clock_.GetWallclockTime();
464 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
465 update_state.download_errors_max = 1;
466 update_state.download_errors.emplace_back(
467 0, ErrorCode::kDownloadTransferError,
468 curr_time - TimeDelta::FromSeconds(8));
469 update_state.download_errors.emplace_back(
470 0, ErrorCode::kDownloadTransferError,
471 curr_time - TimeDelta::FromSeconds(2));
472 update_state.failures_last_updated = curr_time;
473 update_state.backoff_expiry = curr_time + TimeDelta::FromMinutes(3);
474
475 // Check that UpdateCanStart returns false and a new backoff expiry is
476 // generated.
477 UpdateDownloadParams result;
478 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::UpdateCanStart,
479 &result, update_state);
480 EXPECT_FALSE(result.update_can_start);
481 EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
482 EXPECT_FALSE(result.do_increment_failures);
483 EXPECT_LT(curr_time, result.backoff_expiry);
484}
485
486TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffSatisfied) {
487 // The UpdateCanStart policy returns true; a previously enacted backoff period
488 // has elapsed, we're good to go.
489
490 SetUpdateCheckAllowed(false);
491
492 const Time curr_time = fake_clock_.GetWallclockTime();
493 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
494 update_state.download_errors_max = 1;
495 update_state.download_errors.emplace_back(
496 0, ErrorCode::kDownloadTransferError,
497 curr_time - TimeDelta::FromSeconds(8));
498 update_state.download_errors.emplace_back(
499 0, ErrorCode::kDownloadTransferError,
500 curr_time - TimeDelta::FromSeconds(2));
501 update_state.failures_last_updated = curr_time - TimeDelta::FromSeconds(1);
502 update_state.backoff_expiry = curr_time - TimeDelta::FromSeconds(1);
503
504 // Check that UpdateCanStart returns false and a new backoff expiry is
505 // generated.
506 UpdateDownloadParams result;
507 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart,
508 &result, update_state);
509 EXPECT_TRUE(result.update_can_start);
510 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
511 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700512 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700513 EXPECT_EQ(0, result.download_url_num_errors);
514 EXPECT_FALSE(result.do_increment_failures);
515 EXPECT_EQ(Time(), result.backoff_expiry);
516}
517
518TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffDisabled) {
519 // The UpdateCanStart policy returns false; failures are reported but backoff
520 // is disabled.
521
522 SetUpdateCheckAllowed(false);
523
524 const Time curr_time = fake_clock_.GetWallclockTime();
525 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
526 update_state.download_errors_max = 1;
527 update_state.download_errors.emplace_back(
528 0, ErrorCode::kDownloadTransferError,
529 curr_time - TimeDelta::FromSeconds(8));
530 update_state.download_errors.emplace_back(
531 0, ErrorCode::kDownloadTransferError,
532 curr_time - TimeDelta::FromSeconds(2));
533 update_state.is_backoff_disabled = true;
534
535 // Check that UpdateCanStart returns false and a new backoff expiry is
536 // generated.
537 UpdateDownloadParams result;
538 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
539 update_state);
540 EXPECT_TRUE(result.update_can_start);
541 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
542 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700543 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700544 EXPECT_EQ(0, result.download_url_num_errors);
545 EXPECT_TRUE(result.do_increment_failures);
546 EXPECT_EQ(Time(), result.backoff_expiry);
547}
548
549TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffInteractive) {
550 // The UpdateCanStart policy returns false; failures are reported but this is
551 // an interactive update check.
552
553 SetUpdateCheckAllowed(false);
554
555 const Time curr_time = fake_clock_.GetWallclockTime();
556 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
557 update_state.download_errors_max = 1;
558 update_state.download_errors.emplace_back(
559 0, ErrorCode::kDownloadTransferError,
560 curr_time - TimeDelta::FromSeconds(8));
561 update_state.download_errors.emplace_back(
562 0, ErrorCode::kDownloadTransferError,
563 curr_time - TimeDelta::FromSeconds(2));
Amin Hassanied37d682018-04-06 13:22:00 -0700564 update_state.interactive = true;
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700565
566 // Check that UpdateCanStart returns false and a new backoff expiry is
567 // generated.
568 UpdateDownloadParams result;
569 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
570 update_state);
571 EXPECT_TRUE(result.update_can_start);
572 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
573 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700574 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700575 EXPECT_EQ(0, result.download_url_num_errors);
576 EXPECT_TRUE(result.do_increment_failures);
577 EXPECT_EQ(Time(), result.backoff_expiry);
578}
579
580TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffDelta) {
581 // The UpdateCanStart policy returns false; failures are reported but this is
582 // a delta payload.
583
584 SetUpdateCheckAllowed(false);
585
586 const Time curr_time = fake_clock_.GetWallclockTime();
587 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
588 update_state.download_errors_max = 1;
589 update_state.download_errors.emplace_back(
590 0, ErrorCode::kDownloadTransferError,
591 curr_time - TimeDelta::FromSeconds(8));
592 update_state.download_errors.emplace_back(
593 0, ErrorCode::kDownloadTransferError,
594 curr_time - TimeDelta::FromSeconds(2));
595 update_state.is_delta_payload = true;
596
597 // Check that UpdateCanStart returns false and a new backoff expiry is
598 // generated.
599 UpdateDownloadParams result;
600 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
601 update_state);
602 EXPECT_TRUE(result.update_can_start);
603 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
604 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700605 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700606 EXPECT_EQ(0, result.download_url_num_errors);
607 EXPECT_TRUE(result.do_increment_failures);
608 EXPECT_EQ(Time(), result.backoff_expiry);
609}
610
611TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffUnofficialBuild) {
612 // The UpdateCanStart policy returns false; failures are reported but this is
613 // an unofficial build.
614
615 SetUpdateCheckAllowed(false);
616
617 const Time curr_time = fake_clock_.GetWallclockTime();
618 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
619 update_state.download_errors_max = 1;
620 update_state.download_errors.emplace_back(
621 0, ErrorCode::kDownloadTransferError,
622 curr_time - TimeDelta::FromSeconds(8));
623 update_state.download_errors.emplace_back(
624 0, ErrorCode::kDownloadTransferError,
625 curr_time - TimeDelta::FromSeconds(2));
626
627 fake_state_.system_provider()->var_is_official_build()->
628 reset(new bool(false));
629
630 // Check that UpdateCanStart returns false and a new backoff expiry is
631 // generated.
632 UpdateDownloadParams result;
633 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
634 update_state);
635 EXPECT_TRUE(result.update_can_start);
636 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
637 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700638 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700639 EXPECT_EQ(0, result.download_url_num_errors);
640 EXPECT_TRUE(result.do_increment_failures);
641 EXPECT_EQ(Time(), result.backoff_expiry);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700642}
643
Alex Deymo63784a52014-05-28 10:46:14 -0700644TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsScatteringFailed) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700645 // The UpdateCanStart policy fails because the UpdateScattering policy it
646 // depends on fails (unset variable).
647
648 SetUpdateCheckAllowed(false);
649
650 // Override the default seed variable with a null value so that the policy
651 // request would fail.
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700652 // TODO(garnold) This failure may or may not fail a number
653 // sub-policies/decisions, like scattering and backoff. We'll need a more
654 // deliberate setup to ensure that we're failing what we want to be failing.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700655 fake_state_.random_provider()->var_seed()->reset(nullptr);
656
657 // Check that the UpdateCanStart fails.
658 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700659 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700660 ExpectPolicyStatus(EvalStatus::kFailed,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700661 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700662}
663
Alex Deymo63784a52014-05-28 10:46:14 -0700664TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700665 UpdateCanStartNotAllowedScatteringNewWaitPeriodApplies) {
666 // The UpdateCanStart policy returns false; device policy is loaded and
667 // scattering applies due to an unsatisfied wait period, which was newly
668 // generated.
669
670 SetUpdateCheckAllowed(false);
671 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
672 new TimeDelta(TimeDelta::FromMinutes(2)));
673
674
675 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
676
677 // Check that the UpdateCanStart returns false and a new wait period
678 // generated.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700679 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700680 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700681 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700682 EXPECT_FALSE(result.update_can_start);
683 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
684 EXPECT_LT(TimeDelta(), result.scatter_wait_period);
685 EXPECT_EQ(0, result.scatter_check_threshold);
686}
687
Alex Deymo63784a52014-05-28 10:46:14 -0700688TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700689 UpdateCanStartNotAllowedScatteringPrevWaitPeriodStillApplies) {
690 // The UpdateCanStart policy returns false w/ kAskMeAgainLater; device policy
691 // is loaded and a previously generated scattering period still applies, none
692 // of the scattering values has changed.
693
694 SetUpdateCheckAllowed(false);
695 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
696 new TimeDelta(TimeDelta::FromMinutes(2)));
697
698 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
699 update_state.scatter_wait_period = TimeDelta::FromSeconds(35);
700
701 // Check that the UpdateCanStart returns false and a new wait period
702 // generated.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700703 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700704 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::UpdateCanStart,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700705 &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700706 EXPECT_FALSE(result.update_can_start);
707 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
708 EXPECT_EQ(TimeDelta::FromSeconds(35), result.scatter_wait_period);
709 EXPECT_EQ(0, result.scatter_check_threshold);
710}
711
Alex Deymo63784a52014-05-28 10:46:14 -0700712TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700713 UpdateCanStartNotAllowedScatteringNewCountThresholdApplies) {
714 // The UpdateCanStart policy returns false; device policy is loaded and
715 // scattering applies due to an unsatisfied update check count threshold.
716 //
717 // This ensures a non-zero check threshold, which may or may not be combined
718 // with a non-zero wait period (for which we cannot reliably control).
719
720 SetUpdateCheckAllowed(false);
721 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
722 new TimeDelta(TimeDelta::FromSeconds(1)));
723
724 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
725 update_state.scatter_check_threshold_min = 2;
726 update_state.scatter_check_threshold_max = 5;
727
728 // Check that the UpdateCanStart returns false.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700729 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700730 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700731 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700732 EXPECT_FALSE(result.update_can_start);
733 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
734 EXPECT_LE(2, result.scatter_check_threshold);
735 EXPECT_GE(5, result.scatter_check_threshold);
736}
737
Alex Deymo63784a52014-05-28 10:46:14 -0700738TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700739 UpdateCanStartNotAllowedScatteringPrevCountThresholdStillApplies) {
740 // The UpdateCanStart policy returns false; device policy is loaded and
741 // scattering due to a previously generated count threshold still applies.
742
743 SetUpdateCheckAllowed(false);
744 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
745 new TimeDelta(TimeDelta::FromSeconds(1)));
746
747 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
748 update_state.scatter_check_threshold = 3;
749 update_state.scatter_check_threshold_min = 2;
750 update_state.scatter_check_threshold_max = 5;
751
752 // Check that the UpdateCanStart returns false.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700753 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700754 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700755 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700756 EXPECT_FALSE(result.update_can_start);
757 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
758 EXPECT_EQ(3, result.scatter_check_threshold);
759}
760
Alex Deymo63784a52014-05-28 10:46:14 -0700761TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedScatteringSatisfied) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700762 // The UpdateCanStart policy returns true; device policy is loaded and
763 // scattering is enabled, but both wait period and check threshold are
764 // satisfied.
765
766 SetUpdateCheckAllowed(false);
767 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
768 new TimeDelta(TimeDelta::FromSeconds(120)));
769
770 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(75));
771 update_state.num_checks = 4;
772 update_state.scatter_wait_period = TimeDelta::FromSeconds(60);
773 update_state.scatter_check_threshold = 3;
774 update_state.scatter_check_threshold_min = 2;
775 update_state.scatter_check_threshold_max = 5;
776
777 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700778 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700779 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700780 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700781 EXPECT_TRUE(result.update_can_start);
782 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
783 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700784 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700785 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700786 EXPECT_EQ(0, result.download_url_num_errors);
787 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700788}
789
Alex Deymo63784a52014-05-28 10:46:14 -0700790TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700791 UpdateCanStartAllowedInteractivePreventsScattering) {
792 // The UpdateCanStart policy returns true; device policy is loaded and
793 // scattering would have applied, except that the update check is interactive
794 // and so it is suppressed.
795
796 SetUpdateCheckAllowed(false);
797 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
798 new TimeDelta(TimeDelta::FromSeconds(1)));
799
800 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Amin Hassanied37d682018-04-06 13:22:00 -0700801 update_state.interactive = true;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700802 update_state.scatter_check_threshold = 0;
803 update_state.scatter_check_threshold_min = 2;
804 update_state.scatter_check_threshold_max = 5;
805
806 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700807 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700808 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700809 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700810 EXPECT_TRUE(result.update_can_start);
811 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
812 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700813 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700814 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700815 EXPECT_EQ(0, result.download_url_num_errors);
816 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700817}
818
Alex Deymo63784a52014-05-28 10:46:14 -0700819TEST_F(UmChromeOSPolicyTest,
Gilad Arnold76a11f62014-05-20 09:02:12 -0700820 UpdateCanStartAllowedOobePreventsScattering) {
821 // The UpdateCanStart policy returns true; device policy is loaded and
822 // scattering would have applied, except that OOBE was not completed and so it
823 // is suppressed.
824
825 SetUpdateCheckAllowed(false);
826 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
827 new TimeDelta(TimeDelta::FromSeconds(1)));
828 fake_state_.system_provider()->var_is_oobe_complete()->reset(new bool(false));
829
830 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Amin Hassanied37d682018-04-06 13:22:00 -0700831 update_state.interactive = true;
Gilad Arnold76a11f62014-05-20 09:02:12 -0700832 update_state.scatter_check_threshold = 0;
833 update_state.scatter_check_threshold_min = 2;
834 update_state.scatter_check_threshold_max = 5;
835
836 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700837 UpdateDownloadParams result;
Gilad Arnold76a11f62014-05-20 09:02:12 -0700838 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700839 update_state);
Gilad Arnold76a11f62014-05-20 09:02:12 -0700840 EXPECT_TRUE(result.update_can_start);
841 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
842 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700843 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700844 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700845 EXPECT_EQ(0, result.download_url_num_errors);
846 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnold76a11f62014-05-20 09:02:12 -0700847}
848
Alex Deymo63784a52014-05-28 10:46:14 -0700849TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithAttributes) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700850 // The UpdateCanStart policy returns true; device policy permits both HTTP and
851 // P2P updates, as well as a non-empty target channel string.
852
853 SetUpdateCheckAllowed(false);
854
855 // Override specific device policy attributes.
856 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
857 new bool(true));
858 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
859 new bool(true));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700860
861 // Check that the UpdateCanStart returns true.
862 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700863 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700864 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700865 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700866 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700867 EXPECT_TRUE(result.p2p_downloading_allowed);
868 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700869 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700870 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700871 EXPECT_EQ(0, result.download_url_num_errors);
872 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700873}
874
Alex Deymo63784a52014-05-28 10:46:14 -0700875TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithP2PFromUpdater) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700876 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
877 // P2P updates, but the updater is configured to allow P2P and overrules the
878 // setting.
879
880 SetUpdateCheckAllowed(false);
881
882 // Override specific device policy attributes.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700883 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
884
885 // Check that the UpdateCanStart returns true.
886 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700887 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700888 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700889 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700890 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700891 EXPECT_TRUE(result.p2p_downloading_allowed);
892 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700893 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700894 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700895 EXPECT_EQ(0, result.download_url_num_errors);
896 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700897}
898
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700899TEST_F(UmChromeOSPolicyTest,
Gilad Arnold78ecbfc2014-10-22 14:38:25 -0700900 UpdateCanStartAllowedP2PDownloadingBlockedDueToOmaha) {
901 // The UpdateCanStart policy returns true; device policy permits HTTP, but
902 // policy blocks P2P downloading because Omaha forbids it. P2P sharing is
903 // still permitted.
904
905 SetUpdateCheckAllowed(false);
906
907 // Override specific device policy attributes.
908 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
909 new bool(true));
910 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
911 new bool(true));
912
913 // Check that the UpdateCanStart returns true.
914 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
915 update_state.p2p_downloading_disabled = true;
916 UpdateDownloadParams result;
917 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
918 update_state);
919 EXPECT_TRUE(result.update_can_start);
920 EXPECT_FALSE(result.p2p_downloading_allowed);
921 EXPECT_TRUE(result.p2p_sharing_allowed);
922}
923
924TEST_F(UmChromeOSPolicyTest,
925 UpdateCanStartAllowedP2PSharingBlockedDueToOmaha) {
926 // The UpdateCanStart policy returns true; device policy permits HTTP, but
927 // policy blocks P2P sharing because Omaha forbids it. P2P downloading is
928 // still permitted.
929
930 SetUpdateCheckAllowed(false);
931
932 // Override specific device policy attributes.
933 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
934 new bool(true));
935 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
936 new bool(true));
937
938 // Check that the UpdateCanStart returns true.
939 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
940 update_state.p2p_sharing_disabled = true;
941 UpdateDownloadParams result;
942 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
943 update_state);
944 EXPECT_TRUE(result.update_can_start);
945 EXPECT_TRUE(result.p2p_downloading_allowed);
946 EXPECT_FALSE(result.p2p_sharing_allowed);
947}
948
949TEST_F(UmChromeOSPolicyTest,
950 UpdateCanStartAllowedP2PDownloadingBlockedDueToNumAttempts) {
Gilad Arnold349ac832014-10-06 14:20:28 -0700951 // The UpdateCanStart policy returns true; device policy permits HTTP but
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700952 // blocks P2P download, because the max number of P2P downloads have been
953 // attempted. P2P sharing is still permitted.
Gilad Arnold349ac832014-10-06 14:20:28 -0700954
955 SetUpdateCheckAllowed(false);
956
957 // Override specific device policy attributes.
958 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
959 new bool(true));
960 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
961 new bool(true));
962
963 // Check that the UpdateCanStart returns true.
964 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
965 update_state.p2p_num_attempts = ChromeOSPolicy::kMaxP2PAttempts;
966 UpdateDownloadParams result;
967 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
968 update_state);
969 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700970 EXPECT_FALSE(result.p2p_downloading_allowed);
971 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnold349ac832014-10-06 14:20:28 -0700972}
973
974TEST_F(UmChromeOSPolicyTest,
Gilad Arnold78ecbfc2014-10-22 14:38:25 -0700975 UpdateCanStartAllowedP2PDownloadingBlockedDueToAttemptsPeriod) {
Gilad Arnold349ac832014-10-06 14:20:28 -0700976 // The UpdateCanStart policy returns true; device policy permits HTTP but
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700977 // blocks P2P download, because the max period for attempt to download via P2P
978 // has elapsed. P2P sharing is still permitted.
Gilad Arnold349ac832014-10-06 14:20:28 -0700979
980 SetUpdateCheckAllowed(false);
981
982 // Override specific device policy attributes.
983 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
984 new bool(true));
985 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
986 new bool(true));
987
988 // Check that the UpdateCanStart returns true.
989 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
990 update_state.p2p_num_attempts = 1;
991 update_state.p2p_first_attempted =
992 fake_clock_.GetWallclockTime() -
Alex Deymof329b932014-10-30 01:37:48 -0700993 TimeDelta::FromSeconds(
994 ChromeOSPolicy::kMaxP2PAttemptsPeriodInSeconds + 1);
Gilad Arnold349ac832014-10-06 14:20:28 -0700995 UpdateDownloadParams result;
996 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
997 update_state);
998 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700999 EXPECT_FALSE(result.p2p_downloading_allowed);
1000 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnold349ac832014-10-06 14:20:28 -07001001}
1002
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001003TEST_F(UmChromeOSPolicyTest,
1004 UpdateCanStartAllowedWithHttpUrlForUnofficialBuild) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001005 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1006 // P2P updates, but marking this an unofficial build overrules the HTTP
1007 // setting.
1008
1009 SetUpdateCheckAllowed(false);
1010
1011 // Override specific device policy attributes.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001012 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1013 new bool(false));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001014 fake_state_.system_provider()->var_is_official_build()->
1015 reset(new bool(false));
1016
1017 // Check that the UpdateCanStart returns true.
1018 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001019 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001020 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001021 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001022 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001023 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001024 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001025 EXPECT_EQ(0, result.download_url_num_errors);
1026 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001027}
1028
1029TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithHttpsUrl) {
1030 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1031 // P2P updates, but an HTTPS URL is provided and selected for download.
1032
1033 SetUpdateCheckAllowed(false);
1034
1035 // Override specific device policy attributes.
1036 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1037 new bool(false));
1038
1039 // Add an HTTPS URL.
1040 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001041 update_state.download_urls.emplace_back("https://secure/url/");
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001042
1043 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001044 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001045 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001046 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001047 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001048 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001049 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001050 EXPECT_EQ(0, result.download_url_num_errors);
1051 EXPECT_FALSE(result.do_increment_failures);
1052}
1053
1054TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedMaxErrorsNotExceeded) {
1055 // The UpdateCanStart policy returns true; the first URL has download errors
1056 // but does not exceed the maximum allowed number of failures, so it is stilli
1057 // usable.
1058
1059 SetUpdateCheckAllowed(false);
1060
1061 // Add a second URL; update with this URL attempted and failed enough times to
1062 // disqualify the current (first) URL.
1063 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1064 update_state.num_checks = 5;
1065 update_state.download_urls.emplace_back("http://another/fake/url/");
1066 Time t = fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(12);
1067 for (int i = 0; i < 5; i++) {
1068 update_state.download_errors.emplace_back(
1069 0, ErrorCode::kDownloadTransferError, t);
1070 t += TimeDelta::FromSeconds(1);
1071 }
1072
1073 // Check that the UpdateCanStart returns true.
1074 UpdateDownloadParams result;
1075 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1076 update_state);
1077 EXPECT_TRUE(result.update_can_start);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001078 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001079 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001080 EXPECT_EQ(5, result.download_url_num_errors);
1081 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001082}
1083
1084TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlMaxExceeded) {
1085 // The UpdateCanStart policy returns true; the first URL exceeded the maximum
1086 // allowed number of failures, but a second URL is available.
1087
1088 SetUpdateCheckAllowed(false);
1089
1090 // Add a second URL; update with this URL attempted and failed enough times to
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001091 // disqualify the current (first) URL.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001092 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1093 update_state.num_checks = 10;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001094 update_state.download_urls.emplace_back("http://another/fake/url/");
1095 Time t = fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(12);
1096 for (int i = 0; i < 11; i++) {
1097 update_state.download_errors.emplace_back(
1098 0, ErrorCode::kDownloadTransferError, t);
1099 t += TimeDelta::FromSeconds(1);
1100 }
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001101
1102 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001103 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001104 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001105 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001106 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001107 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001108 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001109 EXPECT_EQ(0, result.download_url_num_errors);
1110 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001111}
1112
1113TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlHardError) {
1114 // The UpdateCanStart policy returns true; the first URL fails with a hard
1115 // error, but a second URL is available.
1116
1117 SetUpdateCheckAllowed(false);
1118
1119 // Add a second URL; update with this URL attempted and failed in a way that
1120 // causes it to switch directly to the next URL.
1121 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1122 update_state.num_checks = 10;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001123 update_state.download_urls.emplace_back("http://another/fake/url/");
1124 update_state.download_errors.emplace_back(
1125 0, ErrorCode::kPayloadHashMismatchError,
1126 fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(1));
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001127
1128 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001129 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001130 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001131 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001132 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001133 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001134 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001135 EXPECT_EQ(0, result.download_url_num_errors);
1136 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001137}
1138
1139TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedUrlWrapsAround) {
1140 // The UpdateCanStart policy returns true; URL search properly wraps around
1141 // the last one on the list.
1142
1143 SetUpdateCheckAllowed(false);
1144
1145 // Add a second URL; update with this URL attempted and failed in a way that
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001146 // causes it to switch directly to the next URL. We must disable backoff in
1147 // order for it not to interfere.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001148 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001149 update_state.num_checks = 1;
1150 update_state.is_backoff_disabled = true;
1151 update_state.download_urls.emplace_back("http://another/fake/url/");
1152 update_state.download_errors.emplace_back(
1153 1, ErrorCode::kPayloadHashMismatchError,
1154 fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(1));
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001155
1156 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001157 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001158 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001159 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001160 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001161 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001162 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001163 EXPECT_EQ(0, result.download_url_num_errors);
1164 EXPECT_TRUE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001165}
1166
1167TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedNoUsableUrls) {
1168 // The UpdateCanStart policy returns false; there's a single HTTP URL but its
1169 // use is forbidden by policy.
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001170 //
1171 // Note: In the case where no usable URLs are found, the policy should not
1172 // increment the number of failed attempts! Doing so would result in a
1173 // non-idempotent semantics, and does not fall within the intended purpose of
1174 // the backoff mechanism anyway.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001175
1176 SetUpdateCheckAllowed(false);
1177
1178 // Override specific device policy attributes.
1179 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1180 new bool(false));
1181
1182 // Check that the UpdateCanStart returns false.
1183 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001184 UpdateDownloadParams result;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001185 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1186 update_state);
1187 EXPECT_FALSE(result.update_can_start);
1188 EXPECT_EQ(UpdateCannotStartReason::kCannotDownload,
1189 result.cannot_start_reason);
1190 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001191}
1192
1193TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoUsableUrlsButP2PEnabled) {
1194 // The UpdateCanStart policy returns true; there's a single HTTP URL but its
1195 // use is forbidden by policy, however P2P is enabled. The result indicates
1196 // that no URL can be used.
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001197 //
1198 // Note: The number of failed attempts should not increase in this case (see
1199 // above test).
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001200
1201 SetUpdateCheckAllowed(false);
1202
1203 // Override specific device policy attributes.
1204 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1205 new bool(true));
1206 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1207 new bool(false));
1208
1209 // Check that the UpdateCanStart returns true.
1210 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
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 Arnoldb2f99192014-10-07 13:01:52 -07001215 EXPECT_TRUE(result.p2p_downloading_allowed);
1216 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001217 EXPECT_GT(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001218 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001219 EXPECT_EQ(0, result.download_url_num_errors);
1220 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001221}
1222
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001223TEST_F(UmChromeOSPolicyTest,
1224 UpdateCanStartAllowedNoUsableUrlsButEnterpriseEnrolled) {
1225 // The UpdateCanStart policy returns true; there's a single HTTP URL but its
1226 // use is forbidden by policy, and P2P is unset on the policy, however the
1227 // device is enterprise-enrolled so P2P is allowed. The result indicates that
1228 // no URL can be used.
1229 //
1230 // Note: The number of failed attempts should not increase in this case (see
1231 // above test).
1232
1233 SetUpdateCheckAllowed(false);
1234
1235 // Override specific device policy attributes.
1236 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(nullptr);
1237 fake_state_.device_policy_provider()->var_owner()->reset(nullptr);
1238 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1239 new bool(false));
1240
1241 // Check that the UpdateCanStart returns true.
1242 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1243 UpdateDownloadParams result;
1244 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1245 update_state);
1246 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001247 EXPECT_TRUE(result.p2p_downloading_allowed);
1248 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001249 EXPECT_GT(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001250 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001251 EXPECT_EQ(0, result.download_url_num_errors);
1252 EXPECT_FALSE(result.do_increment_failures);
1253}
1254
Gilad Arnold684219d2014-07-07 14:54:57 -07001255TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedEthernetDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001256 // Ethernet is always allowed.
1257
1258 fake_state_.shill_provider()->var_conn_type()->
1259 reset(new ConnectionType(ConnectionType::kEthernet));
1260
1261 bool result;
1262 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001263 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001264 EXPECT_TRUE(result);
1265}
1266
Gilad Arnold684219d2014-07-07 14:54:57 -07001267TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWifiDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001268 // Wifi is allowed if not tethered.
1269
1270 fake_state_.shill_provider()->var_conn_type()->
1271 reset(new ConnectionType(ConnectionType::kWifi));
1272
1273 bool result;
1274 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001275 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001276 EXPECT_TRUE(result);
1277}
1278
Alex Deymo63784a52014-05-28 10:46:14 -07001279TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001280 UpdateCurrentConnectionNotAllowedWifiTetheredDefault) {
1281 // Tethered wifi is not allowed by default.
1282
1283 fake_state_.shill_provider()->var_conn_type()->
1284 reset(new ConnectionType(ConnectionType::kWifi));
1285 fake_state_.shill_provider()->var_conn_tethering()->
1286 reset(new ConnectionTethering(ConnectionTethering::kConfirmed));
1287
1288 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001289 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001290 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001291}
1292
Alex Deymo63784a52014-05-28 10:46:14 -07001293TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001294 UpdateDownloadAllowedWifiTetheredPolicyOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001295 // Tethered wifi can be allowed by policy.
1296
1297 fake_state_.shill_provider()->var_conn_type()->
1298 reset(new ConnectionType(ConnectionType::kWifi));
1299 fake_state_.shill_provider()->var_conn_tethering()->
1300 reset(new ConnectionTethering(ConnectionTethering::kConfirmed));
1301 set<ConnectionType> allowed_connections;
1302 allowed_connections.insert(ConnectionType::kCellular);
1303 fake_state_.device_policy_provider()->
1304 var_allowed_connection_types_for_update()->
1305 reset(new set<ConnectionType>(allowed_connections));
1306
1307 bool result;
1308 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001309 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001310 EXPECT_TRUE(result);
1311}
1312
Gilad Arnold684219d2014-07-07 14:54:57 -07001313TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWimaxDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001314 // Wimax is always allowed.
1315
1316 fake_state_.shill_provider()->var_conn_type()->
1317 reset(new ConnectionType(ConnectionType::kWifi));
1318
1319 bool result;
1320 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001321 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001322 EXPECT_TRUE(result);
1323}
1324
Alex Deymo63784a52014-05-28 10:46:14 -07001325TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001326 UpdateCurrentConnectionNotAllowedBluetoothDefault) {
1327 // Bluetooth is never allowed.
1328
1329 fake_state_.shill_provider()->var_conn_type()->
1330 reset(new ConnectionType(ConnectionType::kBluetooth));
1331
1332 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001333 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001334 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001335}
1336
Alex Deymo63784a52014-05-28 10:46:14 -07001337TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001338 UpdateCurrentConnectionNotAllowedBluetoothPolicyCannotOverride) {
1339 // Bluetooth cannot be allowed even by policy.
1340
1341 fake_state_.shill_provider()->var_conn_type()->
1342 reset(new ConnectionType(ConnectionType::kBluetooth));
1343 set<ConnectionType> allowed_connections;
1344 allowed_connections.insert(ConnectionType::kBluetooth);
1345 fake_state_.device_policy_provider()->
1346 var_allowed_connection_types_for_update()->
1347 reset(new set<ConnectionType>(allowed_connections));
1348
1349 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001350 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001351 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001352}
1353
Alex Deymo63784a52014-05-28 10:46:14 -07001354TEST_F(UmChromeOSPolicyTest, UpdateCurrentConnectionNotAllowedCellularDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001355 // Cellular is not allowed by default.
1356
1357 fake_state_.shill_provider()->var_conn_type()->
1358 reset(new ConnectionType(ConnectionType::kCellular));
1359
1360 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001361 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001362 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001363}
1364
Alex Deymo63784a52014-05-28 10:46:14 -07001365TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001366 UpdateDownloadAllowedCellularPolicyOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001367 // Update over cellular can be enabled by policy.
1368
1369 fake_state_.shill_provider()->var_conn_type()->
1370 reset(new ConnectionType(ConnectionType::kCellular));
1371 set<ConnectionType> allowed_connections;
1372 allowed_connections.insert(ConnectionType::kCellular);
1373 fake_state_.device_policy_provider()->
1374 var_allowed_connection_types_for_update()->
1375 reset(new set<ConnectionType>(allowed_connections));
1376
1377 bool result;
1378 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001379 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001380 EXPECT_TRUE(result);
1381}
1382
Alex Deymo63784a52014-05-28 10:46:14 -07001383TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001384 UpdateDownloadAllowedCellularUserOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001385 // Update over cellular can be enabled by user settings, but only if policy
1386 // is present and does not determine allowed connections.
1387
1388 fake_state_.shill_provider()->var_conn_type()->
1389 reset(new ConnectionType(ConnectionType::kCellular));
1390 set<ConnectionType> allowed_connections;
1391 allowed_connections.insert(ConnectionType::kCellular);
1392 fake_state_.updater_provider()->var_cellular_enabled()->
1393 reset(new bool(true));
1394
1395 bool result;
1396 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001397 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001398 EXPECT_TRUE(result);
1399}
1400
Gilad Arnold14a9e702014-10-08 08:09:09 -07001401TEST_F(UmChromeOSPolicyTest,
1402 UpdateCanStartAllowedScatteringSupressedDueToP2P) {
1403 // The UpdateCanStart policy returns true; scattering should have applied, but
1404 // P2P download is allowed. Scattering values are nonetheless returned, and so
1405 // are download URL values, albeit the latter are not allowed to be used.
1406
1407 SetUpdateCheckAllowed(false);
1408 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
1409 new TimeDelta(TimeDelta::FromMinutes(2)));
1410 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1411
1412 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
1413 update_state.scatter_wait_period = TimeDelta::FromSeconds(35);
1414
1415 UpdateDownloadParams result;
1416 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart,
1417 &result, update_state);
1418 EXPECT_TRUE(result.update_can_start);
1419 EXPECT_EQ(0, result.download_url_idx);
1420 EXPECT_FALSE(result.download_url_allowed);
1421 EXPECT_EQ(0, result.download_url_num_errors);
1422 EXPECT_TRUE(result.p2p_downloading_allowed);
1423 EXPECT_TRUE(result.p2p_sharing_allowed);
1424 EXPECT_FALSE(result.do_increment_failures);
1425 EXPECT_EQ(TimeDelta::FromSeconds(35), result.scatter_wait_period);
1426 EXPECT_EQ(0, result.scatter_check_threshold);
1427}
1428
1429TEST_F(UmChromeOSPolicyTest,
1430 UpdateCanStartAllowedBackoffSupressedDueToP2P) {
1431 // The UpdateCanStart policy returns true; backoff should have applied, but
1432 // P2P download is allowed. Backoff values are nonetheless returned, and so
1433 // are download URL values, albeit the latter are not allowed to be used.
1434
1435 SetUpdateCheckAllowed(false);
1436
1437 const Time curr_time = fake_clock_.GetWallclockTime();
1438 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
1439 update_state.download_errors_max = 1;
1440 update_state.download_errors.emplace_back(
1441 0, ErrorCode::kDownloadTransferError,
1442 curr_time - TimeDelta::FromSeconds(8));
1443 update_state.download_errors.emplace_back(
1444 0, ErrorCode::kDownloadTransferError,
1445 curr_time - TimeDelta::FromSeconds(2));
1446 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1447
1448 UpdateDownloadParams result;
1449 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1450 update_state);
1451 EXPECT_TRUE(result.update_can_start);
1452 EXPECT_EQ(0, result.download_url_idx);
1453 EXPECT_FALSE(result.download_url_allowed);
1454 EXPECT_EQ(0, result.download_url_num_errors);
1455 EXPECT_TRUE(result.p2p_downloading_allowed);
1456 EXPECT_TRUE(result.p2p_sharing_allowed);
1457 EXPECT_TRUE(result.do_increment_failures);
1458 EXPECT_LT(curr_time, result.backoff_expiry);
1459}
1460
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001461TEST_F(UmChromeOSPolicyTest, P2PEnabledNotAllowed) {
1462 bool result;
1463 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1464 EXPECT_FALSE(result);
1465}
1466
1467TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedByDevicePolicy) {
1468 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1469 new bool(true));
1470
1471 bool result;
1472 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1473 EXPECT_TRUE(result);
1474}
1475
1476TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedByUpdater) {
1477 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1478
1479 bool result;
1480 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1481 EXPECT_TRUE(result);
1482}
1483
1484TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedDeviceEnterpriseEnrolled) {
1485 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(nullptr);
1486 fake_state_.device_policy_provider()->var_owner()->reset(nullptr);
1487
1488 bool result;
1489 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1490 EXPECT_TRUE(result);
1491}
1492
1493TEST_F(UmChromeOSPolicyTest, P2PEnabledChangedBlocks) {
1494 bool result;
1495 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::P2PEnabledChanged,
1496 &result, false);
1497}
1498
Alex Deymo63784a52014-05-28 10:46:14 -07001499} // namespace chromeos_update_manager