156d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood//
256d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood// Copyright (C) 2017 The Android Open Source Project
356d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood//
456d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood// Licensed under the Apache License, Version 2.0 (the "License");
556d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood// you may not use this file except in compliance with the License.
656d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood// You may obtain a copy of the License at
756d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood//
856d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood//      http://www.apache.org/licenses/LICENSE-2.0
956d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood//
1056d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood// Unless required by applicable law or agreed to in writing, software
1156d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood// distributed under the License is distributed on an "AS IS" BASIS,
1256d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1356d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood// See the License for the specific language governing permissions and
1456d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood// limitations under the License.
1556d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood//
1656d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood
1756d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood#include "update_engine/update_manager/policy_test_utils.h"
1856d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood
19c73fdc1575f4dd459c2c3edfa0a17d37477f51b5Aaron Wood#include <memory>
2056d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood#include <tuple>
2156d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood#include <vector>
2256d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood
2356d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood#include "update_engine/update_manager/next_update_check_policy_impl.h"
2456d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood
2556d8ab3749fb8c91eea43797832e168b70af7412Aaron Woodusing base::Time;
2656d8ab3749fb8c91eea43797832e168b70af7412Aaron Woodusing base::TimeDelta;
2756d8ab3749fb8c91eea43797832e168b70af7412Aaron Woodusing chromeos_update_engine::ErrorCode;
2856d8ab3749fb8c91eea43797832e168b70af7412Aaron Woodusing std::string;
2956d8ab3749fb8c91eea43797832e168b70af7412Aaron Woodusing std::tuple;
3056d8ab3749fb8c91eea43797832e168b70af7412Aaron Woodusing std::vector;
3156d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood
3256d8ab3749fb8c91eea43797832e168b70af7412Aaron Woodnamespace chromeos_update_manager {
3356d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood
3456d8ab3749fb8c91eea43797832e168b70af7412Aaron Woodvoid UmPolicyTestBase::SetUp() {
3556d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  loop_.SetAsCurrent();
3656d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  SetUpDefaultClock();
3756d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  eval_ctx_ = new EvaluationContext(&fake_clock_, TimeDelta::FromSeconds(5));
3856d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  SetUpDefaultState();
3956d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood}
4056d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood
4156d8ab3749fb8c91eea43797832e168b70af7412Aaron Woodvoid UmPolicyTestBase::TearDown() {
4256d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  EXPECT_FALSE(loop_.PendingTasks());
4356d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood}
4456d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood
4556d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood// Sets the clock to fixed values.
4656d8ab3749fb8c91eea43797832e168b70af7412Aaron Woodvoid UmPolicyTestBase::SetUpDefaultClock() {
4756d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  fake_clock_.SetMonotonicTime(Time::FromInternalValue(12345678L));
4856d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  fake_clock_.SetWallclockTime(Time::FromInternalValue(12345678901234L));
4956d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood}
5056d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood
5156d8ab3749fb8c91eea43797832e168b70af7412Aaron Woodvoid UmPolicyTestBase::SetUpDefaultState() {
5256d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  fake_state_.updater_provider()->var_updater_started_time()->reset(
5356d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood      new Time(fake_clock_.GetWallclockTime()));
5456d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  fake_state_.updater_provider()->var_last_checked_time()->reset(
5556d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood      new Time(fake_clock_.GetWallclockTime()));
5656d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  fake_state_.updater_provider()->var_consecutive_failed_update_checks()->reset(
57c73fdc1575f4dd459c2c3edfa0a17d37477f51b5Aaron Wood      new unsigned int(0));  // NOLINT(readability/casting)
5856d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  fake_state_.updater_provider()->var_server_dictated_poll_interval()->reset(
59c73fdc1575f4dd459c2c3edfa0a17d37477f51b5Aaron Wood      new unsigned int(0));  // NOLINT(readability/casting)
6056d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  fake_state_.updater_provider()->var_forced_update_requested()->reset(
6156d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood      new UpdateRequestStatus{UpdateRequestStatus::kNone});
6256d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood
6356d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  // Chosen by fair dice roll.  Guaranteed to be random.
6456d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  fake_state_.random_provider()->var_seed()->reset(new uint64_t(4));
6556d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood}
6656d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood
6756d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood// Returns a default UpdateState structure:
6856d8ab3749fb8c91eea43797832e168b70af7412Aaron WoodUpdateState UmPolicyTestBase::GetDefaultUpdateState(
6956d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood    TimeDelta first_seen_period) {
7056d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  Time first_seen_time = fake_clock_.GetWallclockTime() - first_seen_period;
7156d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  UpdateState update_state = UpdateState();
7256d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood
7356d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  // This is a non-interactive check returning a delta payload, seen for the
7456d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  // first time (|first_seen_period| ago). Clearly, there were no failed
7556d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  // attempts so far.
7656d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  update_state.is_interactive = false;
7756d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  update_state.is_delta_payload = false;
7856d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  update_state.first_seen = first_seen_time;
7956d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  update_state.num_checks = 1;
8056d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  update_state.num_failures = 0;
8156d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  update_state.failures_last_updated = Time();  // Needs to be zero.
8256d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  // There's a single HTTP download URL with a maximum of 10 retries.
8356d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  update_state.download_urls = vector<string>{"http://fake/url/"};
8456d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  update_state.download_errors_max = 10;
8556d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  // Download was never attempted.
8656d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  update_state.last_download_url_idx = -1;
8756d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  update_state.last_download_url_num_errors = 0;
8856d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  // There were no download errors.
8956d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  update_state.download_errors = vector<tuple<int, ErrorCode, Time>>();
9056d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  // P2P is not disabled by Omaha.
9156d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  update_state.p2p_downloading_disabled = false;
9256d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  update_state.p2p_sharing_disabled = false;
9356d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  // P2P was not attempted.
9456d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  update_state.p2p_num_attempts = 0;
9556d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  update_state.p2p_first_attempted = Time();
9656d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  // No active backoff period, backoff is not disabled by Omaha.
9756d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  update_state.backoff_expiry = Time();
9856d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  update_state.is_backoff_disabled = false;
9956d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  // There is no active scattering wait period (max 7 days allowed) nor check
10056d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  // threshold (none allowed).
10156d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  update_state.scatter_wait_period = TimeDelta();
10256d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  update_state.scatter_check_threshold = 0;
10356d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  update_state.scatter_wait_period_max = TimeDelta::FromDays(7);
10456d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  update_state.scatter_check_threshold_min = 0;
10556d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  update_state.scatter_check_threshold_max = 0;
10656d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood
10756d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood  return update_state;
10856d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood}
10956d8ab3749fb8c91eea43797832e168b70af7412Aaron Wood
110c73fdc1575f4dd459c2c3edfa0a17d37477f51b5Aaron Wood}  // namespace chromeos_update_manager
111