blob: f74eb8b85eba345c0a17f3960ac0e751bba7e440 [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
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));
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
Alex Deymo63784a52014-05-28 10:46:14 -0700475TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsCheckAllowedError) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700476 // The UpdateCanStart policy fails, not being able to query
477 // UpdateCheckAllowed.
478
479 // Configure the UpdateCheckAllowed policy to fail.
480 fake_state_.updater_provider()->var_updater_started_time()->reset(nullptr);
481
482 // Check that the UpdateCanStart fails.
483 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700484 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700485 ExpectPolicyStatus(EvalStatus::kFailed,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700486 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700487}
488
Alex Deymo63784a52014-05-28 10:46:14 -0700489TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedCheckDue) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700490 // The UpdateCanStart policy returns false because we are due for another
Gilad Arnold14a9e702014-10-08 08:09:09 -0700491 // update check. Ensure that download related values are still returned.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700492
493 SetUpdateCheckAllowed(true);
494
495 // Check that the UpdateCanStart returns false.
496 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700497 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700498 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700499 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700500 EXPECT_FALSE(result.update_can_start);
501 EXPECT_EQ(UpdateCannotStartReason::kCheckDue, result.cannot_start_reason);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700502 EXPECT_EQ(0, result.download_url_idx);
503 EXPECT_EQ(0, result.download_url_num_errors);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700504}
505
Alex Deymo63784a52014-05-28 10:46:14 -0700506TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoDevicePolicy) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700507 // The UpdateCanStart policy returns true; no device policy is loaded.
508
509 SetUpdateCheckAllowed(false);
510 fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
511 new bool(false));
512
513 // Check that the UpdateCanStart returns true with no further attributes.
514 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700515 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700516 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700517 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700518 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700519 EXPECT_FALSE(result.p2p_downloading_allowed);
520 EXPECT_FALSE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700521 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700522 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700523 EXPECT_EQ(0, result.download_url_num_errors);
524 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700525}
526
Alex Deymo63784a52014-05-28 10:46:14 -0700527TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBlankPolicy) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700528 // The UpdateCanStart policy returns true; device policy is loaded but imposes
529 // no restrictions on updating.
530
531 SetUpdateCheckAllowed(false);
532
533 // Check that the UpdateCanStart returns true.
534 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700535 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700536 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700537 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700538 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700539 EXPECT_FALSE(result.p2p_downloading_allowed);
540 EXPECT_FALSE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700541 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700542 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700543 EXPECT_EQ(0, result.download_url_num_errors);
544 EXPECT_FALSE(result.do_increment_failures);
545}
546
547TEST_F(UmChromeOSPolicyTest,
548 UpdateCanStartNotAllowedBackoffNewWaitPeriodApplies) {
549 // The UpdateCanStart policy returns false; failures are reported and a new
550 // backoff period is enacted.
551
552 SetUpdateCheckAllowed(false);
553
554 const Time curr_time = fake_clock_.GetWallclockTime();
555 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
556 update_state.download_errors_max = 1;
557 update_state.download_errors.emplace_back(
558 0, ErrorCode::kDownloadTransferError,
559 curr_time - TimeDelta::FromSeconds(8));
560 update_state.download_errors.emplace_back(
561 0, ErrorCode::kDownloadTransferError,
562 curr_time - TimeDelta::FromSeconds(2));
563
564 // Check that UpdateCanStart returns false and a new backoff expiry is
565 // generated.
566 UpdateDownloadParams result;
567 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
568 update_state);
569 EXPECT_FALSE(result.update_can_start);
570 EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
571 EXPECT_TRUE(result.do_increment_failures);
572 EXPECT_LT(curr_time, result.backoff_expiry);
573}
574
575TEST_F(UmChromeOSPolicyTest,
576 UpdateCanStartNotAllowedBackoffPrevWaitPeriodStillApplies) {
577 // The UpdateCanStart policy returns false; a previously enacted backoff
578 // period still applies.
579
580 SetUpdateCheckAllowed(false);
581
582 const Time curr_time = fake_clock_.GetWallclockTime();
583 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
584 update_state.download_errors_max = 1;
585 update_state.download_errors.emplace_back(
586 0, ErrorCode::kDownloadTransferError,
587 curr_time - TimeDelta::FromSeconds(8));
588 update_state.download_errors.emplace_back(
589 0, ErrorCode::kDownloadTransferError,
590 curr_time - TimeDelta::FromSeconds(2));
591 update_state.failures_last_updated = curr_time;
592 update_state.backoff_expiry = curr_time + TimeDelta::FromMinutes(3);
593
594 // Check that UpdateCanStart returns false and a new backoff expiry is
595 // generated.
596 UpdateDownloadParams result;
597 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::UpdateCanStart,
598 &result, update_state);
599 EXPECT_FALSE(result.update_can_start);
600 EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
601 EXPECT_FALSE(result.do_increment_failures);
602 EXPECT_LT(curr_time, result.backoff_expiry);
603}
604
605TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffSatisfied) {
606 // The UpdateCanStart policy returns true; a previously enacted backoff period
607 // has elapsed, we're good to go.
608
609 SetUpdateCheckAllowed(false);
610
611 const Time curr_time = fake_clock_.GetWallclockTime();
612 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
613 update_state.download_errors_max = 1;
614 update_state.download_errors.emplace_back(
615 0, ErrorCode::kDownloadTransferError,
616 curr_time - TimeDelta::FromSeconds(8));
617 update_state.download_errors.emplace_back(
618 0, ErrorCode::kDownloadTransferError,
619 curr_time - TimeDelta::FromSeconds(2));
620 update_state.failures_last_updated = curr_time - TimeDelta::FromSeconds(1);
621 update_state.backoff_expiry = curr_time - TimeDelta::FromSeconds(1);
622
623 // Check that UpdateCanStart returns false and a new backoff expiry is
624 // generated.
625 UpdateDownloadParams result;
626 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart,
627 &result, update_state);
628 EXPECT_TRUE(result.update_can_start);
629 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
630 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700631 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700632 EXPECT_EQ(0, result.download_url_num_errors);
633 EXPECT_FALSE(result.do_increment_failures);
634 EXPECT_EQ(Time(), result.backoff_expiry);
635}
636
637TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffDisabled) {
638 // The UpdateCanStart policy returns false; failures are reported but backoff
639 // is disabled.
640
641 SetUpdateCheckAllowed(false);
642
643 const Time curr_time = fake_clock_.GetWallclockTime();
644 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
645 update_state.download_errors_max = 1;
646 update_state.download_errors.emplace_back(
647 0, ErrorCode::kDownloadTransferError,
648 curr_time - TimeDelta::FromSeconds(8));
649 update_state.download_errors.emplace_back(
650 0, ErrorCode::kDownloadTransferError,
651 curr_time - TimeDelta::FromSeconds(2));
652 update_state.is_backoff_disabled = true;
653
654 // Check that UpdateCanStart returns false and a new backoff expiry is
655 // generated.
656 UpdateDownloadParams result;
657 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
658 update_state);
659 EXPECT_TRUE(result.update_can_start);
660 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
661 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700662 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700663 EXPECT_EQ(0, result.download_url_num_errors);
664 EXPECT_TRUE(result.do_increment_failures);
665 EXPECT_EQ(Time(), result.backoff_expiry);
666}
667
668TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffInteractive) {
669 // The UpdateCanStart policy returns false; failures are reported but this is
670 // an interactive update check.
671
672 SetUpdateCheckAllowed(false);
673
674 const Time curr_time = fake_clock_.GetWallclockTime();
675 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
676 update_state.download_errors_max = 1;
677 update_state.download_errors.emplace_back(
678 0, ErrorCode::kDownloadTransferError,
679 curr_time - TimeDelta::FromSeconds(8));
680 update_state.download_errors.emplace_back(
681 0, ErrorCode::kDownloadTransferError,
682 curr_time - TimeDelta::FromSeconds(2));
683 update_state.is_interactive = true;
684
685 // Check that UpdateCanStart returns false and a new backoff expiry is
686 // generated.
687 UpdateDownloadParams result;
688 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
689 update_state);
690 EXPECT_TRUE(result.update_can_start);
691 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
692 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700693 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700694 EXPECT_EQ(0, result.download_url_num_errors);
695 EXPECT_TRUE(result.do_increment_failures);
696 EXPECT_EQ(Time(), result.backoff_expiry);
697}
698
699TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffDelta) {
700 // The UpdateCanStart policy returns false; failures are reported but this is
701 // a delta payload.
702
703 SetUpdateCheckAllowed(false);
704
705 const Time curr_time = fake_clock_.GetWallclockTime();
706 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
707 update_state.download_errors_max = 1;
708 update_state.download_errors.emplace_back(
709 0, ErrorCode::kDownloadTransferError,
710 curr_time - TimeDelta::FromSeconds(8));
711 update_state.download_errors.emplace_back(
712 0, ErrorCode::kDownloadTransferError,
713 curr_time - TimeDelta::FromSeconds(2));
714 update_state.is_delta_payload = true;
715
716 // Check that UpdateCanStart returns false and a new backoff expiry is
717 // generated.
718 UpdateDownloadParams result;
719 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
720 update_state);
721 EXPECT_TRUE(result.update_can_start);
722 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
723 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700724 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700725 EXPECT_EQ(0, result.download_url_num_errors);
726 EXPECT_TRUE(result.do_increment_failures);
727 EXPECT_EQ(Time(), result.backoff_expiry);
728}
729
730TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffUnofficialBuild) {
731 // The UpdateCanStart policy returns false; failures are reported but this is
732 // an unofficial build.
733
734 SetUpdateCheckAllowed(false);
735
736 const Time curr_time = fake_clock_.GetWallclockTime();
737 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
738 update_state.download_errors_max = 1;
739 update_state.download_errors.emplace_back(
740 0, ErrorCode::kDownloadTransferError,
741 curr_time - TimeDelta::FromSeconds(8));
742 update_state.download_errors.emplace_back(
743 0, ErrorCode::kDownloadTransferError,
744 curr_time - TimeDelta::FromSeconds(2));
745
746 fake_state_.system_provider()->var_is_official_build()->
747 reset(new bool(false));
748
749 // Check that UpdateCanStart returns false and a new backoff expiry is
750 // generated.
751 UpdateDownloadParams result;
752 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
753 update_state);
754 EXPECT_TRUE(result.update_can_start);
755 EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
756 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700757 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700758 EXPECT_EQ(0, result.download_url_num_errors);
759 EXPECT_TRUE(result.do_increment_failures);
760 EXPECT_EQ(Time(), result.backoff_expiry);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700761}
762
Alex Deymo63784a52014-05-28 10:46:14 -0700763TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsScatteringFailed) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700764 // The UpdateCanStart policy fails because the UpdateScattering policy it
765 // depends on fails (unset variable).
766
767 SetUpdateCheckAllowed(false);
768
769 // Override the default seed variable with a null value so that the policy
770 // request would fail.
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700771 // TODO(garnold) This failure may or may not fail a number
772 // sub-policies/decisions, like scattering and backoff. We'll need a more
773 // deliberate setup to ensure that we're failing what we want to be failing.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700774 fake_state_.random_provider()->var_seed()->reset(nullptr);
775
776 // Check that the UpdateCanStart fails.
777 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700778 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700779 ExpectPolicyStatus(EvalStatus::kFailed,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700780 &Policy::UpdateCanStart, &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700781}
782
Alex Deymo63784a52014-05-28 10:46:14 -0700783TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700784 UpdateCanStartNotAllowedScatteringNewWaitPeriodApplies) {
785 // The UpdateCanStart policy returns false; device policy is loaded and
786 // scattering applies due to an unsatisfied wait period, which was newly
787 // generated.
788
789 SetUpdateCheckAllowed(false);
790 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
791 new TimeDelta(TimeDelta::FromMinutes(2)));
792
793
794 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
795
796 // Check that the UpdateCanStart returns false and a new wait period
797 // generated.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700798 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700799 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700800 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700801 EXPECT_FALSE(result.update_can_start);
802 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
803 EXPECT_LT(TimeDelta(), result.scatter_wait_period);
804 EXPECT_EQ(0, result.scatter_check_threshold);
805}
806
Alex Deymo63784a52014-05-28 10:46:14 -0700807TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700808 UpdateCanStartNotAllowedScatteringPrevWaitPeriodStillApplies) {
809 // The UpdateCanStart policy returns false w/ kAskMeAgainLater; device policy
810 // is loaded and a previously generated scattering period still applies, none
811 // of the scattering values has changed.
812
813 SetUpdateCheckAllowed(false);
814 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
815 new TimeDelta(TimeDelta::FromMinutes(2)));
816
817 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
818 update_state.scatter_wait_period = TimeDelta::FromSeconds(35);
819
820 // Check that the UpdateCanStart returns false and a new wait period
821 // generated.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700822 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700823 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::UpdateCanStart,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700824 &result, update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700825 EXPECT_FALSE(result.update_can_start);
826 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
827 EXPECT_EQ(TimeDelta::FromSeconds(35), result.scatter_wait_period);
828 EXPECT_EQ(0, result.scatter_check_threshold);
829}
830
Alex Deymo63784a52014-05-28 10:46:14 -0700831TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700832 UpdateCanStartNotAllowedScatteringNewCountThresholdApplies) {
833 // The UpdateCanStart policy returns false; device policy is loaded and
834 // scattering applies due to an unsatisfied update check count threshold.
835 //
836 // This ensures a non-zero check threshold, which may or may not be combined
837 // with a non-zero wait period (for which we cannot reliably control).
838
839 SetUpdateCheckAllowed(false);
840 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
841 new TimeDelta(TimeDelta::FromSeconds(1)));
842
843 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
844 update_state.scatter_check_threshold_min = 2;
845 update_state.scatter_check_threshold_max = 5;
846
847 // Check that the UpdateCanStart returns false.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700848 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700849 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700850 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700851 EXPECT_FALSE(result.update_can_start);
852 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
853 EXPECT_LE(2, result.scatter_check_threshold);
854 EXPECT_GE(5, result.scatter_check_threshold);
855}
856
Alex Deymo63784a52014-05-28 10:46:14 -0700857TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700858 UpdateCanStartNotAllowedScatteringPrevCountThresholdStillApplies) {
859 // The UpdateCanStart policy returns false; device policy is loaded and
860 // scattering due to a previously generated count threshold still applies.
861
862 SetUpdateCheckAllowed(false);
863 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
864 new TimeDelta(TimeDelta::FromSeconds(1)));
865
866 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
867 update_state.scatter_check_threshold = 3;
868 update_state.scatter_check_threshold_min = 2;
869 update_state.scatter_check_threshold_max = 5;
870
871 // Check that the UpdateCanStart returns false.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700872 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700873 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700874 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700875 EXPECT_FALSE(result.update_can_start);
876 EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
877 EXPECT_EQ(3, result.scatter_check_threshold);
878}
879
Alex Deymo63784a52014-05-28 10:46:14 -0700880TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedScatteringSatisfied) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700881 // The UpdateCanStart policy returns true; device policy is loaded and
882 // scattering is enabled, but both wait period and check threshold are
883 // satisfied.
884
885 SetUpdateCheckAllowed(false);
886 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
887 new TimeDelta(TimeDelta::FromSeconds(120)));
888
889 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(75));
890 update_state.num_checks = 4;
891 update_state.scatter_wait_period = TimeDelta::FromSeconds(60);
892 update_state.scatter_check_threshold = 3;
893 update_state.scatter_check_threshold_min = 2;
894 update_state.scatter_check_threshold_max = 5;
895
896 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700897 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700898 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700899 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700900 EXPECT_TRUE(result.update_can_start);
901 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
902 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700903 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700904 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700905 EXPECT_EQ(0, result.download_url_num_errors);
906 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700907}
908
Alex Deymo63784a52014-05-28 10:46:14 -0700909TEST_F(UmChromeOSPolicyTest,
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700910 UpdateCanStartAllowedInteractivePreventsScattering) {
911 // The UpdateCanStart policy returns true; device policy is loaded and
912 // scattering would have applied, except that the update check is interactive
913 // and so it is suppressed.
914
915 SetUpdateCheckAllowed(false);
916 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
917 new TimeDelta(TimeDelta::FromSeconds(1)));
918
919 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700920 update_state.is_interactive = true;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700921 update_state.scatter_check_threshold = 0;
922 update_state.scatter_check_threshold_min = 2;
923 update_state.scatter_check_threshold_max = 5;
924
925 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700926 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700927 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700928 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700929 EXPECT_TRUE(result.update_can_start);
930 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
931 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700932 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700933 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700934 EXPECT_EQ(0, result.download_url_num_errors);
935 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700936}
937
Alex Deymo63784a52014-05-28 10:46:14 -0700938TEST_F(UmChromeOSPolicyTest,
Gilad Arnold76a11f62014-05-20 09:02:12 -0700939 UpdateCanStartAllowedOobePreventsScattering) {
940 // The UpdateCanStart policy returns true; device policy is loaded and
941 // scattering would have applied, except that OOBE was not completed and so it
942 // is suppressed.
943
944 SetUpdateCheckAllowed(false);
945 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
946 new TimeDelta(TimeDelta::FromSeconds(1)));
947 fake_state_.system_provider()->var_is_oobe_complete()->reset(new bool(false));
948
949 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700950 update_state.is_interactive = true;
Gilad Arnold76a11f62014-05-20 09:02:12 -0700951 update_state.scatter_check_threshold = 0;
952 update_state.scatter_check_threshold_min = 2;
953 update_state.scatter_check_threshold_max = 5;
954
955 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -0700956 UpdateDownloadParams result;
Gilad Arnold76a11f62014-05-20 09:02:12 -0700957 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700958 update_state);
Gilad Arnold76a11f62014-05-20 09:02:12 -0700959 EXPECT_TRUE(result.update_can_start);
960 EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
961 EXPECT_EQ(0, result.scatter_check_threshold);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700962 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700963 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700964 EXPECT_EQ(0, result.download_url_num_errors);
965 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnold76a11f62014-05-20 09:02:12 -0700966}
967
Alex Deymo63784a52014-05-28 10:46:14 -0700968TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithAttributes) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700969 // The UpdateCanStart policy returns true; device policy permits both HTTP and
970 // P2P updates, as well as a non-empty target channel string.
971
972 SetUpdateCheckAllowed(false);
973
974 // Override specific device policy attributes.
975 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
976 new bool(true));
977 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
978 new bool(true));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700979
980 // Check that the UpdateCanStart returns true.
981 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -0700982 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700983 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700984 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700985 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -0700986 EXPECT_TRUE(result.p2p_downloading_allowed);
987 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -0700988 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -0700989 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -0700990 EXPECT_EQ(0, result.download_url_num_errors);
991 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700992}
993
Alex Deymo63784a52014-05-28 10:46:14 -0700994TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithP2PFromUpdater) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -0700995 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
996 // P2P updates, but the updater is configured to allow P2P and overrules the
997 // setting.
998
999 SetUpdateCheckAllowed(false);
1000
1001 // Override specific device policy attributes.
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001002 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1003
1004 // Check that the UpdateCanStart returns true.
1005 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001006 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001007 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001008 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001009 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001010 EXPECT_TRUE(result.p2p_downloading_allowed);
1011 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001012 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001013 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001014 EXPECT_EQ(0, result.download_url_num_errors);
1015 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001016}
1017
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001018TEST_F(UmChromeOSPolicyTest,
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001019 UpdateCanStartAllowedP2PDownloadingBlockedDueToOmaha) {
1020 // The UpdateCanStart policy returns true; device policy permits HTTP, but
1021 // policy blocks P2P downloading because Omaha forbids it. P2P sharing is
1022 // still permitted.
1023
1024 SetUpdateCheckAllowed(false);
1025
1026 // Override specific device policy attributes.
1027 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1028 new bool(true));
1029 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1030 new bool(true));
1031
1032 // Check that the UpdateCanStart returns true.
1033 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1034 update_state.p2p_downloading_disabled = true;
1035 UpdateDownloadParams result;
1036 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1037 update_state);
1038 EXPECT_TRUE(result.update_can_start);
1039 EXPECT_FALSE(result.p2p_downloading_allowed);
1040 EXPECT_TRUE(result.p2p_sharing_allowed);
1041}
1042
1043TEST_F(UmChromeOSPolicyTest,
1044 UpdateCanStartAllowedP2PSharingBlockedDueToOmaha) {
1045 // The UpdateCanStart policy returns true; device policy permits HTTP, but
1046 // policy blocks P2P sharing because Omaha forbids it. P2P downloading is
1047 // still permitted.
1048
1049 SetUpdateCheckAllowed(false);
1050
1051 // Override specific device policy attributes.
1052 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1053 new bool(true));
1054 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1055 new bool(true));
1056
1057 // Check that the UpdateCanStart returns true.
1058 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1059 update_state.p2p_sharing_disabled = true;
1060 UpdateDownloadParams result;
1061 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1062 update_state);
1063 EXPECT_TRUE(result.update_can_start);
1064 EXPECT_TRUE(result.p2p_downloading_allowed);
1065 EXPECT_FALSE(result.p2p_sharing_allowed);
1066}
1067
1068TEST_F(UmChromeOSPolicyTest,
1069 UpdateCanStartAllowedP2PDownloadingBlockedDueToNumAttempts) {
Gilad Arnold349ac832014-10-06 14:20:28 -07001070 // The UpdateCanStart policy returns true; device policy permits HTTP but
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001071 // blocks P2P download, because the max number of P2P downloads have been
1072 // attempted. P2P sharing is still permitted.
Gilad Arnold349ac832014-10-06 14:20:28 -07001073
1074 SetUpdateCheckAllowed(false);
1075
1076 // Override specific device policy attributes.
1077 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1078 new bool(true));
1079 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1080 new bool(true));
1081
1082 // Check that the UpdateCanStart returns true.
1083 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1084 update_state.p2p_num_attempts = ChromeOSPolicy::kMaxP2PAttempts;
1085 UpdateDownloadParams result;
1086 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1087 update_state);
1088 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001089 EXPECT_FALSE(result.p2p_downloading_allowed);
1090 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnold349ac832014-10-06 14:20:28 -07001091}
1092
1093TEST_F(UmChromeOSPolicyTest,
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001094 UpdateCanStartAllowedP2PDownloadingBlockedDueToAttemptsPeriod) {
Gilad Arnold349ac832014-10-06 14:20:28 -07001095 // The UpdateCanStart policy returns true; device policy permits HTTP but
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001096 // blocks P2P download, because the max period for attempt to download via P2P
1097 // has elapsed. P2P sharing is still permitted.
Gilad Arnold349ac832014-10-06 14:20:28 -07001098
1099 SetUpdateCheckAllowed(false);
1100
1101 // Override specific device policy attributes.
1102 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1103 new bool(true));
1104 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1105 new bool(true));
1106
1107 // Check that the UpdateCanStart returns true.
1108 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1109 update_state.p2p_num_attempts = 1;
1110 update_state.p2p_first_attempted =
1111 fake_clock_.GetWallclockTime() -
Alex Deymof329b932014-10-30 01:37:48 -07001112 TimeDelta::FromSeconds(
1113 ChromeOSPolicy::kMaxP2PAttemptsPeriodInSeconds + 1);
Gilad Arnold349ac832014-10-06 14:20:28 -07001114 UpdateDownloadParams result;
1115 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1116 update_state);
1117 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001118 EXPECT_FALSE(result.p2p_downloading_allowed);
1119 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnold349ac832014-10-06 14:20:28 -07001120}
1121
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001122TEST_F(UmChromeOSPolicyTest,
1123 UpdateCanStartAllowedWithHttpUrlForUnofficialBuild) {
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001124 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1125 // P2P updates, but marking this an unofficial build overrules the HTTP
1126 // setting.
1127
1128 SetUpdateCheckAllowed(false);
1129
1130 // Override specific device policy attributes.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001131 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1132 new bool(false));
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001133 fake_state_.system_provider()->var_is_official_build()->
1134 reset(new bool(false));
1135
1136 // Check that the UpdateCanStart returns true.
1137 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001138 UpdateDownloadParams result;
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001139 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001140 update_state);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001141 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001142 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001143 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001144 EXPECT_EQ(0, result.download_url_num_errors);
1145 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001146}
1147
1148TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithHttpsUrl) {
1149 // The UpdateCanStart policy returns true; device policy forbids both HTTP and
1150 // P2P updates, but an HTTPS URL is provided and selected for download.
1151
1152 SetUpdateCheckAllowed(false);
1153
1154 // Override specific device policy attributes.
1155 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1156 new bool(false));
1157
1158 // Add an HTTPS URL.
1159 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001160 update_state.download_urls.emplace_back("https://secure/url/");
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001161
1162 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001163 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001164 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001165 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001166 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001167 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001168 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001169 EXPECT_EQ(0, result.download_url_num_errors);
1170 EXPECT_FALSE(result.do_increment_failures);
1171}
1172
1173TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedMaxErrorsNotExceeded) {
1174 // The UpdateCanStart policy returns true; the first URL has download errors
1175 // but does not exceed the maximum allowed number of failures, so it is stilli
1176 // usable.
1177
1178 SetUpdateCheckAllowed(false);
1179
1180 // Add a second URL; update with this URL attempted and failed enough times to
1181 // disqualify the current (first) URL.
1182 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1183 update_state.num_checks = 5;
1184 update_state.download_urls.emplace_back("http://another/fake/url/");
1185 Time t = fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(12);
1186 for (int i = 0; i < 5; i++) {
1187 update_state.download_errors.emplace_back(
1188 0, ErrorCode::kDownloadTransferError, t);
1189 t += TimeDelta::FromSeconds(1);
1190 }
1191
1192 // Check that the UpdateCanStart returns true.
1193 UpdateDownloadParams result;
1194 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1195 update_state);
1196 EXPECT_TRUE(result.update_can_start);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001197 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001198 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001199 EXPECT_EQ(5, result.download_url_num_errors);
1200 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001201}
1202
1203TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlMaxExceeded) {
1204 // The UpdateCanStart policy returns true; the first URL exceeded the maximum
1205 // allowed number of failures, but a second URL is available.
1206
1207 SetUpdateCheckAllowed(false);
1208
1209 // Add a second URL; update with this URL attempted and failed enough times to
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001210 // disqualify the current (first) URL.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001211 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1212 update_state.num_checks = 10;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001213 update_state.download_urls.emplace_back("http://another/fake/url/");
1214 Time t = fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(12);
1215 for (int i = 0; i < 11; i++) {
1216 update_state.download_errors.emplace_back(
1217 0, ErrorCode::kDownloadTransferError, t);
1218 t += TimeDelta::FromSeconds(1);
1219 }
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001220
1221 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001222 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001223 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001224 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001225 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001226 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001227 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001228 EXPECT_EQ(0, result.download_url_num_errors);
1229 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001230}
1231
1232TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlHardError) {
1233 // The UpdateCanStart policy returns true; the first URL fails with a hard
1234 // error, but a second URL is available.
1235
1236 SetUpdateCheckAllowed(false);
1237
1238 // Add a second URL; update with this URL attempted and failed in a way that
1239 // causes it to switch directly to the next URL.
1240 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1241 update_state.num_checks = 10;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001242 update_state.download_urls.emplace_back("http://another/fake/url/");
1243 update_state.download_errors.emplace_back(
1244 0, ErrorCode::kPayloadHashMismatchError,
1245 fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(1));
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001246
1247 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001248 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001249 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001250 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001251 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001252 EXPECT_EQ(1, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001253 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001254 EXPECT_EQ(0, result.download_url_num_errors);
1255 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001256}
1257
1258TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedUrlWrapsAround) {
1259 // The UpdateCanStart policy returns true; URL search properly wraps around
1260 // the last one on the list.
1261
1262 SetUpdateCheckAllowed(false);
1263
1264 // Add a second URL; update with this URL attempted and failed in a way that
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001265 // causes it to switch directly to the next URL. We must disable backoff in
1266 // order for it not to interfere.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001267 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001268 update_state.num_checks = 1;
1269 update_state.is_backoff_disabled = true;
1270 update_state.download_urls.emplace_back("http://another/fake/url/");
1271 update_state.download_errors.emplace_back(
1272 1, ErrorCode::kPayloadHashMismatchError,
1273 fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(1));
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001274
1275 // Check that the UpdateCanStart returns true.
Gilad Arnold42f253b2014-06-25 12:39:17 -07001276 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001277 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001278 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001279 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001280 EXPECT_EQ(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001281 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001282 EXPECT_EQ(0, result.download_url_num_errors);
1283 EXPECT_TRUE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001284}
1285
1286TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedNoUsableUrls) {
1287 // The UpdateCanStart policy returns false; there's a single HTTP URL but its
1288 // use is forbidden by policy.
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001289 //
1290 // Note: In the case where no usable URLs are found, the policy should not
1291 // increment the number of failed attempts! Doing so would result in a
1292 // non-idempotent semantics, and does not fall within the intended purpose of
1293 // the backoff mechanism anyway.
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001294
1295 SetUpdateCheckAllowed(false);
1296
1297 // Override specific device policy attributes.
1298 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1299 new bool(false));
1300
1301 // Check that the UpdateCanStart returns false.
1302 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001303 UpdateDownloadParams result;
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001304 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1305 update_state);
1306 EXPECT_FALSE(result.update_can_start);
1307 EXPECT_EQ(UpdateCannotStartReason::kCannotDownload,
1308 result.cannot_start_reason);
1309 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001310}
1311
1312TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoUsableUrlsButP2PEnabled) {
1313 // The UpdateCanStart policy returns true; there's a single HTTP URL but its
1314 // use is forbidden by policy, however P2P is enabled. The result indicates
1315 // that no URL can be used.
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001316 //
1317 // Note: The number of failed attempts should not increase in this case (see
1318 // above test).
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001319
1320 SetUpdateCheckAllowed(false);
1321
1322 // Override specific device policy attributes.
1323 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1324 new bool(true));
1325 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1326 new bool(false));
1327
1328 // Check that the UpdateCanStart returns true.
1329 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
Gilad Arnold42f253b2014-06-25 12:39:17 -07001330 UpdateDownloadParams result;
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001331 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001332 update_state);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001333 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001334 EXPECT_TRUE(result.p2p_downloading_allowed);
1335 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldb3b05442014-05-30 14:25:05 -07001336 EXPECT_GT(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001337 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnolddc4bb262014-07-23 10:45:19 -07001338 EXPECT_EQ(0, result.download_url_num_errors);
1339 EXPECT_FALSE(result.do_increment_failures);
Gilad Arnoldf62a4b82014-05-01 07:41:07 -07001340}
1341
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001342TEST_F(UmChromeOSPolicyTest,
1343 UpdateCanStartAllowedNoUsableUrlsButEnterpriseEnrolled) {
1344 // The UpdateCanStart policy returns true; there's a single HTTP URL but its
1345 // use is forbidden by policy, and P2P is unset on the policy, however the
1346 // device is enterprise-enrolled so P2P is allowed. The result indicates that
1347 // no URL can be used.
1348 //
1349 // Note: The number of failed attempts should not increase in this case (see
1350 // above test).
1351
1352 SetUpdateCheckAllowed(false);
1353
1354 // Override specific device policy attributes.
1355 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(nullptr);
1356 fake_state_.device_policy_provider()->var_owner()->reset(nullptr);
1357 fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
1358 new bool(false));
1359
1360 // Check that the UpdateCanStart returns true.
1361 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
1362 UpdateDownloadParams result;
1363 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1364 update_state);
1365 EXPECT_TRUE(result.update_can_start);
Gilad Arnoldb2f99192014-10-07 13:01:52 -07001366 EXPECT_TRUE(result.p2p_downloading_allowed);
1367 EXPECT_TRUE(result.p2p_sharing_allowed);
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001368 EXPECT_GT(0, result.download_url_idx);
Gilad Arnold14a9e702014-10-08 08:09:09 -07001369 EXPECT_TRUE(result.download_url_allowed);
Gilad Arnoldef8d0872014-10-03 14:14:06 -07001370 EXPECT_EQ(0, result.download_url_num_errors);
1371 EXPECT_FALSE(result.do_increment_failures);
1372}
1373
Gilad Arnold684219d2014-07-07 14:54:57 -07001374TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedEthernetDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001375 // Ethernet is always allowed.
1376
1377 fake_state_.shill_provider()->var_conn_type()->
1378 reset(new ConnectionType(ConnectionType::kEthernet));
1379
1380 bool result;
1381 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001382 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001383 EXPECT_TRUE(result);
1384}
1385
Gilad Arnold684219d2014-07-07 14:54:57 -07001386TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWifiDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001387 // Wifi is allowed if not tethered.
1388
1389 fake_state_.shill_provider()->var_conn_type()->
1390 reset(new ConnectionType(ConnectionType::kWifi));
1391
1392 bool result;
1393 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001394 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001395 EXPECT_TRUE(result);
1396}
1397
Alex Deymo63784a52014-05-28 10:46:14 -07001398TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001399 UpdateCurrentConnectionNotAllowedWifiTetheredDefault) {
1400 // Tethered wifi is not allowed by default.
1401
1402 fake_state_.shill_provider()->var_conn_type()->
1403 reset(new ConnectionType(ConnectionType::kWifi));
1404 fake_state_.shill_provider()->var_conn_tethering()->
1405 reset(new ConnectionTethering(ConnectionTethering::kConfirmed));
1406
1407 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001408 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001409 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001410}
1411
Alex Deymo63784a52014-05-28 10:46:14 -07001412TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001413 UpdateDownloadAllowedWifiTetheredPolicyOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001414 // Tethered wifi can be allowed by policy.
1415
1416 fake_state_.shill_provider()->var_conn_type()->
1417 reset(new ConnectionType(ConnectionType::kWifi));
1418 fake_state_.shill_provider()->var_conn_tethering()->
1419 reset(new ConnectionTethering(ConnectionTethering::kConfirmed));
1420 set<ConnectionType> allowed_connections;
1421 allowed_connections.insert(ConnectionType::kCellular);
1422 fake_state_.device_policy_provider()->
1423 var_allowed_connection_types_for_update()->
1424 reset(new set<ConnectionType>(allowed_connections));
1425
1426 bool result;
1427 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001428 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001429 EXPECT_TRUE(result);
1430}
1431
Gilad Arnold684219d2014-07-07 14:54:57 -07001432TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWimaxDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001433 // Wimax is always allowed.
1434
1435 fake_state_.shill_provider()->var_conn_type()->
1436 reset(new ConnectionType(ConnectionType::kWifi));
1437
1438 bool result;
1439 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001440 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001441 EXPECT_TRUE(result);
1442}
1443
Alex Deymo63784a52014-05-28 10:46:14 -07001444TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001445 UpdateCurrentConnectionNotAllowedBluetoothDefault) {
1446 // Bluetooth is never allowed.
1447
1448 fake_state_.shill_provider()->var_conn_type()->
1449 reset(new ConnectionType(ConnectionType::kBluetooth));
1450
1451 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001452 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001453 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001454}
1455
Alex Deymo63784a52014-05-28 10:46:14 -07001456TEST_F(UmChromeOSPolicyTest,
Gilad Arnold0adbc942014-05-12 10:35:43 -07001457 UpdateCurrentConnectionNotAllowedBluetoothPolicyCannotOverride) {
1458 // Bluetooth cannot be allowed even by policy.
1459
1460 fake_state_.shill_provider()->var_conn_type()->
1461 reset(new ConnectionType(ConnectionType::kBluetooth));
1462 set<ConnectionType> allowed_connections;
1463 allowed_connections.insert(ConnectionType::kBluetooth);
1464 fake_state_.device_policy_provider()->
1465 var_allowed_connection_types_for_update()->
1466 reset(new set<ConnectionType>(allowed_connections));
1467
1468 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001469 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001470 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001471}
1472
Alex Deymo63784a52014-05-28 10:46:14 -07001473TEST_F(UmChromeOSPolicyTest, UpdateCurrentConnectionNotAllowedCellularDefault) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001474 // Cellular is not allowed by default.
1475
1476 fake_state_.shill_provider()->var_conn_type()->
1477 reset(new ConnectionType(ConnectionType::kCellular));
1478
1479 bool result;
Gilad Arnold28d6be62014-06-30 14:04:04 -07001480 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
Gilad Arnold684219d2014-07-07 14:54:57 -07001481 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001482}
1483
Alex Deymo63784a52014-05-28 10:46:14 -07001484TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001485 UpdateDownloadAllowedCellularPolicyOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001486 // Update over cellular can be enabled by policy.
1487
1488 fake_state_.shill_provider()->var_conn_type()->
1489 reset(new ConnectionType(ConnectionType::kCellular));
1490 set<ConnectionType> allowed_connections;
1491 allowed_connections.insert(ConnectionType::kCellular);
1492 fake_state_.device_policy_provider()->
1493 var_allowed_connection_types_for_update()->
1494 reset(new set<ConnectionType>(allowed_connections));
1495
1496 bool result;
1497 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001498 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001499 EXPECT_TRUE(result);
1500}
1501
Alex Deymo63784a52014-05-28 10:46:14 -07001502TEST_F(UmChromeOSPolicyTest,
Gilad Arnold684219d2014-07-07 14:54:57 -07001503 UpdateDownloadAllowedCellularUserOverride) {
Gilad Arnold0adbc942014-05-12 10:35:43 -07001504 // Update over cellular can be enabled by user settings, but only if policy
1505 // is present and does not determine allowed connections.
1506
1507 fake_state_.shill_provider()->var_conn_type()->
1508 reset(new ConnectionType(ConnectionType::kCellular));
1509 set<ConnectionType> allowed_connections;
1510 allowed_connections.insert(ConnectionType::kCellular);
1511 fake_state_.updater_provider()->var_cellular_enabled()->
1512 reset(new bool(true));
1513
1514 bool result;
1515 ExpectPolicyStatus(EvalStatus::kSucceeded,
Gilad Arnold684219d2014-07-07 14:54:57 -07001516 &Policy::UpdateDownloadAllowed, &result);
Gilad Arnold0adbc942014-05-12 10:35:43 -07001517 EXPECT_TRUE(result);
1518}
1519
Gilad Arnold14a9e702014-10-08 08:09:09 -07001520TEST_F(UmChromeOSPolicyTest,
1521 UpdateCanStartAllowedScatteringSupressedDueToP2P) {
1522 // The UpdateCanStart policy returns true; scattering should have applied, but
1523 // P2P download is allowed. Scattering values are nonetheless returned, and so
1524 // are download URL values, albeit the latter are not allowed to be used.
1525
1526 SetUpdateCheckAllowed(false);
1527 fake_state_.device_policy_provider()->var_scatter_factor()->reset(
1528 new TimeDelta(TimeDelta::FromMinutes(2)));
1529 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1530
1531 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
1532 update_state.scatter_wait_period = TimeDelta::FromSeconds(35);
1533
1534 UpdateDownloadParams result;
1535 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart,
1536 &result, update_state);
1537 EXPECT_TRUE(result.update_can_start);
1538 EXPECT_EQ(0, result.download_url_idx);
1539 EXPECT_FALSE(result.download_url_allowed);
1540 EXPECT_EQ(0, result.download_url_num_errors);
1541 EXPECT_TRUE(result.p2p_downloading_allowed);
1542 EXPECT_TRUE(result.p2p_sharing_allowed);
1543 EXPECT_FALSE(result.do_increment_failures);
1544 EXPECT_EQ(TimeDelta::FromSeconds(35), result.scatter_wait_period);
1545 EXPECT_EQ(0, result.scatter_check_threshold);
1546}
1547
1548TEST_F(UmChromeOSPolicyTest,
1549 UpdateCanStartAllowedBackoffSupressedDueToP2P) {
1550 // The UpdateCanStart policy returns true; backoff should have applied, but
1551 // P2P download is allowed. Backoff values are nonetheless returned, and so
1552 // are download URL values, albeit the latter are not allowed to be used.
1553
1554 SetUpdateCheckAllowed(false);
1555
1556 const Time curr_time = fake_clock_.GetWallclockTime();
1557 UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
1558 update_state.download_errors_max = 1;
1559 update_state.download_errors.emplace_back(
1560 0, ErrorCode::kDownloadTransferError,
1561 curr_time - TimeDelta::FromSeconds(8));
1562 update_state.download_errors.emplace_back(
1563 0, ErrorCode::kDownloadTransferError,
1564 curr_time - TimeDelta::FromSeconds(2));
1565 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1566
1567 UpdateDownloadParams result;
1568 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
1569 update_state);
1570 EXPECT_TRUE(result.update_can_start);
1571 EXPECT_EQ(0, result.download_url_idx);
1572 EXPECT_FALSE(result.download_url_allowed);
1573 EXPECT_EQ(0, result.download_url_num_errors);
1574 EXPECT_TRUE(result.p2p_downloading_allowed);
1575 EXPECT_TRUE(result.p2p_sharing_allowed);
1576 EXPECT_TRUE(result.do_increment_failures);
1577 EXPECT_LT(curr_time, result.backoff_expiry);
1578}
1579
Gilad Arnold78ecbfc2014-10-22 14:38:25 -07001580TEST_F(UmChromeOSPolicyTest, P2PEnabledNotAllowed) {
1581 bool result;
1582 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1583 EXPECT_FALSE(result);
1584}
1585
1586TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedByDevicePolicy) {
1587 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
1588 new bool(true));
1589
1590 bool result;
1591 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1592 EXPECT_TRUE(result);
1593}
1594
1595TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedByUpdater) {
1596 fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
1597
1598 bool result;
1599 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1600 EXPECT_TRUE(result);
1601}
1602
1603TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedDeviceEnterpriseEnrolled) {
1604 fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(nullptr);
1605 fake_state_.device_policy_provider()->var_owner()->reset(nullptr);
1606
1607 bool result;
1608 ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
1609 EXPECT_TRUE(result);
1610}
1611
1612TEST_F(UmChromeOSPolicyTest, P2PEnabledChangedBlocks) {
1613 bool result;
1614 ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::P2PEnabledChanged,
1615 &result, false);
1616}
1617
Alex Deymo63784a52014-05-28 10:46:14 -07001618} // namespace chromeos_update_manager