blob: 25c91fa2003f84e5a29c1cd44d168638a1facd83 [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);
112 fake_clock_.SetWallclockTime(curr_time);
113 }
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 =
183 fake_clock_.GetWallclockTime() + TimeDelta::FromMinutes(1234);
184
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));
198 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));
206 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 =
219 fake_clock_.GetWallclockTime() + TimeDelta::FromMinutes(1234);
220
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));
231 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));
243 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"));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700265
266 UpdateCheckParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800267 ExpectPolicyStatus(
268 EvalStatus::kSucceeded, &Policy::UpdateCheckAllowed, &result);
Gilad Arnold42f253b2014-06-25 12:39:17 -0700269 EXPECT_TRUE(result.updates_enabled);
Gilad Arnoldd4b30322014-07-21 15:35:27 -0700270 EXPECT_EQ("1.2", result.target_version_prefix);
Marton Hunyady0e0e3542018-02-21 18:51:39 +0100271 EXPECT_EQ(5, result.rollback_allowed_milestones);
Gilad Arnold42f253b2014-06-25 12:39:17 -0700272 EXPECT_EQ("foo-channel", result.target_channel);
Amin Hassanied37d682018-04-06 13:22:00 -0700273 EXPECT_FALSE(result.interactive);
Gilad Arnold42f253b2014-06-25 12:39:17 -0700274}
275
Marton Hunyadyd4bc4622018-08-30 15:52:23 +0200276TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedRollbackAndPowerwash) {
Marton Hunyady8b936f22018-06-15 16:44:37 +0200277 EXPECT_TRUE(TestRollbackAllowed(
Marton Hunyadyd4bc4622018-08-30 15:52:23 +0200278 true, RollbackToTargetVersion::kRollbackAndPowerwash));
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200279}
280
Marton Hunyady31aefb92018-08-29 16:17:03 +0200281TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedRollbackAndRestoreIfPossible) {
282 // We're doing rollback even if we don't support data save and restore.
283 EXPECT_TRUE(TestRollbackAllowed(
284 true, RollbackToTargetVersion::kRollbackAndRestoreIfPossible));
285}
286
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200287TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedRollbackDisabled) {
Marton Hunyady8b936f22018-06-15 16:44:37 +0200288 EXPECT_FALSE(TestRollbackAllowed(true, RollbackToTargetVersion::kDisabled));
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200289}
290
291TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedRollbackUnspecified) {
Marton Hunyady8b936f22018-06-15 16:44:37 +0200292 EXPECT_FALSE(
293 TestRollbackAllowed(true, RollbackToTargetVersion::kUnspecified));
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200294}
295
296TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedRollbackNotSet) {
Marton Hunyady8b936f22018-06-15 16:44:37 +0200297 EXPECT_FALSE(
298 TestRollbackAllowed(false, RollbackToTargetVersion::kUnspecified));
299}
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200300
Marton Hunyady8b936f22018-06-15 16:44:37 +0200301TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskRollbackAllowed) {
302 SetKioskAppControlsChromeOsVersion();
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200303
Marton Hunyady8b936f22018-06-15 16:44:37 +0200304 EXPECT_TRUE(TestRollbackAllowed(
Marton Hunyadyd4bc4622018-08-30 15:52:23 +0200305 true, RollbackToTargetVersion::kRollbackAndPowerwash));
Marton Hunyady8b936f22018-06-15 16:44:37 +0200306}
307
308TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskRollbackDisabled) {
309 SetKioskAppControlsChromeOsVersion();
310
311 EXPECT_FALSE(TestRollbackAllowed(true, RollbackToTargetVersion::kDisabled));
312}
313
314TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskRollbackUnspecified) {
315 SetKioskAppControlsChromeOsVersion();
316
317 EXPECT_FALSE(
318 TestRollbackAllowed(true, RollbackToTargetVersion::kUnspecified));
319}
320
321TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskRollbackNotSet) {
322 SetKioskAppControlsChromeOsVersion();
323
324 EXPECT_FALSE(
325 TestRollbackAllowed(false, RollbackToTargetVersion::kUnspecified));
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200326}
327
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700328TEST_F(UmChromeOSPolicyTest,
329 UpdateCheckAllowedUpdatesDisabledForUnofficialBuilds) {
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700330 // UpdateCheckAllowed should return kAskMeAgainLater if this is an unofficial
331 // build; we don't want periodic update checks on developer images.
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700332
333 fake_state_.system_provider()->var_is_official_build()->reset(
334 new bool(false));
335
336 UpdateCheckParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800337 ExpectPolicyStatus(
338 EvalStatus::kAskMeAgainLater, &Policy::UpdateCheckAllowed, &result);
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700339}
340
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700341TEST_F(UmChromeOSPolicyTest,
Aaron Wood56d8ab32017-09-22 15:56:18 -0700342 UpdateCheckAllowedUpdatesDisabledWhenNotEnoughSlotsAbUpdates) {
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700343 // UpdateCheckAllowed should return false (kSucceeded) if the image booted
Aaron Wood56d8ab32017-09-22 15:56:18 -0700344 // without enough slots to do A/B updates.
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700345
Aaron Woodc73fdc12017-12-06 11:09:15 -0800346 // NOLINTNEXTLINE(readability/casting)
Alex Deymo763e7db2015-08-27 21:08:08 -0700347 fake_state_.system_provider()->var_num_slots()->reset(new unsigned int(1));
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700348
349 UpdateCheckParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800350 ExpectPolicyStatus(
351 EvalStatus::kSucceeded, &Policy::UpdateCheckAllowed, &result);
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700352 EXPECT_FALSE(result.updates_enabled);
353}
354
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700355TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedUpdatesDisabledByPolicy) {
Gilad Arnold42f253b2014-06-25 12:39:17 -0700356 // UpdateCheckAllowed should return kAskMeAgainLater because a device policy
357 // is loaded and prohibits updates.
358
359 SetUpdateCheckAllowed(false);
360 fake_state_.device_policy_provider()->var_update_disabled()->reset(
361 new bool(true));
362
Gilad Arnold42f253b2014-06-25 12:39:17 -0700363 UpdateCheckParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800364 ExpectPolicyStatus(
365 EvalStatus::kAskMeAgainLater, &Policy::UpdateCheckAllowed, &result);
Gilad Arnold42f253b2014-06-25 12:39:17 -0700366}
367
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700368TEST_F(UmChromeOSPolicyTest,
369 UpdateCheckAllowedForcedUpdateRequestedInteractive) {
370 // UpdateCheckAllowed should return true because a forced update request was
371 // signaled for an interactive update.
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700372
373 SetUpdateCheckAllowed(true);
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700374 fake_state_.updater_provider()->var_forced_update_requested()->reset(
375 new UpdateRequestStatus(UpdateRequestStatus::kInteractive));
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700376
377 UpdateCheckParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800378 ExpectPolicyStatus(
379 EvalStatus::kSucceeded, &Policy::UpdateCheckAllowed, &result);
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700380 EXPECT_TRUE(result.updates_enabled);
Amin Hassanied37d682018-04-06 13:22:00 -0700381 EXPECT_TRUE(result.interactive);
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700382}
383
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700384TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedForcedUpdateRequestedPeriodic) {
385 // UpdateCheckAllowed should return true because a forced update request was
386 // signaled for a periodic check.
387
388 SetUpdateCheckAllowed(true);
389 fake_state_.updater_provider()->var_forced_update_requested()->reset(
390 new UpdateRequestStatus(UpdateRequestStatus::kPeriodic));
391
392 UpdateCheckParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800393 ExpectPolicyStatus(
394 EvalStatus::kSucceeded, &Policy::UpdateCheckAllowed, &result);
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700395 EXPECT_TRUE(result.updates_enabled);
Amin Hassanied37d682018-04-06 13:22:00 -0700396 EXPECT_FALSE(result.interactive);
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700397}
398
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800399TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskPin) {
400 // Update check is allowed.
401 SetUpdateCheckAllowed(true);
402
Marton Hunyady8b936f22018-06-15 16:44:37 +0200403 SetKioskAppControlsChromeOsVersion();
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800404
405 UpdateCheckParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800406 ExpectPolicyStatus(
407 EvalStatus::kSucceeded, &Policy::UpdateCheckAllowed, &result);
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800408 EXPECT_TRUE(result.updates_enabled);
Marton Hunyady8b936f22018-06-15 16:44:37 +0200409 EXPECT_EQ("1234.", result.target_version_prefix);
Amin Hassanied37d682018-04-06 13:22:00 -0700410 EXPECT_FALSE(result.interactive);
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800411}
412
413TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedDisabledWhenNoKioskPin) {
414 // Update check is allowed.
415 SetUpdateCheckAllowed(true);
416
417 // Disable AU policy is set but kiosk pin policy is set to false. Update is
418 // disabled in such case.
419 fake_state_.device_policy_provider()->var_update_disabled()->reset(
420 new bool(true));
421 fake_state_.device_policy_provider()
422 ->var_allow_kiosk_app_control_chrome_version()
423 ->reset(new bool(false));
424
425 UpdateCheckParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800426 ExpectPolicyStatus(
427 EvalStatus::kAskMeAgainLater, &Policy::UpdateCheckAllowed, &result);
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800428}
429
430TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskPinWithNoRequiredVersion) {
431 // Update check is allowed.
432 SetUpdateCheckAllowed(true);
433
434 // AU disabled, allow kiosk to pin but there is no kiosk required platform
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700435 // version (i.e. app does not provide the info). Update to latest in such
436 // case.
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800437 fake_state_.device_policy_provider()->var_update_disabled()->reset(
438 new bool(true));
439 fake_state_.device_policy_provider()
440 ->var_allow_kiosk_app_control_chrome_version()
441 ->reset(new bool(true));
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700442 fake_state_.system_provider()->var_kiosk_required_platform_version()->reset(
443 new string());
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800444
445 UpdateCheckParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800446 ExpectPolicyStatus(
447 EvalStatus::kSucceeded, &Policy::UpdateCheckAllowed, &result);
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800448 EXPECT_TRUE(result.updates_enabled);
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700449 EXPECT_TRUE(result.target_version_prefix.empty());
Amin Hassanied37d682018-04-06 13:22:00 -0700450 EXPECT_FALSE(result.interactive);
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800451}
452
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700453TEST_F(UmChromeOSPolicyTest,
454 UpdateCheckAllowedKioskPinWithFailedGetRequiredVersionCall) {
455 // AU disabled, allow kiosk to pin but D-Bus call to get required platform
456 // version failed. Defer update check in this case.
457 fake_state_.device_policy_provider()->var_update_disabled()->reset(
458 new bool(true));
459 fake_state_.device_policy_provider()
460 ->var_allow_kiosk_app_control_chrome_version()
461 ->reset(new bool(true));
462 fake_state_.system_provider()->var_kiosk_required_platform_version()->reset(
463 nullptr);
464
465 UpdateCheckParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800466 ExpectPolicyStatus(
467 EvalStatus::kAskMeAgainLater, &Policy::UpdateCheckAllowed, &result);
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700468}
469
Alex Deymo63784a52014-05-28 10:46:14 -0700470TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsCheckAllowedError) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700471 // The UpdateCanStart policy fails, not being able to query
472 // UpdateCheckAllowed.
473
474 // Configure the UpdateCheckAllowed policy to fail.
475 fake_state_.updater_provider()->var_updater_started_time()->reset(nullptr);
476
477 // Check that the UpdateCanStart fails.
478 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700479 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800480 ExpectPolicyStatus(
481 EvalStatus::kFailed, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700482}
483
Alex Deymo63784a52014-05-28 10:46:14 -0700484TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedCheckDue) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700485 // The UpdateCanStart policy returns false because we are due for another
Gilad Arnold14a9e702014-10-08 08:09:09 -0700486 // update check. Ensure that download related values are still returned.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700487
488 SetUpdateCheckAllowed(true);
489
490 // Check that the UpdateCanStart returns false.
491 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700492 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800493 ExpectPolicyStatus(
494 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700495 EXPECT_FALSE(result.update_can_start);
496 EXPECT_EQ(UpdateCannotStartReason::kCheckDue, result.cannot_start_reason);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700497 EXPECT_EQ(0, result.download_url_idx);
498 EXPECT_EQ(0, result.download_url_num_errors);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700499}
500
Alex Deymo63784a52014-05-28 10:46:14 -0700501TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoDevicePolicy) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700502 // The UpdateCanStart policy returns true; no device policy is loaded.
503
504 SetUpdateCheckAllowed(false);
505 fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
506 new bool(false));
507
508 // Check that the UpdateCanStart returns true with no further attributes.
509 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700510 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800511 ExpectPolicyStatus(
512 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700513 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700514 EXPECT_FALSE(result.p2p_downloading_allowed);
515 EXPECT_FALSE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700516 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700517 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700518 EXPECT_EQ(0, result.download_url_num_errors);
519 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700520}
521
Alex Deymo63784a52014-05-28 10:46:14 -0700522TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBlankPolicy) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700523 // The UpdateCanStart policy returns true; device policy is loaded but imposes
524 // no restrictions on updating.
525
526 SetUpdateCheckAllowed(false);
527
528 // Check that the UpdateCanStart returns true.
529 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700530 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800531 ExpectPolicyStatus(
532 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700533 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700534 EXPECT_FALSE(result.p2p_downloading_allowed);
535 EXPECT_FALSE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700536 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700537 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700538 EXPECT_EQ(0, result.download_url_num_errors);
539 EXPECT_FALSE(result.do_increment_failures);
540}
541
542TEST_F(UmChromeOSPolicyTest,
543 UpdateCanStartNotAllowedBackoffNewWaitPeriodApplies) {
544 // The UpdateCanStart policy returns false; failures are reported and a new
545 // backoff period is enacted.
546
547 SetUpdateCheckAllowed(false);
548
549 const Time curr_time = fake_clock_.GetWallclockTime();
550 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
551 update_state.download_errors_max = 1;
552 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800553 0,
554 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700555 curr_time - TimeDelta::FromSeconds(8));
556 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800557 0,
558 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700559 curr_time - TimeDelta::FromSeconds(2));
560
561 // Check that UpdateCanStart returns false and a new backoff expiry is
562 // generated.
563 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800564 ExpectPolicyStatus(
565 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700566 EXPECT_FALSE(result.update_can_start);
567 EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
568 EXPECT_TRUE(result.do_increment_failures);
569 EXPECT_LT(curr_time, result.backoff_expiry);
570}
571
572TEST_F(UmChromeOSPolicyTest,
573 UpdateCanStartNotAllowedBackoffPrevWaitPeriodStillApplies) {
574 // The UpdateCanStart policy returns false; a previously enacted backoff
575 // period still applies.
576
577 SetUpdateCheckAllowed(false);
578
579 const Time curr_time = fake_clock_.GetWallclockTime();
580 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
581 update_state.download_errors_max = 1;
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(8));
586 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800587 0,
588 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700589 curr_time - TimeDelta::FromSeconds(2));
590 update_state.failures_last_updated = curr_time;
591 update_state.backoff_expiry = curr_time + TimeDelta::FromMinutes(3);
592
593 // Check that UpdateCanStart returns false and a new backoff expiry is
594 // generated.
595 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800596 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
597 &Policy::UpdateCanStart,
598 &result,
599 update_state);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700600 EXPECT_FALSE(result.update_can_start);
601 EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
602 EXPECT_FALSE(result.do_increment_failures);
603 EXPECT_LT(curr_time, result.backoff_expiry);
604}
605
606TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffSatisfied) {
607 // The UpdateCanStart policy returns true; a previously enacted backoff period
608 // has elapsed, we're good to go.
609
610 SetUpdateCheckAllowed(false);
611
612 const Time curr_time = fake_clock_.GetWallclockTime();
613 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
614 update_state.download_errors_max = 1;
615 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800616 0,
617 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700618 curr_time - TimeDelta::FromSeconds(8));
619 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800620 0,
621 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700622 curr_time - TimeDelta::FromSeconds(2));
623 update_state.failures_last_updated = curr_time - TimeDelta::FromSeconds(1);
624 update_state.backoff_expiry = curr_time - TimeDelta::FromSeconds(1);
625
626 // Check that UpdateCanStart returns false and a new backoff expiry is
627 // generated.
628 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800629 ExpectPolicyStatus(
630 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700631 EXPECT_TRUE(result.update_can_start);
632 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
633 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700634 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700635 EXPECT_EQ(0, result.download_url_num_errors);
636 EXPECT_FALSE(result.do_increment_failures);
637 EXPECT_EQ(Time(), result.backoff_expiry);
638}
639
640TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffDisabled) {
641 // The UpdateCanStart policy returns false; failures are reported but backoff
642 // is disabled.
643
644 SetUpdateCheckAllowed(false);
645
646 const Time curr_time = fake_clock_.GetWallclockTime();
647 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
648 update_state.download_errors_max = 1;
649 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800650 0,
651 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700652 curr_time - TimeDelta::FromSeconds(8));
653 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800654 0,
655 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700656 curr_time - TimeDelta::FromSeconds(2));
657 update_state.is_backoff_disabled = true;
658
659 // Check that UpdateCanStart returns false and a new backoff expiry is
660 // generated.
661 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800662 ExpectPolicyStatus(
663 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700664 EXPECT_TRUE(result.update_can_start);
665 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
666 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700667 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700668 EXPECT_EQ(0, result.download_url_num_errors);
669 EXPECT_TRUE(result.do_increment_failures);
670 EXPECT_EQ(Time(), result.backoff_expiry);
671}
672
673TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffInteractive) {
674 // The UpdateCanStart policy returns false; failures are reported but this is
675 // an interactive update check.
676
677 SetUpdateCheckAllowed(false);
678
679 const Time curr_time = fake_clock_.GetWallclockTime();
680 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
681 update_state.download_errors_max = 1;
682 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800683 0,
684 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700685 curr_time - TimeDelta::FromSeconds(8));
686 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800687 0,
688 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700689 curr_time - TimeDelta::FromSeconds(2));
Amin Hassanied37d682018-04-06 13:22:00 -0700690 update_state.interactive = true;
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700691
692 // Check that UpdateCanStart returns false and a new backoff expiry is
693 // generated.
694 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800695 ExpectPolicyStatus(
696 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700697 EXPECT_TRUE(result.update_can_start);
698 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
699 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700700 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700701 EXPECT_EQ(0, result.download_url_num_errors);
702 EXPECT_TRUE(result.do_increment_failures);
703 EXPECT_EQ(Time(), result.backoff_expiry);
704}
705
706TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffDelta) {
707 // The UpdateCanStart policy returns false; failures are reported but this is
708 // a delta payload.
709
710 SetUpdateCheckAllowed(false);
711
712 const Time curr_time = fake_clock_.GetWallclockTime();
713 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
714 update_state.download_errors_max = 1;
715 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800716 0,
717 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700718 curr_time - TimeDelta::FromSeconds(8));
719 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800720 0,
721 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700722 curr_time - TimeDelta::FromSeconds(2));
723 update_state.is_delta_payload = true;
724
725 // Check that UpdateCanStart returns false and a new backoff expiry is
726 // generated.
727 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800728 ExpectPolicyStatus(
729 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700730 EXPECT_TRUE(result.update_can_start);
731 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
732 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700733 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700734 EXPECT_EQ(0, result.download_url_num_errors);
735 EXPECT_TRUE(result.do_increment_failures);
736 EXPECT_EQ(Time(), result.backoff_expiry);
737}
738
739TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffUnofficialBuild) {
740 // The UpdateCanStart policy returns false; failures are reported but this is
741 // an unofficial build.
742
743 SetUpdateCheckAllowed(false);
744
745 const Time curr_time = fake_clock_.GetWallclockTime();
746 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
747 update_state.download_errors_max = 1;
748 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800749 0,
750 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700751 curr_time - TimeDelta::FromSeconds(8));
752 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800753 0,
754 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700755 curr_time - TimeDelta::FromSeconds(2));
756
Amin Hassani4b717432019-01-14 16:24:20 -0800757 fake_state_.system_provider()->var_is_official_build()->reset(
758 new bool(false));
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700759
760 // Check that UpdateCanStart returns false and a new backoff expiry is
761 // generated.
762 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800763 ExpectPolicyStatus(
764 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700765 EXPECT_TRUE(result.update_can_start);
766 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
767 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700768 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700769 EXPECT_EQ(0, result.download_url_num_errors);
770 EXPECT_TRUE(result.do_increment_failures);
771 EXPECT_EQ(Time(), result.backoff_expiry);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700772}
773
Alex Deymo63784a52014-05-28 10:46:14 -0700774TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsScatteringFailed) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700775 // The UpdateCanStart policy fails because the UpdateScattering policy it
776 // depends on fails (unset variable).
777
778 SetUpdateCheckAllowed(false);
779
780 // Override the default seed variable with a null value so that the policy
781 // request would fail.
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700782 // TODO(garnold) This failure may or may not fail a number
783 // sub-policies/decisions, like scattering and backoff. We'll need a more
784 // deliberate setup to ensure that we're failing what we want to be failing.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700785 fake_state_.random_provider()->var_seed()->reset(nullptr);
786
787 // Check that the UpdateCanStart fails.
788 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700789 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800790 ExpectPolicyStatus(
791 EvalStatus::kFailed, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700792}
793
Alex Deymo63784a52014-05-28 10:46:14 -0700794TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700795 UpdateCanStartNotAllowedScatteringNewWaitPeriodApplies) {
796 // The UpdateCanStart policy returns false; device policy is loaded and
797 // scattering applies due to an unsatisfied wait period, which was newly
798 // generated.
799
800 SetUpdateCheckAllowed(false);
801 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
802 new TimeDelta(TimeDelta::FromMinutes(2)));
803
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700804 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
805
806 // Check that the UpdateCanStart returns false and a new wait period
807 // generated.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700808 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800809 ExpectPolicyStatus(
810 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700811 EXPECT_FALSE(result.update_can_start);
812 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
813 EXPECT_LT(TimeDelta(), result.scatter_wait_period);
814 EXPECT_EQ(0, result.scatter_check_threshold);
815}
816
Alex Deymo63784a52014-05-28 10:46:14 -0700817TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700818 UpdateCanStartNotAllowedScatteringPrevWaitPeriodStillApplies) {
819 // The UpdateCanStart policy returns false w/ kAskMeAgainLater; device policy
820 // is loaded and a previously generated scattering period still applies, none
821 // of the scattering values has changed.
822
823 SetUpdateCheckAllowed(false);
824 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
825 new TimeDelta(TimeDelta::FromMinutes(2)));
826
827 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
828 update_state.scatter_wait_period = TimeDelta::FromSeconds(35);
829
830 // Check that the UpdateCanStart returns false and a new wait period
831 // generated.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700832 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800833 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
834 &Policy::UpdateCanStart,
835 &result,
836 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_EQ(TimeDelta::FromSeconds(35), 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 UpdateCanStartNotAllowedScatteringNewCountThresholdApplies) {
845 // The UpdateCanStart policy returns false; device policy is loaded and
846 // scattering applies due to an unsatisfied update check count threshold.
847 //
848 // This ensures a non-zero check threshold, which may or may not be combined
849 // with a non-zero wait period (for which we cannot reliably control).
850
851 SetUpdateCheckAllowed(false);
852 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
853 new TimeDelta(TimeDelta::FromSeconds(1)));
854
855 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
856 update_state.scatter_check_threshold_min = 2;
857 update_state.scatter_check_threshold_max = 5;
858
859 // Check that the UpdateCanStart returns false.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700860 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800861 ExpectPolicyStatus(
862 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, 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_LE(2, result.scatter_check_threshold);
866 EXPECT_GE(5, result.scatter_check_threshold);
867}
868
Alex Deymo63784a52014-05-28 10:46:14 -0700869TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700870 UpdateCanStartNotAllowedScatteringPrevCountThresholdStillApplies) {
871 // The UpdateCanStart policy returns false; device policy is loaded and
872 // scattering due to a previously generated count threshold still applies.
873
874 SetUpdateCheckAllowed(false);
875 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
876 new TimeDelta(TimeDelta::FromSeconds(1)));
877
878 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
879 update_state.scatter_check_threshold = 3;
880 update_state.scatter_check_threshold_min = 2;
881 update_state.scatter_check_threshold_max = 5;
882
883 // Check that the UpdateCanStart returns false.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700884 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800885 ExpectPolicyStatus(
886 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700887 EXPECT_FALSE(result.update_can_start);
888 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
889 EXPECT_EQ(3, result.scatter_check_threshold);
890}
891
Alex Deymo63784a52014-05-28 10:46:14 -0700892TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedScatteringSatisfied) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700893 // The UpdateCanStart policy returns true; device policy is loaded and
894 // scattering is enabled, but both wait period and check threshold are
895 // satisfied.
896
897 SetUpdateCheckAllowed(false);
898 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
899 new TimeDelta(TimeDelta::FromSeconds(120)));
900
901 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(75));
902 update_state.num_checks = 4;
903 update_state.scatter_wait_period = TimeDelta::FromSeconds(60);
904 update_state.scatter_check_threshold = 3;
905 update_state.scatter_check_threshold_min = 2;
906 update_state.scatter_check_threshold_max = 5;
907
908 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700909 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800910 ExpectPolicyStatus(
911 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700912 EXPECT_TRUE(result.update_can_start);
913 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
914 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700915 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700916 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700917 EXPECT_EQ(0, result.download_url_num_errors);
918 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700919}
920
Alex Deymo63784a52014-05-28 10:46:14 -0700921TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700922 UpdateCanStartAllowedInteractivePreventsScattering) {
923 // The UpdateCanStart policy returns true; device policy is loaded and
924 // scattering would have applied, except that the update check is interactive
925 // and so it is suppressed.
926
927 SetUpdateCheckAllowed(false);
928 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
929 new TimeDelta(TimeDelta::FromSeconds(1)));
930
931 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Amin Hassanied37d682018-04-06 13:22:00 -0700932 update_state.interactive = true;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700933 update_state.scatter_check_threshold = 0;
934 update_state.scatter_check_threshold_min = 2;
935 update_state.scatter_check_threshold_max = 5;
936
937 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700938 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800939 ExpectPolicyStatus(
940 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700941 EXPECT_TRUE(result.update_can_start);
942 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
943 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700944 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700945 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700946 EXPECT_EQ(0, result.download_url_num_errors);
947 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700948}
949
Amin Hassani4b717432019-01-14 16:24:20 -0800950TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedOobePreventsScattering) {
Gilad Arnold76a11f62014-05-20 09:02:12 -0700951 // The UpdateCanStart policy returns true; device policy is loaded and
952 // scattering would have applied, except that OOBE was not completed and so it
953 // is suppressed.
954
955 SetUpdateCheckAllowed(false);
956 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
957 new TimeDelta(TimeDelta::FromSeconds(1)));
958 fake_state_.system_provider()->var_is_oobe_complete()->reset(new bool(false));
959
960 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Amin Hassanied37d682018-04-06 13:22:00 -0700961 update_state.interactive = true;
Gilad Arnold76a11f62014-05-20 09:02:12 -0700962 update_state.scatter_check_threshold = 0;
963 update_state.scatter_check_threshold_min = 2;
964 update_state.scatter_check_threshold_max = 5;
965
966 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700967 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800968 ExpectPolicyStatus(
969 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnold76a11f62014-05-20 09:02:12 -0700970 EXPECT_TRUE(result.update_can_start);
971 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
972 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700973 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700974 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700975 EXPECT_EQ(0, result.download_url_num_errors);
976 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnold76a11f62014-05-20 09:02:12 -0700977}
978
Alex Deymo63784a52014-05-28 10:46:14 -0700979TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithAttributes) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700980 // The UpdateCanStart policy returns true; device policy permits both HTTP and
981 // P2P updates, as well as a non-empty target channel string.
982
983 SetUpdateCheckAllowed(false);
984
985 // Override specific device policy attributes.
986 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
987 new bool(true));
988 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
989 new bool(true));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700990
991 // Check that the UpdateCanStart returns true.
992 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
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 Arnoldf62a4b82014-05-01 07:41:07 -0700996 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700997 EXPECT_TRUE(result.p2p_downloading_allowed);
998 EXPECT_TRUE(result.p2p_sharing_allowed);
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 Arnoldf62a4b82014-05-01 07:41:07 -07001003}
1004
Alex Deymo63784a52014-05-28 10:46:14 -07001005TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithP2PFromUpdater) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001006 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1007 // P2P updates, but the updater is configured to allow P2P and overrules the
1008 // setting.
1009
1010 SetUpdateCheckAllowed(false);
1011
1012 // Override specific device policy attributes.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001013 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1014
1015 // Check that the UpdateCanStart returns true.
1016 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001017 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001018 ExpectPolicyStatus(
1019 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001020 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001021 EXPECT_TRUE(result.p2p_downloading_allowed);
1022 EXPECT_TRUE(result.p2p_sharing_allowed);
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 Arnoldf62a4b82014-05-01 07:41:07 -07001027}
1028
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001029TEST_F(UmChromeOSPolicyTest,
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001030 UpdateCanStartAllowedP2PDownloadingBlockedDueToOmaha) {
1031 // The UpdateCanStart policy returns true; device policy permits HTTP, but
1032 // policy blocks P2P downloading because Omaha forbids it. P2P sharing is
1033 // still permitted.
1034
1035 SetUpdateCheckAllowed(false);
1036
1037 // Override specific device policy attributes.
1038 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1039 new bool(true));
1040 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1041 new bool(true));
1042
1043 // Check that the UpdateCanStart returns true.
1044 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1045 update_state.p2p_downloading_disabled = true;
1046 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001047 ExpectPolicyStatus(
1048 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001049 EXPECT_TRUE(result.update_can_start);
1050 EXPECT_FALSE(result.p2p_downloading_allowed);
1051 EXPECT_TRUE(result.p2p_sharing_allowed);
1052}
1053
Amin Hassani4b717432019-01-14 16:24:20 -08001054TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedP2PSharingBlockedDueToOmaha) {
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001055 // The UpdateCanStart policy returns true; device policy permits HTTP, but
1056 // policy blocks P2P sharing because Omaha forbids it. P2P downloading is
1057 // still permitted.
1058
1059 SetUpdateCheckAllowed(false);
1060
1061 // Override specific device policy attributes.
1062 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1063 new bool(true));
1064 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1065 new bool(true));
1066
1067 // Check that the UpdateCanStart returns true.
1068 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1069 update_state.p2p_sharing_disabled = true;
1070 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001071 ExpectPolicyStatus(
1072 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001073 EXPECT_TRUE(result.update_can_start);
1074 EXPECT_TRUE(result.p2p_downloading_allowed);
1075 EXPECT_FALSE(result.p2p_sharing_allowed);
1076}
1077
1078TEST_F(UmChromeOSPolicyTest,
1079 UpdateCanStartAllowedP2PDownloadingBlockedDueToNumAttempts) {
Gilad Arnold349ac832014-10-06 14:20:28 -07001080 // The UpdateCanStart policy returns true; device policy permits HTTP but
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001081 // blocks P2P download, because the max number of P2P downloads have been
1082 // attempted. P2P sharing is still permitted.
Gilad Arnold349ac832014-10-06 14:20:28 -07001083
1084 SetUpdateCheckAllowed(false);
1085
1086 // Override specific device policy attributes.
1087 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1088 new bool(true));
1089 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1090 new bool(true));
1091
1092 // Check that the UpdateCanStart returns true.
1093 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1094 update_state.p2p_num_attempts = ChromeOSPolicy::kMaxP2PAttempts;
1095 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001096 ExpectPolicyStatus(
1097 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnold349ac832014-10-06 14:20:28 -07001098 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001099 EXPECT_FALSE(result.p2p_downloading_allowed);
1100 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnold349ac832014-10-06 14:20:28 -07001101}
1102
1103TEST_F(UmChromeOSPolicyTest,
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001104 UpdateCanStartAllowedP2PDownloadingBlockedDueToAttemptsPeriod) {
Gilad Arnold349ac832014-10-06 14:20:28 -07001105 // The UpdateCanStart policy returns true; device policy permits HTTP but
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001106 // blocks P2P download, because the max period for attempt to download via P2P
1107 // has elapsed. P2P sharing is still permitted.
Gilad Arnold349ac832014-10-06 14:20:28 -07001108
1109 SetUpdateCheckAllowed(false);
1110
1111 // Override specific device policy attributes.
1112 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1113 new bool(true));
1114 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1115 new bool(true));
1116
1117 // Check that the UpdateCanStart returns true.
1118 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1119 update_state.p2p_num_attempts = 1;
1120 update_state.p2p_first_attempted =
1121 fake_clock_.GetWallclockTime() -
Amin Hassani4b717432019-01-14 16:24:20 -08001122 TimeDelta::FromSeconds(ChromeOSPolicy::kMaxP2PAttemptsPeriodInSeconds +
1123 1);
Gilad Arnold349ac832014-10-06 14:20:28 -07001124 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001125 ExpectPolicyStatus(
1126 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnold349ac832014-10-06 14:20:28 -07001127 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001128 EXPECT_FALSE(result.p2p_downloading_allowed);
1129 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnold349ac832014-10-06 14:20:28 -07001130}
1131
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001132TEST_F(UmChromeOSPolicyTest,
1133 UpdateCanStartAllowedWithHttpUrlForUnofficialBuild) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001134 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1135 // P2P updates, but marking this an unofficial build overrules the HTTP
1136 // setting.
1137
1138 SetUpdateCheckAllowed(false);
1139
1140 // Override specific device policy attributes.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001141 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1142 new bool(false));
Amin Hassani4b717432019-01-14 16:24:20 -08001143 fake_state_.system_provider()->var_is_official_build()->reset(
1144 new bool(false));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001145
1146 // Check that the UpdateCanStart returns true.
1147 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001148 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001149 ExpectPolicyStatus(
1150 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001151 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001152 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001153 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001154 EXPECT_EQ(0, result.download_url_num_errors);
1155 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001156}
1157
1158TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithHttpsUrl) {
1159 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1160 // P2P updates, but an HTTPS URL is provided and selected for download.
1161
1162 SetUpdateCheckAllowed(false);
1163
1164 // Override specific device policy attributes.
1165 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1166 new bool(false));
1167
1168 // Add an HTTPS URL.
1169 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001170 update_state.download_urls.emplace_back("https://secure/url/");
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001171
1172 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001173 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001174 ExpectPolicyStatus(
1175 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001176 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001177 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001178 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001179 EXPECT_EQ(0, result.download_url_num_errors);
1180 EXPECT_FALSE(result.do_increment_failures);
1181}
1182
1183TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedMaxErrorsNotExceeded) {
1184 // The UpdateCanStart policy returns true; the first URL has download errors
1185 // but does not exceed the maximum allowed number of failures, so it is stilli
1186 // usable.
1187
1188 SetUpdateCheckAllowed(false);
1189
1190 // Add a second URL; update with this URL attempted and failed enough times to
1191 // disqualify the current (first) URL.
1192 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1193 update_state.num_checks = 5;
1194 update_state.download_urls.emplace_back("http://another/fake/url/");
1195 Time t = fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(12);
1196 for (int i = 0; i < 5; i++) {
1197 update_state.download_errors.emplace_back(
1198 0, ErrorCode::kDownloadTransferError, t);
1199 t += TimeDelta::FromSeconds(1);
1200 }
1201
1202 // Check that the UpdateCanStart returns true.
1203 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001204 ExpectPolicyStatus(
1205 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001206 EXPECT_TRUE(result.update_can_start);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001207 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001208 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001209 EXPECT_EQ(5, result.download_url_num_errors);
1210 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001211}
1212
1213TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlMaxExceeded) {
1214 // The UpdateCanStart policy returns true; the first URL exceeded the maximum
1215 // allowed number of failures, but a second URL is available.
1216
1217 SetUpdateCheckAllowed(false);
1218
1219 // Add a second URL; update with this URL attempted and failed enough times to
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001220 // disqualify the current (first) URL.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001221 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1222 update_state.num_checks = 10;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001223 update_state.download_urls.emplace_back("http://another/fake/url/");
1224 Time t = fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(12);
1225 for (int i = 0; i < 11; i++) {
1226 update_state.download_errors.emplace_back(
1227 0, ErrorCode::kDownloadTransferError, t);
1228 t += TimeDelta::FromSeconds(1);
1229 }
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001230
1231 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001232 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001233 ExpectPolicyStatus(
1234 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001235 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001236 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001237 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001238 EXPECT_EQ(0, result.download_url_num_errors);
1239 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001240}
1241
1242TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlHardError) {
1243 // The UpdateCanStart policy returns true; the first URL fails with a hard
1244 // error, but a second URL is available.
1245
1246 SetUpdateCheckAllowed(false);
1247
1248 // Add a second URL; update with this URL attempted and failed in a way that
1249 // causes it to switch directly to the next URL.
1250 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1251 update_state.num_checks = 10;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001252 update_state.download_urls.emplace_back("http://another/fake/url/");
1253 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -08001254 0,
1255 ErrorCode::kPayloadHashMismatchError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001256 fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(1));
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001257
1258 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001259 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001260 ExpectPolicyStatus(
1261 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001262 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001263 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001264 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001265 EXPECT_EQ(0, result.download_url_num_errors);
1266 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001267}
1268
1269TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedUrlWrapsAround) {
1270 // The UpdateCanStart policy returns true; URL search properly wraps around
1271 // the last one on the list.
1272
1273 SetUpdateCheckAllowed(false);
1274
1275 // Add a second URL; update with this URL attempted and failed in a way that
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001276 // causes it to switch directly to the next URL. We must disable backoff in
1277 // order for it not to interfere.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001278 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001279 update_state.num_checks = 1;
1280 update_state.is_backoff_disabled = true;
1281 update_state.download_urls.emplace_back("http://another/fake/url/");
1282 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -08001283 1,
1284 ErrorCode::kPayloadHashMismatchError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001285 fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(1));
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001286
1287 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001288 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001289 ExpectPolicyStatus(
1290 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001291 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001292 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001293 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001294 EXPECT_EQ(0, result.download_url_num_errors);
1295 EXPECT_TRUE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001296}
1297
1298TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedNoUsableUrls) {
1299 // The UpdateCanStart policy returns false; there's a single HTTP URL but its
1300 // use is forbidden by policy.
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001301 //
1302 // Note: In the case where no usable URLs are found, the policy should not
1303 // increment the number of failed attempts! Doing so would result in a
1304 // non-idempotent semantics, and does not fall within the intended purpose of
1305 // the backoff mechanism anyway.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001306
1307 SetUpdateCheckAllowed(false);
1308
1309 // Override specific device policy attributes.
1310 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1311 new bool(false));
1312
1313 // Check that the UpdateCanStart returns false.
1314 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001315 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001316 ExpectPolicyStatus(
1317 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001318 EXPECT_FALSE(result.update_can_start);
1319 EXPECT_EQ(UpdateCannotStartReason::kCannotDownload,
1320 result.cannot_start_reason);
1321 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001322}
1323
1324TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoUsableUrlsButP2PEnabled) {
1325 // The UpdateCanStart policy returns true; there's a single HTTP URL but its
1326 // use is forbidden by policy, however P2P is enabled. The result indicates
1327 // that no URL can be used.
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001328 //
1329 // Note: The number of failed attempts should not increase in this case (see
1330 // above test).
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001331
1332 SetUpdateCheckAllowed(false);
1333
1334 // Override specific device policy attributes.
1335 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1336 new bool(true));
1337 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1338 new bool(false));
1339
1340 // Check that the UpdateCanStart returns true.
1341 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001342 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001343 ExpectPolicyStatus(
1344 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001345 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001346 EXPECT_TRUE(result.p2p_downloading_allowed);
1347 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001348 EXPECT_GT(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001349 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001350 EXPECT_EQ(0, result.download_url_num_errors);
1351 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001352}
1353
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001354TEST_F(UmChromeOSPolicyTest,
1355 UpdateCanStartAllowedNoUsableUrlsButEnterpriseEnrolled) {
1356 // The UpdateCanStart policy returns true; there's a single HTTP URL but its
1357 // use is forbidden by policy, and P2P is unset on the policy, however the
1358 // device is enterprise-enrolled so P2P is allowed. The result indicates that
1359 // no URL can be used.
1360 //
1361 // Note: The number of failed attempts should not increase in this case (see
1362 // above test).
1363
1364 SetUpdateCheckAllowed(false);
1365
1366 // Override specific device policy attributes.
1367 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(nullptr);
Jae Hoon Kim9d9492f2019-06-17 14:52:48 -07001368 fake_state_.device_policy_provider()->var_has_owner()->reset(new bool(false));
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001369 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1370 new bool(false));
1371
1372 // Check that the UpdateCanStart returns true.
1373 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1374 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001375 ExpectPolicyStatus(
1376 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001377 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001378 EXPECT_TRUE(result.p2p_downloading_allowed);
1379 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001380 EXPECT_GT(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001381 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001382 EXPECT_EQ(0, result.download_url_num_errors);
1383 EXPECT_FALSE(result.do_increment_failures);
1384}
1385
Gilad Arnold684219d2014-07-07 14:54:57 -07001386TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedEthernetDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001387 // Ethernet is always allowed.
1388
Amin Hassani4b717432019-01-14 16:24:20 -08001389 fake_state_.shill_provider()->var_conn_type()->reset(
1390 new ConnectionType(ConnectionType::kEthernet));
Gilad Arnold0adbc942014-05-12 10:35:43 -07001391
1392 bool result;
Amin Hassani4b717432019-01-14 16:24:20 -08001393 ExpectPolicyStatus(
1394 EvalStatus::kSucceeded, &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001395 EXPECT_TRUE(result);
1396}
1397
Gilad Arnold684219d2014-07-07 14:54:57 -07001398TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWifiDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001399 // Wifi is allowed if not tethered.
1400
Amin Hassani4b717432019-01-14 16:24:20 -08001401 fake_state_.shill_provider()->var_conn_type()->reset(
1402 new ConnectionType(ConnectionType::kWifi));
Gilad Arnold0adbc942014-05-12 10:35:43 -07001403
1404 bool result;
Amin Hassani4b717432019-01-14 16:24:20 -08001405 ExpectPolicyStatus(
1406 EvalStatus::kSucceeded, &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001407 EXPECT_TRUE(result);
1408}
1409
Alex Deymo63784a52014-05-28 10:46:14 -07001410TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001411 UpdateCurrentConnectionNotAllowedWifiTetheredDefault) {
1412 // Tethered wifi is not allowed by default.
1413
Amin Hassani4b717432019-01-14 16:24:20 -08001414 fake_state_.shill_provider()->var_conn_type()->reset(
1415 new ConnectionType(ConnectionType::kWifi));
1416 fake_state_.shill_provider()->var_conn_tethering()->reset(
1417 new ConnectionTethering(ConnectionTethering::kConfirmed));
Gilad Arnold0adbc942014-05-12 10:35:43 -07001418
1419 bool result;
Amin Hassani4b717432019-01-14 16:24:20 -08001420 ExpectPolicyStatus(
1421 EvalStatus::kAskMeAgainLater, &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001422}
1423
Amin Hassani4b717432019-01-14 16:24:20 -08001424TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWifiTetheredPolicyOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001425 // Tethered wifi can be allowed by policy.
1426
Amin Hassani4b717432019-01-14 16:24:20 -08001427 fake_state_.shill_provider()->var_conn_type()->reset(
1428 new ConnectionType(ConnectionType::kWifi));
1429 fake_state_.shill_provider()->var_conn_tethering()->reset(
1430 new ConnectionTethering(ConnectionTethering::kConfirmed));
Gilad Arnold0adbc942014-05-12 10:35:43 -07001431 set<ConnectionType> allowed_connections;
1432 allowed_connections.insert(ConnectionType::kCellular);
Amin Hassani4b717432019-01-14 16:24:20 -08001433 fake_state_.device_policy_provider()
1434 ->var_allowed_connection_types_for_update()
1435 ->reset(new set<ConnectionType>(allowed_connections));
Gilad Arnold0adbc942014-05-12 10:35:43 -07001436
1437 bool result;
Amin Hassani4b717432019-01-14 16:24:20 -08001438 ExpectPolicyStatus(
1439 EvalStatus::kSucceeded, &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001440 EXPECT_TRUE(result);
1441}
1442
Gilad Arnold684219d2014-07-07 14:54:57 -07001443TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWimaxDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001444 // Wimax is always allowed.
1445
Amin Hassani4b717432019-01-14 16:24:20 -08001446 fake_state_.shill_provider()->var_conn_type()->reset(
1447 new ConnectionType(ConnectionType::kWifi));
Gilad Arnold0adbc942014-05-12 10:35:43 -07001448
1449 bool result;
Amin Hassani4b717432019-01-14 16:24:20 -08001450 ExpectPolicyStatus(
1451 EvalStatus::kSucceeded, &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001452 EXPECT_TRUE(result);
1453}
1454
Alex Deymo63784a52014-05-28 10:46:14 -07001455TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001456 UpdateCurrentConnectionNotAllowedBluetoothDefault) {
1457 // Bluetooth is never allowed.
1458
Amin Hassani4b717432019-01-14 16:24:20 -08001459 fake_state_.shill_provider()->var_conn_type()->reset(
1460 new ConnectionType(ConnectionType::kBluetooth));
Gilad Arnold0adbc942014-05-12 10:35:43 -07001461
1462 bool result;
Amin Hassani4b717432019-01-14 16:24:20 -08001463 ExpectPolicyStatus(
1464 EvalStatus::kAskMeAgainLater, &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001465}
1466
Alex Deymo63784a52014-05-28 10:46:14 -07001467TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001468 UpdateCurrentConnectionNotAllowedBluetoothPolicyCannotOverride) {
1469 // Bluetooth cannot be allowed even by policy.
1470
Amin Hassani4b717432019-01-14 16:24:20 -08001471 fake_state_.shill_provider()->var_conn_type()->reset(
1472 new ConnectionType(ConnectionType::kBluetooth));
Gilad Arnold0adbc942014-05-12 10:35:43 -07001473 set<ConnectionType> allowed_connections;
1474 allowed_connections.insert(ConnectionType::kBluetooth);
Amin Hassani4b717432019-01-14 16:24:20 -08001475 fake_state_.device_policy_provider()
1476 ->var_allowed_connection_types_for_update()
1477 ->reset(new set<ConnectionType>(allowed_connections));
Gilad Arnold0adbc942014-05-12 10:35:43 -07001478
1479 bool result;
Amin Hassani4b717432019-01-14 16:24:20 -08001480 ExpectPolicyStatus(
1481 EvalStatus::kAskMeAgainLater, &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001482}
1483
Alex Deymo63784a52014-05-28 10:46:14 -07001484TEST_F(UmChromeOSPolicyTest, UpdateCurrentConnectionNotAllowedCellularDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001485 // Cellular is not allowed by default.
1486
Amin Hassani4b717432019-01-14 16:24:20 -08001487 fake_state_.shill_provider()->var_conn_type()->reset(
1488 new ConnectionType(ConnectionType::kCellular));
Gilad Arnold0adbc942014-05-12 10:35:43 -07001489
1490 bool result;
Amin Hassani4b717432019-01-14 16:24:20 -08001491 ExpectPolicyStatus(
1492 EvalStatus::kAskMeAgainLater, &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001493}
1494
Amin Hassani4b717432019-01-14 16:24:20 -08001495TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedCellularPolicyOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001496 // Update over cellular can be enabled by policy.
1497
Amin Hassani4b717432019-01-14 16:24:20 -08001498 fake_state_.shill_provider()->var_conn_type()->reset(
1499 new ConnectionType(ConnectionType::kCellular));
Gilad Arnold0adbc942014-05-12 10:35:43 -07001500 set<ConnectionType> allowed_connections;
1501 allowed_connections.insert(ConnectionType::kCellular);
Amin Hassani4b717432019-01-14 16:24:20 -08001502 fake_state_.device_policy_provider()
1503 ->var_allowed_connection_types_for_update()
1504 ->reset(new set<ConnectionType>(allowed_connections));
Gilad Arnold0adbc942014-05-12 10:35:43 -07001505
1506 bool result;
Amin Hassani4b717432019-01-14 16:24:20 -08001507 ExpectPolicyStatus(
1508 EvalStatus::kSucceeded, &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001509 EXPECT_TRUE(result);
1510}
1511
Amin Hassani4b717432019-01-14 16:24:20 -08001512TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedCellularUserOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001513 // Update over cellular can be enabled by user settings, but only if policy
1514 // is present and does not determine allowed connections.
1515
Amin Hassani4b717432019-01-14 16:24:20 -08001516 fake_state_.shill_provider()->var_conn_type()->reset(
1517 new ConnectionType(ConnectionType::kCellular));
Gilad Arnold0adbc942014-05-12 10:35:43 -07001518 set<ConnectionType> allowed_connections;
1519 allowed_connections.insert(ConnectionType::kCellular);
Amin Hassani4b717432019-01-14 16:24:20 -08001520 fake_state_.updater_provider()->var_cellular_enabled()->reset(new bool(true));
Gilad Arnold0adbc942014-05-12 10:35:43 -07001521
1522 bool result;
Amin Hassani4b717432019-01-14 16:24:20 -08001523 ExpectPolicyStatus(
1524 EvalStatus::kSucceeded, &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001525 EXPECT_TRUE(result);
1526}
1527
Amin Hassani4b717432019-01-14 16:24:20 -08001528TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedScatteringSupressedDueToP2P) {
Gilad Arnold14a9e702014-10-08 08:09:09 -07001529 // The UpdateCanStart policy returns true; scattering should have applied, but
1530 // P2P download is allowed. Scattering values are nonetheless returned, and so
1531 // are download URL values, albeit the latter are not allowed to be used.
1532
1533 SetUpdateCheckAllowed(false);
1534 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
1535 new TimeDelta(TimeDelta::FromMinutes(2)));
1536 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1537
1538 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
1539 update_state.scatter_wait_period = TimeDelta::FromSeconds(35);
1540
1541 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001542 ExpectPolicyStatus(
1543 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001544 EXPECT_TRUE(result.update_can_start);
1545 EXPECT_EQ(0, result.download_url_idx);
1546 EXPECT_FALSE(result.download_url_allowed);
1547 EXPECT_EQ(0, result.download_url_num_errors);
1548 EXPECT_TRUE(result.p2p_downloading_allowed);
1549 EXPECT_TRUE(result.p2p_sharing_allowed);
1550 EXPECT_FALSE(result.do_increment_failures);
1551 EXPECT_EQ(TimeDelta::FromSeconds(35), result.scatter_wait_period);
1552 EXPECT_EQ(0, result.scatter_check_threshold);
1553}
1554
Amin Hassani4b717432019-01-14 16:24:20 -08001555TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffSupressedDueToP2P) {
Gilad Arnold14a9e702014-10-08 08:09:09 -07001556 // The UpdateCanStart policy returns true; backoff should have applied, but
1557 // P2P download is allowed. Backoff values are nonetheless returned, and so
1558 // are download URL values, albeit the latter are not allowed to be used.
1559
1560 SetUpdateCheckAllowed(false);
1561
1562 const Time curr_time = fake_clock_.GetWallclockTime();
1563 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
1564 update_state.download_errors_max = 1;
1565 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -08001566 0,
1567 ErrorCode::kDownloadTransferError,
Gilad Arnold14a9e702014-10-08 08:09:09 -07001568 curr_time - TimeDelta::FromSeconds(8));
1569 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -08001570 0,
1571 ErrorCode::kDownloadTransferError,
Gilad Arnold14a9e702014-10-08 08:09:09 -07001572 curr_time - TimeDelta::FromSeconds(2));
1573 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1574
1575 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001576 ExpectPolicyStatus(
1577 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001578 EXPECT_TRUE(result.update_can_start);
1579 EXPECT_EQ(0, result.download_url_idx);
1580 EXPECT_FALSE(result.download_url_allowed);
1581 EXPECT_EQ(0, result.download_url_num_errors);
1582 EXPECT_TRUE(result.p2p_downloading_allowed);
1583 EXPECT_TRUE(result.p2p_sharing_allowed);
1584 EXPECT_TRUE(result.do_increment_failures);
1585 EXPECT_LT(curr_time, result.backoff_expiry);
1586}
1587
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001588TEST_F(UmChromeOSPolicyTest, P2PEnabledNotAllowed) {
1589 bool result;
1590 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1591 EXPECT_FALSE(result);
1592}
1593
1594TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedByDevicePolicy) {
1595 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1596 new bool(true));
1597
1598 bool result;
1599 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1600 EXPECT_TRUE(result);
1601}
1602
1603TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedByUpdater) {
1604 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1605
1606 bool result;
1607 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1608 EXPECT_TRUE(result);
1609}
1610
1611TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedDeviceEnterpriseEnrolled) {
1612 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(nullptr);
Jae Hoon Kim9d9492f2019-06-17 14:52:48 -07001613 fake_state_.device_policy_provider()->var_has_owner()->reset(new bool(false));
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001614
1615 bool result;
1616 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1617 EXPECT_TRUE(result);
1618}
1619
1620TEST_F(UmChromeOSPolicyTest, P2PEnabledChangedBlocks) {
1621 bool result;
Amin Hassani4b717432019-01-14 16:24:20 -08001622 ExpectPolicyStatus(
1623 EvalStatus::kAskMeAgainLater, &Policy::P2PEnabledChanged, &result, false);
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001624}
1625
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -07001626TEST_F(UmChromeOSPolicyTest,
1627 UpdateCanBeAppliedForcedUpdatesDisablesTimeRestrictions) {
1628 Time curr_time = fake_clock_.GetWallclockTime();
1629 fake_state_.updater_provider()->var_forced_update_requested()->reset(
1630 new UpdateRequestStatus(UpdateRequestStatus::kInteractive));
1631 // Should return kAskMeAgainLater when updated are not forced.
1632 TestDisallowedTimeIntervals(
1633 {WeeklyTimeInterval(
1634 WeeklyTime::FromTime(curr_time),
1635 WeeklyTime::FromTime(curr_time + TimeDelta::FromMinutes(1)))},
Adolfo Victoria7a7a0822018-07-27 13:35:24 -07001636 ErrorCode::kSuccess,
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -07001637 /* kiosk = */ true);
1638}
1639
1640TEST_F(UmChromeOSPolicyTest, UpdateCanBeAppliedFailsInDisallowedTime) {
1641 Time curr_time = fake_clock_.GetWallclockTime();
1642 TestDisallowedTimeIntervals(
1643 {WeeklyTimeInterval(
1644 WeeklyTime::FromTime(curr_time),
1645 WeeklyTime::FromTime(curr_time + TimeDelta::FromMinutes(1)))},
Adolfo Victoria7a7a0822018-07-27 13:35:24 -07001646 ErrorCode::kOmahaUpdateDeferredPerPolicy,
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -07001647 /* kiosk = */ true);
1648}
1649
1650TEST_F(UmChromeOSPolicyTest, UpdateCanBeAppliedOutsideDisallowedTime) {
1651 Time curr_time = fake_clock_.GetWallclockTime();
1652 TestDisallowedTimeIntervals(
1653 {WeeklyTimeInterval(
1654 WeeklyTime::FromTime(curr_time - TimeDelta::FromHours(3)),
1655 WeeklyTime::FromTime(curr_time))},
Adolfo Victoria7a7a0822018-07-27 13:35:24 -07001656 ErrorCode::kSuccess,
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -07001657 /* kiosk = */ true);
1658}
1659
1660TEST_F(UmChromeOSPolicyTest, UpdateCanBeAppliedPassesOnNonKiosk) {
1661 Time curr_time = fake_clock_.GetWallclockTime();
1662 TestDisallowedTimeIntervals(
1663 {WeeklyTimeInterval(
1664 WeeklyTime::FromTime(curr_time),
1665 WeeklyTime::FromTime(curr_time + TimeDelta::FromMinutes(1)))},
Adolfo Victoria7a7a0822018-07-27 13:35:24 -07001666 ErrorCode::kSuccess,
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -07001667 /* kiosk = */ false);
1668}
1669
Alex Deymo63784a52014-05-28 10:46:14 -07001670} // namespace chromeos_update_manager