blob: 05a5e4b1c4ebfa4a5e5d8cce31a05550874c7827 [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 Deymo509dd532015-06-10 14:11:05 -070025#include <chromeos/message_loops/fake_message_loop.h>
Alex Deymo0d11c602014-04-23 20:12:20 -070026#include <gtest/gtest.h>
27
28#include "update_engine/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));
Gilad Arnoldbfc44f72014-07-09 14:41:39 -070094 fake_state_.system_provider()->var_is_boot_device_removable()->reset(
95 new bool(false));
Gilad Arnold0adbc942014-05-12 10:35:43 -070096
97 // Connection is wifi, untethered.
98 fake_state_.shill_provider()->var_conn_type()->
99 reset(new ConnectionType(ConnectionType::kWifi));
100 fake_state_.shill_provider()->var_conn_tethering()->
101 reset(new ConnectionTethering(ConnectionTethering::kNotDetected));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700102 }
103
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700104 // Sets up a default device policy that does not impose any restrictions
105 // (HTTP) nor enables any features (P2P).
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700106 void SetUpDefaultDevicePolicy() {
107 fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
108 new bool(true));
109 fake_state_.device_policy_provider()->var_update_disabled()->reset(
110 new bool(false));
111 fake_state_.device_policy_provider()->
112 var_allowed_connection_types_for_update()->reset(nullptr);
113 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
114 new TimeDelta());
115 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700116 new bool(true));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700117 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
118 new bool(false));
119 fake_state_.device_policy_provider()->var_release_channel_delegated()->
120 reset(new bool(true));
121 }
122
123 // Configures the UpdateCheckAllowed policy to return a desired value by
124 // faking the current wall clock time as needed. Restores the default state.
125 // This is used when testing policies that depend on this one.
126 void SetUpdateCheckAllowed(bool allow_check) {
127 Time next_update_check;
128 ExpectPolicyStatus(EvalStatus::kSucceeded,
129 &ChromeOSPolicy::NextUpdateCheckTime,
130 &next_update_check);
131 SetUpDefaultState();
132 SetUpDefaultDevicePolicy();
133 Time curr_time = next_update_check;
134 if (allow_check)
135 curr_time += TimeDelta::FromSeconds(1);
136 else
137 curr_time -= TimeDelta::FromSeconds(1);
138 fake_clock_.SetWallclockTime(curr_time);
139 }
140
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700141 // Returns a default UpdateState structure:
142 UpdateState GetDefaultUpdateState(TimeDelta first_seen_period) {
143 Time first_seen_time = fake_clock_.GetWallclockTime() - first_seen_period;
144 UpdateState update_state = UpdateState();
145
146 // This is a non-interactive check returning a delta payload, seen for the
147 // first time (|first_seen_period| ago). Clearly, there were no failed
148 // attempts so far.
149 update_state.is_interactive = false;
150 update_state.is_delta_payload = false;
151 update_state.first_seen = first_seen_time;
152 update_state.num_checks = 1;
153 update_state.num_failures = 0;
154 update_state.failures_last_updated = Time(); // Needs to be zero.
155 // There's a single HTTP download URL with a maximum of 10 retries.
156 update_state.download_urls = vector<string>{"http://fake/url/"};
157 update_state.download_errors_max = 10;
158 // Download was never attempted.
159 update_state.last_download_url_idx = -1;
160 update_state.last_download_url_num_errors = 0;
161 // There were no download errors.
162 update_state.download_errors = vector<tuple<int, ErrorCode, Time>>();
Gilad Arnold78ecbfc2014-10-22 14:38:25 -0700163 // P2P is not disabled by Omaha.
164 update_state.p2p_downloading_disabled = false;
165 update_state.p2p_sharing_disabled = false;
Gilad Arnold349ac832014-10-06 14:20:28 -0700166 // P2P was not attempted.
167 update_state.p2p_num_attempts = 0;
168 update_state.p2p_first_attempted = Time();
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700169 // No active backoff period, backoff is not disabled by Omaha.
170 update_state.backoff_expiry = Time();
171 update_state.is_backoff_disabled = false;
172 // There is no active scattering wait period (max 7 days allowed) nor check
173 // threshold (none allowed).
174 update_state.scatter_wait_period = TimeDelta();
175 update_state.scatter_check_threshold = 0;
176 update_state.scatter_wait_period_max = TimeDelta::FromDays(7);
177 update_state.scatter_check_threshold_min = 0;
178 update_state.scatter_check_threshold_max = 0;
179
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700180 return update_state;
Alex Deymo0d11c602014-04-23 20:12:20 -0700181 }
182
183 // Runs the passed |policy_method| policy and expects it to return the
184 // |expected| return value.
185 template<typename T, typename R, typename... Args>
186 void ExpectPolicyStatus(
187 EvalStatus expected,
188 T policy_method,
189 R* result, Args... args) {
190 string error = "<None>";
191 eval_ctx_->ResetEvaluation();
192 EXPECT_EQ(expected,
Alex Vakulenko9c155d22014-12-10 12:52:31 -0800193 (policy_.*policy_method)(eval_ctx_.get(), &fake_state_, &error,
194 result, args...))
Alex Deymoc850b4f2014-05-19 11:06:41 -0700195 << "Returned error: " << error
196 << "\nEvaluation context: " << eval_ctx_->DumpContext();
Alex Deymo0d11c602014-04-23 20:12:20 -0700197 }
198
Alex Deymo509dd532015-06-10 14:11:05 -0700199 chromeos::FakeMessageLoop loop_{nullptr};
Alex Deymo0d11c602014-04-23 20:12:20 -0700200 FakeClock fake_clock_;
201 FakeState fake_state_;
202 scoped_refptr<EvaluationContext> eval_ctx_;
203 ChromeOSPolicy policy_; // ChromeOSPolicy under test.
204};
205
Alex Deymo63784a52014-05-28 10:46:14 -0700206TEST_F(UmChromeOSPolicyTest, FirstCheckIsAtMostInitialIntervalAfterStart) {
Alex Deymo0d11c602014-04-23 20:12:20 -0700207 Time next_update_check;
208
Gilad Arnold38b14022014-07-09 12:45:56 -0700209 // Set the last update time so it'll appear as if this is a first update check
210 // in the lifetime of the current updater.
211 fake_state_.updater_provider()->var_last_checked_time()->reset(
212 new Time(fake_clock_.GetWallclockTime() - TimeDelta::FromMinutes(10)));
213
Alex Deymo0d11c602014-04-23 20:12:20 -0700214 ExpectPolicyStatus(EvalStatus::kSucceeded,
215 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
216
217 EXPECT_LE(fake_clock_.GetWallclockTime(), next_update_check);
Gilad Arnold38b14022014-07-09 12:45:56 -0700218 EXPECT_GE(
219 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
220 ChromeOSPolicy::kTimeoutInitialInterval +
221 ChromeOSPolicy::kTimeoutRegularFuzz / 2),
222 next_update_check);
223}
224
225TEST_F(UmChromeOSPolicyTest, RecurringCheckBaseIntervalAndFuzz) {
226 // Ensure that we're using the correct interval (kPeriodicInterval) and fuzz
227 // (kTimeoutRegularFuzz) as base values for period updates.
228 Time next_update_check;
229
230 ExpectPolicyStatus(EvalStatus::kSucceeded,
231 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
232
233 EXPECT_LE(
234 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
235 ChromeOSPolicy::kTimeoutPeriodicInterval -
236 ChromeOSPolicy::kTimeoutRegularFuzz / 2),
237 next_update_check);
238 EXPECT_GE(
239 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
240 ChromeOSPolicy::kTimeoutPeriodicInterval +
241 ChromeOSPolicy::kTimeoutRegularFuzz / 2),
242 next_update_check);
243}
244
245TEST_F(UmChromeOSPolicyTest, RecurringCheckBackoffIntervalAndFuzz) {
246 // Ensure that we're properly backing off and fuzzing in the presence of
247 // failed updates attempts.
248 Time next_update_check;
249
250 fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700251 reset(new unsigned int{2});
Gilad Arnold38b14022014-07-09 12:45:56 -0700252
253 ExpectPolicyStatus(EvalStatus::kSucceeded,
254 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
255
256 int expected_interval = ChromeOSPolicy::kTimeoutPeriodicInterval * 4;
257 EXPECT_LE(
258 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
259 expected_interval - expected_interval / 2),
260 next_update_check);
261 EXPECT_GE(
262 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
263 expected_interval + expected_interval / 2),
264 next_update_check);
Alex Deymo0d11c602014-04-23 20:12:20 -0700265}
266
Gilad Arnolda0258a52014-07-10 16:21:19 -0700267TEST_F(UmChromeOSPolicyTest, RecurringCheckServerDictatedPollInterval) {
268 // Policy honors the server provided check poll interval.
269 Time next_update_check;
270
271 const unsigned int kInterval = ChromeOSPolicy::kTimeoutPeriodicInterval * 4;
272 fake_state_.updater_provider()->var_server_dictated_poll_interval()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700273 reset(new unsigned int{kInterval});
Gilad Arnolda0258a52014-07-10 16:21:19 -0700274 // We should not be backing off in this case.
275 fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700276 reset(new unsigned int{2});
Gilad Arnolda0258a52014-07-10 16:21:19 -0700277
278 ExpectPolicyStatus(EvalStatus::kSucceeded,
279 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
280
281 EXPECT_LE(
282 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
283 kInterval - kInterval / 2),
284 next_update_check);
285 EXPECT_GE(
286 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
287 kInterval + kInterval / 2),
288 next_update_check);
289}
290
Alex Deymo63784a52014-05-28 10:46:14 -0700291TEST_F(UmChromeOSPolicyTest, ExponentialBackoffIsCapped) {
Alex Deymo0d11c602014-04-23 20:12:20 -0700292 Time next_update_check;
293
Alex Deymo0d11c602014-04-23 20:12:20 -0700294 fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700295 reset(new unsigned int{100});
Gilad Arnold38b14022014-07-09 12:45:56 -0700296
Alex Deymo0d11c602014-04-23 20:12:20 -0700297 ExpectPolicyStatus(EvalStatus::kSucceeded,
298 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
299
Gilad Arnold38b14022014-07-09 12:45:56 -0700300 EXPECT_LE(
301 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
302 ChromeOSPolicy::kTimeoutMaxBackoffInterval -
303 ChromeOSPolicy::kTimeoutMaxBackoffInterval / 2),
304 next_update_check);
305 EXPECT_GE(
306 fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
307 ChromeOSPolicy::kTimeoutMaxBackoffInterval +
308 ChromeOSPolicy::kTimeoutMaxBackoffInterval /2),
309 next_update_check);
Alex Deymo0d11c602014-04-23 20:12:20 -0700310}
311
Alex Deymo63784a52014-05-28 10:46:14 -0700312TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWaitsForTheTimeout) {
Alex Deymo0d11c602014-04-23 20:12:20 -0700313 // We get the next update_check timestamp from the policy's private method
314 // and then we check the public method respects that value on the normal
315 // case.
316 Time next_update_check;
317 Time last_checked_time =
318 fake_clock_.GetWallclockTime() + TimeDelta::FromMinutes(1234);
319
Alex Deymo0d11c602014-04-23 20:12:20 -0700320 fake_state_.updater_provider()->var_last_checked_time()->reset(
321 new Time(last_checked_time));
322 ExpectPolicyStatus(EvalStatus::kSucceeded,
323 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
324
325 UpdateCheckParams result;
326
327 // Check that the policy blocks until the next_update_check is reached.
328 SetUpDefaultClock();
329 SetUpDefaultState();
330 fake_state_.updater_provider()->var_last_checked_time()->reset(
331 new Time(last_checked_time));
332 fake_clock_.SetWallclockTime(next_update_check - TimeDelta::FromSeconds(1));
333 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
334 &Policy::UpdateCheckAllowed, &result);
335
336 SetUpDefaultClock();
337 SetUpDefaultState();
338 fake_state_.updater_provider()->var_last_checked_time()->reset(
339 new Time(last_checked_time));
340 fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
341 ExpectPolicyStatus(EvalStatus::kSucceeded,
342 &Policy::UpdateCheckAllowed, &result);
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700343 EXPECT_TRUE(result.updates_enabled);
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700344 EXPECT_FALSE(result.is_interactive);
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700345}
346
347TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWaitsForOOBE) {
Alex Vakulenko072359c2014-07-18 11:41:07 -0700348 // Update checks are deferred until OOBE is completed.
Gilad Arnolda1eabcd2014-07-09 15:42:40 -0700349
350 // Ensure that update is not allowed even if wait period is satisfied.
351 Time next_update_check;
352 Time last_checked_time =
353 fake_clock_.GetWallclockTime() + TimeDelta::FromMinutes(1234);
354
355 fake_state_.updater_provider()->var_last_checked_time()->reset(
356 new Time(last_checked_time));
357 ExpectPolicyStatus(EvalStatus::kSucceeded,
358 &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
359
360 SetUpDefaultClock();
361 SetUpDefaultState();
362 fake_state_.updater_provider()->var_last_checked_time()->reset(
363 new Time(last_checked_time));
364 fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
365 fake_state_.system_provider()->var_is_oobe_complete()->reset(
366 new bool(false));
367
368 UpdateCheckParams result;
369 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
370 &Policy::UpdateCheckAllowed, &result);
371
372 // Now check that it is allowed if OOBE is completed.
373 SetUpDefaultClock();
374 SetUpDefaultState();
375 fake_state_.updater_provider()->var_last_checked_time()->reset(
376 new Time(last_checked_time));
377 fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
378 ExpectPolicyStatus(EvalStatus::kSucceeded,
379 &Policy::UpdateCheckAllowed, &result);
380 EXPECT_TRUE(result.updates_enabled);
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700381 EXPECT_FALSE(result.is_interactive);
Alex Deymo0d11c602014-04-23 20:12:20 -0700382}
383
Gilad Arnold42f253b2014-06-25 12:39:17 -0700384TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWithAttributes) {
Alex Vakulenko072359c2014-07-18 11:41:07 -0700385 // Update check is allowed, response includes attributes for use in the
Gilad Arnold42f253b2014-06-25 12:39:17 -0700386 // request.
387 SetUpdateCheckAllowed(true);
388
389 // Override specific device policy attributes.
Gilad Arnoldd4b30322014-07-21 15:35:27 -0700390 fake_state_.device_policy_provider()->var_target_version_prefix()->
391 reset(new string("1.2"));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700392 fake_state_.device_policy_provider()->var_release_channel_delegated()->
393 reset(new bool(false));
394 fake_state_.device_policy_provider()->var_release_channel()->
395 reset(new string("foo-channel"));
396
397 UpdateCheckParams result;
398 ExpectPolicyStatus(EvalStatus::kSucceeded,
399 &Policy::UpdateCheckAllowed, &result);
400 EXPECT_TRUE(result.updates_enabled);
Gilad Arnoldd4b30322014-07-21 15:35:27 -0700401 EXPECT_EQ("1.2", result.target_version_prefix);
Gilad Arnold42f253b2014-06-25 12:39:17 -0700402 EXPECT_EQ("foo-channel", result.target_channel);
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700403 EXPECT_FALSE(result.is_interactive);
Gilad Arnold42f253b2014-06-25 12:39:17 -0700404}
405
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700406TEST_F(UmChromeOSPolicyTest,
407 UpdateCheckAllowedUpdatesDisabledForUnofficialBuilds) {
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700408 // UpdateCheckAllowed should return kAskMeAgainLater if this is an unofficial
409 // build; we don't want periodic update checks on developer images.
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700410
411 fake_state_.system_provider()->var_is_official_build()->reset(
412 new bool(false));
413
414 UpdateCheckParams result;
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700415 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700416 &Policy::UpdateCheckAllowed, &result);
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700417}
418
Gilad Arnoldbfc44f72014-07-09 14:41:39 -0700419TEST_F(UmChromeOSPolicyTest,
420 UpdateCheckAllowedUpdatesDisabledForRemovableBootDevice) {
421 // UpdateCheckAllowed should return false (kSucceeded) if the image booted
422 // from a removable device.
423
424 fake_state_.system_provider()->var_is_boot_device_removable()->reset(
425 new bool(true));
426
427 UpdateCheckParams result;
428 ExpectPolicyStatus(EvalStatus::kSucceeded,
429 &Policy::UpdateCheckAllowed, &result);
430 EXPECT_FALSE(result.updates_enabled);
431}
432
Gilad Arnoldfe12a0f2014-07-09 14:26:57 -0700433TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedUpdatesDisabledByPolicy) {
Gilad Arnold42f253b2014-06-25 12:39:17 -0700434 // UpdateCheckAllowed should return kAskMeAgainLater because a device policy
435 // is loaded and prohibits updates.
436
437 SetUpdateCheckAllowed(false);
438 fake_state_.device_policy_provider()->var_update_disabled()->reset(
439 new bool(true));
440
Gilad Arnold42f253b2014-06-25 12:39:17 -0700441 UpdateCheckParams result;
442 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
443 &Policy::UpdateCheckAllowed, &result);
444}
445
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700446TEST_F(UmChromeOSPolicyTest,
447 UpdateCheckAllowedForcedUpdateRequestedInteractive) {
448 // UpdateCheckAllowed should return true because a forced update request was
449 // signaled for an interactive update.
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700450
451 SetUpdateCheckAllowed(true);
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700452 fake_state_.updater_provider()->var_forced_update_requested()->reset(
453 new UpdateRequestStatus(UpdateRequestStatus::kInteractive));
Gilad Arnold44dc3bf2014-07-18 23:39:38 -0700454
455 UpdateCheckParams result;
456 ExpectPolicyStatus(EvalStatus::kSucceeded,
457 &Policy::UpdateCheckAllowed, &result);
458 EXPECT_TRUE(result.updates_enabled);
459 EXPECT_TRUE(result.is_interactive);
460}
461
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700462TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedForcedUpdateRequestedPeriodic) {
463 // UpdateCheckAllowed should return true because a forced update request was
464 // signaled for a periodic check.
465
466 SetUpdateCheckAllowed(true);
467 fake_state_.updater_provider()->var_forced_update_requested()->reset(
468 new UpdateRequestStatus(UpdateRequestStatus::kPeriodic));
469
470 UpdateCheckParams result;
471 ExpectPolicyStatus(EvalStatus::kSucceeded,
472 &Policy::UpdateCheckAllowed, &result);
473 EXPECT_TRUE(result.updates_enabled);
474 EXPECT_FALSE(result.is_interactive);
475}
476
Alex Deymo63784a52014-05-28 10:46:14 -0700477TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsCheckAllowedError) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700478 // The UpdateCanStart policy fails, not being able to query
479 // UpdateCheckAllowed.
480
481 // Configure the UpdateCheckAllowed policy to fail.
482 fake_state_.updater_provider()->var_updater_started_time()->reset(nullptr);
483
484 // Check that the UpdateCanStart fails.
485 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700486 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700487 ExpectPolicyStatus(EvalStatus::kFailed,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700488 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700489}
490
Alex Deymo63784a52014-05-28 10:46:14 -0700491TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedCheckDue) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700492 // The UpdateCanStart policy returns false because we are due for another
Gilad Arnold14a9e702014-10-08 08:09:09 -0700493 // update check. Ensure that download related values are still returned.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700494
495 SetUpdateCheckAllowed(true);
496
497 // Check that the UpdateCanStart returns false.
498 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700499 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700500 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700501 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700502 EXPECT_FALSE(result.update_can_start);
503 EXPECT_EQ(UpdateCannotStartReason::kCheckDue, result.cannot_start_reason);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700504 EXPECT_EQ(0, result.download_url_idx);
505 EXPECT_EQ(0, result.download_url_num_errors);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700506}
507
Alex Deymo63784a52014-05-28 10:46:14 -0700508TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoDevicePolicy) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700509 // The UpdateCanStart policy returns true; no device policy is loaded.
510
511 SetUpdateCheckAllowed(false);
512 fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
513 new bool(false));
514
515 // Check that the UpdateCanStart returns true with no further attributes.
516 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700517 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700518 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700519 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700520 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700521 EXPECT_FALSE(result.p2p_downloading_allowed);
522 EXPECT_FALSE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700523 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700524 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700525 EXPECT_EQ(0, result.download_url_num_errors);
526 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700527}
528
Alex Deymo63784a52014-05-28 10:46:14 -0700529TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBlankPolicy) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700530 // The UpdateCanStart policy returns true; device policy is loaded but imposes
531 // no restrictions on updating.
532
533 SetUpdateCheckAllowed(false);
534
535 // Check that the UpdateCanStart returns true.
536 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700537 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700538 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700539 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700540 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700541 EXPECT_FALSE(result.p2p_downloading_allowed);
542 EXPECT_FALSE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700543 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700544 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700545 EXPECT_EQ(0, result.download_url_num_errors);
546 EXPECT_FALSE(result.do_increment_failures);
547}
548
549TEST_F(UmChromeOSPolicyTest,
550 UpdateCanStartNotAllowedBackoffNewWaitPeriodApplies) {
551 // The UpdateCanStart policy returns false; failures are reported and a new
552 // backoff period is enacted.
553
554 SetUpdateCheckAllowed(false);
555
556 const Time curr_time = fake_clock_.GetWallclockTime();
557 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
558 update_state.download_errors_max = 1;
559 update_state.download_errors.emplace_back(
560 0, ErrorCode::kDownloadTransferError,
561 curr_time - TimeDelta::FromSeconds(8));
562 update_state.download_errors.emplace_back(
563 0, ErrorCode::kDownloadTransferError,
564 curr_time - TimeDelta::FromSeconds(2));
565
566 // Check that UpdateCanStart returns false and a new backoff expiry is
567 // generated.
568 UpdateDownloadParams result;
569 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
570 update_state);
571 EXPECT_FALSE(result.update_can_start);
572 EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
573 EXPECT_TRUE(result.do_increment_failures);
574 EXPECT_LT(curr_time, result.backoff_expiry);
575}
576
577TEST_F(UmChromeOSPolicyTest,
578 UpdateCanStartNotAllowedBackoffPrevWaitPeriodStillApplies) {
579 // The UpdateCanStart policy returns false; a previously enacted backoff
580 // period still applies.
581
582 SetUpdateCheckAllowed(false);
583
584 const Time curr_time = fake_clock_.GetWallclockTime();
585 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
586 update_state.download_errors_max = 1;
587 update_state.download_errors.emplace_back(
588 0, ErrorCode::kDownloadTransferError,
589 curr_time - TimeDelta::FromSeconds(8));
590 update_state.download_errors.emplace_back(
591 0, ErrorCode::kDownloadTransferError,
592 curr_time - TimeDelta::FromSeconds(2));
593 update_state.failures_last_updated = curr_time;
594 update_state.backoff_expiry = curr_time + TimeDelta::FromMinutes(3);
595
596 // Check that UpdateCanStart returns false and a new backoff expiry is
597 // generated.
598 UpdateDownloadParams result;
599 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::UpdateCanStart,
600 &result, update_state);
601 EXPECT_FALSE(result.update_can_start);
602 EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
603 EXPECT_FALSE(result.do_increment_failures);
604 EXPECT_LT(curr_time, result.backoff_expiry);
605}
606
607TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffSatisfied) {
608 // The UpdateCanStart policy returns true; a previously enacted backoff period
609 // has elapsed, we're good to go.
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 update_state.failures_last_updated = curr_time - TimeDelta::FromSeconds(1);
623 update_state.backoff_expiry = curr_time - TimeDelta::FromSeconds(1);
624
625 // Check that UpdateCanStart returns false and a new backoff expiry is
626 // generated.
627 UpdateDownloadParams result;
628 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart,
629 &result, update_state);
630 EXPECT_TRUE(result.update_can_start);
631 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
632 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700633 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700634 EXPECT_EQ(0, result.download_url_num_errors);
635 EXPECT_FALSE(result.do_increment_failures);
636 EXPECT_EQ(Time(), result.backoff_expiry);
637}
638
639TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffDisabled) {
640 // The UpdateCanStart policy returns false; failures are reported but backoff
641 // is disabled.
642
643 SetUpdateCheckAllowed(false);
644
645 const Time curr_time = fake_clock_.GetWallclockTime();
646 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
647 update_state.download_errors_max = 1;
648 update_state.download_errors.emplace_back(
649 0, ErrorCode::kDownloadTransferError,
650 curr_time - TimeDelta::FromSeconds(8));
651 update_state.download_errors.emplace_back(
652 0, ErrorCode::kDownloadTransferError,
653 curr_time - TimeDelta::FromSeconds(2));
654 update_state.is_backoff_disabled = true;
655
656 // Check that UpdateCanStart returns false and a new backoff expiry is
657 // generated.
658 UpdateDownloadParams result;
659 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
660 update_state);
661 EXPECT_TRUE(result.update_can_start);
662 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
663 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700664 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700665 EXPECT_EQ(0, result.download_url_num_errors);
666 EXPECT_TRUE(result.do_increment_failures);
667 EXPECT_EQ(Time(), result.backoff_expiry);
668}
669
670TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffInteractive) {
671 // The UpdateCanStart policy returns false; failures are reported but this is
672 // an interactive update check.
673
674 SetUpdateCheckAllowed(false);
675
676 const Time curr_time = fake_clock_.GetWallclockTime();
677 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
678 update_state.download_errors_max = 1;
679 update_state.download_errors.emplace_back(
680 0, ErrorCode::kDownloadTransferError,
681 curr_time - TimeDelta::FromSeconds(8));
682 update_state.download_errors.emplace_back(
683 0, ErrorCode::kDownloadTransferError,
684 curr_time - TimeDelta::FromSeconds(2));
685 update_state.is_interactive = true;
686
687 // Check that UpdateCanStart returns false and a new backoff expiry is
688 // generated.
689 UpdateDownloadParams result;
690 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
691 update_state);
692 EXPECT_TRUE(result.update_can_start);
693 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
694 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700695 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700696 EXPECT_EQ(0, result.download_url_num_errors);
697 EXPECT_TRUE(result.do_increment_failures);
698 EXPECT_EQ(Time(), result.backoff_expiry);
699}
700
701TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffDelta) {
702 // The UpdateCanStart policy returns false; failures are reported but this is
703 // a delta payload.
704
705 SetUpdateCheckAllowed(false);
706
707 const Time curr_time = fake_clock_.GetWallclockTime();
708 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
709 update_state.download_errors_max = 1;
710 update_state.download_errors.emplace_back(
711 0, ErrorCode::kDownloadTransferError,
712 curr_time - TimeDelta::FromSeconds(8));
713 update_state.download_errors.emplace_back(
714 0, ErrorCode::kDownloadTransferError,
715 curr_time - TimeDelta::FromSeconds(2));
716 update_state.is_delta_payload = true;
717
718 // Check that UpdateCanStart returns false and a new backoff expiry is
719 // generated.
720 UpdateDownloadParams result;
721 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
722 update_state);
723 EXPECT_TRUE(result.update_can_start);
724 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
725 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700726 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700727 EXPECT_EQ(0, result.download_url_num_errors);
728 EXPECT_TRUE(result.do_increment_failures);
729 EXPECT_EQ(Time(), result.backoff_expiry);
730}
731
732TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffUnofficialBuild) {
733 // The UpdateCanStart policy returns false; failures are reported but this is
734 // an unofficial build.
735
736 SetUpdateCheckAllowed(false);
737
738 const Time curr_time = fake_clock_.GetWallclockTime();
739 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
740 update_state.download_errors_max = 1;
741 update_state.download_errors.emplace_back(
742 0, ErrorCode::kDownloadTransferError,
743 curr_time - TimeDelta::FromSeconds(8));
744 update_state.download_errors.emplace_back(
745 0, ErrorCode::kDownloadTransferError,
746 curr_time - TimeDelta::FromSeconds(2));
747
748 fake_state_.system_provider()->var_is_official_build()->
749 reset(new bool(false));
750
751 // Check that UpdateCanStart returns false and a new backoff expiry is
752 // generated.
753 UpdateDownloadParams result;
754 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
755 update_state);
756 EXPECT_TRUE(result.update_can_start);
757 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
758 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700759 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700760 EXPECT_EQ(0, result.download_url_num_errors);
761 EXPECT_TRUE(result.do_increment_failures);
762 EXPECT_EQ(Time(), result.backoff_expiry);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700763}
764
Alex Deymo63784a52014-05-28 10:46:14 -0700765TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsScatteringFailed) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700766 // The UpdateCanStart policy fails because the UpdateScattering policy it
767 // depends on fails (unset variable).
768
769 SetUpdateCheckAllowed(false);
770
771 // Override the default seed variable with a null value so that the policy
772 // request would fail.
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700773 // TODO(garnold) This failure may or may not fail a number
774 // sub-policies/decisions, like scattering and backoff. We'll need a more
775 // deliberate setup to ensure that we're failing what we want to be failing.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700776 fake_state_.random_provider()->var_seed()->reset(nullptr);
777
778 // Check that the UpdateCanStart fails.
779 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700780 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700781 ExpectPolicyStatus(EvalStatus::kFailed,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700782 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700783}
784
Alex Deymo63784a52014-05-28 10:46:14 -0700785TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700786 UpdateCanStartNotAllowedScatteringNewWaitPeriodApplies) {
787 // The UpdateCanStart policy returns false; device policy is loaded and
788 // scattering applies due to an unsatisfied wait period, which was newly
789 // generated.
790
791 SetUpdateCheckAllowed(false);
792 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
793 new TimeDelta(TimeDelta::FromMinutes(2)));
794
795
796 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
797
798 // Check that the UpdateCanStart returns false and a new wait period
799 // generated.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700800 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700801 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700802 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700803 EXPECT_FALSE(result.update_can_start);
804 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
805 EXPECT_LT(TimeDelta(), result.scatter_wait_period);
806 EXPECT_EQ(0, result.scatter_check_threshold);
807}
808
Alex Deymo63784a52014-05-28 10:46:14 -0700809TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700810 UpdateCanStartNotAllowedScatteringPrevWaitPeriodStillApplies) {
811 // The UpdateCanStart policy returns false w/ kAskMeAgainLater; device policy
812 // is loaded and a previously generated scattering period still applies, none
813 // of the scattering values has changed.
814
815 SetUpdateCheckAllowed(false);
816 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
817 new TimeDelta(TimeDelta::FromMinutes(2)));
818
819 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
820 update_state.scatter_wait_period = TimeDelta::FromSeconds(35);
821
822 // Check that the UpdateCanStart returns false and a new wait period
823 // generated.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700824 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700825 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::UpdateCanStart,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700826 &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700827 EXPECT_FALSE(result.update_can_start);
828 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
829 EXPECT_EQ(TimeDelta::FromSeconds(35), result.scatter_wait_period);
830 EXPECT_EQ(0, result.scatter_check_threshold);
831}
832
Alex Deymo63784a52014-05-28 10:46:14 -0700833TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700834 UpdateCanStartNotAllowedScatteringNewCountThresholdApplies) {
835 // The UpdateCanStart policy returns false; device policy is loaded and
836 // scattering applies due to an unsatisfied update check count threshold.
837 //
838 // This ensures a non-zero check threshold, which may or may not be combined
839 // with a non-zero wait period (for which we cannot reliably control).
840
841 SetUpdateCheckAllowed(false);
842 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
843 new TimeDelta(TimeDelta::FromSeconds(1)));
844
845 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
846 update_state.scatter_check_threshold_min = 2;
847 update_state.scatter_check_threshold_max = 5;
848
849 // Check that the UpdateCanStart returns false.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700850 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700851 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700852 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700853 EXPECT_FALSE(result.update_can_start);
854 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
855 EXPECT_LE(2, result.scatter_check_threshold);
856 EXPECT_GE(5, result.scatter_check_threshold);
857}
858
Alex Deymo63784a52014-05-28 10:46:14 -0700859TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700860 UpdateCanStartNotAllowedScatteringPrevCountThresholdStillApplies) {
861 // The UpdateCanStart policy returns false; device policy is loaded and
862 // scattering due to a previously generated count threshold still applies.
863
864 SetUpdateCheckAllowed(false);
865 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
866 new TimeDelta(TimeDelta::FromSeconds(1)));
867
868 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
869 update_state.scatter_check_threshold = 3;
870 update_state.scatter_check_threshold_min = 2;
871 update_state.scatter_check_threshold_max = 5;
872
873 // Check that the UpdateCanStart returns false.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700874 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700875 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700876 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700877 EXPECT_FALSE(result.update_can_start);
878 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
879 EXPECT_EQ(3, result.scatter_check_threshold);
880}
881
Alex Deymo63784a52014-05-28 10:46:14 -0700882TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedScatteringSatisfied) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700883 // The UpdateCanStart policy returns true; device policy is loaded and
884 // scattering is enabled, but both wait period and check threshold are
885 // satisfied.
886
887 SetUpdateCheckAllowed(false);
888 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
889 new TimeDelta(TimeDelta::FromSeconds(120)));
890
891 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(75));
892 update_state.num_checks = 4;
893 update_state.scatter_wait_period = TimeDelta::FromSeconds(60);
894 update_state.scatter_check_threshold = 3;
895 update_state.scatter_check_threshold_min = 2;
896 update_state.scatter_check_threshold_max = 5;
897
898 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700899 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700900 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700901 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700902 EXPECT_TRUE(result.update_can_start);
903 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
904 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700905 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700906 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700907 EXPECT_EQ(0, result.download_url_num_errors);
908 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700909}
910
Alex Deymo63784a52014-05-28 10:46:14 -0700911TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700912 UpdateCanStartAllowedInteractivePreventsScattering) {
913 // The UpdateCanStart policy returns true; device policy is loaded and
914 // scattering would have applied, except that the update check is interactive
915 // and so it is suppressed.
916
917 SetUpdateCheckAllowed(false);
918 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
919 new TimeDelta(TimeDelta::FromSeconds(1)));
920
921 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700922 update_state.is_interactive = true;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700923 update_state.scatter_check_threshold = 0;
924 update_state.scatter_check_threshold_min = 2;
925 update_state.scatter_check_threshold_max = 5;
926
927 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700928 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700929 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700930 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700931 EXPECT_TRUE(result.update_can_start);
932 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
933 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700934 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700935 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700936 EXPECT_EQ(0, result.download_url_num_errors);
937 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700938}
939
Alex Deymo63784a52014-05-28 10:46:14 -0700940TEST_F(UmChromeOSPolicyTest,
Gilad Arnold76a11f62014-05-20 09:02:12 -0700941 UpdateCanStartAllowedOobePreventsScattering) {
942 // The UpdateCanStart policy returns true; device policy is loaded and
943 // scattering would have applied, except that OOBE was not completed and so it
944 // is suppressed.
945
946 SetUpdateCheckAllowed(false);
947 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
948 new TimeDelta(TimeDelta::FromSeconds(1)));
949 fake_state_.system_provider()->var_is_oobe_complete()->reset(new bool(false));
950
951 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700952 update_state.is_interactive = true;
Gilad Arnold76a11f62014-05-20 09:02:12 -0700953 update_state.scatter_check_threshold = 0;
954 update_state.scatter_check_threshold_min = 2;
955 update_state.scatter_check_threshold_max = 5;
956
957 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700958 UpdateDownloadParams result;
Gilad Arnold76a11f62014-05-20 09:02:12 -0700959 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700960 update_state);
Gilad Arnold76a11f62014-05-20 09:02:12 -0700961 EXPECT_TRUE(result.update_can_start);
962 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
963 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700964 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700965 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700966 EXPECT_EQ(0, result.download_url_num_errors);
967 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnold76a11f62014-05-20 09:02:12 -0700968}
969
Alex Deymo63784a52014-05-28 10:46:14 -0700970TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithAttributes) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700971 // The UpdateCanStart policy returns true; device policy permits both HTTP and
972 // P2P updates, as well as a non-empty target channel string.
973
974 SetUpdateCheckAllowed(false);
975
976 // Override specific device policy attributes.
977 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
978 new bool(true));
979 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
980 new bool(true));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700981
982 // Check that the UpdateCanStart returns true.
983 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700984 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700985 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700986 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700987 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700988 EXPECT_TRUE(result.p2p_downloading_allowed);
989 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700990 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700991 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700992 EXPECT_EQ(0, result.download_url_num_errors);
993 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700994}
995
Alex Deymo63784a52014-05-28 10:46:14 -0700996TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithP2PFromUpdater) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700997 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
998 // P2P updates, but the updater is configured to allow P2P and overrules the
999 // setting.
1000
1001 SetUpdateCheckAllowed(false);
1002
1003 // Override specific device policy attributes.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001004 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1005
1006 // Check that the UpdateCanStart returns true.
1007 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001008 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001009 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001010 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001011 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001012 EXPECT_TRUE(result.p2p_downloading_allowed);
1013 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001014 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001015 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001016 EXPECT_EQ(0, result.download_url_num_errors);
1017 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001018}
1019
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001020TEST_F(UmChromeOSPolicyTest,
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001021 UpdateCanStartAllowedP2PDownloadingBlockedDueToOmaha) {
1022 // The UpdateCanStart policy returns true; device policy permits HTTP, but
1023 // policy blocks P2P downloading because Omaha forbids it. P2P sharing is
1024 // still permitted.
1025
1026 SetUpdateCheckAllowed(false);
1027
1028 // Override specific device policy attributes.
1029 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1030 new bool(true));
1031 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1032 new bool(true));
1033
1034 // Check that the UpdateCanStart returns true.
1035 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1036 update_state.p2p_downloading_disabled = true;
1037 UpdateDownloadParams result;
1038 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1039 update_state);
1040 EXPECT_TRUE(result.update_can_start);
1041 EXPECT_FALSE(result.p2p_downloading_allowed);
1042 EXPECT_TRUE(result.p2p_sharing_allowed);
1043}
1044
1045TEST_F(UmChromeOSPolicyTest,
1046 UpdateCanStartAllowedP2PSharingBlockedDueToOmaha) {
1047 // The UpdateCanStart policy returns true; device policy permits HTTP, but
1048 // policy blocks P2P sharing because Omaha forbids it. P2P downloading is
1049 // still permitted.
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));
1058
1059 // Check that the UpdateCanStart returns true.
1060 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1061 update_state.p2p_sharing_disabled = true;
1062 UpdateDownloadParams result;
1063 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1064 update_state);
1065 EXPECT_TRUE(result.update_can_start);
1066 EXPECT_TRUE(result.p2p_downloading_allowed);
1067 EXPECT_FALSE(result.p2p_sharing_allowed);
1068}
1069
1070TEST_F(UmChromeOSPolicyTest,
1071 UpdateCanStartAllowedP2PDownloadingBlockedDueToNumAttempts) {
Gilad Arnold349ac832014-10-06 14:20:28 -07001072 // The UpdateCanStart policy returns true; device policy permits HTTP but
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001073 // blocks P2P download, because the max number of P2P downloads have been
1074 // attempted. P2P sharing is still permitted.
Gilad Arnold349ac832014-10-06 14:20:28 -07001075
1076 SetUpdateCheckAllowed(false);
1077
1078 // Override specific device policy attributes.
1079 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1080 new bool(true));
1081 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1082 new bool(true));
1083
1084 // Check that the UpdateCanStart returns true.
1085 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1086 update_state.p2p_num_attempts = ChromeOSPolicy::kMaxP2PAttempts;
1087 UpdateDownloadParams result;
1088 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1089 update_state);
1090 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001091 EXPECT_FALSE(result.p2p_downloading_allowed);
1092 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnold349ac832014-10-06 14:20:28 -07001093}
1094
1095TEST_F(UmChromeOSPolicyTest,
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001096 UpdateCanStartAllowedP2PDownloadingBlockedDueToAttemptsPeriod) {
Gilad Arnold349ac832014-10-06 14:20:28 -07001097 // The UpdateCanStart policy returns true; device policy permits HTTP but
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001098 // blocks P2P download, because the max period for attempt to download via P2P
1099 // has elapsed. P2P sharing is still permitted.
Gilad Arnold349ac832014-10-06 14:20:28 -07001100
1101 SetUpdateCheckAllowed(false);
1102
1103 // Override specific device policy attributes.
1104 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1105 new bool(true));
1106 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1107 new bool(true));
1108
1109 // Check that the UpdateCanStart returns true.
1110 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1111 update_state.p2p_num_attempts = 1;
1112 update_state.p2p_first_attempted =
1113 fake_clock_.GetWallclockTime() -
Alex Deymof329b932014-10-30 01:37:48 -07001114 TimeDelta::FromSeconds(
1115 ChromeOSPolicy::kMaxP2PAttemptsPeriodInSeconds + 1);
Gilad Arnold349ac832014-10-06 14:20:28 -07001116 UpdateDownloadParams result;
1117 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1118 update_state);
1119 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001120 EXPECT_FALSE(result.p2p_downloading_allowed);
1121 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnold349ac832014-10-06 14:20:28 -07001122}
1123
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001124TEST_F(UmChromeOSPolicyTest,
1125 UpdateCanStartAllowedWithHttpUrlForUnofficialBuild) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001126 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1127 // P2P updates, but marking this an unofficial build overrules the HTTP
1128 // setting.
1129
1130 SetUpdateCheckAllowed(false);
1131
1132 // Override specific device policy attributes.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001133 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1134 new bool(false));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001135 fake_state_.system_provider()->var_is_official_build()->
1136 reset(new bool(false));
1137
1138 // Check that the UpdateCanStart returns true.
1139 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001140 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001141 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001142 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001143 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001144 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001145 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001146 EXPECT_EQ(0, result.download_url_num_errors);
1147 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001148}
1149
1150TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithHttpsUrl) {
1151 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1152 // P2P updates, but an HTTPS URL is provided and selected for download.
1153
1154 SetUpdateCheckAllowed(false);
1155
1156 // Override specific device policy attributes.
1157 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1158 new bool(false));
1159
1160 // Add an HTTPS URL.
1161 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001162 update_state.download_urls.emplace_back("https://secure/url/");
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001163
1164 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001165 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001166 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001167 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001168 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001169 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001170 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001171 EXPECT_EQ(0, result.download_url_num_errors);
1172 EXPECT_FALSE(result.do_increment_failures);
1173}
1174
1175TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedMaxErrorsNotExceeded) {
1176 // The UpdateCanStart policy returns true; the first URL has download errors
1177 // but does not exceed the maximum allowed number of failures, so it is stilli
1178 // usable.
1179
1180 SetUpdateCheckAllowed(false);
1181
1182 // Add a second URL; update with this URL attempted and failed enough times to
1183 // disqualify the current (first) URL.
1184 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1185 update_state.num_checks = 5;
1186 update_state.download_urls.emplace_back("http://another/fake/url/");
1187 Time t = fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(12);
1188 for (int i = 0; i < 5; i++) {
1189 update_state.download_errors.emplace_back(
1190 0, ErrorCode::kDownloadTransferError, t);
1191 t += TimeDelta::FromSeconds(1);
1192 }
1193
1194 // Check that the UpdateCanStart returns true.
1195 UpdateDownloadParams result;
1196 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1197 update_state);
1198 EXPECT_TRUE(result.update_can_start);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001199 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001200 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001201 EXPECT_EQ(5, result.download_url_num_errors);
1202 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001203}
1204
1205TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlMaxExceeded) {
1206 // The UpdateCanStart policy returns true; the first URL exceeded the maximum
1207 // allowed number of failures, but a second URL is available.
1208
1209 SetUpdateCheckAllowed(false);
1210
1211 // Add a second URL; update with this URL attempted and failed enough times to
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001212 // disqualify the current (first) URL.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001213 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1214 update_state.num_checks = 10;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001215 update_state.download_urls.emplace_back("http://another/fake/url/");
1216 Time t = fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(12);
1217 for (int i = 0; i < 11; i++) {
1218 update_state.download_errors.emplace_back(
1219 0, ErrorCode::kDownloadTransferError, t);
1220 t += TimeDelta::FromSeconds(1);
1221 }
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001222
1223 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001224 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001225 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001226 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001227 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001228 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001229 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001230 EXPECT_EQ(0, result.download_url_num_errors);
1231 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001232}
1233
1234TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlHardError) {
1235 // The UpdateCanStart policy returns true; the first URL fails with a hard
1236 // error, but a second URL is available.
1237
1238 SetUpdateCheckAllowed(false);
1239
1240 // Add a second URL; update with this URL attempted and failed in a way that
1241 // causes it to switch directly to the next URL.
1242 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1243 update_state.num_checks = 10;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001244 update_state.download_urls.emplace_back("http://another/fake/url/");
1245 update_state.download_errors.emplace_back(
1246 0, ErrorCode::kPayloadHashMismatchError,
1247 fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(1));
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001248
1249 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001250 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001251 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001252 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001253 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001254 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001255 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001256 EXPECT_EQ(0, result.download_url_num_errors);
1257 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001258}
1259
1260TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedUrlWrapsAround) {
1261 // The UpdateCanStart policy returns true; URL search properly wraps around
1262 // the last one on the list.
1263
1264 SetUpdateCheckAllowed(false);
1265
1266 // Add a second URL; update with this URL attempted and failed in a way that
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001267 // causes it to switch directly to the next URL. We must disable backoff in
1268 // order for it not to interfere.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001269 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001270 update_state.num_checks = 1;
1271 update_state.is_backoff_disabled = true;
1272 update_state.download_urls.emplace_back("http://another/fake/url/");
1273 update_state.download_errors.emplace_back(
1274 1, ErrorCode::kPayloadHashMismatchError,
1275 fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(1));
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001276
1277 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001278 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001279 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001280 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001281 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001282 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001283 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001284 EXPECT_EQ(0, result.download_url_num_errors);
1285 EXPECT_TRUE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001286}
1287
1288TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedNoUsableUrls) {
1289 // The UpdateCanStart policy returns false; there's a single HTTP URL but its
1290 // use is forbidden by policy.
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001291 //
1292 // Note: In the case where no usable URLs are found, the policy should not
1293 // increment the number of failed attempts! Doing so would result in a
1294 // non-idempotent semantics, and does not fall within the intended purpose of
1295 // the backoff mechanism anyway.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001296
1297 SetUpdateCheckAllowed(false);
1298
1299 // Override specific device policy attributes.
1300 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1301 new bool(false));
1302
1303 // Check that the UpdateCanStart returns false.
1304 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001305 UpdateDownloadParams result;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001306 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1307 update_state);
1308 EXPECT_FALSE(result.update_can_start);
1309 EXPECT_EQ(UpdateCannotStartReason::kCannotDownload,
1310 result.cannot_start_reason);
1311 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001312}
1313
1314TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoUsableUrlsButP2PEnabled) {
1315 // The UpdateCanStart policy returns true; there's a single HTTP URL but its
1316 // use is forbidden by policy, however P2P is enabled. The result indicates
1317 // that no URL can be used.
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001318 //
1319 // Note: The number of failed attempts should not increase in this case (see
1320 // above test).
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001321
1322 SetUpdateCheckAllowed(false);
1323
1324 // Override specific device policy attributes.
1325 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1326 new bool(true));
1327 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1328 new bool(false));
1329
1330 // Check that the UpdateCanStart returns true.
1331 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001332 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001333 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001334 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001335 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001336 EXPECT_TRUE(result.p2p_downloading_allowed);
1337 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001338 EXPECT_GT(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001339 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001340 EXPECT_EQ(0, result.download_url_num_errors);
1341 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001342}
1343
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001344TEST_F(UmChromeOSPolicyTest,
1345 UpdateCanStartAllowedNoUsableUrlsButEnterpriseEnrolled) {
1346 // The UpdateCanStart policy returns true; there's a single HTTP URL but its
1347 // use is forbidden by policy, and P2P is unset on the policy, however the
1348 // device is enterprise-enrolled so P2P is allowed. The result indicates that
1349 // no URL can be used.
1350 //
1351 // Note: The number of failed attempts should not increase in this case (see
1352 // above test).
1353
1354 SetUpdateCheckAllowed(false);
1355
1356 // Override specific device policy attributes.
1357 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(nullptr);
1358 fake_state_.device_policy_provider()->var_owner()->reset(nullptr);
1359 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1360 new bool(false));
1361
1362 // Check that the UpdateCanStart returns true.
1363 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1364 UpdateDownloadParams result;
1365 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1366 update_state);
1367 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001368 EXPECT_TRUE(result.p2p_downloading_allowed);
1369 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001370 EXPECT_GT(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001371 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001372 EXPECT_EQ(0, result.download_url_num_errors);
1373 EXPECT_FALSE(result.do_increment_failures);
1374}
1375
Gilad Arnold684219d2014-07-07 14:54:57 -07001376TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedEthernetDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001377 // Ethernet is always allowed.
1378
1379 fake_state_.shill_provider()->var_conn_type()->
1380 reset(new ConnectionType(ConnectionType::kEthernet));
1381
1382 bool result;
1383 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001384 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001385 EXPECT_TRUE(result);
1386}
1387
Gilad Arnold684219d2014-07-07 14:54:57 -07001388TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWifiDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001389 // Wifi is allowed if not tethered.
1390
1391 fake_state_.shill_provider()->var_conn_type()->
1392 reset(new ConnectionType(ConnectionType::kWifi));
1393
1394 bool result;
1395 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001396 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001397 EXPECT_TRUE(result);
1398}
1399
Alex Deymo63784a52014-05-28 10:46:14 -07001400TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001401 UpdateCurrentConnectionNotAllowedWifiTetheredDefault) {
1402 // Tethered wifi is not allowed by default.
1403
1404 fake_state_.shill_provider()->var_conn_type()->
1405 reset(new ConnectionType(ConnectionType::kWifi));
1406 fake_state_.shill_provider()->var_conn_tethering()->
1407 reset(new ConnectionTethering(ConnectionTethering::kConfirmed));
1408
1409 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001410 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001411 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001412}
1413
Alex Deymo63784a52014-05-28 10:46:14 -07001414TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001415 UpdateDownloadAllowedWifiTetheredPolicyOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001416 // Tethered wifi can be allowed by policy.
1417
1418 fake_state_.shill_provider()->var_conn_type()->
1419 reset(new ConnectionType(ConnectionType::kWifi));
1420 fake_state_.shill_provider()->var_conn_tethering()->
1421 reset(new ConnectionTethering(ConnectionTethering::kConfirmed));
1422 set<ConnectionType> allowed_connections;
1423 allowed_connections.insert(ConnectionType::kCellular);
1424 fake_state_.device_policy_provider()->
1425 var_allowed_connection_types_for_update()->
1426 reset(new set<ConnectionType>(allowed_connections));
1427
1428 bool result;
1429 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001430 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001431 EXPECT_TRUE(result);
1432}
1433
Gilad Arnold684219d2014-07-07 14:54:57 -07001434TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWimaxDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001435 // Wimax is always allowed.
1436
1437 fake_state_.shill_provider()->var_conn_type()->
1438 reset(new ConnectionType(ConnectionType::kWifi));
1439
1440 bool result;
1441 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001442 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001443 EXPECT_TRUE(result);
1444}
1445
Alex Deymo63784a52014-05-28 10:46:14 -07001446TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001447 UpdateCurrentConnectionNotAllowedBluetoothDefault) {
1448 // Bluetooth is never allowed.
1449
1450 fake_state_.shill_provider()->var_conn_type()->
1451 reset(new ConnectionType(ConnectionType::kBluetooth));
1452
1453 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001454 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001455 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001456}
1457
Alex Deymo63784a52014-05-28 10:46:14 -07001458TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001459 UpdateCurrentConnectionNotAllowedBluetoothPolicyCannotOverride) {
1460 // Bluetooth cannot be allowed even by policy.
1461
1462 fake_state_.shill_provider()->var_conn_type()->
1463 reset(new ConnectionType(ConnectionType::kBluetooth));
1464 set<ConnectionType> allowed_connections;
1465 allowed_connections.insert(ConnectionType::kBluetooth);
1466 fake_state_.device_policy_provider()->
1467 var_allowed_connection_types_for_update()->
1468 reset(new set<ConnectionType>(allowed_connections));
1469
1470 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001471 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001472 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001473}
1474
Alex Deymo63784a52014-05-28 10:46:14 -07001475TEST_F(UmChromeOSPolicyTest, UpdateCurrentConnectionNotAllowedCellularDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001476 // Cellular is not allowed by default.
1477
1478 fake_state_.shill_provider()->var_conn_type()->
1479 reset(new ConnectionType(ConnectionType::kCellular));
1480
1481 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001482 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001483 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001484}
1485
Alex Deymo63784a52014-05-28 10:46:14 -07001486TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001487 UpdateDownloadAllowedCellularPolicyOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001488 // Update over cellular can be enabled by policy.
1489
1490 fake_state_.shill_provider()->var_conn_type()->
1491 reset(new ConnectionType(ConnectionType::kCellular));
1492 set<ConnectionType> allowed_connections;
1493 allowed_connections.insert(ConnectionType::kCellular);
1494 fake_state_.device_policy_provider()->
1495 var_allowed_connection_types_for_update()->
1496 reset(new set<ConnectionType>(allowed_connections));
1497
1498 bool result;
1499 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001500 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001501 EXPECT_TRUE(result);
1502}
1503
Alex Deymo63784a52014-05-28 10:46:14 -07001504TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001505 UpdateDownloadAllowedCellularUserOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001506 // Update over cellular can be enabled by user settings, but only if policy
1507 // is present and does not determine allowed connections.
1508
1509 fake_state_.shill_provider()->var_conn_type()->
1510 reset(new ConnectionType(ConnectionType::kCellular));
1511 set<ConnectionType> allowed_connections;
1512 allowed_connections.insert(ConnectionType::kCellular);
1513 fake_state_.updater_provider()->var_cellular_enabled()->
1514 reset(new bool(true));
1515
1516 bool result;
1517 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001518 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001519 EXPECT_TRUE(result);
1520}
1521
Gilad Arnold14a9e702014-10-08 08:09:09 -07001522TEST_F(UmChromeOSPolicyTest,
1523 UpdateCanStartAllowedScatteringSupressedDueToP2P) {
1524 // The UpdateCanStart policy returns true; scattering should have applied, but
1525 // P2P download is allowed. Scattering values are nonetheless returned, and so
1526 // are download URL values, albeit the latter are not allowed to be used.
1527
1528 SetUpdateCheckAllowed(false);
1529 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
1530 new TimeDelta(TimeDelta::FromMinutes(2)));
1531 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1532
1533 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
1534 update_state.scatter_wait_period = TimeDelta::FromSeconds(35);
1535
1536 UpdateDownloadParams result;
1537 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart,
1538 &result, update_state);
1539 EXPECT_TRUE(result.update_can_start);
1540 EXPECT_EQ(0, result.download_url_idx);
1541 EXPECT_FALSE(result.download_url_allowed);
1542 EXPECT_EQ(0, result.download_url_num_errors);
1543 EXPECT_TRUE(result.p2p_downloading_allowed);
1544 EXPECT_TRUE(result.p2p_sharing_allowed);
1545 EXPECT_FALSE(result.do_increment_failures);
1546 EXPECT_EQ(TimeDelta::FromSeconds(35), result.scatter_wait_period);
1547 EXPECT_EQ(0, result.scatter_check_threshold);
1548}
1549
1550TEST_F(UmChromeOSPolicyTest,
1551 UpdateCanStartAllowedBackoffSupressedDueToP2P) {
1552 // The UpdateCanStart policy returns true; backoff should have applied, but
1553 // P2P download is allowed. Backoff values are nonetheless returned, and so
1554 // are download URL values, albeit the latter are not allowed to be used.
1555
1556 SetUpdateCheckAllowed(false);
1557
1558 const Time curr_time = fake_clock_.GetWallclockTime();
1559 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
1560 update_state.download_errors_max = 1;
1561 update_state.download_errors.emplace_back(
1562 0, ErrorCode::kDownloadTransferError,
1563 curr_time - TimeDelta::FromSeconds(8));
1564 update_state.download_errors.emplace_back(
1565 0, ErrorCode::kDownloadTransferError,
1566 curr_time - TimeDelta::FromSeconds(2));
1567 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1568
1569 UpdateDownloadParams result;
1570 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1571 update_state);
1572 EXPECT_TRUE(result.update_can_start);
1573 EXPECT_EQ(0, result.download_url_idx);
1574 EXPECT_FALSE(result.download_url_allowed);
1575 EXPECT_EQ(0, result.download_url_num_errors);
1576 EXPECT_TRUE(result.p2p_downloading_allowed);
1577 EXPECT_TRUE(result.p2p_sharing_allowed);
1578 EXPECT_TRUE(result.do_increment_failures);
1579 EXPECT_LT(curr_time, result.backoff_expiry);
1580}
1581
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001582TEST_F(UmChromeOSPolicyTest, P2PEnabledNotAllowed) {
1583 bool result;
1584 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1585 EXPECT_FALSE(result);
1586}
1587
1588TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedByDevicePolicy) {
1589 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1590 new bool(true));
1591
1592 bool result;
1593 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1594 EXPECT_TRUE(result);
1595}
1596
1597TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedByUpdater) {
1598 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1599
1600 bool result;
1601 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1602 EXPECT_TRUE(result);
1603}
1604
1605TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedDeviceEnterpriseEnrolled) {
1606 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(nullptr);
1607 fake_state_.device_policy_provider()->var_owner()->reset(nullptr);
1608
1609 bool result;
1610 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1611 EXPECT_TRUE(result);
1612}
1613
1614TEST_F(UmChromeOSPolicyTest, P2PEnabledChangedBlocks) {
1615 bool result;
1616 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::P2PEnabledChanged,
1617 &result, false);
1618}
1619
Alex Deymo63784a52014-05-28 10:46:14 -07001620} // namespace chromeos_update_manager