blob: 5341ebb373195b10e91d80db3fa69cd52ee3e302 [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 Hunyadyd4bc4622018-08-30 15:52:23 +0200287TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedRollbackOnlyIfRestorePossible) {
Marton Hunyady31aefb92018-08-29 16:17:03 +0200288 // We're not allowed to do rollback until we support data save and restore.
289 EXPECT_FALSE(TestRollbackAllowed(
Marton Hunyadyd4bc4622018-08-30 15:52:23 +0200290 true, RollbackToTargetVersion::kRollbackOnlyIfRestorePossible));
Marton Hunyady31aefb92018-08-29 16:17:03 +0200291}
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
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700347TEST_F(UmChromeOSPolicyTest,
Aaron Wood56d8ab32017-09-22 15:56:18 -0700348 UpdateCheckAllowedUpdatesDisabledWhenNotEnoughSlotsAbUpdates) {
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700349 // UpdateCheckAllowed should return false (kSucceeded) if the image booted
Aaron Wood56d8ab32017-09-22 15:56:18 -0700350 // without enough slots to do A/B updates.
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700351
Aaron Woodc73fdc12017-12-06 11:09:15 -0800352 // NOLINTNEXTLINE(readability/casting)
Alex Deymo763e7db2015-08-27 21:08:08 -0700353 fake_state_.system_provider()->var_num_slots()->reset(new unsigned int(1));
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700354
355 UpdateCheckParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800356 ExpectPolicyStatus(
357 EvalStatus::kSucceeded, &Policy::UpdateCheckAllowed, &result);
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700358 EXPECT_FALSE(result.updates_enabled);
359}
360
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700361TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedUpdatesDisabledByPolicy) {
Gilad Arnold42f253b2014-06-25 12:39:17 -0700362 // UpdateCheckAllowed should return kAskMeAgainLater because a device policy
363 // is loaded and prohibits updates.
364
365 SetUpdateCheckAllowed(false);
366 fake_state_.device_policy_provider()->var_update_disabled()->reset(
367 new bool(true));
368
Gilad Arnold42f253b2014-06-25 12:39:17 -0700369 UpdateCheckParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800370 ExpectPolicyStatus(
371 EvalStatus::kAskMeAgainLater, &Policy::UpdateCheckAllowed, &result);
Gilad Arnold42f253b2014-06-25 12:39:17 -0700372}
373
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700374TEST_F(UmChromeOSPolicyTest,
375 UpdateCheckAllowedForcedUpdateRequestedInteractive) {
376 // UpdateCheckAllowed should return true because a forced update request was
377 // signaled for an interactive update.
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700378
379 SetUpdateCheckAllowed(true);
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700380 fake_state_.updater_provider()->var_forced_update_requested()->reset(
381 new UpdateRequestStatus(UpdateRequestStatus::kInteractive));
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700382
383 UpdateCheckParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800384 ExpectPolicyStatus(
385 EvalStatus::kSucceeded, &Policy::UpdateCheckAllowed, &result);
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700386 EXPECT_TRUE(result.updates_enabled);
Amin Hassanied37d682018-04-06 13:22:00 -0700387 EXPECT_TRUE(result.interactive);
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700388}
389
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700390TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedForcedUpdateRequestedPeriodic) {
391 // UpdateCheckAllowed should return true because a forced update request was
392 // signaled for a periodic check.
393
394 SetUpdateCheckAllowed(true);
395 fake_state_.updater_provider()->var_forced_update_requested()->reset(
396 new UpdateRequestStatus(UpdateRequestStatus::kPeriodic));
397
398 UpdateCheckParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800399 ExpectPolicyStatus(
400 EvalStatus::kSucceeded, &Policy::UpdateCheckAllowed, &result);
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700401 EXPECT_TRUE(result.updates_enabled);
Amin Hassanied37d682018-04-06 13:22:00 -0700402 EXPECT_FALSE(result.interactive);
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700403}
404
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800405TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskPin) {
406 // Update check is allowed.
407 SetUpdateCheckAllowed(true);
408
Marton Hunyady8b936f22018-06-15 16:44:37 +0200409 SetKioskAppControlsChromeOsVersion();
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800410
411 UpdateCheckParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800412 ExpectPolicyStatus(
413 EvalStatus::kSucceeded, &Policy::UpdateCheckAllowed, &result);
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800414 EXPECT_TRUE(result.updates_enabled);
Marton Hunyady8b936f22018-06-15 16:44:37 +0200415 EXPECT_EQ("1234.", result.target_version_prefix);
Amin Hassanied37d682018-04-06 13:22:00 -0700416 EXPECT_FALSE(result.interactive);
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800417}
418
419TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedDisabledWhenNoKioskPin) {
420 // Update check is allowed.
421 SetUpdateCheckAllowed(true);
422
423 // Disable AU policy is set but kiosk pin policy is set to false. Update is
424 // disabled in such case.
425 fake_state_.device_policy_provider()->var_update_disabled()->reset(
426 new bool(true));
427 fake_state_.device_policy_provider()
428 ->var_allow_kiosk_app_control_chrome_version()
429 ->reset(new bool(false));
430
431 UpdateCheckParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800432 ExpectPolicyStatus(
433 EvalStatus::kAskMeAgainLater, &Policy::UpdateCheckAllowed, &result);
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800434}
435
436TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskPinWithNoRequiredVersion) {
437 // Update check is allowed.
438 SetUpdateCheckAllowed(true);
439
440 // AU disabled, allow kiosk to pin but there is no kiosk required platform
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700441 // version (i.e. app does not provide the info). Update to latest in such
442 // case.
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800443 fake_state_.device_policy_provider()->var_update_disabled()->reset(
444 new bool(true));
445 fake_state_.device_policy_provider()
446 ->var_allow_kiosk_app_control_chrome_version()
447 ->reset(new bool(true));
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700448 fake_state_.system_provider()->var_kiosk_required_platform_version()->reset(
449 new string());
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800450
451 UpdateCheckParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800452 ExpectPolicyStatus(
453 EvalStatus::kSucceeded, &Policy::UpdateCheckAllowed, &result);
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800454 EXPECT_TRUE(result.updates_enabled);
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700455 EXPECT_TRUE(result.target_version_prefix.empty());
Amin Hassanied37d682018-04-06 13:22:00 -0700456 EXPECT_FALSE(result.interactive);
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800457}
458
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700459TEST_F(UmChromeOSPolicyTest,
460 UpdateCheckAllowedKioskPinWithFailedGetRequiredVersionCall) {
461 // AU disabled, allow kiosk to pin but D-Bus call to get required platform
462 // version failed. Defer update check in this case.
463 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));
468 fake_state_.system_provider()->var_kiosk_required_platform_version()->reset(
469 nullptr);
470
471 UpdateCheckParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800472 ExpectPolicyStatus(
473 EvalStatus::kAskMeAgainLater, &Policy::UpdateCheckAllowed, &result);
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700474}
475
Alex Deymo63784a52014-05-28 10:46:14 -0700476TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsCheckAllowedError) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700477 // The UpdateCanStart policy fails, not being able to query
478 // UpdateCheckAllowed.
479
480 // Configure the UpdateCheckAllowed policy to fail.
481 fake_state_.updater_provider()->var_updater_started_time()->reset(nullptr);
482
483 // Check that the UpdateCanStart fails.
484 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700485 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800486 ExpectPolicyStatus(
487 EvalStatus::kFailed, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700488}
489
Alex Deymo63784a52014-05-28 10:46:14 -0700490TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedCheckDue) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700491 // The UpdateCanStart policy returns false because we are due for another
Gilad Arnold14a9e702014-10-08 08:09:09 -0700492 // update check. Ensure that download related values are still returned.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700493
494 SetUpdateCheckAllowed(true);
495
496 // Check that the UpdateCanStart returns false.
497 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700498 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800499 ExpectPolicyStatus(
500 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700501 EXPECT_FALSE(result.update_can_start);
502 EXPECT_EQ(UpdateCannotStartReason::kCheckDue, result.cannot_start_reason);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700503 EXPECT_EQ(0, result.download_url_idx);
504 EXPECT_EQ(0, result.download_url_num_errors);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700505}
506
Alex Deymo63784a52014-05-28 10:46:14 -0700507TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoDevicePolicy) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700508 // The UpdateCanStart policy returns true; no device policy is loaded.
509
510 SetUpdateCheckAllowed(false);
511 fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
512 new bool(false));
513
514 // Check that the UpdateCanStart returns true with no further attributes.
515 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700516 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800517 ExpectPolicyStatus(
518 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700519 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700520 EXPECT_FALSE(result.p2p_downloading_allowed);
521 EXPECT_FALSE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700522 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700523 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700524 EXPECT_EQ(0, result.download_url_num_errors);
525 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700526}
527
Alex Deymo63784a52014-05-28 10:46:14 -0700528TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBlankPolicy) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700529 // The UpdateCanStart policy returns true; device policy is loaded but imposes
530 // no restrictions on updating.
531
532 SetUpdateCheckAllowed(false);
533
534 // Check that the UpdateCanStart returns true.
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);
546}
547
548TEST_F(UmChromeOSPolicyTest,
549 UpdateCanStartNotAllowedBackoffNewWaitPeriodApplies) {
550 // The UpdateCanStart policy returns false; failures are reported and a new
551 // backoff period is enacted.
552
553 SetUpdateCheckAllowed(false);
554
555 const Time curr_time = fake_clock_.GetWallclockTime();
556 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
557 update_state.download_errors_max = 1;
558 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800559 0,
560 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700561 curr_time - TimeDelta::FromSeconds(8));
562 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800563 0,
564 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700565 curr_time - TimeDelta::FromSeconds(2));
566
567 // Check that UpdateCanStart returns false and a new backoff expiry is
568 // generated.
569 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800570 ExpectPolicyStatus(
571 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700572 EXPECT_FALSE(result.update_can_start);
573 EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
574 EXPECT_TRUE(result.do_increment_failures);
575 EXPECT_LT(curr_time, result.backoff_expiry);
576}
577
578TEST_F(UmChromeOSPolicyTest,
579 UpdateCanStartNotAllowedBackoffPrevWaitPeriodStillApplies) {
580 // The UpdateCanStart policy returns false; a previously enacted backoff
581 // period still applies.
582
583 SetUpdateCheckAllowed(false);
584
585 const Time curr_time = fake_clock_.GetWallclockTime();
586 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
587 update_state.download_errors_max = 1;
588 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800589 0,
590 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700591 curr_time - TimeDelta::FromSeconds(8));
592 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800593 0,
594 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700595 curr_time - TimeDelta::FromSeconds(2));
596 update_state.failures_last_updated = curr_time;
597 update_state.backoff_expiry = curr_time + TimeDelta::FromMinutes(3);
598
599 // Check that UpdateCanStart returns false and a new backoff expiry is
600 // generated.
601 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800602 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
603 &Policy::UpdateCanStart,
604 &result,
605 update_state);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700606 EXPECT_FALSE(result.update_can_start);
607 EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
608 EXPECT_FALSE(result.do_increment_failures);
609 EXPECT_LT(curr_time, result.backoff_expiry);
610}
611
612TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffSatisfied) {
613 // The UpdateCanStart policy returns true; a previously enacted backoff period
614 // has elapsed, we're good to go.
615
616 SetUpdateCheckAllowed(false);
617
618 const Time curr_time = fake_clock_.GetWallclockTime();
619 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
620 update_state.download_errors_max = 1;
621 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800622 0,
623 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700624 curr_time - TimeDelta::FromSeconds(8));
625 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800626 0,
627 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700628 curr_time - TimeDelta::FromSeconds(2));
629 update_state.failures_last_updated = curr_time - TimeDelta::FromSeconds(1);
630 update_state.backoff_expiry = curr_time - TimeDelta::FromSeconds(1);
631
632 // Check that UpdateCanStart returns false and a new backoff expiry is
633 // generated.
634 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800635 ExpectPolicyStatus(
636 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700637 EXPECT_TRUE(result.update_can_start);
638 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
639 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700640 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700641 EXPECT_EQ(0, result.download_url_num_errors);
642 EXPECT_FALSE(result.do_increment_failures);
643 EXPECT_EQ(Time(), result.backoff_expiry);
644}
645
646TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffDisabled) {
647 // The UpdateCanStart policy returns false; failures are reported but backoff
648 // is disabled.
649
650 SetUpdateCheckAllowed(false);
651
652 const Time curr_time = fake_clock_.GetWallclockTime();
653 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
654 update_state.download_errors_max = 1;
655 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800656 0,
657 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700658 curr_time - TimeDelta::FromSeconds(8));
659 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800660 0,
661 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700662 curr_time - TimeDelta::FromSeconds(2));
663 update_state.is_backoff_disabled = true;
664
665 // Check that UpdateCanStart returns false and a new backoff expiry is
666 // generated.
667 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800668 ExpectPolicyStatus(
669 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700670 EXPECT_TRUE(result.update_can_start);
671 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
672 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700673 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700674 EXPECT_EQ(0, result.download_url_num_errors);
675 EXPECT_TRUE(result.do_increment_failures);
676 EXPECT_EQ(Time(), result.backoff_expiry);
677}
678
679TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffInteractive) {
680 // The UpdateCanStart policy returns false; failures are reported but this is
681 // an interactive update check.
682
683 SetUpdateCheckAllowed(false);
684
685 const Time curr_time = fake_clock_.GetWallclockTime();
686 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
687 update_state.download_errors_max = 1;
688 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800689 0,
690 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700691 curr_time - TimeDelta::FromSeconds(8));
692 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800693 0,
694 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700695 curr_time - TimeDelta::FromSeconds(2));
Amin Hassanied37d682018-04-06 13:22:00 -0700696 update_state.interactive = true;
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700697
698 // Check that UpdateCanStart returns false and a new backoff expiry is
699 // generated.
700 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800701 ExpectPolicyStatus(
702 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700703 EXPECT_TRUE(result.update_can_start);
704 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
705 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700706 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700707 EXPECT_EQ(0, result.download_url_num_errors);
708 EXPECT_TRUE(result.do_increment_failures);
709 EXPECT_EQ(Time(), result.backoff_expiry);
710}
711
712TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffDelta) {
713 // The UpdateCanStart policy returns false; failures are reported but this is
714 // a delta payload.
715
716 SetUpdateCheckAllowed(false);
717
718 const Time curr_time = fake_clock_.GetWallclockTime();
719 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
720 update_state.download_errors_max = 1;
721 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800722 0,
723 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700724 curr_time - TimeDelta::FromSeconds(8));
725 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800726 0,
727 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700728 curr_time - TimeDelta::FromSeconds(2));
729 update_state.is_delta_payload = true;
730
731 // Check that UpdateCanStart returns false and a new backoff expiry is
732 // generated.
733 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800734 ExpectPolicyStatus(
735 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700736 EXPECT_TRUE(result.update_can_start);
737 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
738 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700739 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700740 EXPECT_EQ(0, result.download_url_num_errors);
741 EXPECT_TRUE(result.do_increment_failures);
742 EXPECT_EQ(Time(), result.backoff_expiry);
743}
744
745TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffUnofficialBuild) {
746 // The UpdateCanStart policy returns false; failures are reported but this is
747 // an unofficial build.
748
749 SetUpdateCheckAllowed(false);
750
751 const Time curr_time = fake_clock_.GetWallclockTime();
752 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
753 update_state.download_errors_max = 1;
754 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800755 0,
756 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700757 curr_time - TimeDelta::FromSeconds(8));
758 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -0800759 0,
760 ErrorCode::kDownloadTransferError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700761 curr_time - TimeDelta::FromSeconds(2));
762
Amin Hassani4b717432019-01-14 16:24:20 -0800763 fake_state_.system_provider()->var_is_official_build()->reset(
764 new bool(false));
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700765
766 // Check that UpdateCanStart returns false and a new backoff expiry is
767 // generated.
768 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800769 ExpectPolicyStatus(
770 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700771 EXPECT_TRUE(result.update_can_start);
772 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
773 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700774 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700775 EXPECT_EQ(0, result.download_url_num_errors);
776 EXPECT_TRUE(result.do_increment_failures);
777 EXPECT_EQ(Time(), result.backoff_expiry);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700778}
779
Alex Deymo63784a52014-05-28 10:46:14 -0700780TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsScatteringFailed) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700781 // The UpdateCanStart policy fails because the UpdateScattering policy it
782 // depends on fails (unset variable).
783
784 SetUpdateCheckAllowed(false);
785
786 // Override the default seed variable with a null value so that the policy
787 // request would fail.
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700788 // TODO(garnold) This failure may or may not fail a number
789 // sub-policies/decisions, like scattering and backoff. We'll need a more
790 // deliberate setup to ensure that we're failing what we want to be failing.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700791 fake_state_.random_provider()->var_seed()->reset(nullptr);
792
793 // Check that the UpdateCanStart fails.
794 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700795 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800796 ExpectPolicyStatus(
797 EvalStatus::kFailed, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700798}
799
Alex Deymo63784a52014-05-28 10:46:14 -0700800TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700801 UpdateCanStartNotAllowedScatteringNewWaitPeriodApplies) {
802 // The UpdateCanStart policy returns false; device policy is loaded and
803 // scattering applies due to an unsatisfied wait period, which was newly
804 // generated.
805
806 SetUpdateCheckAllowed(false);
807 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
808 new TimeDelta(TimeDelta::FromMinutes(2)));
809
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700810 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
811
812 // Check that the UpdateCanStart returns false and a new wait period
813 // generated.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700814 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800815 ExpectPolicyStatus(
816 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700817 EXPECT_FALSE(result.update_can_start);
818 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
819 EXPECT_LT(TimeDelta(), result.scatter_wait_period);
820 EXPECT_EQ(0, result.scatter_check_threshold);
821}
822
Alex Deymo63784a52014-05-28 10:46:14 -0700823TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700824 UpdateCanStartNotAllowedScatteringPrevWaitPeriodStillApplies) {
825 // The UpdateCanStart policy returns false w/ kAskMeAgainLater; device policy
826 // is loaded and a previously generated scattering period still applies, none
827 // of the scattering values has changed.
828
829 SetUpdateCheckAllowed(false);
830 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
831 new TimeDelta(TimeDelta::FromMinutes(2)));
832
833 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
834 update_state.scatter_wait_period = TimeDelta::FromSeconds(35);
835
836 // Check that the UpdateCanStart returns false and a new wait period
837 // generated.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700838 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800839 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
840 &Policy::UpdateCanStart,
841 &result,
842 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700843 EXPECT_FALSE(result.update_can_start);
844 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
845 EXPECT_EQ(TimeDelta::FromSeconds(35), result.scatter_wait_period);
846 EXPECT_EQ(0, result.scatter_check_threshold);
847}
848
Alex Deymo63784a52014-05-28 10:46:14 -0700849TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700850 UpdateCanStartNotAllowedScatteringNewCountThresholdApplies) {
851 // The UpdateCanStart policy returns false; device policy is loaded and
852 // scattering applies due to an unsatisfied update check count threshold.
853 //
854 // This ensures a non-zero check threshold, which may or may not be combined
855 // with a non-zero wait period (for which we cannot reliably control).
856
857 SetUpdateCheckAllowed(false);
858 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
859 new TimeDelta(TimeDelta::FromSeconds(1)));
860
861 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
862 update_state.scatter_check_threshold_min = 2;
863 update_state.scatter_check_threshold_max = 5;
864
865 // Check that the UpdateCanStart returns false.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700866 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800867 ExpectPolicyStatus(
868 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700869 EXPECT_FALSE(result.update_can_start);
870 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
871 EXPECT_LE(2, result.scatter_check_threshold);
872 EXPECT_GE(5, result.scatter_check_threshold);
873}
874
Alex Deymo63784a52014-05-28 10:46:14 -0700875TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700876 UpdateCanStartNotAllowedScatteringPrevCountThresholdStillApplies) {
877 // The UpdateCanStart policy returns false; device policy is loaded and
878 // scattering due to a previously generated count threshold still applies.
879
880 SetUpdateCheckAllowed(false);
881 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
882 new TimeDelta(TimeDelta::FromSeconds(1)));
883
884 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
885 update_state.scatter_check_threshold = 3;
886 update_state.scatter_check_threshold_min = 2;
887 update_state.scatter_check_threshold_max = 5;
888
889 // Check that the UpdateCanStart returns false.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700890 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800891 ExpectPolicyStatus(
892 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700893 EXPECT_FALSE(result.update_can_start);
894 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
895 EXPECT_EQ(3, result.scatter_check_threshold);
896}
897
Alex Deymo63784a52014-05-28 10:46:14 -0700898TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedScatteringSatisfied) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700899 // The UpdateCanStart policy returns true; device policy is loaded and
900 // scattering is enabled, but both wait period and check threshold are
901 // satisfied.
902
903 SetUpdateCheckAllowed(false);
904 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
905 new TimeDelta(TimeDelta::FromSeconds(120)));
906
907 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(75));
908 update_state.num_checks = 4;
909 update_state.scatter_wait_period = TimeDelta::FromSeconds(60);
910 update_state.scatter_check_threshold = 3;
911 update_state.scatter_check_threshold_min = 2;
912 update_state.scatter_check_threshold_max = 5;
913
914 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700915 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800916 ExpectPolicyStatus(
917 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700918 EXPECT_TRUE(result.update_can_start);
919 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
920 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700921 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700922 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700923 EXPECT_EQ(0, result.download_url_num_errors);
924 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700925}
926
Alex Deymo63784a52014-05-28 10:46:14 -0700927TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700928 UpdateCanStartAllowedInteractivePreventsScattering) {
929 // The UpdateCanStart policy returns true; device policy is loaded and
930 // scattering would have applied, except that the update check is interactive
931 // and so it is suppressed.
932
933 SetUpdateCheckAllowed(false);
934 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
935 new TimeDelta(TimeDelta::FromSeconds(1)));
936
937 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Amin Hassanied37d682018-04-06 13:22:00 -0700938 update_state.interactive = true;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700939 update_state.scatter_check_threshold = 0;
940 update_state.scatter_check_threshold_min = 2;
941 update_state.scatter_check_threshold_max = 5;
942
943 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700944 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800945 ExpectPolicyStatus(
946 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700947 EXPECT_TRUE(result.update_can_start);
948 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
949 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700950 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700951 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700952 EXPECT_EQ(0, result.download_url_num_errors);
953 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700954}
955
Amin Hassani4b717432019-01-14 16:24:20 -0800956TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedOobePreventsScattering) {
Gilad Arnold76a11f62014-05-20 09:02:12 -0700957 // The UpdateCanStart policy returns true; device policy is loaded and
958 // scattering would have applied, except that OOBE was not completed and so it
959 // is suppressed.
960
961 SetUpdateCheckAllowed(false);
962 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
963 new TimeDelta(TimeDelta::FromSeconds(1)));
964 fake_state_.system_provider()->var_is_oobe_complete()->reset(new bool(false));
965
966 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Amin Hassanied37d682018-04-06 13:22:00 -0700967 update_state.interactive = true;
Gilad Arnold76a11f62014-05-20 09:02:12 -0700968 update_state.scatter_check_threshold = 0;
969 update_state.scatter_check_threshold_min = 2;
970 update_state.scatter_check_threshold_max = 5;
971
972 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700973 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -0800974 ExpectPolicyStatus(
975 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnold76a11f62014-05-20 09:02:12 -0700976 EXPECT_TRUE(result.update_can_start);
977 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
978 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700979 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700980 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700981 EXPECT_EQ(0, result.download_url_num_errors);
982 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnold76a11f62014-05-20 09:02:12 -0700983}
984
Alex Deymo63784a52014-05-28 10:46:14 -0700985TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithAttributes) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700986 // The UpdateCanStart policy returns true; device policy permits both HTTP and
987 // P2P updates, as well as a non-empty target channel string.
988
989 SetUpdateCheckAllowed(false);
990
991 // Override specific device policy attributes.
992 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
993 new bool(true));
994 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
995 new bool(true));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700996
997 // Check that the UpdateCanStart returns true.
998 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700999 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001000 ExpectPolicyStatus(
1001 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001002 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001003 EXPECT_TRUE(result.p2p_downloading_allowed);
1004 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001005 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001006 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001007 EXPECT_EQ(0, result.download_url_num_errors);
1008 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001009}
1010
Alex Deymo63784a52014-05-28 10:46:14 -07001011TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithP2PFromUpdater) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001012 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1013 // P2P updates, but the updater is configured to allow P2P and overrules the
1014 // setting.
1015
1016 SetUpdateCheckAllowed(false);
1017
1018 // Override specific device policy attributes.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001019 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1020
1021 // Check that the UpdateCanStart returns true.
1022 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001023 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001024 ExpectPolicyStatus(
1025 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001026 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001027 EXPECT_TRUE(result.p2p_downloading_allowed);
1028 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001029 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001030 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001031 EXPECT_EQ(0, result.download_url_num_errors);
1032 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001033}
1034
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001035TEST_F(UmChromeOSPolicyTest,
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001036 UpdateCanStartAllowedP2PDownloadingBlockedDueToOmaha) {
1037 // The UpdateCanStart policy returns true; device policy permits HTTP, but
1038 // policy blocks P2P downloading because Omaha forbids it. P2P sharing is
1039 // still permitted.
1040
1041 SetUpdateCheckAllowed(false);
1042
1043 // Override specific device policy attributes.
1044 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1045 new bool(true));
1046 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1047 new bool(true));
1048
1049 // Check that the UpdateCanStart returns true.
1050 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1051 update_state.p2p_downloading_disabled = true;
1052 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001053 ExpectPolicyStatus(
1054 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001055 EXPECT_TRUE(result.update_can_start);
1056 EXPECT_FALSE(result.p2p_downloading_allowed);
1057 EXPECT_TRUE(result.p2p_sharing_allowed);
1058}
1059
Amin Hassani4b717432019-01-14 16:24:20 -08001060TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedP2PSharingBlockedDueToOmaha) {
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001061 // The UpdateCanStart policy returns true; device policy permits HTTP, but
1062 // policy blocks P2P sharing because Omaha forbids it. P2P downloading is
1063 // still permitted.
1064
1065 SetUpdateCheckAllowed(false);
1066
1067 // Override specific device policy attributes.
1068 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1069 new bool(true));
1070 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1071 new bool(true));
1072
1073 // Check that the UpdateCanStart returns true.
1074 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1075 update_state.p2p_sharing_disabled = true;
1076 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001077 ExpectPolicyStatus(
1078 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001079 EXPECT_TRUE(result.update_can_start);
1080 EXPECT_TRUE(result.p2p_downloading_allowed);
1081 EXPECT_FALSE(result.p2p_sharing_allowed);
1082}
1083
1084TEST_F(UmChromeOSPolicyTest,
1085 UpdateCanStartAllowedP2PDownloadingBlockedDueToNumAttempts) {
Gilad Arnold349ac832014-10-06 14:20:28 -07001086 // The UpdateCanStart policy returns true; device policy permits HTTP but
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001087 // blocks P2P download, because the max number of P2P downloads have been
1088 // attempted. P2P sharing is still permitted.
Gilad Arnold349ac832014-10-06 14:20:28 -07001089
1090 SetUpdateCheckAllowed(false);
1091
1092 // Override specific device policy attributes.
1093 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1094 new bool(true));
1095 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1096 new bool(true));
1097
1098 // Check that the UpdateCanStart returns true.
1099 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1100 update_state.p2p_num_attempts = ChromeOSPolicy::kMaxP2PAttempts;
1101 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001102 ExpectPolicyStatus(
1103 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnold349ac832014-10-06 14:20:28 -07001104 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001105 EXPECT_FALSE(result.p2p_downloading_allowed);
1106 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnold349ac832014-10-06 14:20:28 -07001107}
1108
1109TEST_F(UmChromeOSPolicyTest,
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001110 UpdateCanStartAllowedP2PDownloadingBlockedDueToAttemptsPeriod) {
Gilad Arnold349ac832014-10-06 14:20:28 -07001111 // The UpdateCanStart policy returns true; device policy permits HTTP but
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001112 // blocks P2P download, because the max period for attempt to download via P2P
1113 // has elapsed. P2P sharing is still permitted.
Gilad Arnold349ac832014-10-06 14:20:28 -07001114
1115 SetUpdateCheckAllowed(false);
1116
1117 // Override specific device policy attributes.
1118 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1119 new bool(true));
1120 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1121 new bool(true));
1122
1123 // Check that the UpdateCanStart returns true.
1124 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1125 update_state.p2p_num_attempts = 1;
1126 update_state.p2p_first_attempted =
1127 fake_clock_.GetWallclockTime() -
Amin Hassani4b717432019-01-14 16:24:20 -08001128 TimeDelta::FromSeconds(ChromeOSPolicy::kMaxP2PAttemptsPeriodInSeconds +
1129 1);
Gilad Arnold349ac832014-10-06 14:20:28 -07001130 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001131 ExpectPolicyStatus(
1132 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnold349ac832014-10-06 14:20:28 -07001133 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001134 EXPECT_FALSE(result.p2p_downloading_allowed);
1135 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnold349ac832014-10-06 14:20:28 -07001136}
1137
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001138TEST_F(UmChromeOSPolicyTest,
1139 UpdateCanStartAllowedWithHttpUrlForUnofficialBuild) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001140 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1141 // P2P updates, but marking this an unofficial build overrules the HTTP
1142 // setting.
1143
1144 SetUpdateCheckAllowed(false);
1145
1146 // Override specific device policy attributes.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001147 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1148 new bool(false));
Amin Hassani4b717432019-01-14 16:24:20 -08001149 fake_state_.system_provider()->var_is_official_build()->reset(
1150 new bool(false));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001151
1152 // Check that the UpdateCanStart returns true.
1153 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001154 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001155 ExpectPolicyStatus(
1156 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001157 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001158 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001159 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001160 EXPECT_EQ(0, result.download_url_num_errors);
1161 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001162}
1163
1164TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithHttpsUrl) {
1165 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1166 // P2P updates, but an HTTPS URL is provided and selected for download.
1167
1168 SetUpdateCheckAllowed(false);
1169
1170 // Override specific device policy attributes.
1171 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1172 new bool(false));
1173
1174 // Add an HTTPS URL.
1175 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001176 update_state.download_urls.emplace_back("https://secure/url/");
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001177
1178 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001179 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001180 ExpectPolicyStatus(
1181 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001182 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001183 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001184 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001185 EXPECT_EQ(0, result.download_url_num_errors);
1186 EXPECT_FALSE(result.do_increment_failures);
1187}
1188
1189TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedMaxErrorsNotExceeded) {
1190 // The UpdateCanStart policy returns true; the first URL has download errors
1191 // but does not exceed the maximum allowed number of failures, so it is stilli
1192 // usable.
1193
1194 SetUpdateCheckAllowed(false);
1195
1196 // Add a second URL; update with this URL attempted and failed enough times to
1197 // disqualify the current (first) URL.
1198 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1199 update_state.num_checks = 5;
1200 update_state.download_urls.emplace_back("http://another/fake/url/");
1201 Time t = fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(12);
1202 for (int i = 0; i < 5; i++) {
1203 update_state.download_errors.emplace_back(
1204 0, ErrorCode::kDownloadTransferError, t);
1205 t += TimeDelta::FromSeconds(1);
1206 }
1207
1208 // Check that the UpdateCanStart returns true.
1209 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001210 ExpectPolicyStatus(
1211 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001212 EXPECT_TRUE(result.update_can_start);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001213 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001214 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001215 EXPECT_EQ(5, result.download_url_num_errors);
1216 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001217}
1218
1219TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlMaxExceeded) {
1220 // The UpdateCanStart policy returns true; the first URL exceeded the maximum
1221 // allowed number of failures, but a second URL is available.
1222
1223 SetUpdateCheckAllowed(false);
1224
1225 // Add a second URL; update with this URL attempted and failed enough times to
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001226 // disqualify the current (first) URL.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001227 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1228 update_state.num_checks = 10;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001229 update_state.download_urls.emplace_back("http://another/fake/url/");
1230 Time t = fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(12);
1231 for (int i = 0; i < 11; i++) {
1232 update_state.download_errors.emplace_back(
1233 0, ErrorCode::kDownloadTransferError, t);
1234 t += TimeDelta::FromSeconds(1);
1235 }
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001236
1237 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001238 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001239 ExpectPolicyStatus(
1240 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001241 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001242 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001243 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001244 EXPECT_EQ(0, result.download_url_num_errors);
1245 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001246}
1247
1248TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlHardError) {
1249 // The UpdateCanStart policy returns true; the first URL fails with a hard
1250 // error, but a second URL is available.
1251
1252 SetUpdateCheckAllowed(false);
1253
1254 // Add a second URL; update with this URL attempted and failed in a way that
1255 // causes it to switch directly to the next URL.
1256 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1257 update_state.num_checks = 10;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001258 update_state.download_urls.emplace_back("http://another/fake/url/");
1259 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -08001260 0,
1261 ErrorCode::kPayloadHashMismatchError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001262 fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(1));
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001263
1264 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001265 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001266 ExpectPolicyStatus(
1267 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001268 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001269 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001270 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001271 EXPECT_EQ(0, result.download_url_num_errors);
1272 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001273}
1274
1275TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedUrlWrapsAround) {
1276 // The UpdateCanStart policy returns true; URL search properly wraps around
1277 // the last one on the list.
1278
1279 SetUpdateCheckAllowed(false);
1280
1281 // Add a second URL; update with this URL attempted and failed in a way that
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001282 // causes it to switch directly to the next URL. We must disable backoff in
1283 // order for it not to interfere.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001284 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001285 update_state.num_checks = 1;
1286 update_state.is_backoff_disabled = true;
1287 update_state.download_urls.emplace_back("http://another/fake/url/");
1288 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -08001289 1,
1290 ErrorCode::kPayloadHashMismatchError,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001291 fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(1));
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001292
1293 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001294 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001295 ExpectPolicyStatus(
1296 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001297 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001298 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001299 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001300 EXPECT_EQ(0, result.download_url_num_errors);
1301 EXPECT_TRUE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001302}
1303
1304TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedNoUsableUrls) {
1305 // The UpdateCanStart policy returns false; there's a single HTTP URL but its
1306 // use is forbidden by policy.
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001307 //
1308 // Note: In the case where no usable URLs are found, the policy should not
1309 // increment the number of failed attempts! Doing so would result in a
1310 // non-idempotent semantics, and does not fall within the intended purpose of
1311 // the backoff mechanism anyway.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001312
1313 SetUpdateCheckAllowed(false);
1314
1315 // Override specific device policy attributes.
1316 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1317 new bool(false));
1318
1319 // Check that the UpdateCanStart returns false.
1320 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001321 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001322 ExpectPolicyStatus(
1323 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001324 EXPECT_FALSE(result.update_can_start);
1325 EXPECT_EQ(UpdateCannotStartReason::kCannotDownload,
1326 result.cannot_start_reason);
1327 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001328}
1329
1330TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoUsableUrlsButP2PEnabled) {
1331 // The UpdateCanStart policy returns true; there's a single HTTP URL but its
1332 // use is forbidden by policy, however P2P is enabled. The result indicates
1333 // that no URL can be used.
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001334 //
1335 // Note: The number of failed attempts should not increase in this case (see
1336 // above test).
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001337
1338 SetUpdateCheckAllowed(false);
1339
1340 // Override specific device policy attributes.
1341 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1342 new bool(true));
1343 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1344 new bool(false));
1345
1346 // Check that the UpdateCanStart returns true.
1347 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001348 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001349 ExpectPolicyStatus(
1350 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001351 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001352 EXPECT_TRUE(result.p2p_downloading_allowed);
1353 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001354 EXPECT_GT(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001355 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001356 EXPECT_EQ(0, result.download_url_num_errors);
1357 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001358}
1359
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001360TEST_F(UmChromeOSPolicyTest,
1361 UpdateCanStartAllowedNoUsableUrlsButEnterpriseEnrolled) {
1362 // The UpdateCanStart policy returns true; there's a single HTTP URL but its
1363 // use is forbidden by policy, and P2P is unset on the policy, however the
1364 // device is enterprise-enrolled so P2P is allowed. The result indicates that
1365 // no URL can be used.
1366 //
1367 // Note: The number of failed attempts should not increase in this case (see
1368 // above test).
1369
1370 SetUpdateCheckAllowed(false);
1371
1372 // Override specific device policy attributes.
1373 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(nullptr);
1374 fake_state_.device_policy_provider()->var_owner()->reset(nullptr);
1375 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1376 new bool(false));
1377
1378 // Check that the UpdateCanStart returns true.
1379 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1380 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001381 ExpectPolicyStatus(
1382 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001383 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001384 EXPECT_TRUE(result.p2p_downloading_allowed);
1385 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001386 EXPECT_GT(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001387 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001388 EXPECT_EQ(0, result.download_url_num_errors);
1389 EXPECT_FALSE(result.do_increment_failures);
1390}
1391
Gilad Arnold684219d2014-07-07 14:54:57 -07001392TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedEthernetDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001393 // Ethernet is always allowed.
1394
Amin Hassani4b717432019-01-14 16:24:20 -08001395 fake_state_.shill_provider()->var_conn_type()->reset(
1396 new ConnectionType(ConnectionType::kEthernet));
Gilad Arnold0adbc942014-05-12 10:35:43 -07001397
1398 bool result;
Amin Hassani4b717432019-01-14 16:24:20 -08001399 ExpectPolicyStatus(
1400 EvalStatus::kSucceeded, &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001401 EXPECT_TRUE(result);
1402}
1403
Gilad Arnold684219d2014-07-07 14:54:57 -07001404TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWifiDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001405 // Wifi is allowed if not tethered.
1406
Amin Hassani4b717432019-01-14 16:24:20 -08001407 fake_state_.shill_provider()->var_conn_type()->reset(
1408 new ConnectionType(ConnectionType::kWifi));
Gilad Arnold0adbc942014-05-12 10:35:43 -07001409
1410 bool result;
Amin Hassani4b717432019-01-14 16:24:20 -08001411 ExpectPolicyStatus(
1412 EvalStatus::kSucceeded, &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001413 EXPECT_TRUE(result);
1414}
1415
Alex Deymo63784a52014-05-28 10:46:14 -07001416TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001417 UpdateCurrentConnectionNotAllowedWifiTetheredDefault) {
1418 // Tethered wifi is not allowed by default.
1419
Amin Hassani4b717432019-01-14 16:24:20 -08001420 fake_state_.shill_provider()->var_conn_type()->reset(
1421 new ConnectionType(ConnectionType::kWifi));
1422 fake_state_.shill_provider()->var_conn_tethering()->reset(
1423 new ConnectionTethering(ConnectionTethering::kConfirmed));
Gilad Arnold0adbc942014-05-12 10:35:43 -07001424
1425 bool result;
Amin Hassani4b717432019-01-14 16:24:20 -08001426 ExpectPolicyStatus(
1427 EvalStatus::kAskMeAgainLater, &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001428}
1429
Amin Hassani4b717432019-01-14 16:24:20 -08001430TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWifiTetheredPolicyOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001431 // Tethered wifi can be allowed by policy.
1432
Amin Hassani4b717432019-01-14 16:24:20 -08001433 fake_state_.shill_provider()->var_conn_type()->reset(
1434 new ConnectionType(ConnectionType::kWifi));
1435 fake_state_.shill_provider()->var_conn_tethering()->reset(
1436 new ConnectionTethering(ConnectionTethering::kConfirmed));
Gilad Arnold0adbc942014-05-12 10:35:43 -07001437 set<ConnectionType> allowed_connections;
1438 allowed_connections.insert(ConnectionType::kCellular);
Amin Hassani4b717432019-01-14 16:24:20 -08001439 fake_state_.device_policy_provider()
1440 ->var_allowed_connection_types_for_update()
1441 ->reset(new set<ConnectionType>(allowed_connections));
Gilad Arnold0adbc942014-05-12 10:35:43 -07001442
1443 bool result;
Amin Hassani4b717432019-01-14 16:24:20 -08001444 ExpectPolicyStatus(
1445 EvalStatus::kSucceeded, &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001446 EXPECT_TRUE(result);
1447}
1448
Gilad Arnold684219d2014-07-07 14:54:57 -07001449TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWimaxDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001450 // Wimax is always allowed.
1451
Amin Hassani4b717432019-01-14 16:24:20 -08001452 fake_state_.shill_provider()->var_conn_type()->reset(
1453 new ConnectionType(ConnectionType::kWifi));
Gilad Arnold0adbc942014-05-12 10:35:43 -07001454
1455 bool result;
Amin Hassani4b717432019-01-14 16:24:20 -08001456 ExpectPolicyStatus(
1457 EvalStatus::kSucceeded, &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001458 EXPECT_TRUE(result);
1459}
1460
Alex Deymo63784a52014-05-28 10:46:14 -07001461TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001462 UpdateCurrentConnectionNotAllowedBluetoothDefault) {
1463 // Bluetooth is never allowed.
1464
Amin Hassani4b717432019-01-14 16:24:20 -08001465 fake_state_.shill_provider()->var_conn_type()->reset(
1466 new ConnectionType(ConnectionType::kBluetooth));
Gilad Arnold0adbc942014-05-12 10:35:43 -07001467
1468 bool result;
Amin Hassani4b717432019-01-14 16:24:20 -08001469 ExpectPolicyStatus(
1470 EvalStatus::kAskMeAgainLater, &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001471}
1472
Alex Deymo63784a52014-05-28 10:46:14 -07001473TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001474 UpdateCurrentConnectionNotAllowedBluetoothPolicyCannotOverride) {
1475 // Bluetooth cannot be allowed even by policy.
1476
Amin Hassani4b717432019-01-14 16:24:20 -08001477 fake_state_.shill_provider()->var_conn_type()->reset(
1478 new ConnectionType(ConnectionType::kBluetooth));
Gilad Arnold0adbc942014-05-12 10:35:43 -07001479 set<ConnectionType> allowed_connections;
1480 allowed_connections.insert(ConnectionType::kBluetooth);
Amin Hassani4b717432019-01-14 16:24:20 -08001481 fake_state_.device_policy_provider()
1482 ->var_allowed_connection_types_for_update()
1483 ->reset(new set<ConnectionType>(allowed_connections));
Gilad Arnold0adbc942014-05-12 10:35:43 -07001484
1485 bool result;
Amin Hassani4b717432019-01-14 16:24:20 -08001486 ExpectPolicyStatus(
1487 EvalStatus::kAskMeAgainLater, &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001488}
1489
Alex Deymo63784a52014-05-28 10:46:14 -07001490TEST_F(UmChromeOSPolicyTest, UpdateCurrentConnectionNotAllowedCellularDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001491 // Cellular is not allowed by default.
1492
Amin Hassani4b717432019-01-14 16:24:20 -08001493 fake_state_.shill_provider()->var_conn_type()->reset(
1494 new ConnectionType(ConnectionType::kCellular));
Gilad Arnold0adbc942014-05-12 10:35:43 -07001495
1496 bool result;
Amin Hassani4b717432019-01-14 16:24:20 -08001497 ExpectPolicyStatus(
1498 EvalStatus::kAskMeAgainLater, &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001499}
1500
Amin Hassani4b717432019-01-14 16:24:20 -08001501TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedCellularPolicyOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001502 // Update over cellular can be enabled by policy.
1503
Amin Hassani4b717432019-01-14 16:24:20 -08001504 fake_state_.shill_provider()->var_conn_type()->reset(
1505 new ConnectionType(ConnectionType::kCellular));
Gilad Arnold0adbc942014-05-12 10:35:43 -07001506 set<ConnectionType> allowed_connections;
1507 allowed_connections.insert(ConnectionType::kCellular);
Amin Hassani4b717432019-01-14 16:24:20 -08001508 fake_state_.device_policy_provider()
1509 ->var_allowed_connection_types_for_update()
1510 ->reset(new set<ConnectionType>(allowed_connections));
Gilad Arnold0adbc942014-05-12 10:35:43 -07001511
1512 bool result;
Amin Hassani4b717432019-01-14 16:24:20 -08001513 ExpectPolicyStatus(
1514 EvalStatus::kSucceeded, &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001515 EXPECT_TRUE(result);
1516}
1517
Amin Hassani4b717432019-01-14 16:24:20 -08001518TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedCellularUserOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001519 // Update over cellular can be enabled by user settings, but only if policy
1520 // is present and does not determine allowed connections.
1521
Amin Hassani4b717432019-01-14 16:24:20 -08001522 fake_state_.shill_provider()->var_conn_type()->reset(
1523 new ConnectionType(ConnectionType::kCellular));
Gilad Arnold0adbc942014-05-12 10:35:43 -07001524 set<ConnectionType> allowed_connections;
1525 allowed_connections.insert(ConnectionType::kCellular);
Amin Hassani4b717432019-01-14 16:24:20 -08001526 fake_state_.updater_provider()->var_cellular_enabled()->reset(new bool(true));
Gilad Arnold0adbc942014-05-12 10:35:43 -07001527
1528 bool result;
Amin Hassani4b717432019-01-14 16:24:20 -08001529 ExpectPolicyStatus(
1530 EvalStatus::kSucceeded, &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001531 EXPECT_TRUE(result);
1532}
1533
Amin Hassani4b717432019-01-14 16:24:20 -08001534TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedScatteringSupressedDueToP2P) {
Gilad Arnold14a9e702014-10-08 08:09:09 -07001535 // The UpdateCanStart policy returns true; scattering should have applied, but
1536 // P2P download is allowed. Scattering values are nonetheless returned, and so
1537 // are download URL values, albeit the latter are not allowed to be used.
1538
1539 SetUpdateCheckAllowed(false);
1540 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
1541 new TimeDelta(TimeDelta::FromMinutes(2)));
1542 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1543
1544 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
1545 update_state.scatter_wait_period = TimeDelta::FromSeconds(35);
1546
1547 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001548 ExpectPolicyStatus(
1549 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001550 EXPECT_TRUE(result.update_can_start);
1551 EXPECT_EQ(0, result.download_url_idx);
1552 EXPECT_FALSE(result.download_url_allowed);
1553 EXPECT_EQ(0, result.download_url_num_errors);
1554 EXPECT_TRUE(result.p2p_downloading_allowed);
1555 EXPECT_TRUE(result.p2p_sharing_allowed);
1556 EXPECT_FALSE(result.do_increment_failures);
1557 EXPECT_EQ(TimeDelta::FromSeconds(35), result.scatter_wait_period);
1558 EXPECT_EQ(0, result.scatter_check_threshold);
1559}
1560
Amin Hassani4b717432019-01-14 16:24:20 -08001561TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffSupressedDueToP2P) {
Gilad Arnold14a9e702014-10-08 08:09:09 -07001562 // The UpdateCanStart policy returns true; backoff should have applied, but
1563 // P2P download is allowed. Backoff values are nonetheless returned, and so
1564 // are download URL values, albeit the latter are not allowed to be used.
1565
1566 SetUpdateCheckAllowed(false);
1567
1568 const Time curr_time = fake_clock_.GetWallclockTime();
1569 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
1570 update_state.download_errors_max = 1;
1571 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -08001572 0,
1573 ErrorCode::kDownloadTransferError,
Gilad Arnold14a9e702014-10-08 08:09:09 -07001574 curr_time - TimeDelta::FromSeconds(8));
1575 update_state.download_errors.emplace_back(
Amin Hassani4b717432019-01-14 16:24:20 -08001576 0,
1577 ErrorCode::kDownloadTransferError,
Gilad Arnold14a9e702014-10-08 08:09:09 -07001578 curr_time - TimeDelta::FromSeconds(2));
1579 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1580
1581 UpdateDownloadParams result;
Amin Hassani4b717432019-01-14 16:24:20 -08001582 ExpectPolicyStatus(
1583 EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result, update_state);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001584 EXPECT_TRUE(result.update_can_start);
1585 EXPECT_EQ(0, result.download_url_idx);
1586 EXPECT_FALSE(result.download_url_allowed);
1587 EXPECT_EQ(0, result.download_url_num_errors);
1588 EXPECT_TRUE(result.p2p_downloading_allowed);
1589 EXPECT_TRUE(result.p2p_sharing_allowed);
1590 EXPECT_TRUE(result.do_increment_failures);
1591 EXPECT_LT(curr_time, result.backoff_expiry);
1592}
1593
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001594TEST_F(UmChromeOSPolicyTest, P2PEnabledNotAllowed) {
1595 bool result;
1596 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1597 EXPECT_FALSE(result);
1598}
1599
1600TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedByDevicePolicy) {
1601 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1602 new bool(true));
1603
1604 bool result;
1605 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1606 EXPECT_TRUE(result);
1607}
1608
1609TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedByUpdater) {
1610 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1611
1612 bool result;
1613 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1614 EXPECT_TRUE(result);
1615}
1616
1617TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedDeviceEnterpriseEnrolled) {
1618 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(nullptr);
1619 fake_state_.device_policy_provider()->var_owner()->reset(nullptr);
1620
1621 bool result;
1622 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1623 EXPECT_TRUE(result);
1624}
1625
1626TEST_F(UmChromeOSPolicyTest, P2PEnabledChangedBlocks) {
1627 bool result;
Amin Hassani4b717432019-01-14 16:24:20 -08001628 ExpectPolicyStatus(
1629 EvalStatus::kAskMeAgainLater, &Policy::P2PEnabledChanged, &result, false);
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001630}
1631
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -07001632TEST_F(UmChromeOSPolicyTest,
1633 UpdateCanBeAppliedForcedUpdatesDisablesTimeRestrictions) {
1634 Time curr_time = fake_clock_.GetWallclockTime();
1635 fake_state_.updater_provider()->var_forced_update_requested()->reset(
1636 new UpdateRequestStatus(UpdateRequestStatus::kInteractive));
1637 // Should return kAskMeAgainLater when updated are not forced.
1638 TestDisallowedTimeIntervals(
1639 {WeeklyTimeInterval(
1640 WeeklyTime::FromTime(curr_time),
1641 WeeklyTime::FromTime(curr_time + TimeDelta::FromMinutes(1)))},
Adolfo Victoria7a7a0822018-07-27 13:35:24 -07001642 ErrorCode::kSuccess,
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -07001643 /* kiosk = */ true);
1644}
1645
1646TEST_F(UmChromeOSPolicyTest, UpdateCanBeAppliedFailsInDisallowedTime) {
1647 Time curr_time = fake_clock_.GetWallclockTime();
1648 TestDisallowedTimeIntervals(
1649 {WeeklyTimeInterval(
1650 WeeklyTime::FromTime(curr_time),
1651 WeeklyTime::FromTime(curr_time + TimeDelta::FromMinutes(1)))},
Adolfo Victoria7a7a0822018-07-27 13:35:24 -07001652 ErrorCode::kOmahaUpdateDeferredPerPolicy,
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -07001653 /* kiosk = */ true);
1654}
1655
1656TEST_F(UmChromeOSPolicyTest, UpdateCanBeAppliedOutsideDisallowedTime) {
1657 Time curr_time = fake_clock_.GetWallclockTime();
1658 TestDisallowedTimeIntervals(
1659 {WeeklyTimeInterval(
1660 WeeklyTime::FromTime(curr_time - TimeDelta::FromHours(3)),
1661 WeeklyTime::FromTime(curr_time))},
Adolfo Victoria7a7a0822018-07-27 13:35:24 -07001662 ErrorCode::kSuccess,
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -07001663 /* kiosk = */ true);
1664}
1665
1666TEST_F(UmChromeOSPolicyTest, UpdateCanBeAppliedPassesOnNonKiosk) {
1667 Time curr_time = fake_clock_.GetWallclockTime();
1668 TestDisallowedTimeIntervals(
1669 {WeeklyTimeInterval(
1670 WeeklyTime::FromTime(curr_time),
1671 WeeklyTime::FromTime(curr_time + TimeDelta::FromMinutes(1)))},
Adolfo Victoria7a7a0822018-07-27 13:35:24 -07001672 ErrorCode::kSuccess,
Adolfo Victoria0dbf1f92018-07-19 14:18:11 -07001673 /* kiosk = */ false);
1674}
1675
Alex Deymo63784a52014-05-28 10:46:14 -07001676} // namespace chromeos_update_manager