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::ConnectionTethering;
     36 using chromeos_update_engine::ConnectionType;
     37 using chromeos_update_engine::ErrorCode;
     38 using chromeos_update_engine::FakeClock;
     39 using std::set;
     40 using std::string;
     41 using std::tuple;
     42 using std::vector;
     43 
     44 namespace chromeos_update_manager {
     45 
     46 class UmChromeOSPolicyTest : public ::testing::Test {
     47  protected:
     48   void SetUp() override {
     49     loop_.SetAsCurrent();
     50     SetUpDefaultClock();
     51     eval_ctx_ = new EvaluationContext(&fake_clock_, TimeDelta::FromSeconds(5));
     52     SetUpDefaultState();
     53     SetUpDefaultDevicePolicy();
     54   }
     55 
     56   void TearDown() override {
     57     EXPECT_FALSE(loop_.PendingTasks());
     58   }
     59 
     60   // Sets the clock to fixed values.
     61   void SetUpDefaultClock() {
     62     fake_clock_.SetMonotonicTime(Time::FromInternalValue(12345678L));
     63     fake_clock_.SetWallclockTime(Time::FromInternalValue(12345678901234L));
     64   }
     65 
     66   void SetUpDefaultState() {
     67     fake_state_.updater_provider()->var_updater_started_time()->reset(
     68         new Time(fake_clock_.GetWallclockTime()));
     69     fake_state_.updater_provider()->var_last_checked_time()->reset(
     70         new Time(fake_clock_.GetWallclockTime()));
     71     fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
     72         reset(new unsigned int{0});
     73     fake_state_.updater_provider()->var_server_dictated_poll_interval()->
     74         reset(new unsigned int{0});
     75     fake_state_.updater_provider()->var_forced_update_requested()->
     76         reset(new UpdateRequestStatus{UpdateRequestStatus::kNone});
     77 
     78     fake_state_.random_provider()->var_seed()->reset(
     79         new uint64_t(4));  // chosen by fair dice roll.
     80                            // guaranteed to be random.
     81 
     82     // No device policy loaded by default.
     83     fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
     84         new bool(false));
     85 
     86     // OOBE is enabled by default.
     87     fake_state_.config_provider()->var_is_oobe_enabled()->reset(
     88         new bool(true));
     89 
     90     // For the purpose of the tests, this is an official build and OOBE was
     91     // completed.
     92     fake_state_.system_provider()->var_is_official_build()->reset(
     93         new bool(true));
     94     fake_state_.system_provider()->var_is_oobe_complete()->reset(
     95         new bool(true));
     96     fake_state_.system_provider()->var_num_slots()->reset(new unsigned int(2));
     97 
     98     // Connection is wifi, untethered.
     99     fake_state_.shill_provider()->var_conn_type()->
    100         reset(new ConnectionType(ConnectionType::kWifi));
    101     fake_state_.shill_provider()->var_conn_tethering()->
    102         reset(new ConnectionTethering(ConnectionTethering::kNotDetected));
    103   }
    104 
    105   // Sets up a default device policy that does not impose any restrictions
    106   // (HTTP) nor enables any features (P2P).
    107   void SetUpDefaultDevicePolicy() {
    108     fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
    109         new bool(true));
    110     fake_state_.device_policy_provider()->var_update_disabled()->reset(
    111         new bool(false));
    112     fake_state_.device_policy_provider()->
    113         var_allowed_connection_types_for_update()->reset(nullptr);
    114     fake_state_.device_policy_provider()->var_scatter_factor()->reset(
    115         new TimeDelta());
    116     fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
    117         new bool(true));
    118     fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
    119         new bool(false));
    120     fake_state_.device_policy_provider()->var_release_channel_delegated()->
    121         reset(new bool(true));
    122   }
    123 
    124   // Configures the UpdateCheckAllowed policy to return a desired value by
    125   // faking the current wall clock time as needed. Restores the default state.
    126   // This is used when testing policies that depend on this one.
    127   void SetUpdateCheckAllowed(bool allow_check) {
    128     Time next_update_check;
    129     ExpectPolicyStatus(EvalStatus::kSucceeded,
    130                        &ChromeOSPolicy::NextUpdateCheckTime,
    131                        &next_update_check);
    132     SetUpDefaultState();
    133     SetUpDefaultDevicePolicy();
    134     Time curr_time = next_update_check;
    135     if (allow_check)
    136       curr_time += TimeDelta::FromSeconds(1);
    137     else
    138       curr_time -= TimeDelta::FromSeconds(1);
    139     fake_clock_.SetWallclockTime(curr_time);
    140   }
    141 
    142   // Returns a default UpdateState structure:
    143   UpdateState GetDefaultUpdateState(TimeDelta first_seen_period) {
    144     Time first_seen_time = fake_clock_.GetWallclockTime() - first_seen_period;
    145     UpdateState update_state = UpdateState();
    146 
    147     // This is a non-interactive check returning a delta payload, seen for the
    148     // first time (|first_seen_period| ago). Clearly, there were no failed
    149     // attempts so far.
    150     update_state.is_interactive = false;
    151     update_state.is_delta_payload = false;
    152     update_state.first_seen = first_seen_time;
    153     update_state.num_checks = 1;
    154     update_state.num_failures = 0;
    155     update_state.failures_last_updated = Time();  // Needs to be zero.
    156     // There's a single HTTP download URL with a maximum of 10 retries.
    157     update_state.download_urls = vector<string>{"http://fake/url/"};
    158     update_state.download_errors_max = 10;
    159     // Download was never attempted.
    160     update_state.last_download_url_idx = -1;
    161     update_state.last_download_url_num_errors = 0;
    162     // There were no download errors.
    163     update_state.download_errors = vector<tuple<int, ErrorCode, Time>>();
    164     // P2P is not disabled by Omaha.
    165     update_state.p2p_downloading_disabled = false;
    166     update_state.p2p_sharing_disabled = false;
    167     // P2P was not attempted.
    168     update_state.p2p_num_attempts = 0;
    169     update_state.p2p_first_attempted = Time();
    170     // No active backoff period, backoff is not disabled by Omaha.
    171     update_state.backoff_expiry = Time();
    172     update_state.is_backoff_disabled = false;
    173     // There is no active scattering wait period (max 7 days allowed) nor check
    174     // threshold (none allowed).
    175     update_state.scatter_wait_period = TimeDelta();
    176     update_state.scatter_check_threshold = 0;
    177     update_state.scatter_wait_period_max = TimeDelta::FromDays(7);
    178     update_state.scatter_check_threshold_min = 0;
    179     update_state.scatter_check_threshold_max = 0;
    180 
    181     return update_state;
    182   }
    183 
    184   // Runs the passed |policy_method| policy and expects it to return the
    185   // |expected| return value.
    186   template<typename T, typename R, typename... Args>
    187   void ExpectPolicyStatus(
    188       EvalStatus expected,
    189       T policy_method,
    190       R* result, Args... args) {
    191     string error = "<None>";
    192     eval_ctx_->ResetEvaluation();
    193     EXPECT_EQ(expected,
    194               (policy_.*policy_method)(eval_ctx_.get(), &fake_state_, &error,
    195                                        result, args...))
    196         << "Returned error: " << error
    197         << "\nEvaluation context: " << eval_ctx_->DumpContext();
    198   }
    199 
    200   brillo::FakeMessageLoop loop_{nullptr};
    201   FakeClock fake_clock_;
    202   FakeState fake_state_;
    203   scoped_refptr<EvaluationContext> eval_ctx_;
    204   ChromeOSPolicy policy_;  // ChromeOSPolicy under test.
    205 };
    206 
    207 TEST_F(UmChromeOSPolicyTest, FirstCheckIsAtMostInitialIntervalAfterStart) {
    208   Time next_update_check;
    209 
    210   // Set the last update time so it'll appear as if this is a first update check
    211   // in the lifetime of the current updater.
    212   fake_state_.updater_provider()->var_last_checked_time()->reset(
    213       new Time(fake_clock_.GetWallclockTime() - TimeDelta::FromMinutes(10)));
    214 
    215   ExpectPolicyStatus(EvalStatus::kSucceeded,
    216                      &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
    217 
    218   EXPECT_LE(fake_clock_.GetWallclockTime(), next_update_check);
    219   EXPECT_GE(
    220       fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
    221           ChromeOSPolicy::kTimeoutInitialInterval +
    222           ChromeOSPolicy::kTimeoutRegularFuzz / 2),
    223       next_update_check);
    224 }
    225 
    226 TEST_F(UmChromeOSPolicyTest, RecurringCheckBaseIntervalAndFuzz) {
    227   // Ensure that we're using the correct interval (kPeriodicInterval) and fuzz
    228   // (kTimeoutRegularFuzz) as base values for period updates.
    229   Time next_update_check;
    230 
    231   ExpectPolicyStatus(EvalStatus::kSucceeded,
    232                      &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
    233 
    234   EXPECT_LE(
    235       fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
    236           ChromeOSPolicy::kTimeoutPeriodicInterval -
    237           ChromeOSPolicy::kTimeoutRegularFuzz / 2),
    238       next_update_check);
    239   EXPECT_GE(
    240       fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
    241           ChromeOSPolicy::kTimeoutPeriodicInterval +
    242           ChromeOSPolicy::kTimeoutRegularFuzz / 2),
    243       next_update_check);
    244 }
    245 
    246 TEST_F(UmChromeOSPolicyTest, RecurringCheckBackoffIntervalAndFuzz) {
    247   // Ensure that we're properly backing off and fuzzing in the presence of
    248   // failed updates attempts.
    249   Time next_update_check;
    250 
    251   fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
    252       reset(new unsigned int{2});
    253 
    254   ExpectPolicyStatus(EvalStatus::kSucceeded,
    255                      &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
    256 
    257   int expected_interval = ChromeOSPolicy::kTimeoutPeriodicInterval * 4;
    258   EXPECT_LE(
    259       fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
    260           expected_interval - expected_interval / 2),
    261       next_update_check);
    262   EXPECT_GE(
    263       fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
    264           expected_interval + expected_interval / 2),
    265       next_update_check);
    266 }
    267 
    268 TEST_F(UmChromeOSPolicyTest, RecurringCheckServerDictatedPollInterval) {
    269   // Policy honors the server provided check poll interval.
    270   Time next_update_check;
    271 
    272   const unsigned int kInterval = ChromeOSPolicy::kTimeoutPeriodicInterval * 4;
    273   fake_state_.updater_provider()->var_server_dictated_poll_interval()->
    274       reset(new unsigned int{kInterval});
    275   // We should not be backing off in this case.
    276   fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
    277       reset(new unsigned int{2});
    278 
    279   ExpectPolicyStatus(EvalStatus::kSucceeded,
    280                      &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
    281 
    282   EXPECT_LE(
    283       fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
    284           kInterval - kInterval / 2),
    285       next_update_check);
    286   EXPECT_GE(
    287       fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
    288           kInterval + kInterval / 2),
    289       next_update_check);
    290 }
    291 
    292 TEST_F(UmChromeOSPolicyTest, ExponentialBackoffIsCapped) {
    293   Time next_update_check;
    294 
    295   fake_state_.updater_provider()->var_consecutive_failed_update_checks()->
    296       reset(new unsigned int{100});
    297 
    298   ExpectPolicyStatus(EvalStatus::kSucceeded,
    299                      &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
    300 
    301   EXPECT_LE(
    302       fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
    303           ChromeOSPolicy::kTimeoutMaxBackoffInterval -
    304           ChromeOSPolicy::kTimeoutMaxBackoffInterval / 2),
    305       next_update_check);
    306   EXPECT_GE(
    307       fake_clock_.GetWallclockTime() + TimeDelta::FromSeconds(
    308           ChromeOSPolicy::kTimeoutMaxBackoffInterval +
    309           ChromeOSPolicy::kTimeoutMaxBackoffInterval /2),
    310       next_update_check);
    311 }
    312 
    313 TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWaitsForTheTimeout) {
    314   // We get the next update_check timestamp from the policy's private method
    315   // and then we check the public method respects that value on the normal
    316   // case.
    317   Time next_update_check;
    318   Time last_checked_time =
    319       fake_clock_.GetWallclockTime() + TimeDelta::FromMinutes(1234);
    320 
    321   fake_state_.updater_provider()->var_last_checked_time()->reset(
    322       new Time(last_checked_time));
    323   ExpectPolicyStatus(EvalStatus::kSucceeded,
    324                      &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
    325 
    326   UpdateCheckParams result;
    327 
    328   // Check that the policy blocks until the next_update_check is reached.
    329   SetUpDefaultClock();
    330   SetUpDefaultState();
    331   fake_state_.updater_provider()->var_last_checked_time()->reset(
    332       new Time(last_checked_time));
    333   fake_clock_.SetWallclockTime(next_update_check - TimeDelta::FromSeconds(1));
    334   ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
    335                      &Policy::UpdateCheckAllowed, &result);
    336 
    337   SetUpDefaultClock();
    338   SetUpDefaultState();
    339   fake_state_.updater_provider()->var_last_checked_time()->reset(
    340       new Time(last_checked_time));
    341   fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
    342   ExpectPolicyStatus(EvalStatus::kSucceeded,
    343                      &Policy::UpdateCheckAllowed, &result);
    344   EXPECT_TRUE(result.updates_enabled);
    345   EXPECT_FALSE(result.is_interactive);
    346 }
    347 
    348 TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWaitsForOOBE) {
    349   // Update checks are deferred until OOBE is completed.
    350 
    351   // Ensure that update is not allowed even if wait period is satisfied.
    352   Time next_update_check;
    353   Time last_checked_time =
    354       fake_clock_.GetWallclockTime() + TimeDelta::FromMinutes(1234);
    355 
    356   fake_state_.updater_provider()->var_last_checked_time()->reset(
    357       new Time(last_checked_time));
    358   ExpectPolicyStatus(EvalStatus::kSucceeded,
    359                      &ChromeOSPolicy::NextUpdateCheckTime, &next_update_check);
    360 
    361   SetUpDefaultClock();
    362   SetUpDefaultState();
    363   fake_state_.updater_provider()->var_last_checked_time()->reset(
    364       new Time(last_checked_time));
    365   fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
    366   fake_state_.system_provider()->var_is_oobe_complete()->reset(
    367       new bool(false));
    368 
    369   UpdateCheckParams result;
    370   ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
    371                      &Policy::UpdateCheckAllowed, &result);
    372 
    373   // Now check that it is allowed if OOBE is completed.
    374   SetUpDefaultClock();
    375   SetUpDefaultState();
    376   fake_state_.updater_provider()->var_last_checked_time()->reset(
    377       new Time(last_checked_time));
    378   fake_clock_.SetWallclockTime(next_update_check + TimeDelta::FromSeconds(1));
    379   ExpectPolicyStatus(EvalStatus::kSucceeded,
    380                      &Policy::UpdateCheckAllowed, &result);
    381   EXPECT_TRUE(result.updates_enabled);
    382   EXPECT_FALSE(result.is_interactive);
    383 }
    384 
    385 TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedWithAttributes) {
    386   // Update check is allowed, response includes attributes for use in the
    387   // request.
    388   SetUpdateCheckAllowed(true);
    389 
    390   // Override specific device policy attributes.
    391   fake_state_.device_policy_provider()->var_target_version_prefix()->
    392       reset(new string("1.2"));
    393   fake_state_.device_policy_provider()->var_release_channel_delegated()->
    394       reset(new bool(false));
    395   fake_state_.device_policy_provider()->var_release_channel()->
    396       reset(new string("foo-channel"));
    397 
    398   UpdateCheckParams result;
    399   ExpectPolicyStatus(EvalStatus::kSucceeded,
    400                      &Policy::UpdateCheckAllowed, &result);
    401   EXPECT_TRUE(result.updates_enabled);
    402   EXPECT_EQ("1.2", result.target_version_prefix);
    403   EXPECT_EQ("foo-channel", result.target_channel);
    404   EXPECT_FALSE(result.is_interactive);
    405 }
    406 
    407 TEST_F(UmChromeOSPolicyTest,
    408        UpdateCheckAllowedUpdatesDisabledForUnofficialBuilds) {
    409   // UpdateCheckAllowed should return kAskMeAgainLater if this is an unofficial
    410   // build; we don't want periodic update checks on developer images.
    411 
    412   fake_state_.system_provider()->var_is_official_build()->reset(
    413       new bool(false));
    414 
    415   UpdateCheckParams result;
    416   ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
    417                      &Policy::UpdateCheckAllowed, &result);
    418 }
    419 
    420 TEST_F(UmChromeOSPolicyTest,
    421        UpdateCheckAllowedUpdatesDisabledForRemovableBootDevice) {
    422   // UpdateCheckAllowed should return false (kSucceeded) if the image booted
    423   // from a removable device.
    424 
    425   fake_state_.system_provider()->var_num_slots()->reset(new unsigned int(1));
    426 
    427   UpdateCheckParams result;
    428   ExpectPolicyStatus(EvalStatus::kSucceeded,
    429                      &Policy::UpdateCheckAllowed, &result);
    430   EXPECT_FALSE(result.updates_enabled);
    431 }
    432 
    433 TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedUpdatesDisabledByPolicy) {
    434   // UpdateCheckAllowed should return kAskMeAgainLater because a device policy
    435   // is loaded and prohibits updates.
    436 
    437   SetUpdateCheckAllowed(false);
    438   fake_state_.device_policy_provider()->var_update_disabled()->reset(
    439       new bool(true));
    440 
    441   UpdateCheckParams result;
    442   ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
    443                      &Policy::UpdateCheckAllowed, &result);
    444 }
    445 
    446 TEST_F(UmChromeOSPolicyTest,
    447        UpdateCheckAllowedForcedUpdateRequestedInteractive) {
    448   // UpdateCheckAllowed should return true because a forced update request was
    449   // signaled for an interactive update.
    450 
    451   SetUpdateCheckAllowed(true);
    452   fake_state_.updater_provider()->var_forced_update_requested()->reset(
    453       new UpdateRequestStatus(UpdateRequestStatus::kInteractive));
    454 
    455   UpdateCheckParams result;
    456   ExpectPolicyStatus(EvalStatus::kSucceeded,
    457                      &Policy::UpdateCheckAllowed, &result);
    458   EXPECT_TRUE(result.updates_enabled);
    459   EXPECT_TRUE(result.is_interactive);
    460 }
    461 
    462 TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedForcedUpdateRequestedPeriodic) {
    463   // UpdateCheckAllowed should return true because a forced update request was
    464   // signaled for a periodic check.
    465 
    466   SetUpdateCheckAllowed(true);
    467   fake_state_.updater_provider()->var_forced_update_requested()->reset(
    468       new UpdateRequestStatus(UpdateRequestStatus::kPeriodic));
    469 
    470   UpdateCheckParams result;
    471   ExpectPolicyStatus(EvalStatus::kSucceeded,
    472                      &Policy::UpdateCheckAllowed, &result);
    473   EXPECT_TRUE(result.updates_enabled);
    474   EXPECT_FALSE(result.is_interactive);
    475 }
    476 
    477 TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskPin) {
    478   // Update check is allowed.
    479   SetUpdateCheckAllowed(true);
    480 
    481   // A typical setup for kiosk pin policy: AU disabled, allow kiosk to pin
    482   // and there is a kiosk required platform version.
    483   fake_state_.device_policy_provider()->var_update_disabled()->reset(
    484       new bool(true));
    485   fake_state_.device_policy_provider()
    486       ->var_allow_kiosk_app_control_chrome_version()
    487       ->reset(new bool(true));
    488   fake_state_.system_provider()->var_kiosk_required_platform_version()->reset(
    489       new string("1234.0.0"));
    490 
    491   UpdateCheckParams result;
    492   ExpectPolicyStatus(EvalStatus::kSucceeded,
    493                      &Policy::UpdateCheckAllowed, &result);
    494   EXPECT_TRUE(result.updates_enabled);
    495   EXPECT_EQ("1234.0.0", result.target_version_prefix);
    496   EXPECT_FALSE(result.is_interactive);
    497 }
    498 
    499 TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedDisabledWhenNoKioskPin) {
    500   // Update check is allowed.
    501   SetUpdateCheckAllowed(true);
    502 
    503   // Disable AU policy is set but kiosk pin policy is set to false. Update is
    504   // disabled in such case.
    505   fake_state_.device_policy_provider()->var_update_disabled()->reset(
    506       new bool(true));
    507   fake_state_.device_policy_provider()
    508       ->var_allow_kiosk_app_control_chrome_version()
    509       ->reset(new bool(false));
    510 
    511   UpdateCheckParams result;
    512   ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
    513                      &Policy::UpdateCheckAllowed, &result);
    514 }
    515 
    516 TEST_F(UmChromeOSPolicyTest, UpdateCheckAllowedKioskPinWithNoRequiredVersion) {
    517   // Update check is allowed.
    518   SetUpdateCheckAllowed(true);
    519 
    520   // AU disabled, allow kiosk to pin but there is no kiosk required platform
    521   // version (i.e. app does not provide the info). Update to latest in such
    522   // case.
    523   fake_state_.device_policy_provider()->var_update_disabled()->reset(
    524       new bool(true));
    525   fake_state_.device_policy_provider()
    526       ->var_allow_kiosk_app_control_chrome_version()
    527       ->reset(new bool(true));
    528   fake_state_.system_provider()->var_kiosk_required_platform_version()->reset(
    529       new string());
    530 
    531   UpdateCheckParams result;
    532   ExpectPolicyStatus(EvalStatus::kSucceeded,
    533                      &Policy::UpdateCheckAllowed, &result);
    534   EXPECT_TRUE(result.updates_enabled);
    535   EXPECT_TRUE(result.target_version_prefix.empty());
    536   EXPECT_FALSE(result.is_interactive);
    537 }
    538 
    539 TEST_F(UmChromeOSPolicyTest,
    540        UpdateCheckAllowedKioskPinWithFailedGetRequiredVersionCall) {
    541   // AU disabled, allow kiosk to pin but D-Bus call to get required platform
    542   // version failed. Defer update check in this case.
    543   fake_state_.device_policy_provider()->var_update_disabled()->reset(
    544       new bool(true));
    545   fake_state_.device_policy_provider()
    546       ->var_allow_kiosk_app_control_chrome_version()
    547       ->reset(new bool(true));
    548   fake_state_.system_provider()->var_kiosk_required_platform_version()->reset(
    549       nullptr);
    550 
    551   UpdateCheckParams result;
    552   ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
    553                      &Policy::UpdateCheckAllowed, &result);
    554 }
    555 
    556 TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsCheckAllowedError) {
    557   // The UpdateCanStart policy fails, not being able to query
    558   // UpdateCheckAllowed.
    559 
    560   // Configure the UpdateCheckAllowed policy to fail.
    561   fake_state_.updater_provider()->var_updater_started_time()->reset(nullptr);
    562 
    563   // Check that the UpdateCanStart fails.
    564   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
    565   UpdateDownloadParams result;
    566   ExpectPolicyStatus(EvalStatus::kFailed,
    567                      &Policy::UpdateCanStart, &result, update_state);
    568 }
    569 
    570 TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedCheckDue) {
    571   // The UpdateCanStart policy returns false because we are due for another
    572   // update check. Ensure that download related values are still returned.
    573 
    574   SetUpdateCheckAllowed(true);
    575 
    576   // Check that the UpdateCanStart returns false.
    577   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
    578   UpdateDownloadParams result;
    579   ExpectPolicyStatus(EvalStatus::kSucceeded,
    580                      &Policy::UpdateCanStart, &result, update_state);
    581   EXPECT_FALSE(result.update_can_start);
    582   EXPECT_EQ(UpdateCannotStartReason::kCheckDue, result.cannot_start_reason);
    583   EXPECT_EQ(0, result.download_url_idx);
    584   EXPECT_EQ(0, result.download_url_num_errors);
    585 }
    586 
    587 TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoDevicePolicy) {
    588   // The UpdateCanStart policy returns true; no device policy is loaded.
    589 
    590   SetUpdateCheckAllowed(false);
    591   fake_state_.device_policy_provider()->var_device_policy_is_loaded()->reset(
    592       new bool(false));
    593 
    594   // Check that the UpdateCanStart returns true with no further attributes.
    595   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
    596   UpdateDownloadParams result;
    597   ExpectPolicyStatus(EvalStatus::kSucceeded,
    598                      &Policy::UpdateCanStart, &result, update_state);
    599   EXPECT_TRUE(result.update_can_start);
    600   EXPECT_FALSE(result.p2p_downloading_allowed);
    601   EXPECT_FALSE(result.p2p_sharing_allowed);
    602   EXPECT_EQ(0, result.download_url_idx);
    603   EXPECT_TRUE(result.download_url_allowed);
    604   EXPECT_EQ(0, result.download_url_num_errors);
    605   EXPECT_FALSE(result.do_increment_failures);
    606 }
    607 
    608 TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBlankPolicy) {
    609   // The UpdateCanStart policy returns true; device policy is loaded but imposes
    610   // no restrictions on updating.
    611 
    612   SetUpdateCheckAllowed(false);
    613 
    614   // Check that the UpdateCanStart returns true.
    615   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
    616   UpdateDownloadParams result;
    617   ExpectPolicyStatus(EvalStatus::kSucceeded,
    618                      &Policy::UpdateCanStart, &result, update_state);
    619   EXPECT_TRUE(result.update_can_start);
    620   EXPECT_FALSE(result.p2p_downloading_allowed);
    621   EXPECT_FALSE(result.p2p_sharing_allowed);
    622   EXPECT_EQ(0, result.download_url_idx);
    623   EXPECT_TRUE(result.download_url_allowed);
    624   EXPECT_EQ(0, result.download_url_num_errors);
    625   EXPECT_FALSE(result.do_increment_failures);
    626 }
    627 
    628 TEST_F(UmChromeOSPolicyTest,
    629        UpdateCanStartNotAllowedBackoffNewWaitPeriodApplies) {
    630   // The UpdateCanStart policy returns false; failures are reported and a new
    631   // backoff period is enacted.
    632 
    633   SetUpdateCheckAllowed(false);
    634 
    635   const Time curr_time = fake_clock_.GetWallclockTime();
    636   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
    637   update_state.download_errors_max = 1;
    638   update_state.download_errors.emplace_back(
    639       0, ErrorCode::kDownloadTransferError,
    640       curr_time - TimeDelta::FromSeconds(8));
    641   update_state.download_errors.emplace_back(
    642       0, ErrorCode::kDownloadTransferError,
    643       curr_time - TimeDelta::FromSeconds(2));
    644 
    645   // Check that UpdateCanStart returns false and a new backoff expiry is
    646   // generated.
    647   UpdateDownloadParams result;
    648   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
    649                      update_state);
    650   EXPECT_FALSE(result.update_can_start);
    651   EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
    652   EXPECT_TRUE(result.do_increment_failures);
    653   EXPECT_LT(curr_time, result.backoff_expiry);
    654 }
    655 
    656 TEST_F(UmChromeOSPolicyTest,
    657        UpdateCanStartNotAllowedBackoffPrevWaitPeriodStillApplies) {
    658   // The UpdateCanStart policy returns false; a previously enacted backoff
    659   // period still applies.
    660 
    661   SetUpdateCheckAllowed(false);
    662 
    663   const Time curr_time = fake_clock_.GetWallclockTime();
    664   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
    665   update_state.download_errors_max = 1;
    666   update_state.download_errors.emplace_back(
    667       0, ErrorCode::kDownloadTransferError,
    668       curr_time - TimeDelta::FromSeconds(8));
    669   update_state.download_errors.emplace_back(
    670       0, ErrorCode::kDownloadTransferError,
    671       curr_time - TimeDelta::FromSeconds(2));
    672   update_state.failures_last_updated = curr_time;
    673   update_state.backoff_expiry = curr_time + TimeDelta::FromMinutes(3);
    674 
    675   // Check that UpdateCanStart returns false and a new backoff expiry is
    676   // generated.
    677   UpdateDownloadParams result;
    678   ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::UpdateCanStart,
    679                      &result, update_state);
    680   EXPECT_FALSE(result.update_can_start);
    681   EXPECT_EQ(UpdateCannotStartReason::kBackoff, result.cannot_start_reason);
    682   EXPECT_FALSE(result.do_increment_failures);
    683   EXPECT_LT(curr_time, result.backoff_expiry);
    684 }
    685 
    686 TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffSatisfied) {
    687   // The UpdateCanStart policy returns true; a previously enacted backoff period
    688   // has elapsed, we're good to go.
    689 
    690   SetUpdateCheckAllowed(false);
    691 
    692   const Time curr_time = fake_clock_.GetWallclockTime();
    693   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
    694   update_state.download_errors_max = 1;
    695   update_state.download_errors.emplace_back(
    696       0, ErrorCode::kDownloadTransferError,
    697       curr_time - TimeDelta::FromSeconds(8));
    698   update_state.download_errors.emplace_back(
    699       0, ErrorCode::kDownloadTransferError,
    700       curr_time - TimeDelta::FromSeconds(2));
    701   update_state.failures_last_updated = curr_time - TimeDelta::FromSeconds(1);
    702   update_state.backoff_expiry = curr_time - TimeDelta::FromSeconds(1);
    703 
    704   // Check that UpdateCanStart returns false and a new backoff expiry is
    705   // generated.
    706   UpdateDownloadParams result;
    707   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart,
    708                      &result, update_state);
    709   EXPECT_TRUE(result.update_can_start);
    710   EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
    711   EXPECT_EQ(0, result.download_url_idx);
    712   EXPECT_TRUE(result.download_url_allowed);
    713   EXPECT_EQ(0, result.download_url_num_errors);
    714   EXPECT_FALSE(result.do_increment_failures);
    715   EXPECT_EQ(Time(), result.backoff_expiry);
    716 }
    717 
    718 TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedBackoffDisabled) {
    719   // The UpdateCanStart policy returns false; failures are reported but backoff
    720   // is disabled.
    721 
    722   SetUpdateCheckAllowed(false);
    723 
    724   const Time curr_time = fake_clock_.GetWallclockTime();
    725   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
    726   update_state.download_errors_max = 1;
    727   update_state.download_errors.emplace_back(
    728       0, ErrorCode::kDownloadTransferError,
    729       curr_time - TimeDelta::FromSeconds(8));
    730   update_state.download_errors.emplace_back(
    731       0, ErrorCode::kDownloadTransferError,
    732       curr_time - TimeDelta::FromSeconds(2));
    733   update_state.is_backoff_disabled = true;
    734 
    735   // Check that UpdateCanStart returns false and a new backoff expiry is
    736   // generated.
    737   UpdateDownloadParams result;
    738   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
    739                      update_state);
    740   EXPECT_TRUE(result.update_can_start);
    741   EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
    742   EXPECT_EQ(0, result.download_url_idx);
    743   EXPECT_TRUE(result.download_url_allowed);
    744   EXPECT_EQ(0, result.download_url_num_errors);
    745   EXPECT_TRUE(result.do_increment_failures);
    746   EXPECT_EQ(Time(), result.backoff_expiry);
    747 }
    748 
    749 TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffInteractive) {
    750   // The UpdateCanStart policy returns false; failures are reported but this is
    751   // an interactive update check.
    752 
    753   SetUpdateCheckAllowed(false);
    754 
    755   const Time curr_time = fake_clock_.GetWallclockTime();
    756   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
    757   update_state.download_errors_max = 1;
    758   update_state.download_errors.emplace_back(
    759       0, ErrorCode::kDownloadTransferError,
    760       curr_time - TimeDelta::FromSeconds(8));
    761   update_state.download_errors.emplace_back(
    762       0, ErrorCode::kDownloadTransferError,
    763       curr_time - TimeDelta::FromSeconds(2));
    764   update_state.is_interactive = true;
    765 
    766   // Check that UpdateCanStart returns false and a new backoff expiry is
    767   // generated.
    768   UpdateDownloadParams result;
    769   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
    770                      update_state);
    771   EXPECT_TRUE(result.update_can_start);
    772   EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
    773   EXPECT_EQ(0, result.download_url_idx);
    774   EXPECT_TRUE(result.download_url_allowed);
    775   EXPECT_EQ(0, result.download_url_num_errors);
    776   EXPECT_TRUE(result.do_increment_failures);
    777   EXPECT_EQ(Time(), result.backoff_expiry);
    778 }
    779 
    780 TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffDelta) {
    781   // The UpdateCanStart policy returns false; failures are reported but this is
    782   // a delta payload.
    783 
    784   SetUpdateCheckAllowed(false);
    785 
    786   const Time curr_time = fake_clock_.GetWallclockTime();
    787   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
    788   update_state.download_errors_max = 1;
    789   update_state.download_errors.emplace_back(
    790       0, ErrorCode::kDownloadTransferError,
    791       curr_time - TimeDelta::FromSeconds(8));
    792   update_state.download_errors.emplace_back(
    793       0, ErrorCode::kDownloadTransferError,
    794       curr_time - TimeDelta::FromSeconds(2));
    795   update_state.is_delta_payload = true;
    796 
    797   // Check that UpdateCanStart returns false and a new backoff expiry is
    798   // generated.
    799   UpdateDownloadParams result;
    800   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
    801                      update_state);
    802   EXPECT_TRUE(result.update_can_start);
    803   EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
    804   EXPECT_EQ(0, result.download_url_idx);
    805   EXPECT_TRUE(result.download_url_allowed);
    806   EXPECT_EQ(0, result.download_url_num_errors);
    807   EXPECT_TRUE(result.do_increment_failures);
    808   EXPECT_EQ(Time(), result.backoff_expiry);
    809 }
    810 
    811 TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoBackoffUnofficialBuild) {
    812   // The UpdateCanStart policy returns false; failures are reported but this is
    813   // an unofficial build.
    814 
    815   SetUpdateCheckAllowed(false);
    816 
    817   const Time curr_time = fake_clock_.GetWallclockTime();
    818   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
    819   update_state.download_errors_max = 1;
    820   update_state.download_errors.emplace_back(
    821       0, ErrorCode::kDownloadTransferError,
    822       curr_time - TimeDelta::FromSeconds(8));
    823   update_state.download_errors.emplace_back(
    824       0, ErrorCode::kDownloadTransferError,
    825       curr_time - TimeDelta::FromSeconds(2));
    826 
    827   fake_state_.system_provider()->var_is_official_build()->
    828       reset(new bool(false));
    829 
    830   // Check that UpdateCanStart returns false and a new backoff expiry is
    831   // generated.
    832   UpdateDownloadParams result;
    833   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
    834                      update_state);
    835   EXPECT_TRUE(result.update_can_start);
    836   EXPECT_EQ(UpdateCannotStartReason::kUndefined, result.cannot_start_reason);
    837   EXPECT_EQ(0, result.download_url_idx);
    838   EXPECT_TRUE(result.download_url_allowed);
    839   EXPECT_EQ(0, result.download_url_num_errors);
    840   EXPECT_TRUE(result.do_increment_failures);
    841   EXPECT_EQ(Time(), result.backoff_expiry);
    842 }
    843 
    844 TEST_F(UmChromeOSPolicyTest, UpdateCanStartFailsScatteringFailed) {
    845   // The UpdateCanStart policy fails because the UpdateScattering policy it
    846   // depends on fails (unset variable).
    847 
    848   SetUpdateCheckAllowed(false);
    849 
    850   // Override the default seed variable with a null value so that the policy
    851   // request would fail.
    852   // TODO(garnold) This failure may or may not fail a number
    853   // sub-policies/decisions, like scattering and backoff. We'll need a more
    854   // deliberate setup to ensure that we're failing what we want to be failing.
    855   fake_state_.random_provider()->var_seed()->reset(nullptr);
    856 
    857   // Check that the UpdateCanStart fails.
    858   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
    859   UpdateDownloadParams result;
    860   ExpectPolicyStatus(EvalStatus::kFailed,
    861                      &Policy::UpdateCanStart, &result, update_state);
    862 }
    863 
    864 TEST_F(UmChromeOSPolicyTest,
    865        UpdateCanStartNotAllowedScatteringNewWaitPeriodApplies) {
    866   // The UpdateCanStart policy returns false; device policy is loaded and
    867   // scattering applies due to an unsatisfied wait period, which was newly
    868   // generated.
    869 
    870   SetUpdateCheckAllowed(false);
    871   fake_state_.device_policy_provider()->var_scatter_factor()->reset(
    872       new TimeDelta(TimeDelta::FromMinutes(2)));
    873 
    874 
    875   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
    876 
    877   // Check that the UpdateCanStart returns false and a new wait period
    878   // generated.
    879   UpdateDownloadParams result;
    880   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
    881                      update_state);
    882   EXPECT_FALSE(result.update_can_start);
    883   EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
    884   EXPECT_LT(TimeDelta(), result.scatter_wait_period);
    885   EXPECT_EQ(0, result.scatter_check_threshold);
    886 }
    887 
    888 TEST_F(UmChromeOSPolicyTest,
    889        UpdateCanStartNotAllowedScatteringPrevWaitPeriodStillApplies) {
    890   // The UpdateCanStart policy returns false w/ kAskMeAgainLater; device policy
    891   // is loaded and a previously generated scattering period still applies, none
    892   // of the scattering values has changed.
    893 
    894   SetUpdateCheckAllowed(false);
    895   fake_state_.device_policy_provider()->var_scatter_factor()->reset(
    896       new TimeDelta(TimeDelta::FromMinutes(2)));
    897 
    898   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
    899   update_state.scatter_wait_period = TimeDelta::FromSeconds(35);
    900 
    901   // Check that the UpdateCanStart returns false and a new wait period
    902   // generated.
    903   UpdateDownloadParams result;
    904   ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::UpdateCanStart,
    905                      &result, update_state);
    906   EXPECT_FALSE(result.update_can_start);
    907   EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
    908   EXPECT_EQ(TimeDelta::FromSeconds(35), result.scatter_wait_period);
    909   EXPECT_EQ(0, result.scatter_check_threshold);
    910 }
    911 
    912 TEST_F(UmChromeOSPolicyTest,
    913        UpdateCanStartNotAllowedScatteringNewCountThresholdApplies) {
    914   // The UpdateCanStart policy returns false; device policy is loaded and
    915   // scattering applies due to an unsatisfied update check count threshold.
    916   //
    917   // This ensures a non-zero check threshold, which may or may not be combined
    918   // with a non-zero wait period (for which we cannot reliably control).
    919 
    920   SetUpdateCheckAllowed(false);
    921   fake_state_.device_policy_provider()->var_scatter_factor()->reset(
    922       new TimeDelta(TimeDelta::FromSeconds(1)));
    923 
    924   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
    925   update_state.scatter_check_threshold_min = 2;
    926   update_state.scatter_check_threshold_max = 5;
    927 
    928   // Check that the UpdateCanStart returns false.
    929   UpdateDownloadParams result;
    930   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
    931                      update_state);
    932   EXPECT_FALSE(result.update_can_start);
    933   EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
    934   EXPECT_LE(2, result.scatter_check_threshold);
    935   EXPECT_GE(5, result.scatter_check_threshold);
    936 }
    937 
    938 TEST_F(UmChromeOSPolicyTest,
    939        UpdateCanStartNotAllowedScatteringPrevCountThresholdStillApplies) {
    940   // The UpdateCanStart policy returns false; device policy is loaded and
    941   // scattering due to a previously generated count threshold still applies.
    942 
    943   SetUpdateCheckAllowed(false);
    944   fake_state_.device_policy_provider()->var_scatter_factor()->reset(
    945       new TimeDelta(TimeDelta::FromSeconds(1)));
    946 
    947   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
    948   update_state.scatter_check_threshold = 3;
    949   update_state.scatter_check_threshold_min = 2;
    950   update_state.scatter_check_threshold_max = 5;
    951 
    952   // Check that the UpdateCanStart returns false.
    953   UpdateDownloadParams result;
    954   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
    955                      update_state);
    956   EXPECT_FALSE(result.update_can_start);
    957   EXPECT_EQ(UpdateCannotStartReason::kScattering, result.cannot_start_reason);
    958   EXPECT_EQ(3, result.scatter_check_threshold);
    959 }
    960 
    961 TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedScatteringSatisfied) {
    962   // The UpdateCanStart policy returns true; device policy is loaded and
    963   // scattering is enabled, but both wait period and check threshold are
    964   // satisfied.
    965 
    966   SetUpdateCheckAllowed(false);
    967   fake_state_.device_policy_provider()->var_scatter_factor()->reset(
    968       new TimeDelta(TimeDelta::FromSeconds(120)));
    969 
    970   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(75));
    971   update_state.num_checks = 4;
    972   update_state.scatter_wait_period = TimeDelta::FromSeconds(60);
    973   update_state.scatter_check_threshold = 3;
    974   update_state.scatter_check_threshold_min = 2;
    975   update_state.scatter_check_threshold_max = 5;
    976 
    977   // Check that the UpdateCanStart returns true.
    978   UpdateDownloadParams result;
    979   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
    980                      update_state);
    981   EXPECT_TRUE(result.update_can_start);
    982   EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
    983   EXPECT_EQ(0, result.scatter_check_threshold);
    984   EXPECT_EQ(0, result.download_url_idx);
    985   EXPECT_TRUE(result.download_url_allowed);
    986   EXPECT_EQ(0, result.download_url_num_errors);
    987   EXPECT_FALSE(result.do_increment_failures);
    988 }
    989 
    990 TEST_F(UmChromeOSPolicyTest,
    991        UpdateCanStartAllowedInteractivePreventsScattering) {
    992   // The UpdateCanStart policy returns true; device policy is loaded and
    993   // scattering would have applied, except that the update check is interactive
    994   // and so it is suppressed.
    995 
    996   SetUpdateCheckAllowed(false);
    997   fake_state_.device_policy_provider()->var_scatter_factor()->reset(
    998       new TimeDelta(TimeDelta::FromSeconds(1)));
    999 
   1000   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
   1001   update_state.is_interactive = true;
   1002   update_state.scatter_check_threshold = 0;
   1003   update_state.scatter_check_threshold_min = 2;
   1004   update_state.scatter_check_threshold_max = 5;
   1005 
   1006   // Check that the UpdateCanStart returns true.
   1007   UpdateDownloadParams result;
   1008   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
   1009                      update_state);
   1010   EXPECT_TRUE(result.update_can_start);
   1011   EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
   1012   EXPECT_EQ(0, result.scatter_check_threshold);
   1013   EXPECT_EQ(0, result.download_url_idx);
   1014   EXPECT_TRUE(result.download_url_allowed);
   1015   EXPECT_EQ(0, result.download_url_num_errors);
   1016   EXPECT_FALSE(result.do_increment_failures);
   1017 }
   1018 
   1019 TEST_F(UmChromeOSPolicyTest,
   1020        UpdateCanStartAllowedOobePreventsScattering) {
   1021   // The UpdateCanStart policy returns true; device policy is loaded and
   1022   // scattering would have applied, except that OOBE was not completed and so it
   1023   // is suppressed.
   1024 
   1025   SetUpdateCheckAllowed(false);
   1026   fake_state_.device_policy_provider()->var_scatter_factor()->reset(
   1027       new TimeDelta(TimeDelta::FromSeconds(1)));
   1028   fake_state_.system_provider()->var_is_oobe_complete()->reset(new bool(false));
   1029 
   1030   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
   1031   update_state.is_interactive = true;
   1032   update_state.scatter_check_threshold = 0;
   1033   update_state.scatter_check_threshold_min = 2;
   1034   update_state.scatter_check_threshold_max = 5;
   1035 
   1036   // Check that the UpdateCanStart returns true.
   1037   UpdateDownloadParams result;
   1038   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
   1039                      update_state);
   1040   EXPECT_TRUE(result.update_can_start);
   1041   EXPECT_EQ(TimeDelta(), result.scatter_wait_period);
   1042   EXPECT_EQ(0, result.scatter_check_threshold);
   1043   EXPECT_EQ(0, result.download_url_idx);
   1044   EXPECT_TRUE(result.download_url_allowed);
   1045   EXPECT_EQ(0, result.download_url_num_errors);
   1046   EXPECT_FALSE(result.do_increment_failures);
   1047 }
   1048 
   1049 TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithAttributes) {
   1050   // The UpdateCanStart policy returns true; device policy permits both HTTP and
   1051   // P2P updates, as well as a non-empty target channel string.
   1052 
   1053   SetUpdateCheckAllowed(false);
   1054 
   1055   // Override specific device policy attributes.
   1056   fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
   1057       new bool(true));
   1058   fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
   1059       new bool(true));
   1060 
   1061   // Check that the UpdateCanStart returns true.
   1062   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
   1063   UpdateDownloadParams result;
   1064   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
   1065                      update_state);
   1066   EXPECT_TRUE(result.update_can_start);
   1067   EXPECT_TRUE(result.p2p_downloading_allowed);
   1068   EXPECT_TRUE(result.p2p_sharing_allowed);
   1069   EXPECT_EQ(0, result.download_url_idx);
   1070   EXPECT_TRUE(result.download_url_allowed);
   1071   EXPECT_EQ(0, result.download_url_num_errors);
   1072   EXPECT_FALSE(result.do_increment_failures);
   1073 }
   1074 
   1075 TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithP2PFromUpdater) {
   1076   // The UpdateCanStart policy returns true; device policy forbids both HTTP and
   1077   // P2P updates, but the updater is configured to allow P2P and overrules the
   1078   // setting.
   1079 
   1080   SetUpdateCheckAllowed(false);
   1081 
   1082   // Override specific device policy attributes.
   1083   fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
   1084 
   1085   // Check that the UpdateCanStart returns true.
   1086   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
   1087   UpdateDownloadParams result;
   1088   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
   1089                      update_state);
   1090   EXPECT_TRUE(result.update_can_start);
   1091   EXPECT_TRUE(result.p2p_downloading_allowed);
   1092   EXPECT_TRUE(result.p2p_sharing_allowed);
   1093   EXPECT_EQ(0, result.download_url_idx);
   1094   EXPECT_TRUE(result.download_url_allowed);
   1095   EXPECT_EQ(0, result.download_url_num_errors);
   1096   EXPECT_FALSE(result.do_increment_failures);
   1097 }
   1098 
   1099 TEST_F(UmChromeOSPolicyTest,
   1100        UpdateCanStartAllowedP2PDownloadingBlockedDueToOmaha) {
   1101   // The UpdateCanStart policy returns true; device policy permits HTTP, but
   1102   // policy blocks P2P downloading because Omaha forbids it.  P2P sharing is
   1103   // still permitted.
   1104 
   1105   SetUpdateCheckAllowed(false);
   1106 
   1107   // Override specific device policy attributes.
   1108   fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
   1109       new bool(true));
   1110   fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
   1111       new bool(true));
   1112 
   1113   // Check that the UpdateCanStart returns true.
   1114   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
   1115   update_state.p2p_downloading_disabled = true;
   1116   UpdateDownloadParams result;
   1117   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
   1118                      update_state);
   1119   EXPECT_TRUE(result.update_can_start);
   1120   EXPECT_FALSE(result.p2p_downloading_allowed);
   1121   EXPECT_TRUE(result.p2p_sharing_allowed);
   1122 }
   1123 
   1124 TEST_F(UmChromeOSPolicyTest,
   1125        UpdateCanStartAllowedP2PSharingBlockedDueToOmaha) {
   1126   // The UpdateCanStart policy returns true; device policy permits HTTP, but
   1127   // policy blocks P2P sharing because Omaha forbids it.  P2P downloading is
   1128   // still permitted.
   1129 
   1130   SetUpdateCheckAllowed(false);
   1131 
   1132   // Override specific device policy attributes.
   1133   fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
   1134       new bool(true));
   1135   fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
   1136       new bool(true));
   1137 
   1138   // Check that the UpdateCanStart returns true.
   1139   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
   1140   update_state.p2p_sharing_disabled = true;
   1141   UpdateDownloadParams result;
   1142   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
   1143                      update_state);
   1144   EXPECT_TRUE(result.update_can_start);
   1145   EXPECT_TRUE(result.p2p_downloading_allowed);
   1146   EXPECT_FALSE(result.p2p_sharing_allowed);
   1147 }
   1148 
   1149 TEST_F(UmChromeOSPolicyTest,
   1150        UpdateCanStartAllowedP2PDownloadingBlockedDueToNumAttempts) {
   1151   // The UpdateCanStart policy returns true; device policy permits HTTP but
   1152   // blocks P2P download, because the max number of P2P downloads have been
   1153   // attempted. P2P sharing is still permitted.
   1154 
   1155   SetUpdateCheckAllowed(false);
   1156 
   1157   // Override specific device policy attributes.
   1158   fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
   1159       new bool(true));
   1160   fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
   1161       new bool(true));
   1162 
   1163   // Check that the UpdateCanStart returns true.
   1164   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
   1165   update_state.p2p_num_attempts = ChromeOSPolicy::kMaxP2PAttempts;
   1166   UpdateDownloadParams result;
   1167   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
   1168                      update_state);
   1169   EXPECT_TRUE(result.update_can_start);
   1170   EXPECT_FALSE(result.p2p_downloading_allowed);
   1171   EXPECT_TRUE(result.p2p_sharing_allowed);
   1172 }
   1173 
   1174 TEST_F(UmChromeOSPolicyTest,
   1175        UpdateCanStartAllowedP2PDownloadingBlockedDueToAttemptsPeriod) {
   1176   // The UpdateCanStart policy returns true; device policy permits HTTP but
   1177   // blocks P2P download, because the max period for attempt to download via P2P
   1178   // has elapsed. P2P sharing is still permitted.
   1179 
   1180   SetUpdateCheckAllowed(false);
   1181 
   1182   // Override specific device policy attributes.
   1183   fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
   1184       new bool(true));
   1185   fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
   1186       new bool(true));
   1187 
   1188   // Check that the UpdateCanStart returns true.
   1189   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
   1190   update_state.p2p_num_attempts = 1;
   1191   update_state.p2p_first_attempted =
   1192       fake_clock_.GetWallclockTime() -
   1193       TimeDelta::FromSeconds(
   1194           ChromeOSPolicy::kMaxP2PAttemptsPeriodInSeconds + 1);
   1195   UpdateDownloadParams result;
   1196   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
   1197                      update_state);
   1198   EXPECT_TRUE(result.update_can_start);
   1199   EXPECT_FALSE(result.p2p_downloading_allowed);
   1200   EXPECT_TRUE(result.p2p_sharing_allowed);
   1201 }
   1202 
   1203 TEST_F(UmChromeOSPolicyTest,
   1204        UpdateCanStartAllowedWithHttpUrlForUnofficialBuild) {
   1205   // The UpdateCanStart policy returns true; device policy forbids both HTTP and
   1206   // P2P updates, but marking this an unofficial build overrules the HTTP
   1207   // setting.
   1208 
   1209   SetUpdateCheckAllowed(false);
   1210 
   1211   // Override specific device policy attributes.
   1212   fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
   1213       new bool(false));
   1214   fake_state_.system_provider()->var_is_official_build()->
   1215       reset(new bool(false));
   1216 
   1217   // Check that the UpdateCanStart returns true.
   1218   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
   1219   UpdateDownloadParams result;
   1220   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
   1221                      update_state);
   1222   EXPECT_TRUE(result.update_can_start);
   1223   EXPECT_EQ(0, result.download_url_idx);
   1224   EXPECT_TRUE(result.download_url_allowed);
   1225   EXPECT_EQ(0, result.download_url_num_errors);
   1226   EXPECT_FALSE(result.do_increment_failures);
   1227 }
   1228 
   1229 TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithHttpsUrl) {
   1230   // The UpdateCanStart policy returns true; device policy forbids both HTTP and
   1231   // P2P updates, but an HTTPS URL is provided and selected for download.
   1232 
   1233   SetUpdateCheckAllowed(false);
   1234 
   1235   // Override specific device policy attributes.
   1236   fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
   1237       new bool(false));
   1238 
   1239   // Add an HTTPS URL.
   1240   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
   1241   update_state.download_urls.emplace_back("https://secure/url/");
   1242 
   1243   // Check that the UpdateCanStart returns true.
   1244   UpdateDownloadParams result;
   1245   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
   1246                      update_state);
   1247   EXPECT_TRUE(result.update_can_start);
   1248   EXPECT_EQ(1, result.download_url_idx);
   1249   EXPECT_TRUE(result.download_url_allowed);
   1250   EXPECT_EQ(0, result.download_url_num_errors);
   1251   EXPECT_FALSE(result.do_increment_failures);
   1252 }
   1253 
   1254 TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedMaxErrorsNotExceeded) {
   1255   // The UpdateCanStart policy returns true; the first URL has download errors
   1256   // but does not exceed the maximum allowed number of failures, so it is stilli
   1257   // usable.
   1258 
   1259   SetUpdateCheckAllowed(false);
   1260 
   1261   // Add a second URL; update with this URL attempted and failed enough times to
   1262   // disqualify the current (first) URL.
   1263   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
   1264   update_state.num_checks = 5;
   1265   update_state.download_urls.emplace_back("http://another/fake/url/");
   1266   Time t = fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(12);
   1267   for (int i = 0; i < 5; i++) {
   1268     update_state.download_errors.emplace_back(
   1269         0, ErrorCode::kDownloadTransferError, t);
   1270     t += TimeDelta::FromSeconds(1);
   1271   }
   1272 
   1273   // Check that the UpdateCanStart returns true.
   1274   UpdateDownloadParams result;
   1275   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
   1276                      update_state);
   1277   EXPECT_TRUE(result.update_can_start);
   1278   EXPECT_EQ(0, result.download_url_idx);
   1279   EXPECT_TRUE(result.download_url_allowed);
   1280   EXPECT_EQ(5, result.download_url_num_errors);
   1281   EXPECT_FALSE(result.do_increment_failures);
   1282 }
   1283 
   1284 TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlMaxExceeded) {
   1285   // The UpdateCanStart policy returns true; the first URL exceeded the maximum
   1286   // allowed number of failures, but a second URL is available.
   1287 
   1288   SetUpdateCheckAllowed(false);
   1289 
   1290   // Add a second URL; update with this URL attempted and failed enough times to
   1291   // disqualify the current (first) URL.
   1292   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
   1293   update_state.num_checks = 10;
   1294   update_state.download_urls.emplace_back("http://another/fake/url/");
   1295   Time t = fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(12);
   1296   for (int i = 0; i < 11; i++) {
   1297     update_state.download_errors.emplace_back(
   1298         0, ErrorCode::kDownloadTransferError, t);
   1299     t += TimeDelta::FromSeconds(1);
   1300   }
   1301 
   1302   // Check that the UpdateCanStart returns true.
   1303   UpdateDownloadParams result;
   1304   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
   1305                      update_state);
   1306   EXPECT_TRUE(result.update_can_start);
   1307   EXPECT_EQ(1, result.download_url_idx);
   1308   EXPECT_TRUE(result.download_url_allowed);
   1309   EXPECT_EQ(0, result.download_url_num_errors);
   1310   EXPECT_FALSE(result.do_increment_failures);
   1311 }
   1312 
   1313 TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedWithSecondUrlHardError) {
   1314   // The UpdateCanStart policy returns true; the first URL fails with a hard
   1315   // error, but a second URL is available.
   1316 
   1317   SetUpdateCheckAllowed(false);
   1318 
   1319   // Add a second URL; update with this URL attempted and failed in a way that
   1320   // causes it to switch directly to the next URL.
   1321   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
   1322   update_state.num_checks = 10;
   1323   update_state.download_urls.emplace_back("http://another/fake/url/");
   1324   update_state.download_errors.emplace_back(
   1325       0, ErrorCode::kPayloadHashMismatchError,
   1326       fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(1));
   1327 
   1328   // Check that the UpdateCanStart returns true.
   1329   UpdateDownloadParams result;
   1330   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
   1331                      update_state);
   1332   EXPECT_TRUE(result.update_can_start);
   1333   EXPECT_EQ(1, result.download_url_idx);
   1334   EXPECT_TRUE(result.download_url_allowed);
   1335   EXPECT_EQ(0, result.download_url_num_errors);
   1336   EXPECT_FALSE(result.do_increment_failures);
   1337 }
   1338 
   1339 TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedUrlWrapsAround) {
   1340   // The UpdateCanStart policy returns true; URL search properly wraps around
   1341   // the last one on the list.
   1342 
   1343   SetUpdateCheckAllowed(false);
   1344 
   1345   // Add a second URL; update with this URL attempted and failed in a way that
   1346   // causes it to switch directly to the next URL. We must disable backoff in
   1347   // order for it not to interfere.
   1348   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
   1349   update_state.num_checks = 1;
   1350   update_state.is_backoff_disabled = true;
   1351   update_state.download_urls.emplace_back("http://another/fake/url/");
   1352   update_state.download_errors.emplace_back(
   1353       1, ErrorCode::kPayloadHashMismatchError,
   1354       fake_clock_.GetWallclockTime() - TimeDelta::FromSeconds(1));
   1355 
   1356   // Check that the UpdateCanStart returns true.
   1357   UpdateDownloadParams result;
   1358   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
   1359                      update_state);
   1360   EXPECT_TRUE(result.update_can_start);
   1361   EXPECT_EQ(0, result.download_url_idx);
   1362   EXPECT_TRUE(result.download_url_allowed);
   1363   EXPECT_EQ(0, result.download_url_num_errors);
   1364   EXPECT_TRUE(result.do_increment_failures);
   1365 }
   1366 
   1367 TEST_F(UmChromeOSPolicyTest, UpdateCanStartNotAllowedNoUsableUrls) {
   1368   // The UpdateCanStart policy returns false; there's a single HTTP URL but its
   1369   // use is forbidden by policy.
   1370   //
   1371   // Note: In the case where no usable URLs are found, the policy should not
   1372   // increment the number of failed attempts! Doing so would result in a
   1373   // non-idempotent semantics, and does not fall within the intended purpose of
   1374   // the backoff mechanism anyway.
   1375 
   1376   SetUpdateCheckAllowed(false);
   1377 
   1378   // Override specific device policy attributes.
   1379   fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
   1380       new bool(false));
   1381 
   1382   // Check that the UpdateCanStart returns false.
   1383   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
   1384   UpdateDownloadParams result;
   1385   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
   1386                      update_state);
   1387   EXPECT_FALSE(result.update_can_start);
   1388   EXPECT_EQ(UpdateCannotStartReason::kCannotDownload,
   1389             result.cannot_start_reason);
   1390   EXPECT_FALSE(result.do_increment_failures);
   1391 }
   1392 
   1393 TEST_F(UmChromeOSPolicyTest, UpdateCanStartAllowedNoUsableUrlsButP2PEnabled) {
   1394   // The UpdateCanStart policy returns true; there's a single HTTP URL but its
   1395   // use is forbidden by policy, however P2P is enabled. The result indicates
   1396   // that no URL can be used.
   1397   //
   1398   // Note: The number of failed attempts should not increase in this case (see
   1399   // above test).
   1400 
   1401   SetUpdateCheckAllowed(false);
   1402 
   1403   // Override specific device policy attributes.
   1404   fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
   1405       new bool(true));
   1406   fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
   1407       new bool(false));
   1408 
   1409   // Check that the UpdateCanStart returns true.
   1410   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
   1411   UpdateDownloadParams result;
   1412   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
   1413                      update_state);
   1414   EXPECT_TRUE(result.update_can_start);
   1415   EXPECT_TRUE(result.p2p_downloading_allowed);
   1416   EXPECT_TRUE(result.p2p_sharing_allowed);
   1417   EXPECT_GT(0, result.download_url_idx);
   1418   EXPECT_TRUE(result.download_url_allowed);
   1419   EXPECT_EQ(0, result.download_url_num_errors);
   1420   EXPECT_FALSE(result.do_increment_failures);
   1421 }
   1422 
   1423 TEST_F(UmChromeOSPolicyTest,
   1424        UpdateCanStartAllowedNoUsableUrlsButEnterpriseEnrolled) {
   1425   // The UpdateCanStart policy returns true; there's a single HTTP URL but its
   1426   // use is forbidden by policy, and P2P is unset on the policy, however the
   1427   // device is enterprise-enrolled so P2P is allowed. The result indicates that
   1428   // no URL can be used.
   1429   //
   1430   // Note: The number of failed attempts should not increase in this case (see
   1431   // above test).
   1432 
   1433   SetUpdateCheckAllowed(false);
   1434 
   1435   // Override specific device policy attributes.
   1436   fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(nullptr);
   1437   fake_state_.device_policy_provider()->var_owner()->reset(nullptr);
   1438   fake_state_.device_policy_provider()->var_http_downloads_enabled()->reset(
   1439       new bool(false));
   1440 
   1441   // Check that the UpdateCanStart returns true.
   1442   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromMinutes(10));
   1443   UpdateDownloadParams result;
   1444   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
   1445                      update_state);
   1446   EXPECT_TRUE(result.update_can_start);
   1447   EXPECT_TRUE(result.p2p_downloading_allowed);
   1448   EXPECT_TRUE(result.p2p_sharing_allowed);
   1449   EXPECT_GT(0, result.download_url_idx);
   1450   EXPECT_TRUE(result.download_url_allowed);
   1451   EXPECT_EQ(0, result.download_url_num_errors);
   1452   EXPECT_FALSE(result.do_increment_failures);
   1453 }
   1454 
   1455 TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedEthernetDefault) {
   1456   // Ethernet is always allowed.
   1457 
   1458   fake_state_.shill_provider()->var_conn_type()->
   1459       reset(new ConnectionType(ConnectionType::kEthernet));
   1460 
   1461   bool result;
   1462   ExpectPolicyStatus(EvalStatus::kSucceeded,
   1463                      &Policy::UpdateDownloadAllowed, &result);
   1464   EXPECT_TRUE(result);
   1465 }
   1466 
   1467 TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWifiDefault) {
   1468   // Wifi is allowed if not tethered.
   1469 
   1470   fake_state_.shill_provider()->var_conn_type()->
   1471       reset(new ConnectionType(ConnectionType::kWifi));
   1472 
   1473   bool result;
   1474   ExpectPolicyStatus(EvalStatus::kSucceeded,
   1475                      &Policy::UpdateDownloadAllowed, &result);
   1476   EXPECT_TRUE(result);
   1477 }
   1478 
   1479 TEST_F(UmChromeOSPolicyTest,
   1480        UpdateCurrentConnectionNotAllowedWifiTetheredDefault) {
   1481   // Tethered wifi is not allowed by default.
   1482 
   1483   fake_state_.shill_provider()->var_conn_type()->
   1484       reset(new ConnectionType(ConnectionType::kWifi));
   1485   fake_state_.shill_provider()->var_conn_tethering()->
   1486       reset(new ConnectionTethering(ConnectionTethering::kConfirmed));
   1487 
   1488   bool result;
   1489   ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
   1490                      &Policy::UpdateDownloadAllowed, &result);
   1491 }
   1492 
   1493 TEST_F(UmChromeOSPolicyTest,
   1494        UpdateDownloadAllowedWifiTetheredPolicyOverride) {
   1495   // Tethered wifi can be allowed by policy.
   1496 
   1497   fake_state_.shill_provider()->var_conn_type()->
   1498       reset(new ConnectionType(ConnectionType::kWifi));
   1499   fake_state_.shill_provider()->var_conn_tethering()->
   1500       reset(new ConnectionTethering(ConnectionTethering::kConfirmed));
   1501   set<ConnectionType> allowed_connections;
   1502   allowed_connections.insert(ConnectionType::kCellular);
   1503   fake_state_.device_policy_provider()->
   1504       var_allowed_connection_types_for_update()->
   1505       reset(new set<ConnectionType>(allowed_connections));
   1506 
   1507   bool result;
   1508   ExpectPolicyStatus(EvalStatus::kSucceeded,
   1509                      &Policy::UpdateDownloadAllowed, &result);
   1510   EXPECT_TRUE(result);
   1511 }
   1512 
   1513 TEST_F(UmChromeOSPolicyTest, UpdateDownloadAllowedWimaxDefault) {
   1514   // Wimax is always allowed.
   1515 
   1516   fake_state_.shill_provider()->var_conn_type()->
   1517       reset(new ConnectionType(ConnectionType::kWifi));
   1518 
   1519   bool result;
   1520   ExpectPolicyStatus(EvalStatus::kSucceeded,
   1521                      &Policy::UpdateDownloadAllowed, &result);
   1522   EXPECT_TRUE(result);
   1523 }
   1524 
   1525 TEST_F(UmChromeOSPolicyTest,
   1526        UpdateCurrentConnectionNotAllowedBluetoothDefault) {
   1527   // Bluetooth is never allowed.
   1528 
   1529   fake_state_.shill_provider()->var_conn_type()->
   1530       reset(new ConnectionType(ConnectionType::kBluetooth));
   1531 
   1532   bool result;
   1533   ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
   1534                      &Policy::UpdateDownloadAllowed, &result);
   1535 }
   1536 
   1537 TEST_F(UmChromeOSPolicyTest,
   1538        UpdateCurrentConnectionNotAllowedBluetoothPolicyCannotOverride) {
   1539   // Bluetooth cannot be allowed even by policy.
   1540 
   1541   fake_state_.shill_provider()->var_conn_type()->
   1542       reset(new ConnectionType(ConnectionType::kBluetooth));
   1543   set<ConnectionType> allowed_connections;
   1544   allowed_connections.insert(ConnectionType::kBluetooth);
   1545   fake_state_.device_policy_provider()->
   1546       var_allowed_connection_types_for_update()->
   1547       reset(new set<ConnectionType>(allowed_connections));
   1548 
   1549   bool result;
   1550   ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
   1551                      &Policy::UpdateDownloadAllowed, &result);
   1552 }
   1553 
   1554 TEST_F(UmChromeOSPolicyTest, UpdateCurrentConnectionNotAllowedCellularDefault) {
   1555   // Cellular is not allowed by default.
   1556 
   1557   fake_state_.shill_provider()->var_conn_type()->
   1558       reset(new ConnectionType(ConnectionType::kCellular));
   1559 
   1560   bool result;
   1561   ExpectPolicyStatus(EvalStatus::kAskMeAgainLater,
   1562                      &Policy::UpdateDownloadAllowed, &result);
   1563 }
   1564 
   1565 TEST_F(UmChromeOSPolicyTest,
   1566        UpdateDownloadAllowedCellularPolicyOverride) {
   1567   // Update over cellular can be enabled by policy.
   1568 
   1569   fake_state_.shill_provider()->var_conn_type()->
   1570       reset(new ConnectionType(ConnectionType::kCellular));
   1571   set<ConnectionType> allowed_connections;
   1572   allowed_connections.insert(ConnectionType::kCellular);
   1573   fake_state_.device_policy_provider()->
   1574       var_allowed_connection_types_for_update()->
   1575       reset(new set<ConnectionType>(allowed_connections));
   1576 
   1577   bool result;
   1578   ExpectPolicyStatus(EvalStatus::kSucceeded,
   1579                      &Policy::UpdateDownloadAllowed, &result);
   1580   EXPECT_TRUE(result);
   1581 }
   1582 
   1583 TEST_F(UmChromeOSPolicyTest,
   1584        UpdateDownloadAllowedCellularUserOverride) {
   1585   // Update over cellular can be enabled by user settings, but only if policy
   1586   // is present and does not determine allowed connections.
   1587 
   1588   fake_state_.shill_provider()->var_conn_type()->
   1589       reset(new ConnectionType(ConnectionType::kCellular));
   1590   set<ConnectionType> allowed_connections;
   1591   allowed_connections.insert(ConnectionType::kCellular);
   1592   fake_state_.updater_provider()->var_cellular_enabled()->
   1593       reset(new bool(true));
   1594 
   1595   bool result;
   1596   ExpectPolicyStatus(EvalStatus::kSucceeded,
   1597                      &Policy::UpdateDownloadAllowed, &result);
   1598   EXPECT_TRUE(result);
   1599 }
   1600 
   1601 TEST_F(UmChromeOSPolicyTest,
   1602        UpdateCanStartAllowedScatteringSupressedDueToP2P) {
   1603   // The UpdateCanStart policy returns true; scattering should have applied, but
   1604   // P2P download is allowed. Scattering values are nonetheless returned, and so
   1605   // are download URL values, albeit the latter are not allowed to be used.
   1606 
   1607   SetUpdateCheckAllowed(false);
   1608   fake_state_.device_policy_provider()->var_scatter_factor()->reset(
   1609       new TimeDelta(TimeDelta::FromMinutes(2)));
   1610   fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
   1611 
   1612   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(1));
   1613   update_state.scatter_wait_period = TimeDelta::FromSeconds(35);
   1614 
   1615   UpdateDownloadParams result;
   1616   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart,
   1617                      &result, update_state);
   1618   EXPECT_TRUE(result.update_can_start);
   1619   EXPECT_EQ(0, result.download_url_idx);
   1620   EXPECT_FALSE(result.download_url_allowed);
   1621   EXPECT_EQ(0, result.download_url_num_errors);
   1622   EXPECT_TRUE(result.p2p_downloading_allowed);
   1623   EXPECT_TRUE(result.p2p_sharing_allowed);
   1624   EXPECT_FALSE(result.do_increment_failures);
   1625   EXPECT_EQ(TimeDelta::FromSeconds(35), result.scatter_wait_period);
   1626   EXPECT_EQ(0, result.scatter_check_threshold);
   1627 }
   1628 
   1629 TEST_F(UmChromeOSPolicyTest,
   1630        UpdateCanStartAllowedBackoffSupressedDueToP2P) {
   1631   // The UpdateCanStart policy returns true; backoff should have applied, but
   1632   // P2P download is allowed. Backoff values are nonetheless returned, and so
   1633   // are download URL values, albeit the latter are not allowed to be used.
   1634 
   1635   SetUpdateCheckAllowed(false);
   1636 
   1637   const Time curr_time = fake_clock_.GetWallclockTime();
   1638   UpdateState update_state = GetDefaultUpdateState(TimeDelta::FromSeconds(10));
   1639   update_state.download_errors_max = 1;
   1640   update_state.download_errors.emplace_back(
   1641       0, ErrorCode::kDownloadTransferError,
   1642       curr_time - TimeDelta::FromSeconds(8));
   1643   update_state.download_errors.emplace_back(
   1644       0, ErrorCode::kDownloadTransferError,
   1645       curr_time - TimeDelta::FromSeconds(2));
   1646   fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
   1647 
   1648   UpdateDownloadParams result;
   1649   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::UpdateCanStart, &result,
   1650                      update_state);
   1651   EXPECT_TRUE(result.update_can_start);
   1652   EXPECT_EQ(0, result.download_url_idx);
   1653   EXPECT_FALSE(result.download_url_allowed);
   1654   EXPECT_EQ(0, result.download_url_num_errors);
   1655   EXPECT_TRUE(result.p2p_downloading_allowed);
   1656   EXPECT_TRUE(result.p2p_sharing_allowed);
   1657   EXPECT_TRUE(result.do_increment_failures);
   1658   EXPECT_LT(curr_time, result.backoff_expiry);
   1659 }
   1660 
   1661 TEST_F(UmChromeOSPolicyTest, P2PEnabledNotAllowed) {
   1662   bool result;
   1663   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
   1664   EXPECT_FALSE(result);
   1665 }
   1666 
   1667 TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedByDevicePolicy) {
   1668   fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(
   1669       new bool(true));
   1670 
   1671   bool result;
   1672   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
   1673   EXPECT_TRUE(result);
   1674 }
   1675 
   1676 TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedByUpdater) {
   1677   fake_state_.updater_provider()->var_p2p_enabled()->reset(new bool(true));
   1678 
   1679   bool result;
   1680   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
   1681   EXPECT_TRUE(result);
   1682 }
   1683 
   1684 TEST_F(UmChromeOSPolicyTest, P2PEnabledAllowedDeviceEnterpriseEnrolled) {
   1685   fake_state_.device_policy_provider()->var_au_p2p_enabled()->reset(nullptr);
   1686   fake_state_.device_policy_provider()->var_owner()->reset(nullptr);
   1687 
   1688   bool result;
   1689   ExpectPolicyStatus(EvalStatus::kSucceeded, &Policy::P2PEnabled, &result);
   1690   EXPECT_TRUE(result);
   1691 }
   1692 
   1693 TEST_F(UmChromeOSPolicyTest, P2PEnabledChangedBlocks) {
   1694   bool result;
   1695   ExpectPolicyStatus(EvalStatus::kAskMeAgainLater, &Policy::P2PEnabledChanged,
   1696                      &result, false);
   1697 }
   1698 
   1699 }  // namespace chromeos_update_manager
   1700