blob: 917713666ef188ee24bc945b5e45254a1ee7884f [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
Gilad Arnold0adbc942014-05-12 10:35:43 -070019#include <set>
Alex Deymo0d11c602014-04-23 20:12:20 -070020#include <string>
Gilad Arnolddc4bb262014-07-23 10:45:19 -070021#include <tuple>
Gilad Arnoldb3b05442014-05-30 14:25:05 -070022#include <vector>
Alex Deymo0d11c602014-04-23 20:12:20 -070023
24#include <base/time/time.h>
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070025#include <brillo/message_loops/fake_message_loop.h>
Alex Deymo0d11c602014-04-23 20:12:20 -070026#include <gtest/gtest.h>
27
Alex Deymo39910dc2015-11-09 17:04:30 -080028#include "update_engine/common/fake_clock.h"
Alex Deymo63784a52014-05-28 10:46:14 -070029#include "update_engine/update_manager/evaluation_context.h"
30#include "update_engine/update_manager/fake_state.h"
31#include "update_engine/update_manager/umtest_utils.h"
Alex Deymo0d11c602014-04-23 20:12:20 -070032
33using base::Time;
34using base::TimeDelta;
Gilad Arnoldb3b05442014-05-30 14:25:05 -070035using chromeos_update_engine::ErrorCode;
Alex Deymo0d11c602014-04-23 20:12:20 -070036using chromeos_update_engine::FakeClock;
Gilad Arnold0adbc942014-05-12 10:35:43 -070037using std::set;
Alex Deymo0d11c602014-04-23 20:12:20 -070038using std::string;
Gilad Arnolddc4bb262014-07-23 10:45:19 -070039using std::tuple;
Gilad Arnoldb3b05442014-05-30 14:25:05 -070040using std::vector;
Alex Deymo0d11c602014-04-23 20:12:20 -070041
Alex Deymo63784a52014-05-28 10:46:14 -070042namespace chromeos_update_manager {
Alex Deymo0d11c602014-04-23 20:12:20 -070043
Alex Deymo63784a52014-05-28 10:46:14 -070044class UmChromeOSPolicyTest : public ::testing::Test {
Alex Deymo0d11c602014-04-23 20:12:20 -070045 protected:
Alex Deymo610277e2014-11-11 21:18:11 -080046 void SetUp() override {
Alex Deymo509dd532015-06-10 14:11:05 -070047 loop_.SetAsCurrent();
Alex Deymo0d11c602014-04-23 20:12:20 -070048 SetUpDefaultClock();
Gilad Arnoldb2271992014-06-19 12:35:24 -070049 eval_ctx_ = new EvaluationContext(&fake_clock_, TimeDelta::FromSeconds(5));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070050 SetUpDefaultState();
51 SetUpDefaultDevicePolicy();
Alex Deymo0d11c602014-04-23 20:12:20 -070052 }
53
Alex Deymo509dd532015-06-10 14:11:05 -070054 void TearDown() override {
55 EXPECT_FALSE(loop_.PendingTasks());
56 }
57
Alex Deymo0d11c602014-04-23 20:12:20 -070058 // Sets the clock to fixed values.
59 void SetUpDefaultClock() {
60 fake_clock_.SetMonotonicTime(Time::FromInternalValue(12345678L));
61 fake_clock_.SetWallclockTime(Time::FromInternalValue(12345678901234L));
62 }
63
64 void SetUpDefaultState() {
65 fake_state_.updater_provider()->var_updater_started_time()->reset(
66 new Time(fake_clock_.GetWallclockTime()));
67 fake_state_.updater_provider()->var_last_checked_time()->reset(
68 new Time(fake_clock_.GetWallclockTime()));
69 fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -070070 reset(new unsigned int{0});
Gilad Arnolda0258a52014-07-10 16:21:19 -070071 fake_state_.updater_provider()->var_server_dictated_poll_interval()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -070072 reset(new unsigned int{0});
73 fake_state_.updater_provider()->var_forced_update_requested()->
74 reset(new UpdateRequestStatus{UpdateRequestStatus::kNone});
Alex Deymo0d11c602014-04-23 20:12:20 -070075
76 fake_state_.random_provider()->var_seed()->reset(
77 new uint64_t(4)); // chosen by fair dice roll.
78 // guaranteed to be random.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070079
80 // No device policy loaded by default.
81 fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
82 new bool(false));
83
Gilad Arnolda1eabcd2014-07-09 15:42:40 -070084 // OOBE is enabled by default.
85 fake_state_.config_provider()->var_is_oobe_enabled()->reset(
86 new bool(true));
87
Gilad Arnold76a11f62014-05-20 09:02:12 -070088 // For the purpose of the tests, this is an official build and OOBE was
89 // completed.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -070090 fake_state_.system_provider()->var_is_official_build()->reset(
91 new bool(true));
Gilad Arnold76a11f62014-05-20 09:02:12 -070092 fake_state_.system_provider()->var_is_oobe_complete()->reset(
93 new bool(true));
Alex Deymo763e7db2015-08-27 21:08:08 -070094 fake_state_.system_provider()->var_num_slots()->reset(new unsigned int(2));
Gilad Arnold0adbc942014-05-12 10:35:43 -070095
96 // Connection is wifi, untethered.
97 fake_state_.shill_provider()->var_conn_type()->
98 reset(new ConnectionType(ConnectionType::kWifi));
99 fake_state_.shill_provider()->var_conn_tethering()->
100 reset(new ConnectionTethering(ConnectionTethering::kNotDetected));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700101 }
102
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700103 // Sets up a default device policy that does not impose any restrictions
104 // (HTTP) nor enables any features (P2P).
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700105 void SetUpDefaultDevicePolicy() {
106 fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
107 new bool(true));
108 fake_state_.device_policy_provider()->var_update_disabled()->reset(
109 new bool(false));
110 fake_state_.device_policy_provider()->
111 var_allowed_connection_types_for_update()->reset(nullptr);
112 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
113 new TimeDelta());
114 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700115 new bool(true));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700116 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
117 new bool(false));
118 fake_state_.device_policy_provider()->var_release_channel_delegated()->
119 reset(new bool(true));
120 }
121
122 // Configures the UpdateCheckAllowed policy to return a desired value by
123 // faking the current wall clock time as needed. Restores the default state.
124 // This is used when testing policies that depend on this one.
125 void SetUpdateCheckAllowed(bool allow_check) {
126 Time next_update_check;
127 ExpectPolicyStatus(EvalStatus::kSucceeded,
128 &ChromeOSPolicy::NextUpdateCheckTime,
129 &next_update_check);
130 SetUpDefaultState();
131 SetUpDefaultDevicePolicy();
132 Time curr_time = next_update_check;
133 if (allow_check)
134 curr_time += TimeDelta::FromSeconds(1);
135 else
136 curr_time -= TimeDelta::FromSeconds(1);
137 fake_clock_.SetWallclockTime(curr_time);
138 }
139
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700140 // Returns a default UpdateState structure:
141 UpdateState GetDefaultUpdateState(TimeDelta first_seen_period) {
142 Time first_seen_time = fake_clock_.GetWallclockTime() - first_seen_period;
143 UpdateState update_state = UpdateState();
144
145 // This is a non-interactive check returning a delta payload, seen for the
146 // first time (|first_seen_period| ago). Clearly, there were no failed
147 // attempts so far.
148 update_state.is_interactive = false;
149 update_state.is_delta_payload = false;
150 update_state.first_seen = first_seen_time;
151 update_state.num_checks = 1;
152 update_state.num_failures = 0;
153 update_state.failures_last_updated = Time(); // Needs to be zero.
154 // There's a single HTTP download URL with a maximum of 10 retries.
155 update_state.download_urls = vector<string>{"http://fake/url/"};
156 update_state.download_errors_max = 10;
157 // Download was never attempted.
158 update_state.last_download_url_idx = -1;
159 update_state.last_download_url_num_errors = 0;
160 // There were no download errors.
161 update_state.download_errors = vector<tuple<int, ErrorCode, Time>>();
Gilad Arnold78ecbfc2014-10-22 14:38:25 -0700162 // P2P is not disabled by Omaha.
163 update_state.p2p_downloading_disabled = false;
164 update_state.p2p_sharing_disabled = false;
Gilad Arnold349ac832014-10-06 14:20:28 -0700165 // P2P was not attempted.
166 update_state.p2p_num_attempts = 0;
167 update_state.p2p_first_attempted = Time();
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700168 // No active backoff period, backoff is not disabled by Omaha.
169 update_state.backoff_expiry = Time();
170 update_state.is_backoff_disabled = false;
171 // There is no active scattering wait period (max 7 days allowed) nor check
172 // threshold (none allowed).
173 update_state.scatter_wait_period = TimeDelta();
174 update_state.scatter_check_threshold = 0;
175 update_state.scatter_wait_period_max = TimeDelta::FromDays(7);
176 update_state.scatter_check_threshold_min = 0;
177 update_state.scatter_check_threshold_max = 0;
178
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700179 return update_state;
Alex Deymo0d11c602014-04-23 20:12:20 -0700180 }
181
182 // Runs the passed |policy_method| policy and expects it to return the
183 // |expected| return value.
184 template<typename T, typename R, typename... Args>
185 void ExpectPolicyStatus(
186 EvalStatus expected,
187 T policy_method,
188 R* result, Args... args) {
189 string error = "<None>";
190 eval_ctx_->ResetEvaluation();
191 EXPECT_EQ(expected,
Alex Vakulenko9c155d22014-12-10 12:52:31 -0800192 (policy_.*policy_method)(eval_ctx_.get(), &fake_state_, &error,
193 result, args...))
Alex Deymoc850b4f2014-05-19 11:06:41 -0700194 << "Returned error: " << error
195 << "\nEvaluation context: " << eval_ctx_->DumpContext();
Alex Deymo0d11c602014-04-23 20:12:20 -0700196 }
197
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700198 brillo::FakeMessageLoop loop_{nullptr};
Alex Deymo0d11c602014-04-23 20:12:20 -0700199 FakeClock fake_clock_;
200 FakeState fake_state_;
201 scoped_refptr<EvaluationContext> eval_ctx_;
202 ChromeOSPolicy policy_; // ChromeOSPolicy under test.
203};
204
Alex Deymo63784a52014-05-28 10:46:14 -0700205TEST_F(UmChromeOSPolicyTest, FirstCheckIsAtMostInitialIntervalAfterStart) {
Alex Deymo0d11c602014-04-23 20:12:20 -0700206 Time next_update_check;
207
Gilad Arnold38b14022014-07-09 12:45:56 -0700208 // Set the last update time so it'll appear as if this is a first update check
209 // in the lifetime of the current updater.
210 fake_state_.updater_provider()->var_last_checked_time()->reset(
211 new Time(fake_clock_.GetWallclockTime() - TimeDelta::FromMinutes(10)));
212
Alex Deymo0d11c602014-04-23 20:12:20 -0700213 ExpectPolicyStatus(EvalStatus::kSucceeded,
214 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
215
216 EXPECT_LE(fake_clock_.GetWallclockTime(), next_update_check);
Gilad Arnold38b14022014-07-09 12:45:56 -0700217 EXPECT_GE(
218 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
219 ChromeOSPolicy::kTimeoutInitialInterval +
220 ChromeOSPolicy::kTimeoutRegularFuzz / 2),
221 next_update_check);
222}
223
224TEST_F(UmChromeOSPolicyTest, RecurringCheckBaseIntervalAndFuzz) {
225 // Ensure that we're using the correct interval (kPeriodicInterval) and fuzz
226 // (kTimeoutRegularFuzz) as base values for period updates.
227 Time next_update_check;
228
229 ExpectPolicyStatus(EvalStatus::kSucceeded,
230 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
231
232 EXPECT_LE(
233 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
234 ChromeOSPolicy::kTimeoutPeriodicInterval -
235 ChromeOSPolicy::kTimeoutRegularFuzz / 2),
236 next_update_check);
237 EXPECT_GE(
238 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
239 ChromeOSPolicy::kTimeoutPeriodicInterval +
240 ChromeOSPolicy::kTimeoutRegularFuzz / 2),
241 next_update_check);
242}
243
244TEST_F(UmChromeOSPolicyTest, RecurringCheckBackoffIntervalAndFuzz) {
245 // Ensure that we're properly backing off and fuzzing in the presence of
246 // failed updates attempts.
247 Time next_update_check;
248
249 fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700250 reset(new unsigned int{2});
Gilad Arnold38b14022014-07-09 12:45:56 -0700251
252 ExpectPolicyStatus(EvalStatus::kSucceeded,
253 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
254
255 int expected_interval = ChromeOSPolicy::kTimeoutPeriodicInterval * 4;
256 EXPECT_LE(
257 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
258 expected_interval - expected_interval / 2),
259 next_update_check);
260 EXPECT_GE(
261 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
262 expected_interval + expected_interval / 2),
263 next_update_check);
Alex Deymo0d11c602014-04-23 20:12:20 -0700264}
265
Gilad Arnolda0258a52014-07-10 16:21:19 -0700266TEST_F(UmChromeOSPolicyTest, RecurringCheckServerDictatedPollInterval) {
267 // Policy honors the server provided check poll interval.
268 Time next_update_check;
269
270 const unsigned int kInterval = ChromeOSPolicy::kTimeoutPeriodicInterval * 4;
271 fake_state_.updater_provider()->var_server_dictated_poll_interval()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700272 reset(new unsigned int{kInterval});
Gilad Arnolda0258a52014-07-10 16:21:19 -0700273 // We should not be backing off in this case.
274 fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700275 reset(new unsigned int{2});
Gilad Arnolda0258a52014-07-10 16:21:19 -0700276
277 ExpectPolicyStatus(EvalStatus::kSucceeded,
278 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
279
280 EXPECT_LE(
281 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
282 kInterval - kInterval / 2),
283 next_update_check);
284 EXPECT_GE(
285 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
286 kInterval + kInterval / 2),
287 next_update_check);
288}
289
Alex Deymo63784a52014-05-28 10:46:14 -0700290TEST_F(UmChromeOSPolicyTest, ExponentialBackoffIsCapped) {
Alex Deymo0d11c602014-04-23 20:12:20 -0700291 Time next_update_check;
292
Alex Deymo0d11c602014-04-23 20:12:20 -0700293 fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700294 reset(new unsigned int{100});
Gilad Arnold38b14022014-07-09 12:45:56 -0700295
Alex Deymo0d11c602014-04-23 20:12:20 -0700296 ExpectPolicyStatus(EvalStatus::kSucceeded,
297 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
298
Gilad Arnold38b14022014-07-09 12:45:56 -0700299 EXPECT_LE(
300 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
301 ChromeOSPolicy::kTimeoutMaxBackoffInterval -
302 ChromeOSPolicy::kTimeoutMaxBackoffInterval / 2),
303 next_update_check);
304 EXPECT_GE(
305 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
306 ChromeOSPolicy::kTimeoutMaxBackoffInterval +
307 ChromeOSPolicy::kTimeoutMaxBackoffInterval /2),
308 next_update_check);
Alex Deymo0d11c602014-04-23 20:12:20 -0700309}
310
Alex Deymo63784a52014-05-28 10:46:14 -0700311TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWaitsForTheTimeout) {
Alex Deymo0d11c602014-04-23 20:12:20 -0700312 // We get the next update_check timestamp from the policy's private method
313 // and then we check the public method respects that value on the normal
314 // case.
315 Time next_update_check;
316 Time last_checked_time =
317 fake_clock_.GetWallclockTime() + TimeDelta::FromMinutes(1234);
318
Alex Deymo0d11c602014-04-23 20:12:20 -0700319 fake_state_.updater_provider()->var_last_checked_time()->reset(
320 new Time(last_checked_time));
321 ExpectPolicyStatus(EvalStatus::kSucceeded,
322 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
323
324 UpdateCheckParams result;
325
326 // Check that the policy blocks until the next_update_check is reached.
327 SetUpDefaultClock();
328 SetUpDefaultState();
329 fake_state_.updater_provider()->var_last_checked_time()->reset(
330 new Time(last_checked_time));
331 fake_clock_.SetWallclockTime(next_update_check - TimeDelta::FromSeconds(1));
332 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
333 &Policy::UpdateCheckAllowed, &result);
334
335 SetUpDefaultClock();
336 SetUpDefaultState();
337 fake_state_.updater_provider()->var_last_checked_time()->reset(
338 new Time(last_checked_time));
339 fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
340 ExpectPolicyStatus(EvalStatus::kSucceeded,
341 &Policy::UpdateCheckAllowed, &result);
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700342 EXPECT_TRUE(result.updates_enabled);
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700343 EXPECT_FALSE(result.is_interactive);
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700344}
345
346TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWaitsForOOBE) {
Alex Vakulenko072359c2014-07-18 11:41:07 -0700347 // Update checks are deferred until OOBE is completed.
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700348
349 // Ensure that update is not allowed even if wait period is satisfied.
350 Time next_update_check;
351 Time last_checked_time =
352 fake_clock_.GetWallclockTime() + TimeDelta::FromMinutes(1234);
353
354 fake_state_.updater_provider()->var_last_checked_time()->reset(
355 new Time(last_checked_time));
356 ExpectPolicyStatus(EvalStatus::kSucceeded,
357 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
358
359 SetUpDefaultClock();
360 SetUpDefaultState();
361 fake_state_.updater_provider()->var_last_checked_time()->reset(
362 new Time(last_checked_time));
363 fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
364 fake_state_.system_provider()->var_is_oobe_complete()->reset(
365 new bool(false));
366
367 UpdateCheckParams result;
368 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
369 &Policy::UpdateCheckAllowed, &result);
370
371 // Now check that it is allowed if OOBE is completed.
372 SetUpDefaultClock();
373 SetUpDefaultState();
374 fake_state_.updater_provider()->var_last_checked_time()->reset(
375 new Time(last_checked_time));
376 fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
377 ExpectPolicyStatus(EvalStatus::kSucceeded,
378 &Policy::UpdateCheckAllowed, &result);
379 EXPECT_TRUE(result.updates_enabled);
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700380 EXPECT_FALSE(result.is_interactive);
Alex Deymo0d11c602014-04-23 20:12:20 -0700381}
382
Gilad Arnold42f253b2014-06-25 12:39:17 -0700383TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWithAttributes) {
Alex Vakulenko072359c2014-07-18 11:41:07 -0700384 // Update check is allowed, response includes attributes for use in the
Gilad Arnold42f253b2014-06-25 12:39:17 -0700385 // request.
386 SetUpdateCheckAllowed(true);
387
388 // Override specific device policy attributes.
Gilad Arnoldd4b30322014-07-21 15:35:27 -0700389 fake_state_.device_policy_provider()->var_target_version_prefix()->
390 reset(new string("1.2"));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700391 fake_state_.device_policy_provider()->var_release_channel_delegated()->
392 reset(new bool(false));
393 fake_state_.device_policy_provider()->var_release_channel()->
394 reset(new string("foo-channel"));
395
396 UpdateCheckParams result;
397 ExpectPolicyStatus(EvalStatus::kSucceeded,
398 &Policy::UpdateCheckAllowed, &result);
399 EXPECT_TRUE(result.updates_enabled);
Gilad Arnoldd4b30322014-07-21 15:35:27 -0700400 EXPECT_EQ("1.2", result.target_version_prefix);
Gilad Arnold42f253b2014-06-25 12:39:17 -0700401 EXPECT_EQ("foo-channel", result.target_channel);
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700402 EXPECT_FALSE(result.is_interactive);
Gilad Arnold42f253b2014-06-25 12:39:17 -0700403}
404
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700405TEST_F(UmChromeOSPolicyTest,
406 UpdateCheckAllowedUpdatesDisabledForUnofficialBuilds) {
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700407 // UpdateCheckAllowed should return kAskMeAgainLater if this is an unofficial
408 // build; we don't want periodic update checks on developer images.
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700409
410 fake_state_.system_provider()->var_is_official_build()->reset(
411 new bool(false));
412
413 UpdateCheckParams result;
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700414 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700415 &Policy::UpdateCheckAllowed, &result);
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700416}
417
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700418TEST_F(UmChromeOSPolicyTest,
419 UpdateCheckAllowedUpdatesDisabledForRemovableBootDevice) {
420 // UpdateCheckAllowed should return false (kSucceeded) if the image booted
421 // from a removable device.
422
Alex Deymo763e7db2015-08-27 21:08:08 -0700423 fake_state_.system_provider()->var_num_slots()->reset(new unsigned int(1));
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700424
425 UpdateCheckParams result;
426 ExpectPolicyStatus(EvalStatus::kSucceeded,
427 &Policy::UpdateCheckAllowed, &result);
428 EXPECT_FALSE(result.updates_enabled);
429}
430
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700431TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedUpdatesDisabledByPolicy) {
Gilad Arnold42f253b2014-06-25 12:39:17 -0700432 // UpdateCheckAllowed should return kAskMeAgainLater because a device policy
433 // is loaded and prohibits updates.
434
435 SetUpdateCheckAllowed(false);
436 fake_state_.device_policy_provider()->var_update_disabled()->reset(
437 new bool(true));
438
Gilad Arnold42f253b2014-06-25 12:39:17 -0700439 UpdateCheckParams result;
440 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
441 &Policy::UpdateCheckAllowed, &result);
442}
443
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700444TEST_F(UmChromeOSPolicyTest,
445 UpdateCheckAllowedForcedUpdateRequestedInteractive) {
446 // UpdateCheckAllowed should return true because a forced update request was
447 // signaled for an interactive update.
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700448
449 SetUpdateCheckAllowed(true);
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700450 fake_state_.updater_provider()->var_forced_update_requested()->reset(
451 new UpdateRequestStatus(UpdateRequestStatus::kInteractive));
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700452
453 UpdateCheckParams result;
454 ExpectPolicyStatus(EvalStatus::kSucceeded,
455 &Policy::UpdateCheckAllowed, &result);
456 EXPECT_TRUE(result.updates_enabled);
457 EXPECT_TRUE(result.is_interactive);
458}
459
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700460TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedForcedUpdateRequestedPeriodic) {
461 // UpdateCheckAllowed should return true because a forced update request was
462 // signaled for a periodic check.
463
464 SetUpdateCheckAllowed(true);
465 fake_state_.updater_provider()->var_forced_update_requested()->reset(
466 new UpdateRequestStatus(UpdateRequestStatus::kPeriodic));
467
468 UpdateCheckParams result;
469 ExpectPolicyStatus(EvalStatus::kSucceeded,
470 &Policy::UpdateCheckAllowed, &result);
471 EXPECT_TRUE(result.updates_enabled);
472 EXPECT_FALSE(result.is_interactive);
473}
474
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800475TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskPin) {
476 // Update check is allowed.
477 SetUpdateCheckAllowed(true);
478
479 // A typical setup for kiosk pin policy: AU disabled, allow kiosk to pin
480 // and there is a kiosk required platform version.
481 fake_state_.device_policy_provider()->var_update_disabled()->reset(
482 new bool(true));
483 fake_state_.device_policy_provider()
484 ->var_allow_kiosk_app_control_chrome_version()
485 ->reset(new bool(true));
486 fake_state_.system_provider()->var_kiosk_required_platform_version()->reset(
487 new string("1234.0.0"));
488
489 UpdateCheckParams result;
490 ExpectPolicyStatus(EvalStatus::kSucceeded,
491 &Policy::UpdateCheckAllowed, &result);
492 EXPECT_TRUE(result.updates_enabled);
493 EXPECT_EQ("1234.0.0", result.target_version_prefix);
494 EXPECT_FALSE(result.is_interactive);
495}
496
497TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedDisabledWhenNoKioskPin) {
498 // Update check is allowed.
499 SetUpdateCheckAllowed(true);
500
501 // Disable AU policy is set but kiosk pin policy is set to false. Update is
502 // disabled in such case.
503 fake_state_.device_policy_provider()->var_update_disabled()->reset(
504 new bool(true));
505 fake_state_.device_policy_provider()
506 ->var_allow_kiosk_app_control_chrome_version()
507 ->reset(new bool(false));
508
509 UpdateCheckParams result;
510 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
511 &Policy::UpdateCheckAllowed, &result);
512}
513
514TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskPinWithNoRequiredVersion) {
515 // Update check is allowed.
516 SetUpdateCheckAllowed(true);
517
518 // AU disabled, allow kiosk to pin but there is no kiosk required platform
519 // version (due to Chrome crash or app does not provide the info). Update to
520 // latest in such case.
521 fake_state_.device_policy_provider()->var_update_disabled()->reset(
522 new bool(true));
523 fake_state_.device_policy_provider()
524 ->var_allow_kiosk_app_control_chrome_version()
525 ->reset(new bool(true));
526
527 UpdateCheckParams result;
528 ExpectPolicyStatus(EvalStatus::kSucceeded,
529 &Policy::UpdateCheckAllowed, &result);
530 EXPECT_TRUE(result.updates_enabled);
531 EXPECT_FALSE(result.is_interactive);
532}
533
Alex Deymo63784a52014-05-28 10:46:14 -0700534TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsCheckAllowedError) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700535 // The UpdateCanStart policy fails, not being able to query
536 // UpdateCheckAllowed.
537
538 // Configure the UpdateCheckAllowed policy to fail.
539 fake_state_.updater_provider()->var_updater_started_time()->reset(nullptr);
540
541 // Check that the UpdateCanStart fails.
542 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700543 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700544 ExpectPolicyStatus(EvalStatus::kFailed,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700545 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700546}
547
Alex Deymo63784a52014-05-28 10:46:14 -0700548TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedCheckDue) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700549 // The UpdateCanStart policy returns false because we are due for another
Gilad Arnold14a9e702014-10-08 08:09:09 -0700550 // update check. Ensure that download related values are still returned.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700551
552 SetUpdateCheckAllowed(true);
553
554 // Check that the UpdateCanStart returns false.
555 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700556 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700557 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700558 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700559 EXPECT_FALSE(result.update_can_start);
560 EXPECT_EQ(UpdateCannotStartReason::kCheckDue, result.cannot_start_reason);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700561 EXPECT_EQ(0, result.download_url_idx);
562 EXPECT_EQ(0, result.download_url_num_errors);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700563}
564
Alex Deymo63784a52014-05-28 10:46:14 -0700565TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoDevicePolicy) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700566 // The UpdateCanStart policy returns true; no device policy is loaded.
567
568 SetUpdateCheckAllowed(false);
569 fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
570 new bool(false));
571
572 // Check that the UpdateCanStart returns true with no further attributes.
573 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700574 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700575 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700576 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700577 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700578 EXPECT_FALSE(result.p2p_downloading_allowed);
579 EXPECT_FALSE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700580 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700581 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700582 EXPECT_EQ(0, result.download_url_num_errors);
583 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700584}
585
Alex Deymo63784a52014-05-28 10:46:14 -0700586TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBlankPolicy) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700587 // The UpdateCanStart policy returns true; device policy is loaded but imposes
588 // no restrictions on updating.
589
590 SetUpdateCheckAllowed(false);
591
592 // Check that the UpdateCanStart returns true.
593 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700594 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700595 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700596 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700597 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700598 EXPECT_FALSE(result.p2p_downloading_allowed);
599 EXPECT_FALSE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700600 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700601 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700602 EXPECT_EQ(0, result.download_url_num_errors);
603 EXPECT_FALSE(result.do_increment_failures);
604}
605
606TEST_F(UmChromeOSPolicyTest,
607 UpdateCanStartNotAllowedBackoffNewWaitPeriodApplies) {
608 // The UpdateCanStart policy returns false; failures are reported and a new
609 // backoff period is enacted.
610
611 SetUpdateCheckAllowed(false);
612
613 const Time curr_time = fake_clock_.GetWallclockTime();
614 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
615 update_state.download_errors_max = 1;
616 update_state.download_errors.emplace_back(
617 0, ErrorCode::kDownloadTransferError,
618 curr_time - TimeDelta::FromSeconds(8));
619 update_state.download_errors.emplace_back(
620 0, ErrorCode::kDownloadTransferError,
621 curr_time - TimeDelta::FromSeconds(2));
622
623 // Check that UpdateCanStart returns false and a new backoff expiry is
624 // generated.
625 UpdateDownloadParams result;
626 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
627 update_state);
628 EXPECT_FALSE(result.update_can_start);
629 EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
630 EXPECT_TRUE(result.do_increment_failures);
631 EXPECT_LT(curr_time, result.backoff_expiry);
632}
633
634TEST_F(UmChromeOSPolicyTest,
635 UpdateCanStartNotAllowedBackoffPrevWaitPeriodStillApplies) {
636 // The UpdateCanStart policy returns false; a previously enacted backoff
637 // period still applies.
638
639 SetUpdateCheckAllowed(false);
640
641 const Time curr_time = fake_clock_.GetWallclockTime();
642 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
643 update_state.download_errors_max = 1;
644 update_state.download_errors.emplace_back(
645 0, ErrorCode::kDownloadTransferError,
646 curr_time - TimeDelta::FromSeconds(8));
647 update_state.download_errors.emplace_back(
648 0, ErrorCode::kDownloadTransferError,
649 curr_time - TimeDelta::FromSeconds(2));
650 update_state.failures_last_updated = curr_time;
651 update_state.backoff_expiry = curr_time + TimeDelta::FromMinutes(3);
652
653 // Check that UpdateCanStart returns false and a new backoff expiry is
654 // generated.
655 UpdateDownloadParams result;
656 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::UpdateCanStart,
657 &result, update_state);
658 EXPECT_FALSE(result.update_can_start);
659 EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
660 EXPECT_FALSE(result.do_increment_failures);
661 EXPECT_LT(curr_time, result.backoff_expiry);
662}
663
664TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffSatisfied) {
665 // The UpdateCanStart policy returns true; a previously enacted backoff period
666 // has elapsed, we're good to go.
667
668 SetUpdateCheckAllowed(false);
669
670 const Time curr_time = fake_clock_.GetWallclockTime();
671 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
672 update_state.download_errors_max = 1;
673 update_state.download_errors.emplace_back(
674 0, ErrorCode::kDownloadTransferError,
675 curr_time - TimeDelta::FromSeconds(8));
676 update_state.download_errors.emplace_back(
677 0, ErrorCode::kDownloadTransferError,
678 curr_time - TimeDelta::FromSeconds(2));
679 update_state.failures_last_updated = curr_time - TimeDelta::FromSeconds(1);
680 update_state.backoff_expiry = curr_time - TimeDelta::FromSeconds(1);
681
682 // Check that UpdateCanStart returns false and a new backoff expiry is
683 // generated.
684 UpdateDownloadParams result;
685 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart,
686 &result, update_state);
687 EXPECT_TRUE(result.update_can_start);
688 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
689 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700690 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700691 EXPECT_EQ(0, result.download_url_num_errors);
692 EXPECT_FALSE(result.do_increment_failures);
693 EXPECT_EQ(Time(), result.backoff_expiry);
694}
695
696TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffDisabled) {
697 // The UpdateCanStart policy returns false; failures are reported but backoff
698 // is disabled.
699
700 SetUpdateCheckAllowed(false);
701
702 const Time curr_time = fake_clock_.GetWallclockTime();
703 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
704 update_state.download_errors_max = 1;
705 update_state.download_errors.emplace_back(
706 0, ErrorCode::kDownloadTransferError,
707 curr_time - TimeDelta::FromSeconds(8));
708 update_state.download_errors.emplace_back(
709 0, ErrorCode::kDownloadTransferError,
710 curr_time - TimeDelta::FromSeconds(2));
711 update_state.is_backoff_disabled = true;
712
713 // Check that UpdateCanStart returns false and a new backoff expiry is
714 // generated.
715 UpdateDownloadParams result;
716 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
717 update_state);
718 EXPECT_TRUE(result.update_can_start);
719 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
720 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700721 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700722 EXPECT_EQ(0, result.download_url_num_errors);
723 EXPECT_TRUE(result.do_increment_failures);
724 EXPECT_EQ(Time(), result.backoff_expiry);
725}
726
727TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffInteractive) {
728 // The UpdateCanStart policy returns false; failures are reported but this is
729 // an interactive update check.
730
731 SetUpdateCheckAllowed(false);
732
733 const Time curr_time = fake_clock_.GetWallclockTime();
734 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
735 update_state.download_errors_max = 1;
736 update_state.download_errors.emplace_back(
737 0, ErrorCode::kDownloadTransferError,
738 curr_time - TimeDelta::FromSeconds(8));
739 update_state.download_errors.emplace_back(
740 0, ErrorCode::kDownloadTransferError,
741 curr_time - TimeDelta::FromSeconds(2));
742 update_state.is_interactive = true;
743
744 // Check that UpdateCanStart returns false and a new backoff expiry is
745 // generated.
746 UpdateDownloadParams result;
747 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
748 update_state);
749 EXPECT_TRUE(result.update_can_start);
750 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
751 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700752 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700753 EXPECT_EQ(0, result.download_url_num_errors);
754 EXPECT_TRUE(result.do_increment_failures);
755 EXPECT_EQ(Time(), result.backoff_expiry);
756}
757
758TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffDelta) {
759 // The UpdateCanStart policy returns false; failures are reported but this is
760 // a delta payload.
761
762 SetUpdateCheckAllowed(false);
763
764 const Time curr_time = fake_clock_.GetWallclockTime();
765 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
766 update_state.download_errors_max = 1;
767 update_state.download_errors.emplace_back(
768 0, ErrorCode::kDownloadTransferError,
769 curr_time - TimeDelta::FromSeconds(8));
770 update_state.download_errors.emplace_back(
771 0, ErrorCode::kDownloadTransferError,
772 curr_time - TimeDelta::FromSeconds(2));
773 update_state.is_delta_payload = true;
774
775 // Check that UpdateCanStart returns false and a new backoff expiry is
776 // generated.
777 UpdateDownloadParams result;
778 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
779 update_state);
780 EXPECT_TRUE(result.update_can_start);
781 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
782 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700783 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700784 EXPECT_EQ(0, result.download_url_num_errors);
785 EXPECT_TRUE(result.do_increment_failures);
786 EXPECT_EQ(Time(), result.backoff_expiry);
787}
788
789TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffUnofficialBuild) {
790 // The UpdateCanStart policy returns false; failures are reported but this is
791 // an unofficial build.
792
793 SetUpdateCheckAllowed(false);
794
795 const Time curr_time = fake_clock_.GetWallclockTime();
796 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
797 update_state.download_errors_max = 1;
798 update_state.download_errors.emplace_back(
799 0, ErrorCode::kDownloadTransferError,
800 curr_time - TimeDelta::FromSeconds(8));
801 update_state.download_errors.emplace_back(
802 0, ErrorCode::kDownloadTransferError,
803 curr_time - TimeDelta::FromSeconds(2));
804
805 fake_state_.system_provider()->var_is_official_build()->
806 reset(new bool(false));
807
808 // Check that UpdateCanStart returns false and a new backoff expiry is
809 // generated.
810 UpdateDownloadParams result;
811 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
812 update_state);
813 EXPECT_TRUE(result.update_can_start);
814 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
815 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700816 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700817 EXPECT_EQ(0, result.download_url_num_errors);
818 EXPECT_TRUE(result.do_increment_failures);
819 EXPECT_EQ(Time(), result.backoff_expiry);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700820}
821
Alex Deymo63784a52014-05-28 10:46:14 -0700822TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsScatteringFailed) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700823 // The UpdateCanStart policy fails because the UpdateScattering policy it
824 // depends on fails (unset variable).
825
826 SetUpdateCheckAllowed(false);
827
828 // Override the default seed variable with a null value so that the policy
829 // request would fail.
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700830 // TODO(garnold) This failure may or may not fail a number
831 // sub-policies/decisions, like scattering and backoff. We'll need a more
832 // deliberate setup to ensure that we're failing what we want to be failing.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700833 fake_state_.random_provider()->var_seed()->reset(nullptr);
834
835 // Check that the UpdateCanStart fails.
836 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700837 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700838 ExpectPolicyStatus(EvalStatus::kFailed,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700839 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700840}
841
Alex Deymo63784a52014-05-28 10:46:14 -0700842TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700843 UpdateCanStartNotAllowedScatteringNewWaitPeriodApplies) {
844 // The UpdateCanStart policy returns false; device policy is loaded and
845 // scattering applies due to an unsatisfied wait period, which was newly
846 // generated.
847
848 SetUpdateCheckAllowed(false);
849 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
850 new TimeDelta(TimeDelta::FromMinutes(2)));
851
852
853 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
854
855 // Check that the UpdateCanStart returns false and a new wait period
856 // generated.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700857 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700858 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700859 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700860 EXPECT_FALSE(result.update_can_start);
861 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
862 EXPECT_LT(TimeDelta(), result.scatter_wait_period);
863 EXPECT_EQ(0, result.scatter_check_threshold);
864}
865
Alex Deymo63784a52014-05-28 10:46:14 -0700866TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700867 UpdateCanStartNotAllowedScatteringPrevWaitPeriodStillApplies) {
868 // The UpdateCanStart policy returns false w/ kAskMeAgainLater; device policy
869 // is loaded and a previously generated scattering period still applies, none
870 // of the scattering values has changed.
871
872 SetUpdateCheckAllowed(false);
873 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
874 new TimeDelta(TimeDelta::FromMinutes(2)));
875
876 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
877 update_state.scatter_wait_period = TimeDelta::FromSeconds(35);
878
879 // Check that the UpdateCanStart returns false and a new wait period
880 // generated.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700881 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700882 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::UpdateCanStart,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700883 &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700884 EXPECT_FALSE(result.update_can_start);
885 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
886 EXPECT_EQ(TimeDelta::FromSeconds(35), result.scatter_wait_period);
887 EXPECT_EQ(0, result.scatter_check_threshold);
888}
889
Alex Deymo63784a52014-05-28 10:46:14 -0700890TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700891 UpdateCanStartNotAllowedScatteringNewCountThresholdApplies) {
892 // The UpdateCanStart policy returns false; device policy is loaded and
893 // scattering applies due to an unsatisfied update check count threshold.
894 //
895 // This ensures a non-zero check threshold, which may or may not be combined
896 // with a non-zero wait period (for which we cannot reliably control).
897
898 SetUpdateCheckAllowed(false);
899 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
900 new TimeDelta(TimeDelta::FromSeconds(1)));
901
902 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
903 update_state.scatter_check_threshold_min = 2;
904 update_state.scatter_check_threshold_max = 5;
905
906 // Check that the UpdateCanStart returns false.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700907 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700908 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700909 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700910 EXPECT_FALSE(result.update_can_start);
911 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
912 EXPECT_LE(2, result.scatter_check_threshold);
913 EXPECT_GE(5, result.scatter_check_threshold);
914}
915
Alex Deymo63784a52014-05-28 10:46:14 -0700916TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700917 UpdateCanStartNotAllowedScatteringPrevCountThresholdStillApplies) {
918 // The UpdateCanStart policy returns false; device policy is loaded and
919 // scattering due to a previously generated count threshold still applies.
920
921 SetUpdateCheckAllowed(false);
922 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
923 new TimeDelta(TimeDelta::FromSeconds(1)));
924
925 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
926 update_state.scatter_check_threshold = 3;
927 update_state.scatter_check_threshold_min = 2;
928 update_state.scatter_check_threshold_max = 5;
929
930 // Check that the UpdateCanStart returns false.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700931 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700932 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700933 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700934 EXPECT_FALSE(result.update_can_start);
935 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
936 EXPECT_EQ(3, result.scatter_check_threshold);
937}
938
Alex Deymo63784a52014-05-28 10:46:14 -0700939TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedScatteringSatisfied) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700940 // The UpdateCanStart policy returns true; device policy is loaded and
941 // scattering is enabled, but both wait period and check threshold are
942 // satisfied.
943
944 SetUpdateCheckAllowed(false);
945 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
946 new TimeDelta(TimeDelta::FromSeconds(120)));
947
948 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(75));
949 update_state.num_checks = 4;
950 update_state.scatter_wait_period = TimeDelta::FromSeconds(60);
951 update_state.scatter_check_threshold = 3;
952 update_state.scatter_check_threshold_min = 2;
953 update_state.scatter_check_threshold_max = 5;
954
955 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700956 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700957 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700958 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700959 EXPECT_TRUE(result.update_can_start);
960 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
961 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700962 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700963 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700964 EXPECT_EQ(0, result.download_url_num_errors);
965 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700966}
967
Alex Deymo63784a52014-05-28 10:46:14 -0700968TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700969 UpdateCanStartAllowedInteractivePreventsScattering) {
970 // The UpdateCanStart policy returns true; device policy is loaded and
971 // scattering would have applied, except that the update check is interactive
972 // and so it is suppressed.
973
974 SetUpdateCheckAllowed(false);
975 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
976 new TimeDelta(TimeDelta::FromSeconds(1)));
977
978 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700979 update_state.is_interactive = true;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700980 update_state.scatter_check_threshold = 0;
981 update_state.scatter_check_threshold_min = 2;
982 update_state.scatter_check_threshold_max = 5;
983
984 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700985 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700986 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700987 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700988 EXPECT_TRUE(result.update_can_start);
989 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
990 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700991 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700992 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700993 EXPECT_EQ(0, result.download_url_num_errors);
994 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700995}
996
Alex Deymo63784a52014-05-28 10:46:14 -0700997TEST_F(UmChromeOSPolicyTest,
Gilad Arnold76a11f62014-05-20 09:02:12 -0700998 UpdateCanStartAllowedOobePreventsScattering) {
999 // The UpdateCanStart policy returns true; device policy is loaded and
1000 // scattering would have applied, except that OOBE was not completed and so it
1001 // is suppressed.
1002
1003 SetUpdateCheckAllowed(false);
1004 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
1005 new TimeDelta(TimeDelta::FromSeconds(1)));
1006 fake_state_.system_provider()->var_is_oobe_complete()->reset(new bool(false));
1007
1008 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001009 update_state.is_interactive = true;
Gilad Arnold76a11f62014-05-20 09:02:12 -07001010 update_state.scatter_check_threshold = 0;
1011 update_state.scatter_check_threshold_min = 2;
1012 update_state.scatter_check_threshold_max = 5;
1013
1014 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001015 UpdateDownloadParams result;
Gilad Arnold76a11f62014-05-20 09:02:12 -07001016 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001017 update_state);
Gilad Arnold76a11f62014-05-20 09:02:12 -07001018 EXPECT_TRUE(result.update_can_start);
1019 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
1020 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001021 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001022 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001023 EXPECT_EQ(0, result.download_url_num_errors);
1024 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnold76a11f62014-05-20 09:02:12 -07001025}
1026
Alex Deymo63784a52014-05-28 10:46:14 -07001027TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithAttributes) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001028 // The UpdateCanStart policy returns true; device policy permits both HTTP and
1029 // P2P updates, as well as a non-empty target channel string.
1030
1031 SetUpdateCheckAllowed(false);
1032
1033 // Override specific device policy attributes.
1034 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1035 new bool(true));
1036 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1037 new bool(true));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001038
1039 // Check that the UpdateCanStart returns true.
1040 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001041 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001042 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001043 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001044 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001045 EXPECT_TRUE(result.p2p_downloading_allowed);
1046 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001047 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001048 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001049 EXPECT_EQ(0, result.download_url_num_errors);
1050 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001051}
1052
Alex Deymo63784a52014-05-28 10:46:14 -07001053TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithP2PFromUpdater) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001054 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1055 // P2P updates, but the updater is configured to allow P2P and overrules the
1056 // setting.
1057
1058 SetUpdateCheckAllowed(false);
1059
1060 // Override specific device policy attributes.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001061 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1062
1063 // Check that the UpdateCanStart returns true.
1064 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001065 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001066 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001067 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001068 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001069 EXPECT_TRUE(result.p2p_downloading_allowed);
1070 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001071 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001072 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001073 EXPECT_EQ(0, result.download_url_num_errors);
1074 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001075}
1076
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001077TEST_F(UmChromeOSPolicyTest,
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001078 UpdateCanStartAllowedP2PDownloadingBlockedDueToOmaha) {
1079 // The UpdateCanStart policy returns true; device policy permits HTTP, but
1080 // policy blocks P2P downloading because Omaha forbids it. P2P sharing is
1081 // still permitted.
1082
1083 SetUpdateCheckAllowed(false);
1084
1085 // Override specific device policy attributes.
1086 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1087 new bool(true));
1088 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1089 new bool(true));
1090
1091 // Check that the UpdateCanStart returns true.
1092 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1093 update_state.p2p_downloading_disabled = true;
1094 UpdateDownloadParams result;
1095 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1096 update_state);
1097 EXPECT_TRUE(result.update_can_start);
1098 EXPECT_FALSE(result.p2p_downloading_allowed);
1099 EXPECT_TRUE(result.p2p_sharing_allowed);
1100}
1101
1102TEST_F(UmChromeOSPolicyTest,
1103 UpdateCanStartAllowedP2PSharingBlockedDueToOmaha) {
1104 // The UpdateCanStart policy returns true; device policy permits HTTP, but
1105 // policy blocks P2P sharing because Omaha forbids it. P2P downloading is
1106 // still permitted.
1107
1108 SetUpdateCheckAllowed(false);
1109
1110 // Override specific device policy attributes.
1111 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1112 new bool(true));
1113 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1114 new bool(true));
1115
1116 // Check that the UpdateCanStart returns true.
1117 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1118 update_state.p2p_sharing_disabled = true;
1119 UpdateDownloadParams result;
1120 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1121 update_state);
1122 EXPECT_TRUE(result.update_can_start);
1123 EXPECT_TRUE(result.p2p_downloading_allowed);
1124 EXPECT_FALSE(result.p2p_sharing_allowed);
1125}
1126
1127TEST_F(UmChromeOSPolicyTest,
1128 UpdateCanStartAllowedP2PDownloadingBlockedDueToNumAttempts) {
Gilad Arnold349ac832014-10-06 14:20:28 -07001129 // The UpdateCanStart policy returns true; device policy permits HTTP but
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001130 // blocks P2P download, because the max number of P2P downloads have been
1131 // attempted. P2P sharing is still permitted.
Gilad Arnold349ac832014-10-06 14:20:28 -07001132
1133 SetUpdateCheckAllowed(false);
1134
1135 // Override specific device policy attributes.
1136 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1137 new bool(true));
1138 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1139 new bool(true));
1140
1141 // Check that the UpdateCanStart returns true.
1142 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1143 update_state.p2p_num_attempts = ChromeOSPolicy::kMaxP2PAttempts;
1144 UpdateDownloadParams result;
1145 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1146 update_state);
1147 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001148 EXPECT_FALSE(result.p2p_downloading_allowed);
1149 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnold349ac832014-10-06 14:20:28 -07001150}
1151
1152TEST_F(UmChromeOSPolicyTest,
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001153 UpdateCanStartAllowedP2PDownloadingBlockedDueToAttemptsPeriod) {
Gilad Arnold349ac832014-10-06 14:20:28 -07001154 // The UpdateCanStart policy returns true; device policy permits HTTP but
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001155 // blocks P2P download, because the max period for attempt to download via P2P
1156 // has elapsed. P2P sharing is still permitted.
Gilad Arnold349ac832014-10-06 14:20:28 -07001157
1158 SetUpdateCheckAllowed(false);
1159
1160 // Override specific device policy attributes.
1161 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1162 new bool(true));
1163 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1164 new bool(true));
1165
1166 // Check that the UpdateCanStart returns true.
1167 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1168 update_state.p2p_num_attempts = 1;
1169 update_state.p2p_first_attempted =
1170 fake_clock_.GetWallclockTime() -
Alex Deymof329b932014-10-30 01:37:48 -07001171 TimeDelta::FromSeconds(
1172 ChromeOSPolicy::kMaxP2PAttemptsPeriodInSeconds + 1);
Gilad Arnold349ac832014-10-06 14:20:28 -07001173 UpdateDownloadParams result;
1174 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1175 update_state);
1176 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001177 EXPECT_FALSE(result.p2p_downloading_allowed);
1178 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnold349ac832014-10-06 14:20:28 -07001179}
1180
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001181TEST_F(UmChromeOSPolicyTest,
1182 UpdateCanStartAllowedWithHttpUrlForUnofficialBuild) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001183 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1184 // P2P updates, but marking this an unofficial build overrules the HTTP
1185 // setting.
1186
1187 SetUpdateCheckAllowed(false);
1188
1189 // Override specific device policy attributes.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001190 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1191 new bool(false));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001192 fake_state_.system_provider()->var_is_official_build()->
1193 reset(new bool(false));
1194
1195 // Check that the UpdateCanStart returns true.
1196 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001197 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001198 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001199 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001200 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001201 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001202 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001203 EXPECT_EQ(0, result.download_url_num_errors);
1204 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001205}
1206
1207TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithHttpsUrl) {
1208 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1209 // P2P updates, but an HTTPS URL is provided and selected for download.
1210
1211 SetUpdateCheckAllowed(false);
1212
1213 // Override specific device policy attributes.
1214 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1215 new bool(false));
1216
1217 // Add an HTTPS URL.
1218 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001219 update_state.download_urls.emplace_back("https://secure/url/");
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001220
1221 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001222 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001223 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001224 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001225 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001226 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001227 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001228 EXPECT_EQ(0, result.download_url_num_errors);
1229 EXPECT_FALSE(result.do_increment_failures);
1230}
1231
1232TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedMaxErrorsNotExceeded) {
1233 // The UpdateCanStart policy returns true; the first URL has download errors
1234 // but does not exceed the maximum allowed number of failures, so it is stilli
1235 // usable.
1236
1237 SetUpdateCheckAllowed(false);
1238
1239 // Add a second URL; update with this URL attempted and failed enough times to
1240 // disqualify the current (first) URL.
1241 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1242 update_state.num_checks = 5;
1243 update_state.download_urls.emplace_back("http://another/fake/url/");
1244 Time t = fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(12);
1245 for (int i = 0; i < 5; i++) {
1246 update_state.download_errors.emplace_back(
1247 0, ErrorCode::kDownloadTransferError, t);
1248 t += TimeDelta::FromSeconds(1);
1249 }
1250
1251 // Check that the UpdateCanStart returns true.
1252 UpdateDownloadParams result;
1253 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1254 update_state);
1255 EXPECT_TRUE(result.update_can_start);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001256 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001257 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001258 EXPECT_EQ(5, result.download_url_num_errors);
1259 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001260}
1261
1262TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlMaxExceeded) {
1263 // The UpdateCanStart policy returns true; the first URL exceeded the maximum
1264 // allowed number of failures, but a second URL is available.
1265
1266 SetUpdateCheckAllowed(false);
1267
1268 // Add a second URL; update with this URL attempted and failed enough times to
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001269 // disqualify the current (first) URL.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001270 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1271 update_state.num_checks = 10;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001272 update_state.download_urls.emplace_back("http://another/fake/url/");
1273 Time t = fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(12);
1274 for (int i = 0; i < 11; i++) {
1275 update_state.download_errors.emplace_back(
1276 0, ErrorCode::kDownloadTransferError, t);
1277 t += TimeDelta::FromSeconds(1);
1278 }
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001279
1280 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001281 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001282 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001283 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001284 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001285 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001286 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001287 EXPECT_EQ(0, result.download_url_num_errors);
1288 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001289}
1290
1291TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlHardError) {
1292 // The UpdateCanStart policy returns true; the first URL fails with a hard
1293 // error, but a second URL is available.
1294
1295 SetUpdateCheckAllowed(false);
1296
1297 // Add a second URL; update with this URL attempted and failed in a way that
1298 // causes it to switch directly to the next URL.
1299 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1300 update_state.num_checks = 10;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001301 update_state.download_urls.emplace_back("http://another/fake/url/");
1302 update_state.download_errors.emplace_back(
1303 0, ErrorCode::kPayloadHashMismatchError,
1304 fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(1));
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001305
1306 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001307 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001308 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001309 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001310 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001311 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001312 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001313 EXPECT_EQ(0, result.download_url_num_errors);
1314 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001315}
1316
1317TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedUrlWrapsAround) {
1318 // The UpdateCanStart policy returns true; URL search properly wraps around
1319 // the last one on the list.
1320
1321 SetUpdateCheckAllowed(false);
1322
1323 // Add a second URL; update with this URL attempted and failed in a way that
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001324 // causes it to switch directly to the next URL. We must disable backoff in
1325 // order for it not to interfere.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001326 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001327 update_state.num_checks = 1;
1328 update_state.is_backoff_disabled = true;
1329 update_state.download_urls.emplace_back("http://another/fake/url/");
1330 update_state.download_errors.emplace_back(
1331 1, ErrorCode::kPayloadHashMismatchError,
1332 fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(1));
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001333
1334 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001335 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001336 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001337 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001338 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001339 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001340 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001341 EXPECT_EQ(0, result.download_url_num_errors);
1342 EXPECT_TRUE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001343}
1344
1345TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedNoUsableUrls) {
1346 // The UpdateCanStart policy returns false; there's a single HTTP URL but its
1347 // use is forbidden by policy.
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001348 //
1349 // Note: In the case where no usable URLs are found, the policy should not
1350 // increment the number of failed attempts! Doing so would result in a
1351 // non-idempotent semantics, and does not fall within the intended purpose of
1352 // the backoff mechanism anyway.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001353
1354 SetUpdateCheckAllowed(false);
1355
1356 // Override specific device policy attributes.
1357 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1358 new bool(false));
1359
1360 // Check that the UpdateCanStart returns false.
1361 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001362 UpdateDownloadParams result;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001363 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1364 update_state);
1365 EXPECT_FALSE(result.update_can_start);
1366 EXPECT_EQ(UpdateCannotStartReason::kCannotDownload,
1367 result.cannot_start_reason);
1368 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001369}
1370
1371TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoUsableUrlsButP2PEnabled) {
1372 // The UpdateCanStart policy returns true; there's a single HTTP URL but its
1373 // use is forbidden by policy, however P2P is enabled. The result indicates
1374 // that no URL can be used.
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001375 //
1376 // Note: The number of failed attempts should not increase in this case (see
1377 // above test).
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001378
1379 SetUpdateCheckAllowed(false);
1380
1381 // Override specific device policy attributes.
1382 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1383 new bool(true));
1384 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1385 new bool(false));
1386
1387 // Check that the UpdateCanStart returns true.
1388 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001389 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001390 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001391 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001392 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001393 EXPECT_TRUE(result.p2p_downloading_allowed);
1394 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001395 EXPECT_GT(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001396 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001397 EXPECT_EQ(0, result.download_url_num_errors);
1398 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001399}
1400
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001401TEST_F(UmChromeOSPolicyTest,
1402 UpdateCanStartAllowedNoUsableUrlsButEnterpriseEnrolled) {
1403 // The UpdateCanStart policy returns true; there's a single HTTP URL but its
1404 // use is forbidden by policy, and P2P is unset on the policy, however the
1405 // device is enterprise-enrolled so P2P is allowed. The result indicates that
1406 // no URL can be used.
1407 //
1408 // Note: The number of failed attempts should not increase in this case (see
1409 // above test).
1410
1411 SetUpdateCheckAllowed(false);
1412
1413 // Override specific device policy attributes.
1414 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(nullptr);
1415 fake_state_.device_policy_provider()->var_owner()->reset(nullptr);
1416 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1417 new bool(false));
1418
1419 // Check that the UpdateCanStart returns true.
1420 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1421 UpdateDownloadParams result;
1422 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1423 update_state);
1424 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001425 EXPECT_TRUE(result.p2p_downloading_allowed);
1426 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001427 EXPECT_GT(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001428 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001429 EXPECT_EQ(0, result.download_url_num_errors);
1430 EXPECT_FALSE(result.do_increment_failures);
1431}
1432
Gilad Arnold684219d2014-07-07 14:54:57 -07001433TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedEthernetDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001434 // Ethernet is always allowed.
1435
1436 fake_state_.shill_provider()->var_conn_type()->
1437 reset(new ConnectionType(ConnectionType::kEthernet));
1438
1439 bool result;
1440 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001441 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001442 EXPECT_TRUE(result);
1443}
1444
Gilad Arnold684219d2014-07-07 14:54:57 -07001445TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWifiDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001446 // Wifi is allowed if not tethered.
1447
1448 fake_state_.shill_provider()->var_conn_type()->
1449 reset(new ConnectionType(ConnectionType::kWifi));
1450
1451 bool result;
1452 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001453 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001454 EXPECT_TRUE(result);
1455}
1456
Alex Deymo63784a52014-05-28 10:46:14 -07001457TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001458 UpdateCurrentConnectionNotAllowedWifiTetheredDefault) {
1459 // Tethered wifi is not allowed by default.
1460
1461 fake_state_.shill_provider()->var_conn_type()->
1462 reset(new ConnectionType(ConnectionType::kWifi));
1463 fake_state_.shill_provider()->var_conn_tethering()->
1464 reset(new ConnectionTethering(ConnectionTethering::kConfirmed));
1465
1466 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001467 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001468 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001469}
1470
Alex Deymo63784a52014-05-28 10:46:14 -07001471TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001472 UpdateDownloadAllowedWifiTetheredPolicyOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001473 // Tethered wifi can be allowed by policy.
1474
1475 fake_state_.shill_provider()->var_conn_type()->
1476 reset(new ConnectionType(ConnectionType::kWifi));
1477 fake_state_.shill_provider()->var_conn_tethering()->
1478 reset(new ConnectionTethering(ConnectionTethering::kConfirmed));
1479 set<ConnectionType> allowed_connections;
1480 allowed_connections.insert(ConnectionType::kCellular);
1481 fake_state_.device_policy_provider()->
1482 var_allowed_connection_types_for_update()->
1483 reset(new set<ConnectionType>(allowed_connections));
1484
1485 bool result;
1486 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001487 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001488 EXPECT_TRUE(result);
1489}
1490
Gilad Arnold684219d2014-07-07 14:54:57 -07001491TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWimaxDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001492 // Wimax is always allowed.
1493
1494 fake_state_.shill_provider()->var_conn_type()->
1495 reset(new ConnectionType(ConnectionType::kWifi));
1496
1497 bool result;
1498 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001499 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001500 EXPECT_TRUE(result);
1501}
1502
Alex Deymo63784a52014-05-28 10:46:14 -07001503TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001504 UpdateCurrentConnectionNotAllowedBluetoothDefault) {
1505 // Bluetooth is never allowed.
1506
1507 fake_state_.shill_provider()->var_conn_type()->
1508 reset(new ConnectionType(ConnectionType::kBluetooth));
1509
1510 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001511 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001512 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001513}
1514
Alex Deymo63784a52014-05-28 10:46:14 -07001515TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001516 UpdateCurrentConnectionNotAllowedBluetoothPolicyCannotOverride) {
1517 // Bluetooth cannot be allowed even by policy.
1518
1519 fake_state_.shill_provider()->var_conn_type()->
1520 reset(new ConnectionType(ConnectionType::kBluetooth));
1521 set<ConnectionType> allowed_connections;
1522 allowed_connections.insert(ConnectionType::kBluetooth);
1523 fake_state_.device_policy_provider()->
1524 var_allowed_connection_types_for_update()->
1525 reset(new set<ConnectionType>(allowed_connections));
1526
1527 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001528 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001529 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001530}
1531
Alex Deymo63784a52014-05-28 10:46:14 -07001532TEST_F(UmChromeOSPolicyTest, UpdateCurrentConnectionNotAllowedCellularDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001533 // Cellular is not allowed by default.
1534
1535 fake_state_.shill_provider()->var_conn_type()->
1536 reset(new ConnectionType(ConnectionType::kCellular));
1537
1538 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001539 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001540 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001541}
1542
Alex Deymo63784a52014-05-28 10:46:14 -07001543TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001544 UpdateDownloadAllowedCellularPolicyOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001545 // Update over cellular can be enabled by policy.
1546
1547 fake_state_.shill_provider()->var_conn_type()->
1548 reset(new ConnectionType(ConnectionType::kCellular));
1549 set<ConnectionType> allowed_connections;
1550 allowed_connections.insert(ConnectionType::kCellular);
1551 fake_state_.device_policy_provider()->
1552 var_allowed_connection_types_for_update()->
1553 reset(new set<ConnectionType>(allowed_connections));
1554
1555 bool result;
1556 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001557 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001558 EXPECT_TRUE(result);
1559}
1560
Alex Deymo63784a52014-05-28 10:46:14 -07001561TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001562 UpdateDownloadAllowedCellularUserOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001563 // Update over cellular can be enabled by user settings, but only if policy
1564 // is present and does not determine allowed connections.
1565
1566 fake_state_.shill_provider()->var_conn_type()->
1567 reset(new ConnectionType(ConnectionType::kCellular));
1568 set<ConnectionType> allowed_connections;
1569 allowed_connections.insert(ConnectionType::kCellular);
1570 fake_state_.updater_provider()->var_cellular_enabled()->
1571 reset(new bool(true));
1572
1573 bool result;
1574 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001575 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001576 EXPECT_TRUE(result);
1577}
1578
Gilad Arnold14a9e702014-10-08 08:09:09 -07001579TEST_F(UmChromeOSPolicyTest,
1580 UpdateCanStartAllowedScatteringSupressedDueToP2P) {
1581 // The UpdateCanStart policy returns true; scattering should have applied, but
1582 // P2P download is allowed. Scattering values are nonetheless returned, and so
1583 // are download URL values, albeit the latter are not allowed to be used.
1584
1585 SetUpdateCheckAllowed(false);
1586 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
1587 new TimeDelta(TimeDelta::FromMinutes(2)));
1588 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1589
1590 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
1591 update_state.scatter_wait_period = TimeDelta::FromSeconds(35);
1592
1593 UpdateDownloadParams result;
1594 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart,
1595 &result, update_state);
1596 EXPECT_TRUE(result.update_can_start);
1597 EXPECT_EQ(0, result.download_url_idx);
1598 EXPECT_FALSE(result.download_url_allowed);
1599 EXPECT_EQ(0, result.download_url_num_errors);
1600 EXPECT_TRUE(result.p2p_downloading_allowed);
1601 EXPECT_TRUE(result.p2p_sharing_allowed);
1602 EXPECT_FALSE(result.do_increment_failures);
1603 EXPECT_EQ(TimeDelta::FromSeconds(35), result.scatter_wait_period);
1604 EXPECT_EQ(0, result.scatter_check_threshold);
1605}
1606
1607TEST_F(UmChromeOSPolicyTest,
1608 UpdateCanStartAllowedBackoffSupressedDueToP2P) {
1609 // The UpdateCanStart policy returns true; backoff should have applied, but
1610 // P2P download is allowed. Backoff values are nonetheless returned, and so
1611 // are download URL values, albeit the latter are not allowed to be used.
1612
1613 SetUpdateCheckAllowed(false);
1614
1615 const Time curr_time = fake_clock_.GetWallclockTime();
1616 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
1617 update_state.download_errors_max = 1;
1618 update_state.download_errors.emplace_back(
1619 0, ErrorCode::kDownloadTransferError,
1620 curr_time - TimeDelta::FromSeconds(8));
1621 update_state.download_errors.emplace_back(
1622 0, ErrorCode::kDownloadTransferError,
1623 curr_time - TimeDelta::FromSeconds(2));
1624 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1625
1626 UpdateDownloadParams result;
1627 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1628 update_state);
1629 EXPECT_TRUE(result.update_can_start);
1630 EXPECT_EQ(0, result.download_url_idx);
1631 EXPECT_FALSE(result.download_url_allowed);
1632 EXPECT_EQ(0, result.download_url_num_errors);
1633 EXPECT_TRUE(result.p2p_downloading_allowed);
1634 EXPECT_TRUE(result.p2p_sharing_allowed);
1635 EXPECT_TRUE(result.do_increment_failures);
1636 EXPECT_LT(curr_time, result.backoff_expiry);
1637}
1638
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001639TEST_F(UmChromeOSPolicyTest, P2PEnabledNotAllowed) {
1640 bool result;
1641 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1642 EXPECT_FALSE(result);
1643}
1644
1645TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedByDevicePolicy) {
1646 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1647 new bool(true));
1648
1649 bool result;
1650 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1651 EXPECT_TRUE(result);
1652}
1653
1654TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedByUpdater) {
1655 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1656
1657 bool result;
1658 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1659 EXPECT_TRUE(result);
1660}
1661
1662TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedDeviceEnterpriseEnrolled) {
1663 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(nullptr);
1664 fake_state_.device_policy_provider()->var_owner()->reset(nullptr);
1665
1666 bool result;
1667 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1668 EXPECT_TRUE(result);
1669}
1670
1671TEST_F(UmChromeOSPolicyTest, P2PEnabledChangedBlocks) {
1672 bool result;
1673 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::P2PEnabledChanged,
1674 &result, false);
1675}
1676
Alex Deymo63784a52014-05-28 10:46:14 -07001677} // namespace chromeos_update_manager