Home | History | Annotate | Download | only in update_manager
      1 //
      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 //
     16 
     17 #include "update_engine/update_manager/chromeos_policy.h"
     18 
     19 #include <set>
     20 #include <string>
     21 #include <tuple>
     22 #include <vector>
     23 
     24 #include <base/time/time.h>
     25 #include <brillo/message_loops/fake_message_loop.h>
     26 #include <gtest/gtest.h>
     27 
     28 #include "update_engine/common/fake_clock.h"
     29 #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"
     32 
     33 using base::Time;
     34 using base::TimeDelta;
     35 using chromeos_update_engine::ErrorCode;
     36 using chromeos_update_engine::FakeClock;
     37 using std::set;
     38 using std::string;
     39 using std::tuple;
     40 using std::vector;
     41 
     42 namespace chromeos_update_manager {
     43 
     44 class UmChromeOSPolicyTest : public ::testing::Test {
     45  protected:
     46   void SetUp() override {
     47     loop_.SetAsCurrent();
     48     SetUpDefaultClock();
     49     eval_ctx_ = new EvaluationContext(&fake_clock_, TimeDelta::FromSeconds(5));
     50     SetUpDefaultState();
     51     SetUpDefaultDevicePolicy();
     52   }
     53 
     54   void TearDown() override {
     55     EXPECT_FALSE(loop_.PendingTasks());
     56   }
     57 
     58   // 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()->
     70         reset(new unsigned int{0});
     71     fake_state_.updater_provider()->var_server_dictated_poll_interval()->
     72         reset(new unsigned int{0});
     73     fake_state_.updater_provider()->var_forced_update_requested()->
     74         reset(new UpdateRequestStatus{UpdateRequestStatus::kNone});
     75 
     76     fake_state_.random_provider()->var_seed()->reset(
     77         new uint64_t(4));  // chosen by fair dice roll.
     78                            // guaranteed to be random.
     79 
     80     // No device policy loaded by default.
     81     fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
     82         new bool(false));
     83 
     84     // OOBE is enabled by default.
     85     fake_state_.config_provider()->var_is_oobe_enabled()->reset(
     86         new bool(true));
     87 
     88     // For the purpose of the tests, this is an official build and OOBE was
     89     // completed.
     90     fake_state_.system_provider()->var_is_official_build()->reset(
     91         new bool(true));
     92     fake_state_.system_provider()->var_is_oobe_complete()->reset(
     93         new bool(true));
     94     fake_state_.system_provider()->var_num_slots()->reset(new unsigned int(2));
     95 
     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));
    101   }
    102 
    103   // Sets up a default device policy that does not impose any restrictions
    104   // (HTTP) nor enables any features (P2P).
    105   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(
    115         new bool(true));
    116     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 
    140   // 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>>();
    162     // P2P is not disabled by Omaha.
    163     update_state.p2p_downloading_disabled = false;
    164     update_state.p2p_sharing_disabled = false;
    165     // P2P was not attempted.
    166     update_state.p2p_num_attempts = 0;
    167     update_state.p2p_first_attempted = Time();
    168     // 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 
    179     return update_state;
    180   }
    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,
    192               (policy_.*policy_method)(eval_ctx_.get(), &fake_state_, &error,
    193                                        result, args...))
    194         << "Returned error: " << error
    195         << "\nEvaluation context: " << eval_ctx_->DumpContext();
    196   }
    197 
    198   brillo::FakeMessageLoop loop_{nullptr};
    199   FakeClock fake_clock_;
    200   FakeState fake_state_;
    201   scoped_refptr<EvaluationContext> eval_ctx_;
    202   ChromeOSPolicy policy_;  // ChromeOSPolicy under test.
    203 };
    204 
    205 TEST_F(UmChromeOSPolicyTest, FirstCheckIsAtMostInitialIntervalAfterStart) {
    206   Time next_update_check;
    207 
    208   // 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 
    213   ExpectPolicyStatus(EvalStatus::kSucceeded,
    214                      &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
    215 
    216   EXPECT_LE(fake_clock_.GetWallclockTime(), next_update_check);
    217   EXPECT_GE(
    218       fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
    219           ChromeOSPolicy::kTimeoutInitialInterval +
    220           ChromeOSPolicy::kTimeoutRegularFuzz / 2),
    221       next_update_check);
    222 }
    223 
    224 TEST_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 
    244 TEST_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()->
    250       reset(new unsigned int{2});
    251 
    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);
    264 }
    265 
    266 TEST_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()->
    272       reset(new unsigned int{kInterval});
    273   // We should not be backing off in this case.
    274   fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
    275       reset(new unsigned int{2});
    276 
    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 
    290 TEST_F(UmChromeOSPolicyTest, ExponentialBackoffIsCapped) {
    291   Time next_update_check;
    292 
    293   fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
    294       reset(new unsigned int{100});
    295 
    296   ExpectPolicyStatus(EvalStatus::kSucceeded,
    297                      &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
    298 
    299   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);
    309 }
    310 
    311 TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWaitsForTheTimeout) {
    312   // 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 
    319   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);
    342   EXPECT_TRUE(result.updates_enabled);
    343   EXPECT_FALSE(result.is_interactive);
    344 }
    345 
    346 TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWaitsForOOBE) {
    347   // Update checks are deferred until OOBE is completed.
    348 
    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);
    380   EXPECT_FALSE(result.is_interactive);
    381 }
    382 
    383 TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWithAttributes) {
    384   // Update check is allowed, response includes attributes for use in the
    385   // request.
    386   SetUpdateCheckAllowed(true);
    387 
    388   // Override specific device policy attributes.
    389   fake_state_.device_policy_provider()->var_target_version_prefix()->
    390       reset(new string("1.2"));
    391   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);
    400   EXPECT_EQ("1.2", result.target_version_prefix);
    401   EXPECT_EQ("foo-channel", result.target_channel);
    402   EXPECT_FALSE(result.is_interactive);
    403 }
    404 
    405 TEST_F(UmChromeOSPolicyTest,
    406        UpdateCheckAllowedUpdatesDisabledForUnofficialBuilds) {
    407   // UpdateCheckAllowed should return kAskMeAgainLater if this is an unofficial
    408   // build; we don't want periodic update checks on developer images.
    409 
    410   fake_state_.system_provider()->var_is_official_build()->reset(
    411       new bool(false));
    412 
    413   UpdateCheckParams result;
    414   ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
    415                      &Policy::UpdateCheckAllowed, &result);
    416 }
    417 
    418 TEST_F(UmChromeOSPolicyTest,
    419        UpdateCheckAllowedUpdatesDisabledForRemovableBootDevice) {
    420   // UpdateCheckAllowed should return false (kSucceeded) if the image booted
    421   // from a removable device.
    422 
    423   fake_state_.system_provider()->var_num_slots()->reset(new unsigned int(1));
    424 
    425   UpdateCheckParams result;
    426   ExpectPolicyStatus(EvalStatus::kSucceeded,
    427                      &Policy::UpdateCheckAllowed, &result);
    428   EXPECT_FALSE(result.updates_enabled);
    429 }
    430 
    431 TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedUpdatesDisabledByPolicy) {
    432   // 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 
    439   UpdateCheckParams result;
    440   ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
    441                      &Policy::UpdateCheckAllowed, &result);
    442 }
    443 
    444 TEST_F(UmChromeOSPolicyTest,
    445        UpdateCheckAllowedForcedUpdateRequestedInteractive) {
    446   // UpdateCheckAllowed should return true because a forced update request was
    447   // signaled for an interactive update.
    448 
    449   SetUpdateCheckAllowed(true);
    450   fake_state_.updater_provider()->var_forced_update_requested()->reset(
    451       new UpdateRequestStatus(UpdateRequestStatus::kInteractive));
    452 
    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 
    460 TEST_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 
    475 TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsCheckAllowedError) {
    476   // 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));
    484   UpdateDownloadParams result;
    485   ExpectPolicyStatus(EvalStatus::kFailed,
    486                      &Policy::UpdateCanStart, &result, update_state);
    487 }
    488 
    489 TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedCheckDue) {
    490   // The UpdateCanStart policy returns false because we are due for another
    491   // update check. Ensure that download related values are still returned.
    492 
    493   SetUpdateCheckAllowed(true);
    494 
    495   // Check that the UpdateCanStart returns false.
    496   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
    497   UpdateDownloadParams result;
    498   ExpectPolicyStatus(EvalStatus::kSucceeded,
    499                      &Policy::UpdateCanStart, &result, update_state);
    500   EXPECT_FALSE(result.update_can_start);
    501   EXPECT_EQ(UpdateCannotStartReason::kCheckDue, result.cannot_start_reason);
    502   EXPECT_EQ(0, result.download_url_idx);
    503   EXPECT_EQ(0, result.download_url_num_errors);
    504 }
    505 
    506 TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoDevicePolicy) {
    507   // 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));
    515   UpdateDownloadParams result;
    516   ExpectPolicyStatus(EvalStatus::kSucceeded,
    517                      &Policy::UpdateCanStart, &result, update_state);
    518   EXPECT_TRUE(result.update_can_start);
    519   EXPECT_FALSE(result.p2p_downloading_allowed);
    520   EXPECT_FALSE(result.p2p_sharing_allowed);
    521   EXPECT_EQ(0, result.download_url_idx);
    522   EXPECT_TRUE(result.download_url_allowed);
    523   EXPECT_EQ(0, result.download_url_num_errors);
    524   EXPECT_FALSE(result.do_increment_failures);
    525 }
    526 
    527 TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBlankPolicy) {
    528   // 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));
    535   UpdateDownloadParams result;
    536   ExpectPolicyStatus(EvalStatus::kSucceeded,
    537                      &Policy::UpdateCanStart, &result, update_state);
    538   EXPECT_TRUE(result.update_can_start);
    539   EXPECT_FALSE(result.p2p_downloading_allowed);
    540   EXPECT_FALSE(result.p2p_sharing_allowed);
    541   EXPECT_EQ(0, result.download_url_idx);
    542   EXPECT_TRUE(result.download_url_allowed);
    543   EXPECT_EQ(0, result.download_url_num_errors);
    544   EXPECT_FALSE(result.do_increment_failures);
    545 }
    546 
    547 TEST_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 
    575 TEST_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 
    605 TEST_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);
    631   EXPECT_TRUE(result.download_url_allowed);
    632   EXPECT_EQ(0, result.download_url_num_errors);
    633   EXPECT_FALSE(result.do_increment_failures);
    634   EXPECT_EQ(Time(), result.backoff_expiry);
    635 }
    636 
    637 TEST_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);
    662   EXPECT_TRUE(result.download_url_allowed);
    663   EXPECT_EQ(0, result.download_url_num_errors);
    664   EXPECT_TRUE(result.do_increment_failures);
    665   EXPECT_EQ(Time(), result.backoff_expiry);
    666 }
    667 
    668 TEST_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);
    693   EXPECT_TRUE(result.download_url_allowed);
    694   EXPECT_EQ(0, result.download_url_num_errors);
    695   EXPECT_TRUE(result.do_increment_failures);
    696   EXPECT_EQ(Time(), result.backoff_expiry);
    697 }
    698 
    699 TEST_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);
    724   EXPECT_TRUE(result.download_url_allowed);
    725   EXPECT_EQ(0, result.download_url_num_errors);
    726   EXPECT_TRUE(result.do_increment_failures);
    727   EXPECT_EQ(Time(), result.backoff_expiry);
    728 }
    729 
    730 TEST_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);
    757   EXPECT_TRUE(result.download_url_allowed);
    758   EXPECT_EQ(0, result.download_url_num_errors);
    759   EXPECT_TRUE(result.do_increment_failures);
    760   EXPECT_EQ(Time(), result.backoff_expiry);
    761 }
    762 
    763 TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsScatteringFailed) {
    764   // 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.
    771   // 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.
    774   fake_state_.random_provider()->var_seed()->reset(nullptr);
    775 
    776   // Check that the UpdateCanStart fails.
    777   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
    778   UpdateDownloadParams result;
    779   ExpectPolicyStatus(EvalStatus::kFailed,
    780                      &Policy::UpdateCanStart, &result, update_state);
    781 }
    782 
    783 TEST_F(UmChromeOSPolicyTest,
    784        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.
    798   UpdateDownloadParams result;
    799   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
    800                      update_state);
    801   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 
    807 TEST_F(UmChromeOSPolicyTest,
    808        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.
    822   UpdateDownloadParams result;
    823   ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::UpdateCanStart,
    824                      &result, update_state);
    825   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 
    831 TEST_F(UmChromeOSPolicyTest,
    832        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.
    848   UpdateDownloadParams result;
    849   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
    850                      update_state);
    851   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 
    857 TEST_F(UmChromeOSPolicyTest,
    858        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.
    872   UpdateDownloadParams result;
    873   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
    874                      update_state);
    875   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 
    880 TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedScatteringSatisfied) {
    881   // 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.
    897   UpdateDownloadParams result;
    898   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
    899                      update_state);
    900   EXPECT_TRUE(result.update_can_start);
    901   EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
    902   EXPECT_EQ(0, result.scatter_check_threshold);
    903   EXPECT_EQ(0, result.download_url_idx);
    904   EXPECT_TRUE(result.download_url_allowed);
    905   EXPECT_EQ(0, result.download_url_num_errors);
    906   EXPECT_FALSE(result.do_increment_failures);
    907 }
    908 
    909 TEST_F(UmChromeOSPolicyTest,
    910        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));
    920   update_state.is_interactive = true;
    921   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.
    926   UpdateDownloadParams result;
    927   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
    928                      update_state);
    929   EXPECT_TRUE(result.update_can_start);
    930   EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
    931   EXPECT_EQ(0, result.scatter_check_threshold);
    932   EXPECT_EQ(0, result.download_url_idx);
    933   EXPECT_TRUE(result.download_url_allowed);
    934   EXPECT_EQ(0, result.download_url_num_errors);
    935   EXPECT_FALSE(result.do_increment_failures);
    936 }
    937 
    938 TEST_F(UmChromeOSPolicyTest,
    939        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));
    950   update_state.is_interactive = true;
    951   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.
    956   UpdateDownloadParams result;
    957   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
    958                      update_state);
    959   EXPECT_TRUE(result.update_can_start);
    960   EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
    961   EXPECT_EQ(0, result.scatter_check_threshold);
    962   EXPECT_EQ(0, result.download_url_idx);
    963   EXPECT_TRUE(result.download_url_allowed);
    964   EXPECT_EQ(0, result.download_url_num_errors);
    965   EXPECT_FALSE(result.do_increment_failures);
    966 }
    967 
    968 TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithAttributes) {
    969   // 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));
    979 
    980   // Check that the UpdateCanStart returns true.
    981   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
    982   UpdateDownloadParams result;
    983   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
    984                      update_state);
    985   EXPECT_TRUE(result.update_can_start);
    986   EXPECT_TRUE(result.p2p_downloading_allowed);
    987   EXPECT_TRUE(result.p2p_sharing_allowed);
    988   EXPECT_EQ(0, result.download_url_idx);
    989   EXPECT_TRUE(result.download_url_allowed);
    990   EXPECT_EQ(0, result.download_url_num_errors);
    991   EXPECT_FALSE(result.do_increment_failures);
    992 }
    993 
    994 TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithP2PFromUpdater) {
    995   // 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.
   1002   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));
   1006   UpdateDownloadParams result;
   1007   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
   1008                      update_state);
   1009   EXPECT_TRUE(result.update_can_start);
   1010   EXPECT_TRUE(result.p2p_downloading_allowed);
   1011   EXPECT_TRUE(result.p2p_sharing_allowed);
   1012   EXPECT_EQ(0, result.download_url_idx);
   1013   EXPECT_TRUE(result.download_url_allowed);
   1014   EXPECT_EQ(0, result.download_url_num_errors);
   1015   EXPECT_FALSE(result.do_increment_failures);
   1016 }
   1017 
   1018 TEST_F(UmChromeOSPolicyTest,
   1019        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 
   1043 TEST_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 
   1068 TEST_F(UmChromeOSPolicyTest,
   1069        UpdateCanStartAllowedP2PDownloadingBlockedDueToNumAttempts) {
   1070   // The UpdateCanStart policy returns true; device policy permits HTTP but
   1071   // blocks P2P download, because the max number of P2P downloads have been
   1072   // attempted. P2P sharing is still permitted.
   1073 
   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);
   1089   EXPECT_FALSE(result.p2p_downloading_allowed);
   1090   EXPECT_TRUE(result.p2p_sharing_allowed);
   1091 }
   1092 
   1093 TEST_F(UmChromeOSPolicyTest,
   1094        UpdateCanStartAllowedP2PDownloadingBlockedDueToAttemptsPeriod) {
   1095   // The UpdateCanStart policy returns true; device policy permits HTTP but
   1096   // blocks P2P download, because the max period for attempt to download via P2P
   1097   // has elapsed. P2P sharing is still permitted.
   1098 
   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() -
   1112       TimeDelta::FromSeconds(
   1113           ChromeOSPolicy::kMaxP2PAttemptsPeriodInSeconds + 1);
   1114   UpdateDownloadParams result;
   1115   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
   1116                      update_state);
   1117   EXPECT_TRUE(result.update_can_start);
   1118   EXPECT_FALSE(result.p2p_downloading_allowed);
   1119   EXPECT_TRUE(result.p2p_sharing_allowed);
   1120 }
   1121 
   1122 TEST_F(UmChromeOSPolicyTest,
   1123        UpdateCanStartAllowedWithHttpUrlForUnofficialBuild) {
   1124   // 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.
   1131   fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
   1132       new bool(false));
   1133   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));
   1138   UpdateDownloadParams result;
   1139   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
   1140                      update_state);
   1141   EXPECT_TRUE(result.update_can_start);
   1142   EXPECT_EQ(0, result.download_url_idx);
   1143   EXPECT_TRUE(result.download_url_allowed);
   1144   EXPECT_EQ(0, result.download_url_num_errors);
   1145   EXPECT_FALSE(result.do_increment_failures);
   1146 }
   1147 
   1148 TEST_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));
   1160   update_state.download_urls.emplace_back("https://secure/url/");
   1161 
   1162   // Check that the UpdateCanStart returns true.
   1163   UpdateDownloadParams result;
   1164   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
   1165                      update_state);
   1166   EXPECT_TRUE(result.update_can_start);
   1167   EXPECT_EQ(1, result.download_url_idx);
   1168   EXPECT_TRUE(result.download_url_allowed);
   1169   EXPECT_EQ(0, result.download_url_num_errors);
   1170   EXPECT_FALSE(result.do_increment_failures);
   1171 }
   1172 
   1173 TEST_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);
   1197   EXPECT_EQ(0, result.download_url_idx);
   1198   EXPECT_TRUE(result.download_url_allowed);
   1199   EXPECT_EQ(5, result.download_url_num_errors);
   1200   EXPECT_FALSE(result.do_increment_failures);
   1201 }
   1202 
   1203 TEST_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
   1210   // disqualify the current (first) URL.
   1211   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
   1212   update_state.num_checks = 10;
   1213   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   }
   1220 
   1221   // Check that the UpdateCanStart returns true.
   1222   UpdateDownloadParams result;
   1223   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
   1224                      update_state);
   1225   EXPECT_TRUE(result.update_can_start);
   1226   EXPECT_EQ(1, result.download_url_idx);
   1227   EXPECT_TRUE(result.download_url_allowed);
   1228   EXPECT_EQ(0, result.download_url_num_errors);
   1229   EXPECT_FALSE(result.do_increment_failures);
   1230 }
   1231 
   1232 TEST_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;
   1242   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));
   1246 
   1247   // Check that the UpdateCanStart returns true.
   1248   UpdateDownloadParams result;
   1249   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
   1250                      update_state);
   1251   EXPECT_TRUE(result.update_can_start);
   1252   EXPECT_EQ(1, result.download_url_idx);
   1253   EXPECT_TRUE(result.download_url_allowed);
   1254   EXPECT_EQ(0, result.download_url_num_errors);
   1255   EXPECT_FALSE(result.do_increment_failures);
   1256 }
   1257 
   1258 TEST_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
   1265   // causes it to switch directly to the next URL. We must disable backoff in
   1266   // order for it not to interfere.
   1267   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
   1268   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));
   1274 
   1275   // Check that the UpdateCanStart returns true.
   1276   UpdateDownloadParams result;
   1277   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
   1278                      update_state);
   1279   EXPECT_TRUE(result.update_can_start);
   1280   EXPECT_EQ(0, result.download_url_idx);
   1281   EXPECT_TRUE(result.download_url_allowed);
   1282   EXPECT_EQ(0, result.download_url_num_errors);
   1283   EXPECT_TRUE(result.do_increment_failures);
   1284 }
   1285 
   1286 TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedNoUsableUrls) {
   1287   // The UpdateCanStart policy returns false; there's a single HTTP URL but its
   1288   // use is forbidden by policy.
   1289   //
   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.
   1294 
   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));
   1303   UpdateDownloadParams result;
   1304   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);
   1310 }
   1311 
   1312 TEST_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.
   1316   //
   1317   // Note: The number of failed attempts should not increase in this case (see
   1318   // above test).
   1319 
   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));
   1330   UpdateDownloadParams result;
   1331   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
   1332                      update_state);
   1333   EXPECT_TRUE(result.update_can_start);
   1334   EXPECT_TRUE(result.p2p_downloading_allowed);
   1335   EXPECT_TRUE(result.p2p_sharing_allowed);
   1336   EXPECT_GT(0, result.download_url_idx);
   1337   EXPECT_TRUE(result.download_url_allowed);
   1338   EXPECT_EQ(0, result.download_url_num_errors);
   1339   EXPECT_FALSE(result.do_increment_failures);
   1340 }
   1341 
   1342 TEST_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);
   1366   EXPECT_TRUE(result.p2p_downloading_allowed);
   1367   EXPECT_TRUE(result.p2p_sharing_allowed);
   1368   EXPECT_GT(0, result.download_url_idx);
   1369   EXPECT_TRUE(result.download_url_allowed);
   1370   EXPECT_EQ(0, result.download_url_num_errors);
   1371   EXPECT_FALSE(result.do_increment_failures);
   1372 }
   1373 
   1374 TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedEthernetDefault) {
   1375   // 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,
   1382                      &Policy::UpdateDownloadAllowed, &result);
   1383   EXPECT_TRUE(result);
   1384 }
   1385 
   1386 TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWifiDefault) {
   1387   // 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,
   1394                      &Policy::UpdateDownloadAllowed, &result);
   1395   EXPECT_TRUE(result);
   1396 }
   1397 
   1398 TEST_F(UmChromeOSPolicyTest,
   1399        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;
   1408   ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
   1409                      &Policy::UpdateDownloadAllowed, &result);
   1410 }
   1411 
   1412 TEST_F(UmChromeOSPolicyTest,
   1413        UpdateDownloadAllowedWifiTetheredPolicyOverride) {
   1414   // 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,
   1428                      &Policy::UpdateDownloadAllowed, &result);
   1429   EXPECT_TRUE(result);
   1430 }
   1431 
   1432 TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWimaxDefault) {
   1433   // 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,
   1440                      &Policy::UpdateDownloadAllowed, &result);
   1441   EXPECT_TRUE(result);
   1442 }
   1443 
   1444 TEST_F(UmChromeOSPolicyTest,
   1445        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;
   1452   ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
   1453                      &Policy::UpdateDownloadAllowed, &result);
   1454 }
   1455 
   1456 TEST_F(UmChromeOSPolicyTest,
   1457        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;
   1469   ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
   1470                      &Policy::UpdateDownloadAllowed, &result);
   1471 }
   1472 
   1473 TEST_F(UmChromeOSPolicyTest, UpdateCurrentConnectionNotAllowedCellularDefault) {
   1474   // 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;
   1480   ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
   1481                      &Policy::UpdateDownloadAllowed, &result);
   1482 }
   1483 
   1484 TEST_F(UmChromeOSPolicyTest,
   1485        UpdateDownloadAllowedCellularPolicyOverride) {
   1486   // 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,
   1498                      &Policy::UpdateDownloadAllowed, &result);
   1499   EXPECT_TRUE(result);
   1500 }
   1501 
   1502 TEST_F(UmChromeOSPolicyTest,
   1503        UpdateDownloadAllowedCellularUserOverride) {
   1504   // 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,
   1516                      &Policy::UpdateDownloadAllowed, &result);
   1517   EXPECT_TRUE(result);
   1518 }
   1519 
   1520 TEST_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 
   1548 TEST_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 
   1580 TEST_F(UmChromeOSPolicyTest, P2PEnabledNotAllowed) {
   1581   bool result;
   1582   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
   1583   EXPECT_FALSE(result);
   1584 }
   1585 
   1586 TEST_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 
   1595 TEST_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 
   1603 TEST_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 
   1612 TEST_F(UmChromeOSPolicyTest, P2PEnabledChangedBlocks) {
   1613   bool result;
   1614   ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::P2PEnabledChanged,
   1615                      &result, false);
   1616 }
   1617 
   1618 }  // namespace chromeos_update_manager
   1619