blob: 5bd416d3f5747b993c1057f2ffc0abc02da4b0c3 [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.
Amin Hassani4b717432019-01-14 16:24:20 -080052 fake_state_.config_provider()->var_is_oobe_enabled()->reset(new bool(true));
Gilad Arnolda1eabcd2014-07-09 15:42:40 -070053
Gilad Arnold76a11f62014-05-20 09:02:12 -070054 // For the purpose of the tests, this is an official build and OOBE was
55 // completed.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070056 fake_state_.system_provider()->var_is_official_build()->reset(
57 new bool(true));
Gilad Arnold76a11f62014-05-20 09:02:12 -070058 fake_state_.system_provider()->var_is_oobe_complete()->reset(
59 new bool(true));
Aaron Woodc73fdc12017-12-06 11:09:15 -080060 // NOLINTNEXTLINE(readability/casting)
Alex Deymo763e7db2015-08-27 21:08:08 -070061 fake_state_.system_provider()->var_num_slots()->reset(new unsigned int(2));
Gilad Arnold0adbc942014-05-12 10:35:43 -070062
63 // Connection is wifi, untethered.
Amin Hassani4b717432019-01-14 16:24:20 -080064 fake_state_.shill_provider()->var_conn_type()->reset(
65 new ConnectionType(ConnectionType::kWifi));
66 fake_state_.shill_provider()->var_conn_tethering()->reset(
67 new ConnectionTethering(ConnectionTethering::kNotDetected));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070068 }
69
Gilad Arnoldb3b05442014-05-30 14:25:05 -070070 // Sets up a default device policy that does not impose any restrictions
71 // (HTTP) nor enables any features (P2P).
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070072 void SetUpDefaultDevicePolicy() {
73 fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
74 new bool(true));
75 fake_state_.device_policy_provider()->var_update_disabled()->reset(
76 new bool(false));
Amin Hassani4b717432019-01-14 16:24:20 -080077 fake_state_.device_policy_provider()
78 ->var_allowed_connection_types_for_update()
79 ->reset(nullptr);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070080 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));
Amin Hassani4b717432019-01-14 16:24:20 -080086 fake_state_.device_policy_provider()
87 ->var_release_channel_delegated()
88 ->reset(new bool(true));
Adolfo Victoria94ffe132018-06-28 16:14:56 -070089 fake_state_.device_policy_provider()
90 ->var_disallowed_time_intervals()
91 ->reset(new WeeklyTimeIntervalVector());
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070092 }
93
Amin Hassani186ff6a2018-02-27 11:06:03 -080094 // Configures the policy to return a desired value from UpdateCheckAllowed by
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070095 // faking the current wall clock time as needed. Restores the default state.
96 // This is used when testing policies that depend on this one.
Amin Hassani186ff6a2018-02-27 11:06:03 -080097 //
98 // Note that the default implementation relies on NextUpdateCheckPolicyImpl to
99 // set the FakeClock to the appropriate time.
100 virtual void SetUpdateCheckAllowed(bool allow_check) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700101 Time next_update_check;
Amin Hassani186ff6a2018-02-27 11:06:03 -0800102 CallMethodWithContext(&NextUpdateCheckTimePolicyImpl::NextUpdateCheckTime,
103 &next_update_check,
104 ChromeOSPolicy::kNextUpdateCheckPolicyConstants);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700105 SetUpDefaultState();
106 SetUpDefaultDevicePolicy();
107 Time curr_time = next_update_check;
108 if (allow_check)
109 curr_time += TimeDelta::FromSeconds(1);
110 else
111 curr_time -= TimeDelta::FromSeconds(1);
Amin Hassani0468a762020-11-17 23:53:48 -0800112 fake_clock_->SetWallclockTime(curr_time);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700113 }
Marton Hunyady8b936f22018-06-15 16:44:37 +0200114
115 // Sets the policies required for a kiosk app to control Chrome OS version:
116 // - AllowKioskAppControlChromeVersion = True
117 // - UpdateDisabled = True
118 // In the kiosk app manifest:
119 // - RequiredPlatformVersion = 1234.
120 void SetKioskAppControlsChromeOsVersion() {
121 fake_state_.device_policy_provider()
122 ->var_allow_kiosk_app_control_chrome_version()
123 ->reset(new bool(true));
124 fake_state_.device_policy_provider()->var_update_disabled()->reset(
125 new bool(true));
126 fake_state_.system_provider()->var_kiosk_required_platform_version()->reset(
127 new string("1234."));
128 }
129
130 // Sets up a test with the value of RollbackToTargetVersion policy (and
131 // whether it's set), and returns the value of
132 // UpdateCheckParams.rollback_allowed.
133 bool TestRollbackAllowed(bool set_policy,
134 RollbackToTargetVersion rollback_to_target_version) {
135 // Update check is allowed, response includes attributes for use in the
136 // request.
137 SetUpdateCheckAllowed(true);
138
139 if (set_policy) {
140 // Override RollbackToTargetVersion device policy attribute.
141 fake_state_.device_policy_provider()
142 ->var_rollback_to_target_version()
143 ->reset(new RollbackToTargetVersion(rollback_to_target_version));
144 }
145
146 UpdateCheckParams result;
147 ExpectPolicyStatus(
148 EvalStatus::kSucceeded, &Policy::UpdateCheckAllowed, &result);
149 return result.rollback_allowed;
150 }
Adolfo Victoria94ffe132018-06-28 16:14:56 -0700151
152 // Sets up a test with the given intervals and the current fake wallclock
153 // time.
154 void TestDisallowedTimeIntervals(const WeeklyTimeIntervalVector& intervals,
Adolfo Victoria7a7a0822018-07-27 13:35:24 -0700155 const ErrorCode& expected_error_code,
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -0700156 bool kiosk) {
Adolfo Victoria94ffe132018-06-28 16:14:56 -0700157 SetUpDefaultTimeProvider();
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -0700158 if (kiosk)
159 fake_state_.device_policy_provider()
160 ->var_auto_launched_kiosk_app_id()
161 ->reset(new string("myapp"));
Adolfo Victoria94ffe132018-06-28 16:14:56 -0700162 fake_state_.device_policy_provider()
163 ->var_disallowed_time_intervals()
164 ->reset(new WeeklyTimeIntervalVector(intervals));
165
166 // Check that |expected_status| matches the value of UpdateCheckAllowed
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -0700167 ErrorCode result;
168 InstallPlan install_plan;
Adolfo Victoria7a7a0822018-07-27 13:35:24 -0700169 ExpectPolicyStatus(EvalStatus::kSucceeded,
170 &Policy::UpdateCanBeApplied,
171 &result,
172 &install_plan);
173 EXPECT_EQ(result, expected_error_code);
Adolfo Victoria94ffe132018-06-28 16:14:56 -0700174 }
Alex Deymo0d11c602014-04-23 20:12:20 -0700175};
176
Alex Deymo63784a52014-05-28 10:46:14 -0700177TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWaitsForTheTimeout) {
Alex Deymo0d11c602014-04-23 20:12:20 -0700178 // We get the next update_check timestamp from the policy's private method
179 // and then we check the public method respects that value on the normal
180 // case.
181 Time next_update_check;
182 Time last_checked_time =
Amin Hassani0468a762020-11-17 23:53:48 -0800183 fake_clock_->GetWallclockTime() + TimeDelta::FromMinutes(1234);
Alex Deymo0d11c602014-04-23 20:12:20 -0700184
Alex Deymo0d11c602014-04-23 20:12:20 -0700185 fake_state_.updater_provider()->var_last_checked_time()->reset(
186 new Time(last_checked_time));
Amin Hassani186ff6a2018-02-27 11:06:03 -0800187 CallMethodWithContext(&NextUpdateCheckTimePolicyImpl::NextUpdateCheckTime,
188 &next_update_check,
189 ChromeOSPolicy::kNextUpdateCheckPolicyConstants);
Alex Deymo0d11c602014-04-23 20:12:20 -0700190
191 UpdateCheckParams result;
192
193 // Check that the policy blocks until the next_update_check is reached.
194 SetUpDefaultClock();
195 SetUpDefaultState();
196 fake_state_.updater_provider()->var_last_checked_time()->reset(
197 new Time(last_checked_time));
Amin Hassani0468a762020-11-17 23:53:48 -0800198 fake_clock_->SetWallclockTime(next_update_check - TimeDelta::FromSeconds(1));
Amin Hassani4b717432019-01-14 16:24:20 -0800199 ExpectPolicyStatus(
200 EvalStatus::kAskMeAgainLater, &Policy::UpdateCheckAllowed, &result);
Alex Deymo0d11c602014-04-23 20:12:20 -0700201
202 SetUpDefaultClock();
203 SetUpDefaultState();
204 fake_state_.updater_provider()->var_last_checked_time()->reset(
205 new Time(last_checked_time));
Amin Hassani0468a762020-11-17 23:53:48 -0800206 fake_clock_->SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
Amin Hassani4b717432019-01-14 16:24:20 -0800207 ExpectPolicyStatus(
208 EvalStatus::kSucceeded, &Policy::UpdateCheckAllowed, &result);
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700209 EXPECT_TRUE(result.updates_enabled);
Amin Hassanied37d682018-04-06 13:22:00 -0700210 EXPECT_FALSE(result.interactive);
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700211}
212
213TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWaitsForOOBE) {
Alex Vakulenko072359c2014-07-18 11:41:07 -0700214 // Update checks are deferred until OOBE is completed.
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700215
216 // Ensure that update is not allowed even if wait period is satisfied.
217 Time next_update_check;
218 Time last_checked_time =
Amin Hassani0468a762020-11-17 23:53:48 -0800219 fake_clock_->GetWallclockTime() + TimeDelta::FromMinutes(1234);
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700220
221 fake_state_.updater_provider()->var_last_checked_time()->reset(
222 new Time(last_checked_time));
Amin Hassani186ff6a2018-02-27 11:06:03 -0800223 CallMethodWithContext(&NextUpdateCheckTimePolicyImpl::NextUpdateCheckTime,
224 &next_update_check,
225 ChromeOSPolicy::kNextUpdateCheckPolicyConstants);
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700226
227 SetUpDefaultClock();
228 SetUpDefaultState();
229 fake_state_.updater_provider()->var_last_checked_time()->reset(
230 new Time(last_checked_time));
Amin Hassani0468a762020-11-17 23:53:48 -0800231 fake_clock_->SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
Amin Hassani4b717432019-01-14 16:24:20 -0800232 fake_state_.system_provider()->var_is_oobe_complete()->reset(new bool(false));
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700233
234 UpdateCheckParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800235 ExpectPolicyStatus(
236 EvalStatus::kAskMeAgainLater, &Policy::UpdateCheckAllowed, &result);
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700237
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));
Amin Hassani0468a762020-11-17 23:53:48 -0800243 fake_clock_->SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
Amin Hassani4b717432019-01-14 16:24:20 -0800244 ExpectPolicyStatus(
245 EvalStatus::kSucceeded, &Policy::UpdateCheckAllowed, &result);
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700246 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.
Amin Hassani4b717432019-01-14 16:24:20 -0800256 fake_state_.device_policy_provider()->var_target_version_prefix()->reset(
257 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));
Amin Hassani4b717432019-01-14 16:24:20 -0800263 fake_state_.device_policy_provider()->var_release_channel()->reset(
264 new string("foo-channel"));
Amin Hassani37b67232020-08-13 09:29:48 -0700265 fake_state_.device_policy_provider()->var_release_lts_tag()->reset(
266 new string("foo-hint"));
Saurabh Nijhara43d7adc2020-11-06 16:13:02 +0100267 fake_state_.device_policy_provider()->var_quick_fix_build_token()->reset(
268 new string("foo-token"));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700269
270 UpdateCheckParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800271 ExpectPolicyStatus(
272 EvalStatus::kSucceeded, &Policy::UpdateCheckAllowed, &result);
Gilad Arnold42f253b2014-06-25 12:39:17 -0700273 EXPECT_TRUE(result.updates_enabled);
Gilad Arnoldd4b30322014-07-21 15:35:27 -0700274 EXPECT_EQ("1.2", result.target_version_prefix);
Marton Hunyady0e0e3542018-02-21 18:51:39 +0100275 EXPECT_EQ(5, result.rollback_allowed_milestones);
Gilad Arnold42f253b2014-06-25 12:39:17 -0700276 EXPECT_EQ("foo-channel", result.target_channel);
Amin Hassani37b67232020-08-13 09:29:48 -0700277 EXPECT_EQ("foo-hint", result.lts_tag);
Saurabh Nijhara43d7adc2020-11-06 16:13:02 +0100278 EXPECT_EQ("foo-token", result.quick_fix_build_token);
Amin Hassanied37d682018-04-06 13:22:00 -0700279 EXPECT_FALSE(result.interactive);
Gilad Arnold42f253b2014-06-25 12:39:17 -0700280}
281
Marton Hunyadyd4bc4622018-08-30 15:52:23 +0200282TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedRollbackAndPowerwash) {
Marton Hunyady8b936f22018-06-15 16:44:37 +0200283 EXPECT_TRUE(TestRollbackAllowed(
Marton Hunyadyd4bc4622018-08-30 15:52:23 +0200284 true, RollbackToTargetVersion::kRollbackAndPowerwash));
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200285}
286
Marton Hunyady31aefb92018-08-29 16:17:03 +0200287TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedRollbackAndRestoreIfPossible) {
288 // We're doing rollback even if we don't support data save and restore.
289 EXPECT_TRUE(TestRollbackAllowed(
290 true, RollbackToTargetVersion::kRollbackAndRestoreIfPossible));
291}
292
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200293TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedRollbackDisabled) {
Marton Hunyady8b936f22018-06-15 16:44:37 +0200294 EXPECT_FALSE(TestRollbackAllowed(true, RollbackToTargetVersion::kDisabled));
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200295}
296
297TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedRollbackUnspecified) {
Marton Hunyady8b936f22018-06-15 16:44:37 +0200298 EXPECT_FALSE(
299 TestRollbackAllowed(true, RollbackToTargetVersion::kUnspecified));
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200300}
301
302TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedRollbackNotSet) {
Marton Hunyady8b936f22018-06-15 16:44:37 +0200303 EXPECT_FALSE(
304 TestRollbackAllowed(false, RollbackToTargetVersion::kUnspecified));
305}
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200306
Marton Hunyady8b936f22018-06-15 16:44:37 +0200307TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskRollbackAllowed) {
308 SetKioskAppControlsChromeOsVersion();
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200309
Marton Hunyady8b936f22018-06-15 16:44:37 +0200310 EXPECT_TRUE(TestRollbackAllowed(
Marton Hunyadyd4bc4622018-08-30 15:52:23 +0200311 true, RollbackToTargetVersion::kRollbackAndPowerwash));
Marton Hunyady8b936f22018-06-15 16:44:37 +0200312}
313
314TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskRollbackDisabled) {
315 SetKioskAppControlsChromeOsVersion();
316
317 EXPECT_FALSE(TestRollbackAllowed(true, RollbackToTargetVersion::kDisabled));
318}
319
320TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskRollbackUnspecified) {
321 SetKioskAppControlsChromeOsVersion();
322
323 EXPECT_FALSE(
324 TestRollbackAllowed(true, RollbackToTargetVersion::kUnspecified));
325}
326
327TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskRollbackNotSet) {
328 SetKioskAppControlsChromeOsVersion();
329
330 EXPECT_FALSE(
331 TestRollbackAllowed(false, RollbackToTargetVersion::kUnspecified));
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200332}
333
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700334TEST_F(UmChromeOSPolicyTest,
335 UpdateCheckAllowedUpdatesDisabledForUnofficialBuilds) {
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700336 // UpdateCheckAllowed should return kAskMeAgainLater if this is an unofficial
337 // build; we don't want periodic update checks on developer images.
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700338
339 fake_state_.system_provider()->var_is_official_build()->reset(
340 new bool(false));
341
342 UpdateCheckParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800343 ExpectPolicyStatus(
344 EvalStatus::kAskMeAgainLater, &Policy::UpdateCheckAllowed, &result);
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700345}
346
Amin Hassani03277de2020-07-28 12:32:49 -0700347TEST_F(UmChromeOSPolicyTest, TestUpdateCheckIntervalTimeout) {
348 fake_state_.updater_provider()
349 ->var_test_update_check_interval_timeout()
350 ->reset(new int64_t(10));
351 fake_state_.system_provider()->var_is_official_build()->reset(
352 new bool(false));
353
354 // The first time, update should not be allowed.
355 UpdateCheckParams result;
356 ExpectPolicyStatus(
357 EvalStatus::kAskMeAgainLater, &Policy::UpdateCheckAllowed, &result);
358
359 // After moving the time forward more than the update check interval, it
360 // should now allow for update.
Amin Hassani0468a762020-11-17 23:53:48 -0800361 fake_clock_->SetWallclockTime(fake_clock_->GetWallclockTime() +
362 TimeDelta::FromSeconds(11));
Amin Hassani03277de2020-07-28 12:32:49 -0700363 ExpectPolicyStatus(
364 EvalStatus::kSucceeded, &Policy::UpdateCheckAllowed, &result);
365}
366
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700367TEST_F(UmChromeOSPolicyTest,
Aaron Wood56d8ab32017-09-22 15:56:18 -0700368 UpdateCheckAllowedUpdatesDisabledWhenNotEnoughSlotsAbUpdates) {
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700369 // UpdateCheckAllowed should return false (kSucceeded) if the image booted
Aaron Wood56d8ab32017-09-22 15:56:18 -0700370 // without enough slots to do A/B updates.
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700371
Aaron Woodc73fdc12017-12-06 11:09:15 -0800372 // NOLINTNEXTLINE(readability/casting)
Alex Deymo763e7db2015-08-27 21:08:08 -0700373 fake_state_.system_provider()->var_num_slots()->reset(new unsigned int(1));
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700374
375 UpdateCheckParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800376 ExpectPolicyStatus(
377 EvalStatus::kSucceeded, &Policy::UpdateCheckAllowed, &result);
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700378 EXPECT_FALSE(result.updates_enabled);
379}
380
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700381TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedUpdatesDisabledByPolicy) {
Gilad Arnold42f253b2014-06-25 12:39:17 -0700382 // UpdateCheckAllowed should return kAskMeAgainLater because a device policy
383 // is loaded and prohibits updates.
384
385 SetUpdateCheckAllowed(false);
386 fake_state_.device_policy_provider()->var_update_disabled()->reset(
387 new bool(true));
388
Gilad Arnold42f253b2014-06-25 12:39:17 -0700389 UpdateCheckParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800390 ExpectPolicyStatus(
391 EvalStatus::kAskMeAgainLater, &Policy::UpdateCheckAllowed, &result);
Gilad Arnold42f253b2014-06-25 12:39:17 -0700392}
393
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700394TEST_F(UmChromeOSPolicyTest,
395 UpdateCheckAllowedForcedUpdateRequestedInteractive) {
396 // UpdateCheckAllowed should return true because a forced update request was
397 // signaled for an interactive update.
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700398
399 SetUpdateCheckAllowed(true);
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700400 fake_state_.updater_provider()->var_forced_update_requested()->reset(
401 new UpdateRequestStatus(UpdateRequestStatus::kInteractive));
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700402
403 UpdateCheckParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800404 ExpectPolicyStatus(
405 EvalStatus::kSucceeded, &Policy::UpdateCheckAllowed, &result);
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700406 EXPECT_TRUE(result.updates_enabled);
Amin Hassanied37d682018-04-06 13:22:00 -0700407 EXPECT_TRUE(result.interactive);
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700408}
409
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700410TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedForcedUpdateRequestedPeriodic) {
411 // UpdateCheckAllowed should return true because a forced update request was
412 // signaled for a periodic check.
413
414 SetUpdateCheckAllowed(true);
415 fake_state_.updater_provider()->var_forced_update_requested()->reset(
416 new UpdateRequestStatus(UpdateRequestStatus::kPeriodic));
417
418 UpdateCheckParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800419 ExpectPolicyStatus(
420 EvalStatus::kSucceeded, &Policy::UpdateCheckAllowed, &result);
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700421 EXPECT_TRUE(result.updates_enabled);
Amin Hassanied37d682018-04-06 13:22:00 -0700422 EXPECT_FALSE(result.interactive);
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700423}
424
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800425TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskPin) {
426 // Update check is allowed.
427 SetUpdateCheckAllowed(true);
428
Marton Hunyady8b936f22018-06-15 16:44:37 +0200429 SetKioskAppControlsChromeOsVersion();
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800430
431 UpdateCheckParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800432 ExpectPolicyStatus(
433 EvalStatus::kSucceeded, &Policy::UpdateCheckAllowed, &result);
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800434 EXPECT_TRUE(result.updates_enabled);
Marton Hunyady8b936f22018-06-15 16:44:37 +0200435 EXPECT_EQ("1234.", result.target_version_prefix);
Amin Hassanied37d682018-04-06 13:22:00 -0700436 EXPECT_FALSE(result.interactive);
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800437}
438
439TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedDisabledWhenNoKioskPin) {
440 // Update check is allowed.
441 SetUpdateCheckAllowed(true);
442
443 // Disable AU policy is set but kiosk pin policy is set to false. Update is
444 // disabled in such case.
445 fake_state_.device_policy_provider()->var_update_disabled()->reset(
446 new bool(true));
447 fake_state_.device_policy_provider()
448 ->var_allow_kiosk_app_control_chrome_version()
449 ->reset(new bool(false));
450
451 UpdateCheckParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800452 ExpectPolicyStatus(
453 EvalStatus::kAskMeAgainLater, &Policy::UpdateCheckAllowed, &result);
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800454}
455
456TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskPinWithNoRequiredVersion) {
457 // Update check is allowed.
458 SetUpdateCheckAllowed(true);
459
460 // AU disabled, allow kiosk to pin but there is no kiosk required platform
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700461 // version (i.e. app does not provide the info). Update to latest in such
462 // case.
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800463 fake_state_.device_policy_provider()->var_update_disabled()->reset(
464 new bool(true));
465 fake_state_.device_policy_provider()
466 ->var_allow_kiosk_app_control_chrome_version()
467 ->reset(new bool(true));
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700468 fake_state_.system_provider()->var_kiosk_required_platform_version()->reset(
469 new string());
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800470
471 UpdateCheckParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800472 ExpectPolicyStatus(
473 EvalStatus::kSucceeded, &Policy::UpdateCheckAllowed, &result);
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800474 EXPECT_TRUE(result.updates_enabled);
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700475 EXPECT_TRUE(result.target_version_prefix.empty());
Amin Hassanied37d682018-04-06 13:22:00 -0700476 EXPECT_FALSE(result.interactive);
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800477}
478
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700479TEST_F(UmChromeOSPolicyTest,
480 UpdateCheckAllowedKioskPinWithFailedGetRequiredVersionCall) {
481 // AU disabled, allow kiosk to pin but D-Bus call to get required platform
482 // version failed. Defer update check in this case.
483 fake_state_.device_policy_provider()->var_update_disabled()->reset(
484 new bool(true));
485 fake_state_.device_policy_provider()
486 ->var_allow_kiosk_app_control_chrome_version()
487 ->reset(new bool(true));
488 fake_state_.system_provider()->var_kiosk_required_platform_version()->reset(
489 nullptr);
490
491 UpdateCheckParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800492 ExpectPolicyStatus(
493 EvalStatus::kAskMeAgainLater, &Policy::UpdateCheckAllowed, &result);
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700494}
495
Alex Deymo63784a52014-05-28 10:46:14 -0700496TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsCheckAllowedError) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700497 // The UpdateCanStart policy fails, not being able to query
498 // UpdateCheckAllowed.
499
500 // Configure the UpdateCheckAllowed policy to fail.
501 fake_state_.updater_provider()->var_updater_started_time()->reset(nullptr);
502
503 // Check that the UpdateCanStart fails.
504 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700505 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800506 ExpectPolicyStatus(
507 EvalStatus::kFailed, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700508}
509
Alex Deymo63784a52014-05-28 10:46:14 -0700510TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedCheckDue) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700511 // The UpdateCanStart policy returns false because we are due for another
Gilad Arnold14a9e702014-10-08 08:09:09 -0700512 // update check. Ensure that download related values are still returned.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700513
514 SetUpdateCheckAllowed(true);
515
516 // Check that the UpdateCanStart returns false.
517 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700518 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800519 ExpectPolicyStatus(
520 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700521 EXPECT_FALSE(result.update_can_start);
522 EXPECT_EQ(UpdateCannotStartReason::kCheckDue, result.cannot_start_reason);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700523 EXPECT_EQ(0, result.download_url_idx);
524 EXPECT_EQ(0, result.download_url_num_errors);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700525}
526
Alex Deymo63784a52014-05-28 10:46:14 -0700527TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoDevicePolicy) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700528 // The UpdateCanStart policy returns true; no device policy is loaded.
529
530 SetUpdateCheckAllowed(false);
531 fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
532 new bool(false));
533
534 // Check that the UpdateCanStart returns true with no further attributes.
535 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700536 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800537 ExpectPolicyStatus(
538 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700539 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700540 EXPECT_FALSE(result.p2p_downloading_allowed);
541 EXPECT_FALSE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700542 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_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700546}
547
Alex Deymo63784a52014-05-28 10:46:14 -0700548TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBlankPolicy) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700549 // The UpdateCanStart policy returns true; device policy is loaded but imposes
550 // no restrictions on updating.
551
552 SetUpdateCheckAllowed(false);
553
554 // Check that the UpdateCanStart returns true.
555 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700556 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800557 ExpectPolicyStatus(
558 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700559 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700560 EXPECT_FALSE(result.p2p_downloading_allowed);
561 EXPECT_FALSE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700562 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700563 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700564 EXPECT_EQ(0, result.download_url_num_errors);
565 EXPECT_FALSE(result.do_increment_failures);
566}
567
568TEST_F(UmChromeOSPolicyTest,
569 UpdateCanStartNotAllowedBackoffNewWaitPeriodApplies) {
570 // The UpdateCanStart policy returns false; failures are reported and a new
571 // backoff period is enacted.
572
573 SetUpdateCheckAllowed(false);
574
Amin Hassani0468a762020-11-17 23:53:48 -0800575 const Time curr_time = fake_clock_->GetWallclockTime();
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700576 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
577 update_state.download_errors_max = 1;
578 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800579 0,
580 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700581 curr_time - TimeDelta::FromSeconds(8));
582 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800583 0,
584 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700585 curr_time - TimeDelta::FromSeconds(2));
586
587 // Check that UpdateCanStart returns false and a new backoff expiry is
588 // generated.
589 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800590 ExpectPolicyStatus(
591 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700592 EXPECT_FALSE(result.update_can_start);
593 EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
594 EXPECT_TRUE(result.do_increment_failures);
595 EXPECT_LT(curr_time, result.backoff_expiry);
596}
597
598TEST_F(UmChromeOSPolicyTest,
599 UpdateCanStartNotAllowedBackoffPrevWaitPeriodStillApplies) {
600 // The UpdateCanStart policy returns false; a previously enacted backoff
601 // period still applies.
602
603 SetUpdateCheckAllowed(false);
604
Amin Hassani0468a762020-11-17 23:53:48 -0800605 const Time curr_time = fake_clock_->GetWallclockTime();
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700606 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
607 update_state.download_errors_max = 1;
608 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800609 0,
610 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700611 curr_time - TimeDelta::FromSeconds(8));
612 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800613 0,
614 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700615 curr_time - TimeDelta::FromSeconds(2));
616 update_state.failures_last_updated = curr_time;
617 update_state.backoff_expiry = curr_time + TimeDelta::FromMinutes(3);
618
619 // Check that UpdateCanStart returns false and a new backoff expiry is
620 // generated.
621 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800622 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
623 &Policy::UpdateCanStart,
624 &result,
625 update_state);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700626 EXPECT_FALSE(result.update_can_start);
627 EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
628 EXPECT_FALSE(result.do_increment_failures);
629 EXPECT_LT(curr_time, result.backoff_expiry);
630}
631
632TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffSatisfied) {
633 // The UpdateCanStart policy returns true; a previously enacted backoff period
634 // has elapsed, we're good to go.
635
636 SetUpdateCheckAllowed(false);
637
Amin Hassani0468a762020-11-17 23:53:48 -0800638 const Time curr_time = fake_clock_->GetWallclockTime();
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700639 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
640 update_state.download_errors_max = 1;
641 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800642 0,
643 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700644 curr_time - TimeDelta::FromSeconds(8));
645 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800646 0,
647 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700648 curr_time - TimeDelta::FromSeconds(2));
649 update_state.failures_last_updated = curr_time - TimeDelta::FromSeconds(1);
650 update_state.backoff_expiry = curr_time - TimeDelta::FromSeconds(1);
651
652 // Check that UpdateCanStart returns false and a new backoff expiry is
653 // generated.
654 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800655 ExpectPolicyStatus(
656 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700657 EXPECT_TRUE(result.update_can_start);
658 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
659 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700660 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700661 EXPECT_EQ(0, result.download_url_num_errors);
662 EXPECT_FALSE(result.do_increment_failures);
663 EXPECT_EQ(Time(), result.backoff_expiry);
664}
665
666TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffDisabled) {
667 // The UpdateCanStart policy returns false; failures are reported but backoff
668 // is disabled.
669
670 SetUpdateCheckAllowed(false);
671
Amin Hassani0468a762020-11-17 23:53:48 -0800672 const Time curr_time = fake_clock_->GetWallclockTime();
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700673 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
674 update_state.download_errors_max = 1;
675 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800676 0,
677 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700678 curr_time - TimeDelta::FromSeconds(8));
679 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800680 0,
681 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700682 curr_time - TimeDelta::FromSeconds(2));
683 update_state.is_backoff_disabled = true;
684
685 // Check that UpdateCanStart returns false and a new backoff expiry is
686 // generated.
687 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800688 ExpectPolicyStatus(
689 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700690 EXPECT_TRUE(result.update_can_start);
691 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
692 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700693 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700694 EXPECT_EQ(0, result.download_url_num_errors);
695 EXPECT_TRUE(result.do_increment_failures);
696 EXPECT_EQ(Time(), result.backoff_expiry);
697}
698
699TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffInteractive) {
700 // The UpdateCanStart policy returns false; failures are reported but this is
701 // an interactive update check.
702
703 SetUpdateCheckAllowed(false);
704
Amin Hassani0468a762020-11-17 23:53:48 -0800705 const Time curr_time = fake_clock_->GetWallclockTime();
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700706 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
707 update_state.download_errors_max = 1;
708 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800709 0,
710 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700711 curr_time - TimeDelta::FromSeconds(8));
712 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800713 0,
714 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700715 curr_time - TimeDelta::FromSeconds(2));
Amin Hassanied37d682018-04-06 13:22:00 -0700716 update_state.interactive = true;
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700717
718 // Check that UpdateCanStart returns false and a new backoff expiry is
719 // generated.
720 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800721 ExpectPolicyStatus(
722 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700723 EXPECT_TRUE(result.update_can_start);
724 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
725 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700726 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700727 EXPECT_EQ(0, result.download_url_num_errors);
728 EXPECT_TRUE(result.do_increment_failures);
729 EXPECT_EQ(Time(), result.backoff_expiry);
730}
731
732TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffDelta) {
733 // The UpdateCanStart policy returns false; failures are reported but this is
734 // a delta payload.
735
736 SetUpdateCheckAllowed(false);
737
Amin Hassani0468a762020-11-17 23:53:48 -0800738 const Time curr_time = fake_clock_->GetWallclockTime();
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700739 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
740 update_state.download_errors_max = 1;
741 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800742 0,
743 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700744 curr_time - TimeDelta::FromSeconds(8));
745 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800746 0,
747 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700748 curr_time - TimeDelta::FromSeconds(2));
749 update_state.is_delta_payload = true;
750
751 // Check that UpdateCanStart returns false and a new backoff expiry is
752 // generated.
753 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800754 ExpectPolicyStatus(
755 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700756 EXPECT_TRUE(result.update_can_start);
757 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
758 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700759 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700760 EXPECT_EQ(0, result.download_url_num_errors);
761 EXPECT_TRUE(result.do_increment_failures);
762 EXPECT_EQ(Time(), result.backoff_expiry);
763}
764
765TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffUnofficialBuild) {
766 // The UpdateCanStart policy returns false; failures are reported but this is
767 // an unofficial build.
768
769 SetUpdateCheckAllowed(false);
770
Amin Hassani0468a762020-11-17 23:53:48 -0800771 const Time curr_time = fake_clock_->GetWallclockTime();
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700772 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
773 update_state.download_errors_max = 1;
774 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800775 0,
776 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700777 curr_time - TimeDelta::FromSeconds(8));
778 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800779 0,
780 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700781 curr_time - TimeDelta::FromSeconds(2));
782
Amin Hassani4b717432019-01-14 16:24:20 -0800783 fake_state_.system_provider()->var_is_official_build()->reset(
784 new bool(false));
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700785
786 // Check that UpdateCanStart returns false and a new backoff expiry is
787 // generated.
788 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800789 ExpectPolicyStatus(
790 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700791 EXPECT_TRUE(result.update_can_start);
792 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
793 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700794 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700795 EXPECT_EQ(0, result.download_url_num_errors);
796 EXPECT_TRUE(result.do_increment_failures);
797 EXPECT_EQ(Time(), result.backoff_expiry);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700798}
799
Alex Deymo63784a52014-05-28 10:46:14 -0700800TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsScatteringFailed) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700801 // The UpdateCanStart policy fails because the UpdateScattering policy it
802 // depends on fails (unset variable).
803
804 SetUpdateCheckAllowed(false);
805
806 // Override the default seed variable with a null value so that the policy
807 // request would fail.
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700808 // TODO(garnold) This failure may or may not fail a number
809 // sub-policies/decisions, like scattering and backoff. We'll need a more
810 // deliberate setup to ensure that we're failing what we want to be failing.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700811 fake_state_.random_provider()->var_seed()->reset(nullptr);
812
813 // Check that the UpdateCanStart fails.
814 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700815 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800816 ExpectPolicyStatus(
817 EvalStatus::kFailed, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700818}
819
Alex Deymo63784a52014-05-28 10:46:14 -0700820TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700821 UpdateCanStartNotAllowedScatteringNewWaitPeriodApplies) {
822 // The UpdateCanStart policy returns false; device policy is loaded and
823 // scattering applies due to an unsatisfied wait period, which was newly
824 // generated.
825
826 SetUpdateCheckAllowed(false);
827 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
828 new TimeDelta(TimeDelta::FromMinutes(2)));
829
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700830 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
831
832 // Check that the UpdateCanStart returns false and a new wait period
833 // generated.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700834 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800835 ExpectPolicyStatus(
836 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700837 EXPECT_FALSE(result.update_can_start);
838 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
839 EXPECT_LT(TimeDelta(), result.scatter_wait_period);
840 EXPECT_EQ(0, result.scatter_check_threshold);
841}
842
Alex Deymo63784a52014-05-28 10:46:14 -0700843TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700844 UpdateCanStartNotAllowedScatteringPrevWaitPeriodStillApplies) {
845 // The UpdateCanStart policy returns false w/ kAskMeAgainLater; device policy
846 // is loaded and a previously generated scattering period still applies, none
847 // of the scattering values has changed.
848
849 SetUpdateCheckAllowed(false);
850 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
851 new TimeDelta(TimeDelta::FromMinutes(2)));
852
853 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
854 update_state.scatter_wait_period = TimeDelta::FromSeconds(35);
855
856 // Check that the UpdateCanStart returns false and a new wait period
857 // generated.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700858 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800859 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
860 &Policy::UpdateCanStart,
861 &result,
862 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700863 EXPECT_FALSE(result.update_can_start);
864 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
865 EXPECT_EQ(TimeDelta::FromSeconds(35), result.scatter_wait_period);
866 EXPECT_EQ(0, result.scatter_check_threshold);
867}
868
Alex Deymo63784a52014-05-28 10:46:14 -0700869TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700870 UpdateCanStartNotAllowedScatteringNewCountThresholdApplies) {
871 // The UpdateCanStart policy returns false; device policy is loaded and
872 // scattering applies due to an unsatisfied update check count threshold.
873 //
874 // This ensures a non-zero check threshold, which may or may not be combined
875 // with a non-zero wait period (for which we cannot reliably control).
876
877 SetUpdateCheckAllowed(false);
878 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
879 new TimeDelta(TimeDelta::FromSeconds(1)));
880
881 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
882 update_state.scatter_check_threshold_min = 2;
883 update_state.scatter_check_threshold_max = 5;
884
885 // Check that the UpdateCanStart returns false.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700886 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800887 ExpectPolicyStatus(
888 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700889 EXPECT_FALSE(result.update_can_start);
890 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
891 EXPECT_LE(2, result.scatter_check_threshold);
892 EXPECT_GE(5, result.scatter_check_threshold);
893}
894
Alex Deymo63784a52014-05-28 10:46:14 -0700895TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700896 UpdateCanStartNotAllowedScatteringPrevCountThresholdStillApplies) {
897 // The UpdateCanStart policy returns false; device policy is loaded and
898 // scattering due to a previously generated count threshold still applies.
899
900 SetUpdateCheckAllowed(false);
901 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
902 new TimeDelta(TimeDelta::FromSeconds(1)));
903
904 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
905 update_state.scatter_check_threshold = 3;
906 update_state.scatter_check_threshold_min = 2;
907 update_state.scatter_check_threshold_max = 5;
908
909 // Check that the UpdateCanStart returns false.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700910 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800911 ExpectPolicyStatus(
912 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700913 EXPECT_FALSE(result.update_can_start);
914 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
915 EXPECT_EQ(3, result.scatter_check_threshold);
916}
917
Alex Deymo63784a52014-05-28 10:46:14 -0700918TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedScatteringSatisfied) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700919 // The UpdateCanStart policy returns true; device policy is loaded and
920 // scattering is enabled, but both wait period and check threshold are
921 // satisfied.
922
923 SetUpdateCheckAllowed(false);
924 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
925 new TimeDelta(TimeDelta::FromSeconds(120)));
926
927 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(75));
928 update_state.num_checks = 4;
929 update_state.scatter_wait_period = TimeDelta::FromSeconds(60);
930 update_state.scatter_check_threshold = 3;
931 update_state.scatter_check_threshold_min = 2;
932 update_state.scatter_check_threshold_max = 5;
933
934 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700935 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800936 ExpectPolicyStatus(
937 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700938 EXPECT_TRUE(result.update_can_start);
939 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
940 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700941 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700942 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700943 EXPECT_EQ(0, result.download_url_num_errors);
944 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700945}
946
Alex Deymo63784a52014-05-28 10:46:14 -0700947TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700948 UpdateCanStartAllowedInteractivePreventsScattering) {
949 // The UpdateCanStart policy returns true; device policy is loaded and
950 // scattering would have applied, except that the update check is interactive
951 // and so it is suppressed.
952
953 SetUpdateCheckAllowed(false);
954 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
955 new TimeDelta(TimeDelta::FromSeconds(1)));
956
957 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Amin Hassanied37d682018-04-06 13:22:00 -0700958 update_state.interactive = true;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700959 update_state.scatter_check_threshold = 0;
960 update_state.scatter_check_threshold_min = 2;
961 update_state.scatter_check_threshold_max = 5;
962
963 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700964 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800965 ExpectPolicyStatus(
966 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700967 EXPECT_TRUE(result.update_can_start);
968 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
969 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700970 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700971 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700972 EXPECT_EQ(0, result.download_url_num_errors);
973 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700974}
975
Amin Hassani4b717432019-01-14 16:24:20 -0800976TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedOobePreventsScattering) {
Gilad Arnold76a11f62014-05-20 09:02:12 -0700977 // The UpdateCanStart policy returns true; device policy is loaded and
978 // scattering would have applied, except that OOBE was not completed and so it
979 // is suppressed.
980
981 SetUpdateCheckAllowed(false);
982 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
983 new TimeDelta(TimeDelta::FromSeconds(1)));
984 fake_state_.system_provider()->var_is_oobe_complete()->reset(new bool(false));
985
986 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Amin Hassanied37d682018-04-06 13:22:00 -0700987 update_state.interactive = true;
Gilad Arnold76a11f62014-05-20 09:02:12 -0700988 update_state.scatter_check_threshold = 0;
989 update_state.scatter_check_threshold_min = 2;
990 update_state.scatter_check_threshold_max = 5;
991
992 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700993 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800994 ExpectPolicyStatus(
995 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnold76a11f62014-05-20 09:02:12 -0700996 EXPECT_TRUE(result.update_can_start);
997 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
998 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700999 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001000 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001001 EXPECT_EQ(0, result.download_url_num_errors);
1002 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnold76a11f62014-05-20 09:02:12 -07001003}
1004
Alex Deymo63784a52014-05-28 10:46:14 -07001005TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithAttributes) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001006 // The UpdateCanStart policy returns true; device policy permits both HTTP and
1007 // P2P updates, as well as a non-empty target channel string.
1008
1009 SetUpdateCheckAllowed(false);
1010
1011 // Override specific device policy attributes.
1012 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1013 new bool(true));
1014 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1015 new bool(true));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001016
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;
Amin Hassani4b717432019-01-14 16:24:20 -08001020 ExpectPolicyStatus(
1021 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001022 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001023 EXPECT_TRUE(result.p2p_downloading_allowed);
1024 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001025 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001026 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001027 EXPECT_EQ(0, result.download_url_num_errors);
1028 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001029}
1030
Alex Deymo63784a52014-05-28 10:46:14 -07001031TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithP2PFromUpdater) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001032 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1033 // P2P updates, but the updater is configured to allow P2P and overrules the
1034 // setting.
1035
1036 SetUpdateCheckAllowed(false);
1037
1038 // Override specific device policy attributes.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001039 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1040
1041 // Check that the UpdateCanStart returns true.
1042 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001043 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001044 ExpectPolicyStatus(
1045 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001046 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001047 EXPECT_TRUE(result.p2p_downloading_allowed);
1048 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001049 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001050 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001051 EXPECT_EQ(0, result.download_url_num_errors);
1052 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001053}
1054
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001055TEST_F(UmChromeOSPolicyTest,
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001056 UpdateCanStartAllowedP2PDownloadingBlockedDueToOmaha) {
1057 // The UpdateCanStart policy returns true; device policy permits HTTP, but
1058 // policy blocks P2P downloading because Omaha forbids it. P2P sharing is
1059 // still permitted.
1060
1061 SetUpdateCheckAllowed(false);
1062
1063 // Override specific device policy attributes.
1064 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1065 new bool(true));
1066 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1067 new bool(true));
1068
1069 // Check that the UpdateCanStart returns true.
1070 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1071 update_state.p2p_downloading_disabled = true;
1072 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001073 ExpectPolicyStatus(
1074 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001075 EXPECT_TRUE(result.update_can_start);
1076 EXPECT_FALSE(result.p2p_downloading_allowed);
1077 EXPECT_TRUE(result.p2p_sharing_allowed);
1078}
1079
Amin Hassani4b717432019-01-14 16:24:20 -08001080TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedP2PSharingBlockedDueToOmaha) {
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001081 // The UpdateCanStart policy returns true; device policy permits HTTP, but
1082 // policy blocks P2P sharing because Omaha forbids it. P2P downloading is
1083 // still permitted.
1084
1085 SetUpdateCheckAllowed(false);
1086
1087 // Override specific device policy attributes.
1088 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1089 new bool(true));
1090 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1091 new bool(true));
1092
1093 // Check that the UpdateCanStart returns true.
1094 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1095 update_state.p2p_sharing_disabled = true;
1096 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001097 ExpectPolicyStatus(
1098 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001099 EXPECT_TRUE(result.update_can_start);
1100 EXPECT_TRUE(result.p2p_downloading_allowed);
1101 EXPECT_FALSE(result.p2p_sharing_allowed);
1102}
1103
1104TEST_F(UmChromeOSPolicyTest,
1105 UpdateCanStartAllowedP2PDownloadingBlockedDueToNumAttempts) {
Gilad Arnold349ac832014-10-06 14:20:28 -07001106 // The UpdateCanStart policy returns true; device policy permits HTTP but
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001107 // blocks P2P download, because the max number of P2P downloads have been
1108 // attempted. P2P sharing is still permitted.
Gilad Arnold349ac832014-10-06 14:20:28 -07001109
1110 SetUpdateCheckAllowed(false);
1111
1112 // Override specific device policy attributes.
1113 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1114 new bool(true));
1115 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1116 new bool(true));
1117
1118 // Check that the UpdateCanStart returns true.
1119 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1120 update_state.p2p_num_attempts = ChromeOSPolicy::kMaxP2PAttempts;
1121 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001122 ExpectPolicyStatus(
1123 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnold349ac832014-10-06 14:20:28 -07001124 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001125 EXPECT_FALSE(result.p2p_downloading_allowed);
1126 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnold349ac832014-10-06 14:20:28 -07001127}
1128
1129TEST_F(UmChromeOSPolicyTest,
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001130 UpdateCanStartAllowedP2PDownloadingBlockedDueToAttemptsPeriod) {
Gilad Arnold349ac832014-10-06 14:20:28 -07001131 // The UpdateCanStart policy returns true; device policy permits HTTP but
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001132 // blocks P2P download, because the max period for attempt to download via P2P
1133 // has elapsed. P2P sharing is still permitted.
Gilad Arnold349ac832014-10-06 14:20:28 -07001134
1135 SetUpdateCheckAllowed(false);
1136
1137 // Override specific device policy attributes.
1138 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1139 new bool(true));
1140 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1141 new bool(true));
1142
1143 // Check that the UpdateCanStart returns true.
1144 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1145 update_state.p2p_num_attempts = 1;
1146 update_state.p2p_first_attempted =
Amin Hassani0468a762020-11-17 23:53:48 -08001147 fake_clock_->GetWallclockTime() -
Amin Hassani4b717432019-01-14 16:24:20 -08001148 TimeDelta::FromSeconds(ChromeOSPolicy::kMaxP2PAttemptsPeriodInSeconds +
1149 1);
Gilad Arnold349ac832014-10-06 14:20:28 -07001150 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001151 ExpectPolicyStatus(
1152 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnold349ac832014-10-06 14:20:28 -07001153 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001154 EXPECT_FALSE(result.p2p_downloading_allowed);
1155 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnold349ac832014-10-06 14:20:28 -07001156}
1157
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001158TEST_F(UmChromeOSPolicyTest,
1159 UpdateCanStartAllowedWithHttpUrlForUnofficialBuild) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001160 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1161 // P2P updates, but marking this an unofficial build overrules the HTTP
1162 // setting.
1163
1164 SetUpdateCheckAllowed(false);
1165
1166 // Override specific device policy attributes.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001167 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1168 new bool(false));
Amin Hassani4b717432019-01-14 16:24:20 -08001169 fake_state_.system_provider()->var_is_official_build()->reset(
1170 new bool(false));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001171
1172 // Check that the UpdateCanStart returns true.
1173 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001174 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001175 ExpectPolicyStatus(
1176 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001177 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001178 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001179 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001180 EXPECT_EQ(0, result.download_url_num_errors);
1181 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001182}
1183
1184TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithHttpsUrl) {
1185 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1186 // P2P updates, but an HTTPS URL is provided and selected for download.
1187
1188 SetUpdateCheckAllowed(false);
1189
1190 // Override specific device policy attributes.
1191 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1192 new bool(false));
1193
1194 // Add an HTTPS URL.
1195 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001196 update_state.download_urls.emplace_back("https://secure/url/");
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001197
1198 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001199 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001200 ExpectPolicyStatus(
1201 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001202 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001203 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001204 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001205 EXPECT_EQ(0, result.download_url_num_errors);
1206 EXPECT_FALSE(result.do_increment_failures);
1207}
1208
1209TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedMaxErrorsNotExceeded) {
1210 // The UpdateCanStart policy returns true; the first URL has download errors
1211 // but does not exceed the maximum allowed number of failures, so it is stilli
1212 // usable.
1213
1214 SetUpdateCheckAllowed(false);
1215
1216 // Add a second URL; update with this URL attempted and failed enough times to
1217 // disqualify the current (first) URL.
1218 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1219 update_state.num_checks = 5;
1220 update_state.download_urls.emplace_back("http://another/fake/url/");
Amin Hassani0468a762020-11-17 23:53:48 -08001221 Time t = fake_clock_->GetWallclockTime() - TimeDelta::FromSeconds(12);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001222 for (int i = 0; i < 5; i++) {
1223 update_state.download_errors.emplace_back(
1224 0, ErrorCode::kDownloadTransferError, t);
1225 t += TimeDelta::FromSeconds(1);
1226 }
1227
1228 // Check that the UpdateCanStart returns true.
1229 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001230 ExpectPolicyStatus(
1231 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001232 EXPECT_TRUE(result.update_can_start);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001233 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001234 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001235 EXPECT_EQ(5, result.download_url_num_errors);
1236 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001237}
1238
1239TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlMaxExceeded) {
1240 // The UpdateCanStart policy returns true; the first URL exceeded the maximum
1241 // allowed number of failures, but a second URL is available.
1242
1243 SetUpdateCheckAllowed(false);
1244
1245 // Add a second URL; update with this URL attempted and failed enough times to
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001246 // disqualify the current (first) URL.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001247 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1248 update_state.num_checks = 10;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001249 update_state.download_urls.emplace_back("http://another/fake/url/");
Amin Hassani0468a762020-11-17 23:53:48 -08001250 Time t = fake_clock_->GetWallclockTime() - TimeDelta::FromSeconds(12);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001251 for (int i = 0; i < 11; i++) {
1252 update_state.download_errors.emplace_back(
1253 0, ErrorCode::kDownloadTransferError, t);
1254 t += TimeDelta::FromSeconds(1);
1255 }
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001256
1257 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001258 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001259 ExpectPolicyStatus(
1260 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001261 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001262 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001263 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001264 EXPECT_EQ(0, result.download_url_num_errors);
1265 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001266}
1267
1268TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlHardError) {
1269 // The UpdateCanStart policy returns true; the first URL fails with a hard
1270 // error, but a second URL is available.
1271
1272 SetUpdateCheckAllowed(false);
1273
1274 // Add a second URL; update with this URL attempted and failed in a way that
1275 // causes it to switch directly to the next URL.
1276 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1277 update_state.num_checks = 10;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001278 update_state.download_urls.emplace_back("http://another/fake/url/");
1279 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -08001280 0,
1281 ErrorCode::kPayloadHashMismatchError,
Amin Hassani0468a762020-11-17 23:53:48 -08001282 fake_clock_->GetWallclockTime() - TimeDelta::FromSeconds(1));
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001283
1284 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001285 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001286 ExpectPolicyStatus(
1287 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001288 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001289 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001290 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001291 EXPECT_EQ(0, result.download_url_num_errors);
1292 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001293}
1294
1295TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedUrlWrapsAround) {
1296 // The UpdateCanStart policy returns true; URL search properly wraps around
1297 // the last one on the list.
1298
1299 SetUpdateCheckAllowed(false);
1300
1301 // Add a second URL; update with this URL attempted and failed in a way that
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001302 // causes it to switch directly to the next URL. We must disable backoff in
1303 // order for it not to interfere.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001304 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001305 update_state.num_checks = 1;
1306 update_state.is_backoff_disabled = true;
1307 update_state.download_urls.emplace_back("http://another/fake/url/");
1308 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -08001309 1,
1310 ErrorCode::kPayloadHashMismatchError,
Amin Hassani0468a762020-11-17 23:53:48 -08001311 fake_clock_->GetWallclockTime() - TimeDelta::FromSeconds(1));
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001312
1313 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001314 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001315 ExpectPolicyStatus(
1316 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001317 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001318 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001319 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001320 EXPECT_EQ(0, result.download_url_num_errors);
1321 EXPECT_TRUE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001322}
1323
1324TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedNoUsableUrls) {
1325 // The UpdateCanStart policy returns false; there's a single HTTP URL but its
1326 // use is forbidden by policy.
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001327 //
1328 // Note: In the case where no usable URLs are found, the policy should not
1329 // increment the number of failed attempts! Doing so would result in a
1330 // non-idempotent semantics, and does not fall within the intended purpose of
1331 // the backoff mechanism anyway.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001332
1333 SetUpdateCheckAllowed(false);
1334
1335 // Override specific device policy attributes.
1336 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1337 new bool(false));
1338
1339 // Check that the UpdateCanStart returns false.
1340 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001341 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001342 ExpectPolicyStatus(
1343 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001344 EXPECT_FALSE(result.update_can_start);
1345 EXPECT_EQ(UpdateCannotStartReason::kCannotDownload,
1346 result.cannot_start_reason);
1347 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001348}
1349
1350TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoUsableUrlsButP2PEnabled) {
1351 // The UpdateCanStart policy returns true; there's a single HTTP URL but its
1352 // use is forbidden by policy, however P2P is enabled. The result indicates
1353 // that no URL can be used.
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001354 //
1355 // Note: The number of failed attempts should not increase in this case (see
1356 // above test).
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001357
1358 SetUpdateCheckAllowed(false);
1359
1360 // Override specific device policy attributes.
1361 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1362 new bool(true));
1363 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1364 new bool(false));
1365
1366 // Check that the UpdateCanStart returns true.
1367 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001368 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001369 ExpectPolicyStatus(
1370 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001371 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001372 EXPECT_TRUE(result.p2p_downloading_allowed);
1373 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001374 EXPECT_GT(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001375 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001376 EXPECT_EQ(0, result.download_url_num_errors);
1377 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001378}
1379
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001380TEST_F(UmChromeOSPolicyTest,
1381 UpdateCanStartAllowedNoUsableUrlsButEnterpriseEnrolled) {
1382 // The UpdateCanStart policy returns true; there's a single HTTP URL but its
1383 // use is forbidden by policy, and P2P is unset on the policy, however the
1384 // device is enterprise-enrolled so P2P is allowed. The result indicates that
1385 // no URL can be used.
1386 //
1387 // Note: The number of failed attempts should not increase in this case (see
1388 // above test).
1389
1390 SetUpdateCheckAllowed(false);
1391
1392 // Override specific device policy attributes.
1393 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(nullptr);
Jae Hoon Kim9d9492f2019-06-17 14:52:48 -07001394 fake_state_.device_policy_provider()->var_has_owner()->reset(new bool(false));
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001395 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1396 new bool(false));
1397
1398 // Check that the UpdateCanStart returns true.
1399 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1400 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001401 ExpectPolicyStatus(
1402 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001403 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001404 EXPECT_TRUE(result.p2p_downloading_allowed);
1405 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001406 EXPECT_GT(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001407 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001408 EXPECT_EQ(0, result.download_url_num_errors);
1409 EXPECT_FALSE(result.do_increment_failures);
1410}
1411
Amin Hassani4b717432019-01-14 16:24:20 -08001412TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedScatteringSupressedDueToP2P) {
Gilad Arnold14a9e702014-10-08 08:09:09 -07001413 // The UpdateCanStart policy returns true; scattering should have applied, but
1414 // P2P download is allowed. Scattering values are nonetheless returned, and so
1415 // are download URL values, albeit the latter are not allowed to be used.
1416
1417 SetUpdateCheckAllowed(false);
1418 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
1419 new TimeDelta(TimeDelta::FromMinutes(2)));
1420 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1421
1422 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
1423 update_state.scatter_wait_period = TimeDelta::FromSeconds(35);
1424
1425 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001426 ExpectPolicyStatus(
1427 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001428 EXPECT_TRUE(result.update_can_start);
1429 EXPECT_EQ(0, result.download_url_idx);
1430 EXPECT_FALSE(result.download_url_allowed);
1431 EXPECT_EQ(0, result.download_url_num_errors);
1432 EXPECT_TRUE(result.p2p_downloading_allowed);
1433 EXPECT_TRUE(result.p2p_sharing_allowed);
1434 EXPECT_FALSE(result.do_increment_failures);
1435 EXPECT_EQ(TimeDelta::FromSeconds(35), result.scatter_wait_period);
1436 EXPECT_EQ(0, result.scatter_check_threshold);
1437}
1438
Amin Hassani4b717432019-01-14 16:24:20 -08001439TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffSupressedDueToP2P) {
Gilad Arnold14a9e702014-10-08 08:09:09 -07001440 // The UpdateCanStart policy returns true; backoff should have applied, but
1441 // P2P download is allowed. Backoff values are nonetheless returned, and so
1442 // are download URL values, albeit the latter are not allowed to be used.
1443
1444 SetUpdateCheckAllowed(false);
1445
Amin Hassani0468a762020-11-17 23:53:48 -08001446 const Time curr_time = fake_clock_->GetWallclockTime();
Gilad Arnold14a9e702014-10-08 08:09:09 -07001447 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
1448 update_state.download_errors_max = 1;
1449 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -08001450 0,
1451 ErrorCode::kDownloadTransferError,
Gilad Arnold14a9e702014-10-08 08:09:09 -07001452 curr_time - TimeDelta::FromSeconds(8));
1453 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -08001454 0,
1455 ErrorCode::kDownloadTransferError,
Gilad Arnold14a9e702014-10-08 08:09:09 -07001456 curr_time - TimeDelta::FromSeconds(2));
1457 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1458
1459 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001460 ExpectPolicyStatus(
1461 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001462 EXPECT_TRUE(result.update_can_start);
1463 EXPECT_EQ(0, result.download_url_idx);
1464 EXPECT_FALSE(result.download_url_allowed);
1465 EXPECT_EQ(0, result.download_url_num_errors);
1466 EXPECT_TRUE(result.p2p_downloading_allowed);
1467 EXPECT_TRUE(result.p2p_sharing_allowed);
1468 EXPECT_TRUE(result.do_increment_failures);
1469 EXPECT_LT(curr_time, result.backoff_expiry);
1470}
1471
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001472TEST_F(UmChromeOSPolicyTest, P2PEnabledNotAllowed) {
1473 bool result;
1474 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1475 EXPECT_FALSE(result);
1476}
1477
1478TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedByDevicePolicy) {
1479 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1480 new bool(true));
1481
1482 bool result;
1483 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1484 EXPECT_TRUE(result);
1485}
1486
1487TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedByUpdater) {
1488 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1489
1490 bool result;
1491 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1492 EXPECT_TRUE(result);
1493}
1494
1495TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedDeviceEnterpriseEnrolled) {
1496 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(nullptr);
Jae Hoon Kim9d9492f2019-06-17 14:52:48 -07001497 fake_state_.device_policy_provider()->var_has_owner()->reset(new bool(false));
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001498
1499 bool result;
1500 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1501 EXPECT_TRUE(result);
1502}
1503
1504TEST_F(UmChromeOSPolicyTest, P2PEnabledChangedBlocks) {
1505 bool result;
Amin Hassani4b717432019-01-14 16:24:20 -08001506 ExpectPolicyStatus(
1507 EvalStatus::kAskMeAgainLater, &Policy::P2PEnabledChanged, &result, false);
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001508}
1509
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -07001510TEST_F(UmChromeOSPolicyTest,
1511 UpdateCanBeAppliedForcedUpdatesDisablesTimeRestrictions) {
Amin Hassani0468a762020-11-17 23:53:48 -08001512 Time curr_time = fake_clock_->GetWallclockTime();
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -07001513 fake_state_.updater_provider()->var_forced_update_requested()->reset(
1514 new UpdateRequestStatus(UpdateRequestStatus::kInteractive));
1515 // Should return kAskMeAgainLater when updated are not forced.
1516 TestDisallowedTimeIntervals(
1517 {WeeklyTimeInterval(
1518 WeeklyTime::FromTime(curr_time),
1519 WeeklyTime::FromTime(curr_time + TimeDelta::FromMinutes(1)))},
Adolfo Victoria7a7a0822018-07-27 13:35:24 -07001520 ErrorCode::kSuccess,
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -07001521 /* kiosk = */ true);
1522}
1523
1524TEST_F(UmChromeOSPolicyTest, UpdateCanBeAppliedFailsInDisallowedTime) {
Amin Hassani0468a762020-11-17 23:53:48 -08001525 Time curr_time = fake_clock_->GetWallclockTime();
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -07001526 TestDisallowedTimeIntervals(
1527 {WeeklyTimeInterval(
1528 WeeklyTime::FromTime(curr_time),
1529 WeeklyTime::FromTime(curr_time + TimeDelta::FromMinutes(1)))},
Adolfo Victoria7a7a0822018-07-27 13:35:24 -07001530 ErrorCode::kOmahaUpdateDeferredPerPolicy,
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -07001531 /* kiosk = */ true);
1532}
1533
1534TEST_F(UmChromeOSPolicyTest, UpdateCanBeAppliedOutsideDisallowedTime) {
Amin Hassani0468a762020-11-17 23:53:48 -08001535 Time curr_time = fake_clock_->GetWallclockTime();
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -07001536 TestDisallowedTimeIntervals(
1537 {WeeklyTimeInterval(
1538 WeeklyTime::FromTime(curr_time - TimeDelta::FromHours(3)),
1539 WeeklyTime::FromTime(curr_time))},
Adolfo Victoria7a7a0822018-07-27 13:35:24 -07001540 ErrorCode::kSuccess,
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -07001541 /* kiosk = */ true);
1542}
1543
1544TEST_F(UmChromeOSPolicyTest, UpdateCanBeAppliedPassesOnNonKiosk) {
Amin Hassani0468a762020-11-17 23:53:48 -08001545 Time curr_time = fake_clock_->GetWallclockTime();
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -07001546 TestDisallowedTimeIntervals(
1547 {WeeklyTimeInterval(
1548 WeeklyTime::FromTime(curr_time),
1549 WeeklyTime::FromTime(curr_time + TimeDelta::FromMinutes(1)))},
Adolfo Victoria7a7a0822018-07-27 13:35:24 -07001550 ErrorCode::kSuccess,
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -07001551 /* kiosk = */ false);
1552}
1553
Alex Deymo63784a52014-05-28 10:46:14 -07001554} // namespace chromeos_update_manager