blob: 8a1796fe5e5212679fbcd2e5de96a2441efda48d [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
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700519 // version (i.e. app does not provide the info). Update to latest in such
520 // case.
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800521 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));
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700526 fake_state_.system_provider()->var_kiosk_required_platform_version()->reset(
527 new string());
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800528
529 UpdateCheckParams result;
530 ExpectPolicyStatus(EvalStatus::kSucceeded,
531 &Policy::UpdateCheckAllowed, &result);
532 EXPECT_TRUE(result.updates_enabled);
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700533 EXPECT_TRUE(result.target_version_prefix.empty());
Xiyuan Xia6e30bc52016-02-24 15:35:42 -0800534 EXPECT_FALSE(result.is_interactive);
535}
536
Xiyuan Xiaed9bd922016-04-07 14:45:16 -0700537TEST_F(UmChromeOSPolicyTest,
538 UpdateCheckAllowedKioskPinWithFailedGetRequiredVersionCall) {
539 // AU disabled, allow kiosk to pin but D-Bus call to get required platform
540 // version failed. Defer update check in this case.
541 fake_state_.device_policy_provider()->var_update_disabled()->reset(
542 new bool(true));
543 fake_state_.device_policy_provider()
544 ->var_allow_kiosk_app_control_chrome_version()
545 ->reset(new bool(true));
546 fake_state_.system_provider()->var_kiosk_required_platform_version()->reset(
547 nullptr);
548
549 UpdateCheckParams result;
550 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
551 &Policy::UpdateCheckAllowed, &result);
552}
553
Alex Deymo63784a52014-05-28 10:46:14 -0700554TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsCheckAllowedError) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700555 // The UpdateCanStart policy fails, not being able to query
556 // UpdateCheckAllowed.
557
558 // Configure the UpdateCheckAllowed policy to fail.
559 fake_state_.updater_provider()->var_updater_started_time()->reset(nullptr);
560
561 // Check that the UpdateCanStart fails.
562 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700563 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700564 ExpectPolicyStatus(EvalStatus::kFailed,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700565 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700566}
567
Alex Deymo63784a52014-05-28 10:46:14 -0700568TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedCheckDue) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700569 // The UpdateCanStart policy returns false because we are due for another
Gilad Arnold14a9e702014-10-08 08:09:09 -0700570 // update check. Ensure that download related values are still returned.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700571
572 SetUpdateCheckAllowed(true);
573
574 // Check that the UpdateCanStart returns false.
575 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700576 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700577 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700578 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700579 EXPECT_FALSE(result.update_can_start);
580 EXPECT_EQ(UpdateCannotStartReason::kCheckDue, result.cannot_start_reason);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700581 EXPECT_EQ(0, result.download_url_idx);
582 EXPECT_EQ(0, result.download_url_num_errors);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700583}
584
Alex Deymo63784a52014-05-28 10:46:14 -0700585TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoDevicePolicy) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700586 // The UpdateCanStart policy returns true; no device policy is loaded.
587
588 SetUpdateCheckAllowed(false);
589 fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
590 new bool(false));
591
592 // Check that the UpdateCanStart returns true with no further attributes.
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);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700604}
605
Alex Deymo63784a52014-05-28 10:46:14 -0700606TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBlankPolicy) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700607 // The UpdateCanStart policy returns true; device policy is loaded but imposes
608 // no restrictions on updating.
609
610 SetUpdateCheckAllowed(false);
611
612 // Check that the UpdateCanStart returns true.
613 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700614 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700615 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700616 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700617 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700618 EXPECT_FALSE(result.p2p_downloading_allowed);
619 EXPECT_FALSE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700620 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700621 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700622 EXPECT_EQ(0, result.download_url_num_errors);
623 EXPECT_FALSE(result.do_increment_failures);
624}
625
626TEST_F(UmChromeOSPolicyTest,
627 UpdateCanStartNotAllowedBackoffNewWaitPeriodApplies) {
628 // The UpdateCanStart policy returns false; failures are reported and a new
629 // backoff period is enacted.
630
631 SetUpdateCheckAllowed(false);
632
633 const Time curr_time = fake_clock_.GetWallclockTime();
634 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
635 update_state.download_errors_max = 1;
636 update_state.download_errors.emplace_back(
637 0, ErrorCode::kDownloadTransferError,
638 curr_time - TimeDelta::FromSeconds(8));
639 update_state.download_errors.emplace_back(
640 0, ErrorCode::kDownloadTransferError,
641 curr_time - TimeDelta::FromSeconds(2));
642
643 // Check that UpdateCanStart returns false and a new backoff expiry is
644 // generated.
645 UpdateDownloadParams result;
646 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
647 update_state);
648 EXPECT_FALSE(result.update_can_start);
649 EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
650 EXPECT_TRUE(result.do_increment_failures);
651 EXPECT_LT(curr_time, result.backoff_expiry);
652}
653
654TEST_F(UmChromeOSPolicyTest,
655 UpdateCanStartNotAllowedBackoffPrevWaitPeriodStillApplies) {
656 // The UpdateCanStart policy returns false; a previously enacted backoff
657 // period still applies.
658
659 SetUpdateCheckAllowed(false);
660
661 const Time curr_time = fake_clock_.GetWallclockTime();
662 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
663 update_state.download_errors_max = 1;
664 update_state.download_errors.emplace_back(
665 0, ErrorCode::kDownloadTransferError,
666 curr_time - TimeDelta::FromSeconds(8));
667 update_state.download_errors.emplace_back(
668 0, ErrorCode::kDownloadTransferError,
669 curr_time - TimeDelta::FromSeconds(2));
670 update_state.failures_last_updated = curr_time;
671 update_state.backoff_expiry = curr_time + TimeDelta::FromMinutes(3);
672
673 // Check that UpdateCanStart returns false and a new backoff expiry is
674 // generated.
675 UpdateDownloadParams result;
676 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::UpdateCanStart,
677 &result, update_state);
678 EXPECT_FALSE(result.update_can_start);
679 EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
680 EXPECT_FALSE(result.do_increment_failures);
681 EXPECT_LT(curr_time, result.backoff_expiry);
682}
683
684TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffSatisfied) {
685 // The UpdateCanStart policy returns true; a previously enacted backoff period
686 // has elapsed, we're good to go.
687
688 SetUpdateCheckAllowed(false);
689
690 const Time curr_time = fake_clock_.GetWallclockTime();
691 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
692 update_state.download_errors_max = 1;
693 update_state.download_errors.emplace_back(
694 0, ErrorCode::kDownloadTransferError,
695 curr_time - TimeDelta::FromSeconds(8));
696 update_state.download_errors.emplace_back(
697 0, ErrorCode::kDownloadTransferError,
698 curr_time - TimeDelta::FromSeconds(2));
699 update_state.failures_last_updated = curr_time - TimeDelta::FromSeconds(1);
700 update_state.backoff_expiry = curr_time - TimeDelta::FromSeconds(1);
701
702 // Check that UpdateCanStart returns false and a new backoff expiry is
703 // generated.
704 UpdateDownloadParams result;
705 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart,
706 &result, update_state);
707 EXPECT_TRUE(result.update_can_start);
708 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
709 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700710 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700711 EXPECT_EQ(0, result.download_url_num_errors);
712 EXPECT_FALSE(result.do_increment_failures);
713 EXPECT_EQ(Time(), result.backoff_expiry);
714}
715
716TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffDisabled) {
717 // The UpdateCanStart policy returns false; failures are reported but backoff
718 // is disabled.
719
720 SetUpdateCheckAllowed(false);
721
722 const Time curr_time = fake_clock_.GetWallclockTime();
723 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
724 update_state.download_errors_max = 1;
725 update_state.download_errors.emplace_back(
726 0, ErrorCode::kDownloadTransferError,
727 curr_time - TimeDelta::FromSeconds(8));
728 update_state.download_errors.emplace_back(
729 0, ErrorCode::kDownloadTransferError,
730 curr_time - TimeDelta::FromSeconds(2));
731 update_state.is_backoff_disabled = true;
732
733 // Check that UpdateCanStart returns false and a new backoff expiry is
734 // generated.
735 UpdateDownloadParams result;
736 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
737 update_state);
738 EXPECT_TRUE(result.update_can_start);
739 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
740 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700741 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700742 EXPECT_EQ(0, result.download_url_num_errors);
743 EXPECT_TRUE(result.do_increment_failures);
744 EXPECT_EQ(Time(), result.backoff_expiry);
745}
746
747TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffInteractive) {
748 // The UpdateCanStart policy returns false; failures are reported but this is
749 // an interactive update check.
750
751 SetUpdateCheckAllowed(false);
752
753 const Time curr_time = fake_clock_.GetWallclockTime();
754 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
755 update_state.download_errors_max = 1;
756 update_state.download_errors.emplace_back(
757 0, ErrorCode::kDownloadTransferError,
758 curr_time - TimeDelta::FromSeconds(8));
759 update_state.download_errors.emplace_back(
760 0, ErrorCode::kDownloadTransferError,
761 curr_time - TimeDelta::FromSeconds(2));
762 update_state.is_interactive = true;
763
764 // Check that UpdateCanStart returns false and a new backoff expiry is
765 // generated.
766 UpdateDownloadParams result;
767 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
768 update_state);
769 EXPECT_TRUE(result.update_can_start);
770 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
771 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700772 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700773 EXPECT_EQ(0, result.download_url_num_errors);
774 EXPECT_TRUE(result.do_increment_failures);
775 EXPECT_EQ(Time(), result.backoff_expiry);
776}
777
778TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffDelta) {
779 // The UpdateCanStart policy returns false; failures are reported but this is
780 // a delta payload.
781
782 SetUpdateCheckAllowed(false);
783
784 const Time curr_time = fake_clock_.GetWallclockTime();
785 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
786 update_state.download_errors_max = 1;
787 update_state.download_errors.emplace_back(
788 0, ErrorCode::kDownloadTransferError,
789 curr_time - TimeDelta::FromSeconds(8));
790 update_state.download_errors.emplace_back(
791 0, ErrorCode::kDownloadTransferError,
792 curr_time - TimeDelta::FromSeconds(2));
793 update_state.is_delta_payload = true;
794
795 // Check that UpdateCanStart returns false and a new backoff expiry is
796 // generated.
797 UpdateDownloadParams result;
798 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
799 update_state);
800 EXPECT_TRUE(result.update_can_start);
801 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
802 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700803 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700804 EXPECT_EQ(0, result.download_url_num_errors);
805 EXPECT_TRUE(result.do_increment_failures);
806 EXPECT_EQ(Time(), result.backoff_expiry);
807}
808
809TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffUnofficialBuild) {
810 // The UpdateCanStart policy returns false; failures are reported but this is
811 // an unofficial build.
812
813 SetUpdateCheckAllowed(false);
814
815 const Time curr_time = fake_clock_.GetWallclockTime();
816 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
817 update_state.download_errors_max = 1;
818 update_state.download_errors.emplace_back(
819 0, ErrorCode::kDownloadTransferError,
820 curr_time - TimeDelta::FromSeconds(8));
821 update_state.download_errors.emplace_back(
822 0, ErrorCode::kDownloadTransferError,
823 curr_time - TimeDelta::FromSeconds(2));
824
825 fake_state_.system_provider()->var_is_official_build()->
826 reset(new bool(false));
827
828 // Check that UpdateCanStart returns false and a new backoff expiry is
829 // generated.
830 UpdateDownloadParams result;
831 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
832 update_state);
833 EXPECT_TRUE(result.update_can_start);
834 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
835 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700836 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700837 EXPECT_EQ(0, result.download_url_num_errors);
838 EXPECT_TRUE(result.do_increment_failures);
839 EXPECT_EQ(Time(), result.backoff_expiry);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700840}
841
Alex Deymo63784a52014-05-28 10:46:14 -0700842TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsScatteringFailed) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700843 // The UpdateCanStart policy fails because the UpdateScattering policy it
844 // depends on fails (unset variable).
845
846 SetUpdateCheckAllowed(false);
847
848 // Override the default seed variable with a null value so that the policy
849 // request would fail.
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700850 // TODO(garnold) This failure may or may not fail a number
851 // sub-policies/decisions, like scattering and backoff. We'll need a more
852 // deliberate setup to ensure that we're failing what we want to be failing.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700853 fake_state_.random_provider()->var_seed()->reset(nullptr);
854
855 // Check that the UpdateCanStart fails.
856 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700857 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700858 ExpectPolicyStatus(EvalStatus::kFailed,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700859 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700860}
861
Alex Deymo63784a52014-05-28 10:46:14 -0700862TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700863 UpdateCanStartNotAllowedScatteringNewWaitPeriodApplies) {
864 // The UpdateCanStart policy returns false; device policy is loaded and
865 // scattering applies due to an unsatisfied wait period, which was newly
866 // generated.
867
868 SetUpdateCheckAllowed(false);
869 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
870 new TimeDelta(TimeDelta::FromMinutes(2)));
871
872
873 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
874
875 // Check that the UpdateCanStart returns false and a new wait period
876 // generated.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700877 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700878 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700879 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700880 EXPECT_FALSE(result.update_can_start);
881 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
882 EXPECT_LT(TimeDelta(), result.scatter_wait_period);
883 EXPECT_EQ(0, result.scatter_check_threshold);
884}
885
Alex Deymo63784a52014-05-28 10:46:14 -0700886TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700887 UpdateCanStartNotAllowedScatteringPrevWaitPeriodStillApplies) {
888 // The UpdateCanStart policy returns false w/ kAskMeAgainLater; device policy
889 // is loaded and a previously generated scattering period still applies, none
890 // of the scattering values has changed.
891
892 SetUpdateCheckAllowed(false);
893 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
894 new TimeDelta(TimeDelta::FromMinutes(2)));
895
896 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
897 update_state.scatter_wait_period = TimeDelta::FromSeconds(35);
898
899 // Check that the UpdateCanStart returns false and a new wait period
900 // generated.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700901 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700902 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::UpdateCanStart,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700903 &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700904 EXPECT_FALSE(result.update_can_start);
905 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
906 EXPECT_EQ(TimeDelta::FromSeconds(35), result.scatter_wait_period);
907 EXPECT_EQ(0, result.scatter_check_threshold);
908}
909
Alex Deymo63784a52014-05-28 10:46:14 -0700910TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700911 UpdateCanStartNotAllowedScatteringNewCountThresholdApplies) {
912 // The UpdateCanStart policy returns false; device policy is loaded and
913 // scattering applies due to an unsatisfied update check count threshold.
914 //
915 // This ensures a non-zero check threshold, which may or may not be combined
916 // with a non-zero wait period (for which we cannot reliably control).
917
918 SetUpdateCheckAllowed(false);
919 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
920 new TimeDelta(TimeDelta::FromSeconds(1)));
921
922 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
923 update_state.scatter_check_threshold_min = 2;
924 update_state.scatter_check_threshold_max = 5;
925
926 // Check that the UpdateCanStart returns false.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700927 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700928 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700929 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700930 EXPECT_FALSE(result.update_can_start);
931 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
932 EXPECT_LE(2, result.scatter_check_threshold);
933 EXPECT_GE(5, result.scatter_check_threshold);
934}
935
Alex Deymo63784a52014-05-28 10:46:14 -0700936TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700937 UpdateCanStartNotAllowedScatteringPrevCountThresholdStillApplies) {
938 // The UpdateCanStart policy returns false; device policy is loaded and
939 // scattering due to a previously generated count threshold still applies.
940
941 SetUpdateCheckAllowed(false);
942 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
943 new TimeDelta(TimeDelta::FromSeconds(1)));
944
945 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
946 update_state.scatter_check_threshold = 3;
947 update_state.scatter_check_threshold_min = 2;
948 update_state.scatter_check_threshold_max = 5;
949
950 // Check that the UpdateCanStart returns false.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700951 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700952 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700953 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700954 EXPECT_FALSE(result.update_can_start);
955 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
956 EXPECT_EQ(3, result.scatter_check_threshold);
957}
958
Alex Deymo63784a52014-05-28 10:46:14 -0700959TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedScatteringSatisfied) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700960 // The UpdateCanStart policy returns true; device policy is loaded and
961 // scattering is enabled, but both wait period and check threshold are
962 // satisfied.
963
964 SetUpdateCheckAllowed(false);
965 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
966 new TimeDelta(TimeDelta::FromSeconds(120)));
967
968 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(75));
969 update_state.num_checks = 4;
970 update_state.scatter_wait_period = TimeDelta::FromSeconds(60);
971 update_state.scatter_check_threshold = 3;
972 update_state.scatter_check_threshold_min = 2;
973 update_state.scatter_check_threshold_max = 5;
974
975 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700976 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700977 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700978 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700979 EXPECT_TRUE(result.update_can_start);
980 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
981 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700982 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700983 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700984 EXPECT_EQ(0, result.download_url_num_errors);
985 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700986}
987
Alex Deymo63784a52014-05-28 10:46:14 -0700988TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700989 UpdateCanStartAllowedInteractivePreventsScattering) {
990 // The UpdateCanStart policy returns true; device policy is loaded and
991 // scattering would have applied, except that the update check is interactive
992 // and so it is suppressed.
993
994 SetUpdateCheckAllowed(false);
995 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
996 new TimeDelta(TimeDelta::FromSeconds(1)));
997
998 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700999 update_state.is_interactive = true;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001000 update_state.scatter_check_threshold = 0;
1001 update_state.scatter_check_threshold_min = 2;
1002 update_state.scatter_check_threshold_max = 5;
1003
1004 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001005 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001006 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001007 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001008 EXPECT_TRUE(result.update_can_start);
1009 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
1010 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001011 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001012 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001013 EXPECT_EQ(0, result.download_url_num_errors);
1014 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001015}
1016
Alex Deymo63784a52014-05-28 10:46:14 -07001017TEST_F(UmChromeOSPolicyTest,
Gilad Arnold76a11f62014-05-20 09:02:12 -07001018 UpdateCanStartAllowedOobePreventsScattering) {
1019 // The UpdateCanStart policy returns true; device policy is loaded and
1020 // scattering would have applied, except that OOBE was not completed and so it
1021 // is suppressed.
1022
1023 SetUpdateCheckAllowed(false);
1024 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
1025 new TimeDelta(TimeDelta::FromSeconds(1)));
1026 fake_state_.system_provider()->var_is_oobe_complete()->reset(new bool(false));
1027
1028 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001029 update_state.is_interactive = true;
Gilad Arnold76a11f62014-05-20 09:02:12 -07001030 update_state.scatter_check_threshold = 0;
1031 update_state.scatter_check_threshold_min = 2;
1032 update_state.scatter_check_threshold_max = 5;
1033
1034 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001035 UpdateDownloadParams result;
Gilad Arnold76a11f62014-05-20 09:02:12 -07001036 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001037 update_state);
Gilad Arnold76a11f62014-05-20 09:02:12 -07001038 EXPECT_TRUE(result.update_can_start);
1039 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
1040 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001041 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001042 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001043 EXPECT_EQ(0, result.download_url_num_errors);
1044 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnold76a11f62014-05-20 09:02:12 -07001045}
1046
Alex Deymo63784a52014-05-28 10:46:14 -07001047TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithAttributes) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001048 // The UpdateCanStart policy returns true; device policy permits both HTTP and
1049 // P2P updates, as well as a non-empty target channel string.
1050
1051 SetUpdateCheckAllowed(false);
1052
1053 // Override specific device policy attributes.
1054 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1055 new bool(true));
1056 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1057 new bool(true));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001058
1059 // Check that the UpdateCanStart returns true.
1060 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001061 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001062 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001063 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001064 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001065 EXPECT_TRUE(result.p2p_downloading_allowed);
1066 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001067 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001068 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001069 EXPECT_EQ(0, result.download_url_num_errors);
1070 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001071}
1072
Alex Deymo63784a52014-05-28 10:46:14 -07001073TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithP2PFromUpdater) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001074 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1075 // P2P updates, but the updater is configured to allow P2P and overrules the
1076 // setting.
1077
1078 SetUpdateCheckAllowed(false);
1079
1080 // Override specific device policy attributes.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001081 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1082
1083 // Check that the UpdateCanStart returns true.
1084 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001085 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001086 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001087 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001088 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001089 EXPECT_TRUE(result.p2p_downloading_allowed);
1090 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001091 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001092 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001093 EXPECT_EQ(0, result.download_url_num_errors);
1094 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001095}
1096
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001097TEST_F(UmChromeOSPolicyTest,
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001098 UpdateCanStartAllowedP2PDownloadingBlockedDueToOmaha) {
1099 // The UpdateCanStart policy returns true; device policy permits HTTP, but
1100 // policy blocks P2P downloading because Omaha forbids it. P2P sharing is
1101 // still permitted.
1102
1103 SetUpdateCheckAllowed(false);
1104
1105 // Override specific device policy attributes.
1106 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1107 new bool(true));
1108 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1109 new bool(true));
1110
1111 // Check that the UpdateCanStart returns true.
1112 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1113 update_state.p2p_downloading_disabled = true;
1114 UpdateDownloadParams result;
1115 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1116 update_state);
1117 EXPECT_TRUE(result.update_can_start);
1118 EXPECT_FALSE(result.p2p_downloading_allowed);
1119 EXPECT_TRUE(result.p2p_sharing_allowed);
1120}
1121
1122TEST_F(UmChromeOSPolicyTest,
1123 UpdateCanStartAllowedP2PSharingBlockedDueToOmaha) {
1124 // The UpdateCanStart policy returns true; device policy permits HTTP, but
1125 // policy blocks P2P sharing because Omaha forbids it. P2P downloading is
1126 // still permitted.
1127
1128 SetUpdateCheckAllowed(false);
1129
1130 // Override specific device policy attributes.
1131 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1132 new bool(true));
1133 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1134 new bool(true));
1135
1136 // Check that the UpdateCanStart returns true.
1137 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1138 update_state.p2p_sharing_disabled = true;
1139 UpdateDownloadParams result;
1140 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1141 update_state);
1142 EXPECT_TRUE(result.update_can_start);
1143 EXPECT_TRUE(result.p2p_downloading_allowed);
1144 EXPECT_FALSE(result.p2p_sharing_allowed);
1145}
1146
1147TEST_F(UmChromeOSPolicyTest,
1148 UpdateCanStartAllowedP2PDownloadingBlockedDueToNumAttempts) {
Gilad Arnold349ac832014-10-06 14:20:28 -07001149 // The UpdateCanStart policy returns true; device policy permits HTTP but
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001150 // blocks P2P download, because the max number of P2P downloads have been
1151 // attempted. P2P sharing is still permitted.
Gilad Arnold349ac832014-10-06 14:20:28 -07001152
1153 SetUpdateCheckAllowed(false);
1154
1155 // Override specific device policy attributes.
1156 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1157 new bool(true));
1158 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1159 new bool(true));
1160
1161 // Check that the UpdateCanStart returns true.
1162 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1163 update_state.p2p_num_attempts = ChromeOSPolicy::kMaxP2PAttempts;
1164 UpdateDownloadParams result;
1165 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1166 update_state);
1167 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001168 EXPECT_FALSE(result.p2p_downloading_allowed);
1169 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnold349ac832014-10-06 14:20:28 -07001170}
1171
1172TEST_F(UmChromeOSPolicyTest,
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001173 UpdateCanStartAllowedP2PDownloadingBlockedDueToAttemptsPeriod) {
Gilad Arnold349ac832014-10-06 14:20:28 -07001174 // The UpdateCanStart policy returns true; device policy permits HTTP but
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001175 // blocks P2P download, because the max period for attempt to download via P2P
1176 // has elapsed. P2P sharing is still permitted.
Gilad Arnold349ac832014-10-06 14:20:28 -07001177
1178 SetUpdateCheckAllowed(false);
1179
1180 // Override specific device policy attributes.
1181 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1182 new bool(true));
1183 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1184 new bool(true));
1185
1186 // Check that the UpdateCanStart returns true.
1187 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1188 update_state.p2p_num_attempts = 1;
1189 update_state.p2p_first_attempted =
1190 fake_clock_.GetWallclockTime() -
Alex Deymof329b932014-10-30 01:37:48 -07001191 TimeDelta::FromSeconds(
1192 ChromeOSPolicy::kMaxP2PAttemptsPeriodInSeconds + 1);
Gilad Arnold349ac832014-10-06 14:20:28 -07001193 UpdateDownloadParams result;
1194 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1195 update_state);
1196 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001197 EXPECT_FALSE(result.p2p_downloading_allowed);
1198 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnold349ac832014-10-06 14:20:28 -07001199}
1200
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001201TEST_F(UmChromeOSPolicyTest,
1202 UpdateCanStartAllowedWithHttpUrlForUnofficialBuild) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001203 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1204 // P2P updates, but marking this an unofficial build overrules the HTTP
1205 // setting.
1206
1207 SetUpdateCheckAllowed(false);
1208
1209 // Override specific device policy attributes.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001210 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1211 new bool(false));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001212 fake_state_.system_provider()->var_is_official_build()->
1213 reset(new bool(false));
1214
1215 // Check that the UpdateCanStart returns true.
1216 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001217 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001218 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001219 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001220 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001221 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001222 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001223 EXPECT_EQ(0, result.download_url_num_errors);
1224 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001225}
1226
1227TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithHttpsUrl) {
1228 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1229 // P2P updates, but an HTTPS URL is provided and selected for download.
1230
1231 SetUpdateCheckAllowed(false);
1232
1233 // Override specific device policy attributes.
1234 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1235 new bool(false));
1236
1237 // Add an HTTPS URL.
1238 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001239 update_state.download_urls.emplace_back("https://secure/url/");
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001240
1241 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001242 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001243 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001244 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001245 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001246 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001247 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001248 EXPECT_EQ(0, result.download_url_num_errors);
1249 EXPECT_FALSE(result.do_increment_failures);
1250}
1251
1252TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedMaxErrorsNotExceeded) {
1253 // The UpdateCanStart policy returns true; the first URL has download errors
1254 // but does not exceed the maximum allowed number of failures, so it is stilli
1255 // usable.
1256
1257 SetUpdateCheckAllowed(false);
1258
1259 // Add a second URL; update with this URL attempted and failed enough times to
1260 // disqualify the current (first) URL.
1261 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1262 update_state.num_checks = 5;
1263 update_state.download_urls.emplace_back("http://another/fake/url/");
1264 Time t = fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(12);
1265 for (int i = 0; i < 5; i++) {
1266 update_state.download_errors.emplace_back(
1267 0, ErrorCode::kDownloadTransferError, t);
1268 t += TimeDelta::FromSeconds(1);
1269 }
1270
1271 // Check that the UpdateCanStart returns true.
1272 UpdateDownloadParams result;
1273 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1274 update_state);
1275 EXPECT_TRUE(result.update_can_start);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001276 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001277 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001278 EXPECT_EQ(5, result.download_url_num_errors);
1279 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001280}
1281
1282TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlMaxExceeded) {
1283 // The UpdateCanStart policy returns true; the first URL exceeded the maximum
1284 // allowed number of failures, but a second URL is available.
1285
1286 SetUpdateCheckAllowed(false);
1287
1288 // Add a second URL; update with this URL attempted and failed enough times to
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001289 // disqualify the current (first) URL.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001290 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1291 update_state.num_checks = 10;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001292 update_state.download_urls.emplace_back("http://another/fake/url/");
1293 Time t = fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(12);
1294 for (int i = 0; i < 11; i++) {
1295 update_state.download_errors.emplace_back(
1296 0, ErrorCode::kDownloadTransferError, t);
1297 t += TimeDelta::FromSeconds(1);
1298 }
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001299
1300 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001301 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001302 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001303 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001304 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001305 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001306 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001307 EXPECT_EQ(0, result.download_url_num_errors);
1308 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001309}
1310
1311TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlHardError) {
1312 // The UpdateCanStart policy returns true; the first URL fails with a hard
1313 // error, but a second URL is available.
1314
1315 SetUpdateCheckAllowed(false);
1316
1317 // Add a second URL; update with this URL attempted and failed in a way that
1318 // causes it to switch directly to the next URL.
1319 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1320 update_state.num_checks = 10;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001321 update_state.download_urls.emplace_back("http://another/fake/url/");
1322 update_state.download_errors.emplace_back(
1323 0, ErrorCode::kPayloadHashMismatchError,
1324 fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(1));
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001325
1326 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001327 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001328 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001329 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001330 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001331 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001332 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001333 EXPECT_EQ(0, result.download_url_num_errors);
1334 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001335}
1336
1337TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedUrlWrapsAround) {
1338 // The UpdateCanStart policy returns true; URL search properly wraps around
1339 // the last one on the list.
1340
1341 SetUpdateCheckAllowed(false);
1342
1343 // Add a second URL; update with this URL attempted and failed in a way that
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001344 // causes it to switch directly to the next URL. We must disable backoff in
1345 // order for it not to interfere.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001346 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001347 update_state.num_checks = 1;
1348 update_state.is_backoff_disabled = true;
1349 update_state.download_urls.emplace_back("http://another/fake/url/");
1350 update_state.download_errors.emplace_back(
1351 1, ErrorCode::kPayloadHashMismatchError,
1352 fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(1));
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001353
1354 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001355 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001356 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001357 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001358 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001359 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001360 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001361 EXPECT_EQ(0, result.download_url_num_errors);
1362 EXPECT_TRUE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001363}
1364
1365TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedNoUsableUrls) {
1366 // The UpdateCanStart policy returns false; there's a single HTTP URL but its
1367 // use is forbidden by policy.
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001368 //
1369 // Note: In the case where no usable URLs are found, the policy should not
1370 // increment the number of failed attempts! Doing so would result in a
1371 // non-idempotent semantics, and does not fall within the intended purpose of
1372 // the backoff mechanism anyway.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001373
1374 SetUpdateCheckAllowed(false);
1375
1376 // Override specific device policy attributes.
1377 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1378 new bool(false));
1379
1380 // Check that the UpdateCanStart returns false.
1381 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001382 UpdateDownloadParams result;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001383 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1384 update_state);
1385 EXPECT_FALSE(result.update_can_start);
1386 EXPECT_EQ(UpdateCannotStartReason::kCannotDownload,
1387 result.cannot_start_reason);
1388 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001389}
1390
1391TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoUsableUrlsButP2PEnabled) {
1392 // The UpdateCanStart policy returns true; there's a single HTTP URL but its
1393 // use is forbidden by policy, however P2P is enabled. The result indicates
1394 // that no URL can be used.
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001395 //
1396 // Note: The number of failed attempts should not increase in this case (see
1397 // above test).
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001398
1399 SetUpdateCheckAllowed(false);
1400
1401 // Override specific device policy attributes.
1402 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1403 new bool(true));
1404 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1405 new bool(false));
1406
1407 // Check that the UpdateCanStart returns true.
1408 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001409 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001410 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001411 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001412 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001413 EXPECT_TRUE(result.p2p_downloading_allowed);
1414 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001415 EXPECT_GT(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001416 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001417 EXPECT_EQ(0, result.download_url_num_errors);
1418 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001419}
1420
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001421TEST_F(UmChromeOSPolicyTest,
1422 UpdateCanStartAllowedNoUsableUrlsButEnterpriseEnrolled) {
1423 // The UpdateCanStart policy returns true; there's a single HTTP URL but its
1424 // use is forbidden by policy, and P2P is unset on the policy, however the
1425 // device is enterprise-enrolled so P2P is allowed. The result indicates that
1426 // no URL can be used.
1427 //
1428 // Note: The number of failed attempts should not increase in this case (see
1429 // above test).
1430
1431 SetUpdateCheckAllowed(false);
1432
1433 // Override specific device policy attributes.
1434 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(nullptr);
1435 fake_state_.device_policy_provider()->var_owner()->reset(nullptr);
1436 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1437 new bool(false));
1438
1439 // Check that the UpdateCanStart returns true.
1440 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1441 UpdateDownloadParams result;
1442 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1443 update_state);
1444 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001445 EXPECT_TRUE(result.p2p_downloading_allowed);
1446 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001447 EXPECT_GT(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001448 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001449 EXPECT_EQ(0, result.download_url_num_errors);
1450 EXPECT_FALSE(result.do_increment_failures);
1451}
1452
Gilad Arnold684219d2014-07-07 14:54:57 -07001453TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedEthernetDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001454 // Ethernet is always allowed.
1455
1456 fake_state_.shill_provider()->var_conn_type()->
1457 reset(new ConnectionType(ConnectionType::kEthernet));
1458
1459 bool result;
1460 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001461 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001462 EXPECT_TRUE(result);
1463}
1464
Gilad Arnold684219d2014-07-07 14:54:57 -07001465TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWifiDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001466 // Wifi is allowed if not tethered.
1467
1468 fake_state_.shill_provider()->var_conn_type()->
1469 reset(new ConnectionType(ConnectionType::kWifi));
1470
1471 bool result;
1472 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001473 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001474 EXPECT_TRUE(result);
1475}
1476
Alex Deymo63784a52014-05-28 10:46:14 -07001477TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001478 UpdateCurrentConnectionNotAllowedWifiTetheredDefault) {
1479 // Tethered wifi is not allowed by default.
1480
1481 fake_state_.shill_provider()->var_conn_type()->
1482 reset(new ConnectionType(ConnectionType::kWifi));
1483 fake_state_.shill_provider()->var_conn_tethering()->
1484 reset(new ConnectionTethering(ConnectionTethering::kConfirmed));
1485
1486 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001487 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001488 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001489}
1490
Alex Deymo63784a52014-05-28 10:46:14 -07001491TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001492 UpdateDownloadAllowedWifiTetheredPolicyOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001493 // Tethered wifi can be allowed by policy.
1494
1495 fake_state_.shill_provider()->var_conn_type()->
1496 reset(new ConnectionType(ConnectionType::kWifi));
1497 fake_state_.shill_provider()->var_conn_tethering()->
1498 reset(new ConnectionTethering(ConnectionTethering::kConfirmed));
1499 set<ConnectionType> allowed_connections;
1500 allowed_connections.insert(ConnectionType::kCellular);
1501 fake_state_.device_policy_provider()->
1502 var_allowed_connection_types_for_update()->
1503 reset(new set<ConnectionType>(allowed_connections));
1504
1505 bool result;
1506 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001507 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001508 EXPECT_TRUE(result);
1509}
1510
Gilad Arnold684219d2014-07-07 14:54:57 -07001511TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWimaxDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001512 // Wimax is always allowed.
1513
1514 fake_state_.shill_provider()->var_conn_type()->
1515 reset(new ConnectionType(ConnectionType::kWifi));
1516
1517 bool result;
1518 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001519 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001520 EXPECT_TRUE(result);
1521}
1522
Alex Deymo63784a52014-05-28 10:46:14 -07001523TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001524 UpdateCurrentConnectionNotAllowedBluetoothDefault) {
1525 // Bluetooth is never allowed.
1526
1527 fake_state_.shill_provider()->var_conn_type()->
1528 reset(new ConnectionType(ConnectionType::kBluetooth));
1529
1530 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001531 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001532 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001533}
1534
Alex Deymo63784a52014-05-28 10:46:14 -07001535TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001536 UpdateCurrentConnectionNotAllowedBluetoothPolicyCannotOverride) {
1537 // Bluetooth cannot be allowed even by policy.
1538
1539 fake_state_.shill_provider()->var_conn_type()->
1540 reset(new ConnectionType(ConnectionType::kBluetooth));
1541 set<ConnectionType> allowed_connections;
1542 allowed_connections.insert(ConnectionType::kBluetooth);
1543 fake_state_.device_policy_provider()->
1544 var_allowed_connection_types_for_update()->
1545 reset(new set<ConnectionType>(allowed_connections));
1546
1547 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001548 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001549 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001550}
1551
Alex Deymo63784a52014-05-28 10:46:14 -07001552TEST_F(UmChromeOSPolicyTest, UpdateCurrentConnectionNotAllowedCellularDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001553 // Cellular is not allowed by default.
1554
1555 fake_state_.shill_provider()->var_conn_type()->
1556 reset(new ConnectionType(ConnectionType::kCellular));
1557
1558 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001559 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001560 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001561}
1562
Alex Deymo63784a52014-05-28 10:46:14 -07001563TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001564 UpdateDownloadAllowedCellularPolicyOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001565 // Update over cellular can be enabled by policy.
1566
1567 fake_state_.shill_provider()->var_conn_type()->
1568 reset(new ConnectionType(ConnectionType::kCellular));
1569 set<ConnectionType> allowed_connections;
1570 allowed_connections.insert(ConnectionType::kCellular);
1571 fake_state_.device_policy_provider()->
1572 var_allowed_connection_types_for_update()->
1573 reset(new set<ConnectionType>(allowed_connections));
1574
1575 bool result;
1576 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001577 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001578 EXPECT_TRUE(result);
1579}
1580
Alex Deymo63784a52014-05-28 10:46:14 -07001581TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001582 UpdateDownloadAllowedCellularUserOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001583 // Update over cellular can be enabled by user settings, but only if policy
1584 // is present and does not determine allowed connections.
1585
1586 fake_state_.shill_provider()->var_conn_type()->
1587 reset(new ConnectionType(ConnectionType::kCellular));
1588 set<ConnectionType> allowed_connections;
1589 allowed_connections.insert(ConnectionType::kCellular);
1590 fake_state_.updater_provider()->var_cellular_enabled()->
1591 reset(new bool(true));
1592
1593 bool result;
1594 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001595 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001596 EXPECT_TRUE(result);
1597}
1598
Gilad Arnold14a9e702014-10-08 08:09:09 -07001599TEST_F(UmChromeOSPolicyTest,
1600 UpdateCanStartAllowedScatteringSupressedDueToP2P) {
1601 // The UpdateCanStart policy returns true; scattering should have applied, but
1602 // P2P download is allowed. Scattering values are nonetheless returned, and so
1603 // are download URL values, albeit the latter are not allowed to be used.
1604
1605 SetUpdateCheckAllowed(false);
1606 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
1607 new TimeDelta(TimeDelta::FromMinutes(2)));
1608 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1609
1610 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
1611 update_state.scatter_wait_period = TimeDelta::FromSeconds(35);
1612
1613 UpdateDownloadParams result;
1614 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart,
1615 &result, update_state);
1616 EXPECT_TRUE(result.update_can_start);
1617 EXPECT_EQ(0, result.download_url_idx);
1618 EXPECT_FALSE(result.download_url_allowed);
1619 EXPECT_EQ(0, result.download_url_num_errors);
1620 EXPECT_TRUE(result.p2p_downloading_allowed);
1621 EXPECT_TRUE(result.p2p_sharing_allowed);
1622 EXPECT_FALSE(result.do_increment_failures);
1623 EXPECT_EQ(TimeDelta::FromSeconds(35), result.scatter_wait_period);
1624 EXPECT_EQ(0, result.scatter_check_threshold);
1625}
1626
1627TEST_F(UmChromeOSPolicyTest,
1628 UpdateCanStartAllowedBackoffSupressedDueToP2P) {
1629 // The UpdateCanStart policy returns true; backoff should have applied, but
1630 // P2P download is allowed. Backoff values are nonetheless returned, and so
1631 // are download URL values, albeit the latter are not allowed to be used.
1632
1633 SetUpdateCheckAllowed(false);
1634
1635 const Time curr_time = fake_clock_.GetWallclockTime();
1636 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
1637 update_state.download_errors_max = 1;
1638 update_state.download_errors.emplace_back(
1639 0, ErrorCode::kDownloadTransferError,
1640 curr_time - TimeDelta::FromSeconds(8));
1641 update_state.download_errors.emplace_back(
1642 0, ErrorCode::kDownloadTransferError,
1643 curr_time - TimeDelta::FromSeconds(2));
1644 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1645
1646 UpdateDownloadParams result;
1647 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1648 update_state);
1649 EXPECT_TRUE(result.update_can_start);
1650 EXPECT_EQ(0, result.download_url_idx);
1651 EXPECT_FALSE(result.download_url_allowed);
1652 EXPECT_EQ(0, result.download_url_num_errors);
1653 EXPECT_TRUE(result.p2p_downloading_allowed);
1654 EXPECT_TRUE(result.p2p_sharing_allowed);
1655 EXPECT_TRUE(result.do_increment_failures);
1656 EXPECT_LT(curr_time, result.backoff_expiry);
1657}
1658
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001659TEST_F(UmChromeOSPolicyTest, P2PEnabledNotAllowed) {
1660 bool result;
1661 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1662 EXPECT_FALSE(result);
1663}
1664
1665TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedByDevicePolicy) {
1666 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1667 new bool(true));
1668
1669 bool result;
1670 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1671 EXPECT_TRUE(result);
1672}
1673
1674TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedByUpdater) {
1675 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1676
1677 bool result;
1678 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1679 EXPECT_TRUE(result);
1680}
1681
1682TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedDeviceEnterpriseEnrolled) {
1683 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(nullptr);
1684 fake_state_.device_policy_provider()->var_owner()->reset(nullptr);
1685
1686 bool result;
1687 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1688 EXPECT_TRUE(result);
1689}
1690
1691TEST_F(UmChromeOSPolicyTest, P2PEnabledChangedBlocks) {
1692 bool result;
1693 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::P2PEnabledChanged,
1694 &result, false);
1695}
1696
Alex Deymo63784a52014-05-28 10:46:14 -07001697} // namespace chromeos_update_manager