1aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
2aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Copyright (C) 2012 The Android Open Source Project
3aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
4aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Licensed under the Apache License, Version 2.0 (the "License");
5aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// you may not use this file except in compliance with the License.
6aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// You may obtain a copy of the License at
7aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
8aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//      http://www.apache.org/licenses/LICENSE-2.0
9aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
10aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Unless required by applicable law or agreed to in writing, software
11aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// distributed under the License is distributed on an "AS IS" BASIS,
12aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// See the License for the specific language governing permissions and
14aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// limitations under the License.
15aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
16f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov
172c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo#include "update_engine/update_attempter.h"
182c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo
199abb763fa3840d69cc1098c0233162557a7f99eaBen Chan#include <stdint.h>
209abb763fa3840d69cc1098c0233162557a7f99eaBen Chan
2102f7c1dee242f490143791dbb73fa23fa3007cfaBen Chan#include <memory>
2202f7c1dee242f490143791dbb73fa23fa3007cfaBen Chan
2306c76a49bfd29c8abdb8abd5b646a6583783191aBen Chan#include <base/files/file_util.h>
240b3db6b6040f53eb9859e614f7fe4c681213d33aAlex Deymo#include <base/message_loop/message_loop.h>
253f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko#include <brillo/message_loops/base_message_loop.h>
263f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko#include <brillo/message_loops/message_loop.h>
273f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko#include <brillo/message_loops/message_loop_utils.h>
28f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov#include <gtest/gtest.h>
297fbbe8a9e57ec52f7bc597d0cb607036300ac54cPatrick Dubroy#include <policy/libpolicy.h>
307fbbe8a9e57ec52f7bc597d0cb607036300ac54cPatrick Dubroy#include <policy/mock_device_policy.h>
31f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov
3239910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/fake_clock.h"
3339910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/fake_prefs.h"
3414fd1ec41d1da4e849b724b762ca111a30c6628cAlex Deymo#include "update_engine/common/mock_action.h"
3514fd1ec41d1da4e849b724b762ca111a30c6628cAlex Deymo#include "update_engine/common/mock_action_processor.h"
3639910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/mock_http_fetcher.h"
3739910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/mock_prefs.h"
3839910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/platform_constants.h"
3939910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/prefs.h"
4039910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/test_utils.h"
4139910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/utils.h"
425bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold#include "update_engine/fake_system_state.h"
438f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen#include "update_engine/mock_p2p_manager.h"
446f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan#include "update_engine/mock_payload_state.h"
459321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood#include "update_engine/mock_service_observer.h"
4639910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/payload_consumer/filesystem_verifier_action.h"
4739910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/payload_consumer/install_plan.h"
4839910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/payload_consumer/payload_constants.h"
4939910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/payload_consumer/postinstall_runner_action.h"
50f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov
51985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthenusing base::Time;
52985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthenusing base::TimeDelta;
53bf5a2522481c1e26a8d645a1575824dcd5fbd08eAaron Woodusing chromeos_update_manager::EvalStatus;
54bf5a2522481c1e26a8d645a1575824dcd5fbd08eAaron Woodusing chromeos_update_manager::UpdateCheckParams;
55f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkovusing std::string;
5602f7c1dee242f490143791dbb73fa23fa3007cfaBen Chanusing std::unique_ptr;
57bf5a2522481c1e26a8d645a1575824dcd5fbd08eAaron Woodusing testing::_;
58362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkovusing testing::DoAll;
597f92e2b7060cb35719acf96ef96a4e273e165bc5Aaron Woodusing testing::Field;
60f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkovusing testing::InSequence;
612dd0109675fac379289a9d092fa4a6f6e05e0038Darin Petkovusing testing::Ne;
629c096d6691414d32dee22e083ac8e2e8d24b0880Darin Petkovusing testing::NiceMock;
63f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkovusing testing::Property;
64f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkovusing testing::Return;
6574b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnoldusing testing::ReturnPointee;
662c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymousing testing::SaveArg;
67672c1f54a499a825cc0bb9bc4f240bf1887550d9Ben Chanusing testing::SetArgPointee;
68bf5a2522481c1e26a8d645a1575824dcd5fbd08eAaron Woodusing update_engine::UpdateAttemptFlags;
697f92e2b7060cb35719acf96ef96a4e273e165bc5Aaron Woodusing update_engine::UpdateEngineStatus;
706b6cc1b788af989fb64116fb2e2299abac697510Christopher Wileyusing update_engine::UpdateStatus;
71f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov
72f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkovnamespace chromeos_update_engine {
73f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov
74f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov// Test a subclass rather than the main class directly so that we can mock out
75cd1666f5c1be2745197046a55b2fdde7b6045604Darin Petkov// methods within the class. There're explicit unit tests for the mocked out
76f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov// methods.
77f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkovclass UpdateAttempterUnderTest : public UpdateAttempter {
78f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov public:
79cf5f1f1420b472477317b0ea0fa7f6456d2605cfJeffrey Kardatzke  explicit UpdateAttempterUnderTest(SystemState* system_state)
80cf5f1f1420b472477317b0ea0fa7f6456d2605cfJeffrey Kardatzke      : UpdateAttempter(system_state, nullptr) {}
81ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold
82ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold  // Wrap the update scheduling method, allowing us to opt out of scheduled
83ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold  // updates for testing purposes.
84ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold  void ScheduleUpdates() override {
85ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold    schedule_updates_called_ = true;
86ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold    if (do_schedule_updates_) {
87ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold      UpdateAttempter::ScheduleUpdates();
88ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold    } else {
89ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold      LOG(INFO) << "[TEST] Update scheduling disabled.";
90ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold    }
91ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold  }
92ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold  void EnableScheduleUpdates() { do_schedule_updates_ = true; }
93ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold  void DisableScheduleUpdates() { do_schedule_updates_ = false; }
94ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold
95ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold  // Indicates whether ScheduleUpdates() was called.
96ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold  bool schedule_updates_called() const { return schedule_updates_called_; }
97ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold
9802c1864e204997175302b1aebe3e0be9c6699ea5David Pursell  // Need to expose forced_omaha_url_ so we can test it.
9960ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  const string& forced_omaha_url() const { return forced_omaha_url_; }
10002c1864e204997175302b1aebe3e0be9c6699ea5David Pursell
101ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold private:
102ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold  bool schedule_updates_called_ = false;
103ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold  bool do_schedule_updates_ = true;
104f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov};
105f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov
106f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkovclass UpdateAttempterTest : public ::testing::Test {
107f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov protected:
1084348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  UpdateAttempterTest()
109e5f6f2571d43eb65e0b27dd8d50f2c1f0b3fe30fDaniel Erat      : certificate_checker_(fake_system_state_.mock_prefs(),
11033e91e78bfe98c063b0c3b6d590976e275685686Alex Deymo                             &openssl_wrapper_) {
1111f84723f499b3b309efac11324ed4e6c937341b6Gilad Arnold    // Override system state members.
1125bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold    fake_system_state_.set_connection_manager(&mock_connection_manager);
1135bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold    fake_system_state_.set_update_attempter(&attempter_);
11460ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo    loop_.SetAsCurrent();
1151f84723f499b3b309efac11324ed4e6c937341b6Gilad Arnold
11633e91e78bfe98c063b0c3b6d590976e275685686Alex Deymo    certificate_checker_.Init();
11733e91e78bfe98c063b0c3b6d590976e275685686Alex Deymo
118e67bb5b953d4551d6ef51a9900117e3ddd0a32c5Sen Jiang    // Finish initializing the attempter.
1191f84723f499b3b309efac11324ed4e6c937341b6Gilad Arnold    attempter_.Init();
1204348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan  }
121eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold
122610277efc6f7e5239158dfa4bb3b1021804326e0Alex Deymo  void SetUp() override {
12388b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko    EXPECT_NE(nullptr, attempter_.system_state_);
124f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov    EXPECT_EQ(0, attempter_.http_response_code_);
1256b6cc1b788af989fb64116fb2e2299abac697510Christopher Wiley    EXPECT_EQ(UpdateStatus::IDLE, attempter_.status_);
126f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov    EXPECT_EQ(0.0, attempter_.download_progress_);
127f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov    EXPECT_EQ(0, attempter_.last_checked_time_);
128f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov    EXPECT_EQ("0.0.0.0", attempter_.new_version_);
1297f92e2b7060cb35719acf96ef96a4e273e165bc5Aaron Wood    EXPECT_EQ(0ULL, attempter_.new_payload_size_);
1308427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo    processor_ = new NiceMock<MockActionProcessor>();
131f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov    attempter_.processor_.reset(processor_);  // Transfers ownership.
1325bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold    prefs_ = fake_system_state_.mock_prefs();
13374b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold
13474b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold    // Set up store/load semantics of P2P properties via the mock PayloadState.
13574b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold    actual_using_p2p_for_downloading_ = false;
13674b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold    EXPECT_CALL(*fake_system_state_.mock_payload_state(),
13774b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold                SetUsingP2PForDownloading(_))
13874b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold        .WillRepeatedly(SaveArg<0>(&actual_using_p2p_for_downloading_));
13974b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold    EXPECT_CALL(*fake_system_state_.mock_payload_state(),
14074b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold                GetUsingP2PForDownloading())
14174b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold        .WillRepeatedly(ReturnPointee(&actual_using_p2p_for_downloading_));
14274b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold    actual_using_p2p_for_sharing_ = false;
14374b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold    EXPECT_CALL(*fake_system_state_.mock_payload_state(),
14474b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold                SetUsingP2PForSharing(_))
14574b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold        .WillRepeatedly(SaveArg<0>(&actual_using_p2p_for_sharing_));
14674b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold    EXPECT_CALL(*fake_system_state_.mock_payload_state(),
14774b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold                GetUsingP2PForDownloading())
14874b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold        .WillRepeatedly(ReturnPointee(&actual_using_p2p_for_sharing_));
149f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov  }
150f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov
15160ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo public:
15260ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  void ScheduleQuitMainLoop();
1537fbbe8a9e57ec52f7bc597d0cb607036300ac54cPatrick Dubroy
15460ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  // Callbacks to run the different tests from the main loop.
155e6ef2f8bb08facf8939adc9a9e8c48912ffe0a3eDarin Petkov  void UpdateTestStart();
156e6ef2f8bb08facf8939adc9a9e8c48912ffe0a3eDarin Petkov  void UpdateTestVerify();
15760ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  void RollbackTestStart(bool enterprise_rollback, bool valid_slot);
15876a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa  void RollbackTestVerify();
159116fda3221ff3df037ea1feb271883c87644c839Thieu Le  void PingOmahaTestStart();
160480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  void ReadScatterFactorFromPolicyTestStart();
161480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  void DecrementUpdateCheckCountTestStart();
16208fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan  void NoScatteringDoneDuringManualUpdateTestStart();
1638f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  void P2PNotEnabledStart();
1648f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  void P2PEnabledStart();
1658f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  void P2PEnabledInteractiveStart();
1668f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  void P2PEnabledStartingFailsStart();
1678f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  void P2PEnabledHousekeepingFailsStart();
1688f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
16974b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  bool actual_using_p2p_for_downloading() {
17074b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold    return actual_using_p2p_for_downloading_;
17174b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  }
17274b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  bool actual_using_p2p_for_sharing() {
17374b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold    return actual_using_p2p_for_sharing_;
17474b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  }
17574b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold
1760b3db6b6040f53eb9859e614f7fe4c681213d33aAlex Deymo  base::MessageLoopForIO base_loop_;
1773f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko  brillo::BaseMessageLoop loop_{&base_loop_};
17860ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo
1795bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  FakeSystemState fake_system_state_;
180cf5f1f1420b472477317b0ea0fa7f6456d2605cfJeffrey Kardatzke  UpdateAttempterUnderTest attempter_{&fake_system_state_};
18133e91e78bfe98c063b0c3b6d590976e275685686Alex Deymo  OpenSSLWrapper openssl_wrapper_;
18233e91e78bfe98c063b0c3b6d590976e275685686Alex Deymo  CertificateChecker certificate_checker_;
183305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo
1848427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo  NiceMock<MockActionProcessor>* processor_;
1858427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo  NiceMock<MockPrefs>* prefs_;  // Shortcut to fake_system_state_->mock_prefs().
18655f50c24c2624487b803ba2f93588494cc69e523Jay Srinivasan  NiceMock<MockConnectionManager> mock_connection_manager;
187eff87cc42e9d3777a6dcf01bddcdfec152674aceGilad Arnold
18874b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  bool actual_using_p2p_for_downloading_;
18974b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  bool actual_using_p2p_for_sharing_;
190f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov};
191f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov
19260ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymovoid UpdateAttempterTest::ScheduleQuitMainLoop() {
193f1cf34849efdc0158fb1987ba74a51f25016c5bdLuis Hector Chavez  loop_.PostTask(
194f1cf34849efdc0158fb1987ba74a51f25016c5bdLuis Hector Chavez      FROM_HERE,
195f1cf34849efdc0158fb1987ba74a51f25016c5bdLuis Hector Chavez      base::Bind([](brillo::BaseMessageLoop* loop) { loop->BreakLoop(); },
196f1cf34849efdc0158fb1987ba74a51f25016c5bdLuis Hector Chavez                 base::Unretained(&loop_)));
19760ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo}
19860ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo
1991b0031066aa2e38036a8a84458ea8abac90b2e04Darin PetkovTEST_F(UpdateAttempterTest, ActionCompletedDownloadTest) {
20002f7c1dee242f490143791dbb73fa23fa3007cfaBen Chan  unique_ptr<MockHttpFetcher> fetcher(new MockHttpFetcher("", 0, nullptr));
2011b0031066aa2e38036a8a84458ea8abac90b2e04Darin Petkov  fetcher->FailTransfer(503);  // Sets the HTTP response code.
2027ecda265a87236e83cf820364947a1618872b6beAmin Hassani  DownloadAction action(prefs_,
2037ecda265a87236e83cf820364947a1618872b6beAmin Hassani                        nullptr,
2047ecda265a87236e83cf820364947a1618872b6beAmin Hassani                        nullptr,
2057ecda265a87236e83cf820364947a1618872b6beAmin Hassani                        nullptr,
2067ecda265a87236e83cf820364947a1618872b6beAmin Hassani                        fetcher.release(),
2077ecda265a87236e83cf820364947a1618872b6beAmin Hassani                        false /* is_interactive */);
2086f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan  EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _)).Times(0);
20988b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko  attempter_.ActionCompleted(nullptr, &action, ErrorCode::kSuccess);
2106b6cc1b788af989fb64116fb2e2299abac697510Christopher Wiley  EXPECT_EQ(UpdateStatus::FINALIZING, attempter_.status());
2119321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  EXPECT_EQ(0.0, attempter_.download_progress_);
21288b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko  ASSERT_EQ(nullptr, attempter_.error_event_.get());
2131b0031066aa2e38036a8a84458ea8abac90b2e04Darin Petkov}
2141b0031066aa2e38036a8a84458ea8abac90b2e04Darin Petkov
2151b0031066aa2e38036a8a84458ea8abac90b2e04Darin PetkovTEST_F(UpdateAttempterTest, ActionCompletedErrorTest) {
2168427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo  MockAction action;
2178427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo  EXPECT_CALL(action, Type()).WillRepeatedly(Return("MockAction"));
2186b6cc1b788af989fb64116fb2e2299abac697510Christopher Wiley  attempter_.status_ = UpdateStatus::DOWNLOADING;
2196f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan  EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
2201b0031066aa2e38036a8a84458ea8abac90b2e04Darin Petkov      .WillOnce(Return(false));
22188b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko  attempter_.ActionCompleted(nullptr, &action, ErrorCode::kError);
22288b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko  ASSERT_NE(nullptr, attempter_.error_event_.get());
2231b0031066aa2e38036a8a84458ea8abac90b2e04Darin Petkov}
2241b0031066aa2e38036a8a84458ea8abac90b2e04Darin Petkov
2259321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron WoodTEST_F(UpdateAttempterTest, DownloadProgressAccumulationTest) {
2269321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  // Simple test case, where all the values match (nothing was skipped)
2279321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  uint64_t bytes_progressed_1 = 1024 * 1024;  // 1MB
2289321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  uint64_t bytes_progressed_2 = 1024 * 1024;  // 1MB
2299321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  uint64_t bytes_received_1 = bytes_progressed_1;
2309321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  uint64_t bytes_received_2 = bytes_received_1 + bytes_progressed_2;
2319321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  uint64_t bytes_total = 20 * 1024 * 1024;  // 20MB
2329321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood
2339321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  double progress_1 =
2349321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood      static_cast<double>(bytes_received_1) / static_cast<double>(bytes_total);
2359321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  double progress_2 =
2369321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood      static_cast<double>(bytes_received_2) / static_cast<double>(bytes_total);
2379321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood
2389321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  EXPECT_EQ(0.0, attempter_.download_progress_);
2399321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  // This is set via inspecting the InstallPlan payloads when the
2409321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  // OmahaResponseAction is completed
2419321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  attempter_.new_payload_size_ = bytes_total;
2429321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  NiceMock<MockServiceObserver> observer;
2439321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  EXPECT_CALL(observer,
2447f92e2b7060cb35719acf96ef96a4e273e165bc5Aaron Wood              SendStatusUpdate(AllOf(
2457f92e2b7060cb35719acf96ef96a4e273e165bc5Aaron Wood                  Field(&UpdateEngineStatus::progress, progress_1),
2467f92e2b7060cb35719acf96ef96a4e273e165bc5Aaron Wood                  Field(&UpdateEngineStatus::status, UpdateStatus::DOWNLOADING),
2477f92e2b7060cb35719acf96ef96a4e273e165bc5Aaron Wood                  Field(&UpdateEngineStatus::new_size_bytes, bytes_total))));
2489321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  EXPECT_CALL(observer,
2497f92e2b7060cb35719acf96ef96a4e273e165bc5Aaron Wood              SendStatusUpdate(AllOf(
2507f92e2b7060cb35719acf96ef96a4e273e165bc5Aaron Wood                  Field(&UpdateEngineStatus::progress, progress_2),
2517f92e2b7060cb35719acf96ef96a4e273e165bc5Aaron Wood                  Field(&UpdateEngineStatus::status, UpdateStatus::DOWNLOADING),
2527f92e2b7060cb35719acf96ef96a4e273e165bc5Aaron Wood                  Field(&UpdateEngineStatus::new_size_bytes, bytes_total))));
2539321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  attempter_.AddObserver(&observer);
2549321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  attempter_.BytesReceived(bytes_progressed_1, bytes_received_1, bytes_total);
2559321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  EXPECT_EQ(progress_1, attempter_.download_progress_);
2569321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  // This iteration validates that a later set of updates to the variables are
2579321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  // properly handled (so that |getStatus()| will return the same progress info
2589321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  // as the callback is receiving.
2599321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  attempter_.BytesReceived(bytes_progressed_2, bytes_received_2, bytes_total);
2609321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  EXPECT_EQ(progress_2, attempter_.download_progress_);
2619321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood}
2629321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood
2639321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron WoodTEST_F(UpdateAttempterTest, ChangeToDownloadingOnReceivedBytesTest) {
2649321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  // The transition into UpdateStatus::DOWNLOADING happens when the
2659321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  // first bytes are received.
2669321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  uint64_t bytes_progressed = 1024 * 1024;    // 1MB
2679321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  uint64_t bytes_received = 2 * 1024 * 1024;  // 2MB
2689321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  uint64_t bytes_total = 20 * 1024 * 1024;    // 300MB
2699321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  attempter_.status_ = UpdateStatus::CHECKING_FOR_UPDATE;
2709321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  // This is set via inspecting the InstallPlan payloads when the
2719321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  // OmahaResponseAction is completed
2729321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  attempter_.new_payload_size_ = bytes_total;
2739321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  EXPECT_EQ(0.0, attempter_.download_progress_);
2749321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  NiceMock<MockServiceObserver> observer;
2757f92e2b7060cb35719acf96ef96a4e273e165bc5Aaron Wood  EXPECT_CALL(observer,
2767f92e2b7060cb35719acf96ef96a4e273e165bc5Aaron Wood              SendStatusUpdate(AllOf(
2777f92e2b7060cb35719acf96ef96a4e273e165bc5Aaron Wood                  Field(&UpdateEngineStatus::status, UpdateStatus::DOWNLOADING),
2787f92e2b7060cb35719acf96ef96a4e273e165bc5Aaron Wood                  Field(&UpdateEngineStatus::new_size_bytes, bytes_total))));
2799321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  attempter_.AddObserver(&observer);
2809321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  attempter_.BytesReceived(bytes_progressed, bytes_received, bytes_total);
2819321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  EXPECT_EQ(UpdateStatus::DOWNLOADING, attempter_.status_);
2829321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood}
2839321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood
2849321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron WoodTEST_F(UpdateAttempterTest, BroadcastCompleteDownloadTest) {
2859321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  // There is a special case to ensure that at 100% downloaded,
2869321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  // download_progress_ is updated and that value broadcast. This test confirms
2879321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  // that.
2889321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  uint64_t bytes_progressed = 0;              // ignored
2899321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  uint64_t bytes_received = 5 * 1024 * 1024;  // ignored
2909321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  uint64_t bytes_total = 5 * 1024 * 1024;     // 300MB
2919321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  attempter_.status_ = UpdateStatus::DOWNLOADING;
2929321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  attempter_.new_payload_size_ = bytes_total;
2939321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  EXPECT_EQ(0.0, attempter_.download_progress_);
2949321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  NiceMock<MockServiceObserver> observer;
2957f92e2b7060cb35719acf96ef96a4e273e165bc5Aaron Wood  EXPECT_CALL(observer,
2967f92e2b7060cb35719acf96ef96a4e273e165bc5Aaron Wood              SendStatusUpdate(AllOf(
2977f92e2b7060cb35719acf96ef96a4e273e165bc5Aaron Wood                  Field(&UpdateEngineStatus::progress, 1.0),
2987f92e2b7060cb35719acf96ef96a4e273e165bc5Aaron Wood                  Field(&UpdateEngineStatus::status, UpdateStatus::DOWNLOADING),
2997f92e2b7060cb35719acf96ef96a4e273e165bc5Aaron Wood                  Field(&UpdateEngineStatus::new_size_bytes, bytes_total))));
3009321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  attempter_.AddObserver(&observer);
3019321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  attempter_.BytesReceived(bytes_progressed, bytes_received, bytes_total);
3029321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood  EXPECT_EQ(1.0, attempter_.download_progress_);
3039321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood}
3049321f501029e7c0fdca55db3a79c9dcb24e4a767Aaron Wood
3051b0031066aa2e38036a8a84458ea8abac90b2e04Darin PetkovTEST_F(UpdateAttempterTest, ActionCompletedOmahaRequestTest) {
30602f7c1dee242f490143791dbb73fa23fa3007cfaBen Chan  unique_ptr<MockHttpFetcher> fetcher(new MockHttpFetcher("", 0, nullptr));
3071b0031066aa2e38036a8a84458ea8abac90b2e04Darin Petkov  fetcher->FailTransfer(500);  // Sets the HTTP response code.
30888b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko  OmahaRequestAction action(&fake_system_state_, nullptr,
309c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo                            std::move(fetcher), false);
3101b0031066aa2e38036a8a84458ea8abac90b2e04Darin Petkov  ObjectCollectorAction<OmahaResponse> collector_action;
3111b0031066aa2e38036a8a84458ea8abac90b2e04Darin Petkov  BondActions(&action, &collector_action);
3121b0031066aa2e38036a8a84458ea8abac90b2e04Darin Petkov  OmahaResponse response;
3131b0031066aa2e38036a8a84458ea8abac90b2e04Darin Petkov  response.poll_interval = 234;
3141b0031066aa2e38036a8a84458ea8abac90b2e04Darin Petkov  action.SetOutputObject(response);
3156f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan  EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _)).Times(0);
31688b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko  attempter_.ActionCompleted(nullptr, &action, ErrorCode::kSuccess);
3171b0031066aa2e38036a8a84458ea8abac90b2e04Darin Petkov  EXPECT_EQ(500, attempter_.http_response_code());
3186b6cc1b788af989fb64116fb2e2299abac697510Christopher Wiley  EXPECT_EQ(UpdateStatus::IDLE, attempter_.status());
31980f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo  EXPECT_EQ(234U, attempter_.server_dictated_poll_interval_);
32088b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko  ASSERT_TRUE(attempter_.error_event_.get() == nullptr);
3211b0031066aa2e38036a8a84458ea8abac90b2e04Darin Petkov}
3221b0031066aa2e38036a8a84458ea8abac90b2e04Darin Petkov
323305345001d85ca2282112c2a30fe75c7a4773491Alex DeymoTEST_F(UpdateAttempterTest, ConstructWithUpdatedMarkerTest) {
324906191f88cb2448691e54f7a6a3b464854053154Alex Deymo  FakePrefs fake_prefs;
325906191f88cb2448691e54f7a6a3b464854053154Alex Deymo  string boot_id;
326906191f88cb2448691e54f7a6a3b464854053154Alex Deymo  EXPECT_TRUE(utils::GetBootId(&boot_id));
327906191f88cb2448691e54f7a6a3b464854053154Alex Deymo  fake_prefs.SetString(kPrefsUpdateCompletedOnBootId, boot_id);
328906191f88cb2448691e54f7a6a3b464854053154Alex Deymo  fake_system_state_.set_prefs(&fake_prefs);
329aeeb2e015ef5ef046c744d3c5daa7f353eb71b4eSen Jiang  attempter_.Init();
330aeeb2e015ef5ef046c744d3c5daa7f353eb71b4eSen Jiang  EXPECT_EQ(UpdateStatus::UPDATED_NEED_REBOOT, attempter_.status());
331f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov}
332f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov
333f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin PetkovTEST_F(UpdateAttempterTest, GetErrorCodeForActionTest) {
334a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen  extern ErrorCode GetErrorCodeForAction(AbstractAction* action,
335a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen                                              ErrorCode code);
336d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold  EXPECT_EQ(ErrorCode::kSuccess,
33788b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko            GetErrorCodeForAction(nullptr, ErrorCode::kSuccess));
338f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov
3395bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  FakeSystemState fake_system_state;
34088b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko  OmahaRequestAction omaha_request_action(&fake_system_state, nullptr,
34188b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko                                          nullptr, false);
342d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold  EXPECT_EQ(ErrorCode::kOmahaRequestError,
343d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold            GetErrorCodeForAction(&omaha_request_action, ErrorCode::kError));
3445bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  OmahaResponseHandlerAction omaha_response_handler_action(&fake_system_state_);
345d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold  EXPECT_EQ(ErrorCode::kOmahaResponseHandlerError,
346f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov            GetErrorCodeForAction(&omaha_response_handler_action,
347d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                                  ErrorCode::kError));
348e6e4bb929acd73e57b68a30d1e3a33d76607aec3Sen Jiang  FilesystemVerifierAction filesystem_verifier_action;
349eb9e6d8d8813b2d5a81a14e0184f7b4798573606Allie Wood  EXPECT_EQ(ErrorCode::kFilesystemVerifierError,
350eb9e6d8d8813b2d5a81a14e0184f7b4798573606Allie Wood            GetErrorCodeForAction(&filesystem_verifier_action,
351d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                                  ErrorCode::kError));
352b15a0b8eaf18c9e9341706df9f4ab59ce595a67cAlex Deymo  PostinstallRunnerAction postinstall_runner_action(
353fb905d9b8d49f8fe41297c7aba2dd0942f1be311Alex Deymo      fake_system_state.fake_boot_control(), fake_system_state.fake_hardware());
354d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold  EXPECT_EQ(ErrorCode::kPostinstallRunnerError,
355f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov            GetErrorCodeForAction(&postinstall_runner_action,
356d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                                  ErrorCode::kError));
3578427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo  MockAction action_mock;
3588427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo  EXPECT_CALL(action_mock, Type()).WillOnce(Return("MockAction"));
359d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold  EXPECT_EQ(ErrorCode::kError,
360d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold            GetErrorCodeForAction(&action_mock, ErrorCode::kError));
361f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov}
362f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov
363362757765e7697dd93e8de05fa0a59f29242eb89Darin PetkovTEST_F(UpdateAttempterTest, DisableDeltaUpdateIfNeededTest) {
364ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  attempter_.omaha_request_params_->set_delta_okay(true);
3656f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan  EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
366362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov      .WillOnce(Return(false));
367362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov  attempter_.DisableDeltaUpdateIfNeeded();
368ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_TRUE(attempter_.omaha_request_params_->delta_okay());
3696f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan  EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
370362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov      .WillOnce(DoAll(
371672c1f54a499a825cc0bb9bc4f240bf1887550d9Ben Chan          SetArgPointee<1>(UpdateAttempter::kMaxDeltaUpdateFailures - 1),
372362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov          Return(true)));
373362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov  attempter_.DisableDeltaUpdateIfNeeded();
374ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_TRUE(attempter_.omaha_request_params_->delta_okay());
3756f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan  EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
376362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov      .WillOnce(DoAll(
377672c1f54a499a825cc0bb9bc4f240bf1887550d9Ben Chan          SetArgPointee<1>(UpdateAttempter::kMaxDeltaUpdateFailures),
378362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov          Return(true)));
379362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov  attempter_.DisableDeltaUpdateIfNeeded();
380ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_FALSE(attempter_.omaha_request_params_->delta_okay());
3816f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan  EXPECT_CALL(*prefs_, GetInt64(_, _)).Times(0);
382362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov  attempter_.DisableDeltaUpdateIfNeeded();
383ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_FALSE(attempter_.omaha_request_params_->delta_okay());
384362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov}
385362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov
386362757765e7697dd93e8de05fa0a59f29242eb89Darin PetkovTEST_F(UpdateAttempterTest, MarkDeltaUpdateFailureTest) {
3876f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan  EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
388362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov      .WillOnce(Return(false))
389672c1f54a499a825cc0bb9bc4f240bf1887550d9Ben Chan      .WillOnce(DoAll(SetArgPointee<1>(-1), Return(true)))
390672c1f54a499a825cc0bb9bc4f240bf1887550d9Ben Chan      .WillOnce(DoAll(SetArgPointee<1>(1), Return(true)))
391362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov      .WillOnce(DoAll(
392672c1f54a499a825cc0bb9bc4f240bf1887550d9Ben Chan          SetArgPointee<1>(UpdateAttempter::kMaxDeltaUpdateFailures),
393362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov          Return(true)));
3946f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan  EXPECT_CALL(*prefs_, SetInt64(Ne(kPrefsDeltaUpdateFailures), _))
3952dd0109675fac379289a9d092fa4a6f6e05e0038Darin Petkov      .WillRepeatedly(Return(true));
3966f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan  EXPECT_CALL(*prefs_, SetInt64(kPrefsDeltaUpdateFailures, 1)).Times(2);
39774b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  EXPECT_CALL(*prefs_, SetInt64(kPrefsDeltaUpdateFailures, 2));
3986f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan  EXPECT_CALL(*prefs_, SetInt64(kPrefsDeltaUpdateFailures,
39974b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold                               UpdateAttempter::kMaxDeltaUpdateFailures + 1));
400362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov  for (int i = 0; i < 4; i ++)
401362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov    attempter_.MarkDeltaUpdateFailure();
402362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov}
403362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov
4041b0031066aa2e38036a8a84458ea8abac90b2e04Darin PetkovTEST_F(UpdateAttempterTest, ScheduleErrorEventActionNoEventTest) {
4051b0031066aa2e38036a8a84458ea8abac90b2e04Darin Petkov  EXPECT_CALL(*processor_, EnqueueAction(_)).Times(0);
4061b0031066aa2e38036a8a84458ea8abac90b2e04Darin Petkov  EXPECT_CALL(*processor_, StartProcessing()).Times(0);
4075bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  EXPECT_CALL(*fake_system_state_.mock_payload_state(), UpdateFailed(_))
4086f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan      .Times(0);
4096f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan  OmahaResponse response;
41053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan  string url1 = "http://url1";
4110affc2c099fac47b999ba39f8f1bacb418e65a97Sen Jiang  response.packages.push_back({.payload_urls = {url1, "https://url"}});
4125bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  EXPECT_CALL(*(fake_system_state_.mock_payload_state()), GetCurrentUrl())
41353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan      .WillRepeatedly(Return(url1));
4145bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  fake_system_state_.mock_payload_state()->SetResponse(response);
4151b0031066aa2e38036a8a84458ea8abac90b2e04Darin Petkov  attempter_.ScheduleErrorEventAction();
4165bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  EXPECT_EQ(url1, fake_system_state_.mock_payload_state()->GetCurrentUrl());
4171b0031066aa2e38036a8a84458ea8abac90b2e04Darin Petkov}
4181b0031066aa2e38036a8a84458ea8abac90b2e04Darin Petkov
4191b0031066aa2e38036a8a84458ea8abac90b2e04Darin PetkovTEST_F(UpdateAttempterTest, ScheduleErrorEventActionTest) {
4201b0031066aa2e38036a8a84458ea8abac90b2e04Darin Petkov  EXPECT_CALL(*processor_,
4211b0031066aa2e38036a8a84458ea8abac90b2e04Darin Petkov              EnqueueAction(Property(&AbstractAction::Type,
42274b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold                                     OmahaRequestAction::StaticType())));
42374b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  EXPECT_CALL(*processor_, StartProcessing());
424d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold  ErrorCode err = ErrorCode::kError;
4255bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  EXPECT_CALL(*fake_system_state_.mock_payload_state(), UpdateFailed(err));
4261b0031066aa2e38036a8a84458ea8abac90b2e04Darin Petkov  attempter_.error_event_.reset(new OmahaEvent(OmahaEvent::kTypeUpdateComplete,
4271b0031066aa2e38036a8a84458ea8abac90b2e04Darin Petkov                                               OmahaEvent::kResultError,
4286f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan                                               err));
4291b0031066aa2e38036a8a84458ea8abac90b2e04Darin Petkov  attempter_.ScheduleErrorEventAction();
4306b6cc1b788af989fb64116fb2e2299abac697510Christopher Wiley  EXPECT_EQ(UpdateStatus::REPORTING_ERROR_EVENT, attempter_.status());
4311b0031066aa2e38036a8a84458ea8abac90b2e04Darin Petkov}
4321b0031066aa2e38036a8a84458ea8abac90b2e04Darin Petkov
433e6ef2f8bb08facf8939adc9a9e8c48912ffe0a3eDarin Petkovnamespace {
43476a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa// Actions that will be built as part of an update check.
435d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenkoconst string kUpdateActionTypes[] = {  // NOLINT(runtime/string)
436e6ef2f8bb08facf8939adc9a9e8c48912ffe0a3eDarin Petkov  OmahaRequestAction::StaticType(),
437e6ef2f8bb08facf8939adc9a9e8c48912ffe0a3eDarin Petkov  OmahaResponseHandlerAction::StaticType(),
438e6ef2f8bb08facf8939adc9a9e8c48912ffe0a3eDarin Petkov  OmahaRequestAction::StaticType(),
439e6ef2f8bb08facf8939adc9a9e8c48912ffe0a3eDarin Petkov  DownloadAction::StaticType(),
440e6ef2f8bb08facf8939adc9a9e8c48912ffe0a3eDarin Petkov  OmahaRequestAction::StaticType(),
441eb9e6d8d8813b2d5a81a14e0184f7b4798573606Allie Wood  FilesystemVerifierAction::StaticType(),
442e6ef2f8bb08facf8939adc9a9e8c48912ffe0a3eDarin Petkov  PostinstallRunnerAction::StaticType(),
443e6ef2f8bb08facf8939adc9a9e8c48912ffe0a3eDarin Petkov  OmahaRequestAction::StaticType()
444e6ef2f8bb08facf8939adc9a9e8c48912ffe0a3eDarin Petkov};
44576a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa
44676a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa// Actions that will be built as part of a user-initiated rollback.
447d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenkoconst string kRollbackActionTypes[] = {  // NOLINT(runtime/string)
44876a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa  InstallPlanAction::StaticType(),
44976a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa  PostinstallRunnerAction::StaticType(),
45076a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa};
45176a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa
452d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko}  // namespace
453e6ef2f8bb08facf8939adc9a9e8c48912ffe0a3eDarin Petkov
454e6ef2f8bb08facf8939adc9a9e8c48912ffe0a3eDarin Petkovvoid UpdateAttempterTest::UpdateTestStart() {
455f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov  attempter_.set_http_response_code(200);
456749ecf1c000ce0243c2eee986282dd568535bafeAlex Deymo
457749ecf1c000ce0243c2eee986282dd568535bafeAlex Deymo  // Expect that the device policy is loaded by the UpdateAttempter at some
458749ecf1c000ce0243c2eee986282dd568535bafeAlex Deymo  // point by calling RefreshDevicePolicy.
4599fd76b6b1dc4a80f8464427e981220c29abc1d66Igor  auto device_policy = std::make_unique<policy::MockDevicePolicy>();
460749ecf1c000ce0243c2eee986282dd568535bafeAlex Deymo  EXPECT_CALL(*device_policy, LoadPolicy())
461749ecf1c000ce0243c2eee986282dd568535bafeAlex Deymo      .Times(testing::AtLeast(1)).WillRepeatedly(Return(true));
4629fd76b6b1dc4a80f8464427e981220c29abc1d66Igor  attempter_.policy_provider_.reset(
4639fd76b6b1dc4a80f8464427e981220c29abc1d66Igor      new policy::PolicyProvider(std::move(device_policy)));
464749ecf1c000ce0243c2eee986282dd568535bafeAlex Deymo
465749ecf1c000ce0243c2eee986282dd568535bafeAlex Deymo  {
466749ecf1c000ce0243c2eee986282dd568535bafeAlex Deymo    InSequence s;
467749ecf1c000ce0243c2eee986282dd568535bafeAlex Deymo    for (size_t i = 0; i < arraysize(kUpdateActionTypes); ++i) {
468749ecf1c000ce0243c2eee986282dd568535bafeAlex Deymo      EXPECT_CALL(*processor_,
469749ecf1c000ce0243c2eee986282dd568535bafeAlex Deymo                  EnqueueAction(Property(&AbstractAction::Type,
47074b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold                                         kUpdateActionTypes[i])));
471749ecf1c000ce0243c2eee986282dd568535bafeAlex Deymo    }
47274b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold    EXPECT_CALL(*processor_, StartProcessing());
473f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov  }
474f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov
475ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold  attempter_.Update("", "", "", "", false, false);
47660ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop_.PostTask(FROM_HERE,
47760ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo                 base::Bind(&UpdateAttempterTest::UpdateTestVerify,
47860ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo                            base::Unretained(this)));
479e6ef2f8bb08facf8939adc9a9e8c48912ffe0a3eDarin Petkov}
480f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov
481e6ef2f8bb08facf8939adc9a9e8c48912ffe0a3eDarin Petkovvoid UpdateAttempterTest::UpdateTestVerify() {
482f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov  EXPECT_EQ(0, attempter_.http_response_code());
483f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov  EXPECT_EQ(&attempter_, processor_->delegate());
48476a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa  EXPECT_EQ(arraysize(kUpdateActionTypes), attempter_.actions_.size());
48576a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa  for (size_t i = 0; i < arraysize(kUpdateActionTypes); ++i) {
48676a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa    EXPECT_EQ(kUpdateActionTypes[i], attempter_.actions_[i]->Type());
487f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov  }
488f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov  EXPECT_EQ(attempter_.response_handler_action_.get(),
489f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov            attempter_.actions_[1].get());
490fef85fd9ece49941db274559a938fe8b2c5157bfSen Jiang  AbstractAction* action_3 = attempter_.actions_[3].get();
491fef85fd9ece49941db274559a938fe8b2c5157bfSen Jiang  ASSERT_NE(nullptr, action_3);
492fef85fd9ece49941db274559a938fe8b2c5157bfSen Jiang  ASSERT_EQ(DownloadAction::StaticType(), action_3->Type());
493fef85fd9ece49941db274559a938fe8b2c5157bfSen Jiang  DownloadAction* download_action = static_cast<DownloadAction*>(action_3);
494f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov  EXPECT_EQ(&attempter_, download_action->delegate());
4956b6cc1b788af989fb64116fb2e2299abac697510Christopher Wiley  EXPECT_EQ(UpdateStatus::CHECKING_FOR_UPDATE, attempter_.status());
49660ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop_.BreakLoop();
497e6ef2f8bb08facf8939adc9a9e8c48912ffe0a3eDarin Petkov}
498e6ef2f8bb08facf8939adc9a9e8c48912ffe0a3eDarin Petkov
49928e479c3b08cb4d1280905f5d3510f8ec4ed719cChris Sosavoid UpdateAttempterTest::RollbackTestStart(
50044b9b7ed0a702e54afccb86228668c59151859beChris Sosa    bool enterprise_rollback, bool valid_slot) {
50176a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa  // Create a device policy so that we can change settings.
5029fd76b6b1dc4a80f8464427e981220c29abc1d66Igor  auto device_policy = std::make_unique<policy::MockDevicePolicy>();
50376a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa  EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
5049fd76b6b1dc4a80f8464427e981220c29abc1d66Igor  fake_system_state_.set_device_policy(device_policy.get());
5059fd76b6b1dc4a80f8464427e981220c29abc1d66Igor  if (enterprise_rollback) {
5069fd76b6b1dc4a80f8464427e981220c29abc1d66Igor    // We return an empty owner as this is an enterprise.
5079fd76b6b1dc4a80f8464427e981220c29abc1d66Igor    EXPECT_CALL(*device_policy, GetOwner(_)).WillRepeatedly(
5089fd76b6b1dc4a80f8464427e981220c29abc1d66Igor        DoAll(SetArgPointee<0>(string("")),
5099fd76b6b1dc4a80f8464427e981220c29abc1d66Igor        Return(true)));
5109fd76b6b1dc4a80f8464427e981220c29abc1d66Igor  } else {
5119fd76b6b1dc4a80f8464427e981220c29abc1d66Igor    // We return a fake owner as this is an owned consumer device.
5129fd76b6b1dc4a80f8464427e981220c29abc1d66Igor    EXPECT_CALL(*device_policy, GetOwner(_)).WillRepeatedly(
5139fd76b6b1dc4a80f8464427e981220c29abc1d66Igor        DoAll(SetArgPointee<0>(string("fake.mail@fake.com")),
5149fd76b6b1dc4a80f8464427e981220c29abc1d66Igor        Return(true)));
5159fd76b6b1dc4a80f8464427e981220c29abc1d66Igor  }
5169fd76b6b1dc4a80f8464427e981220c29abc1d66Igor
5179fd76b6b1dc4a80f8464427e981220c29abc1d66Igor  attempter_.policy_provider_.reset(
5189fd76b6b1dc4a80f8464427e981220c29abc1d66Igor      new policy::PolicyProvider(std::move(device_policy)));
51976a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa
520763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo  if (valid_slot) {
521763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo    BootControlInterface::Slot rollback_slot = 1;
522763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo    LOG(INFO) << "Test Mark Bootable: "
523763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo              << BootControlInterface::SlotName(rollback_slot);
524e5e5fe926e9ea45b1a381af1bee91a86643ffd72Alex Deymo    fake_system_state_.fake_boot_control()->SetSlotBootable(rollback_slot,
525e5e5fe926e9ea45b1a381af1bee91a86643ffd72Alex Deymo                                                            true);
5266646b44ac128d07b33435d0bbf7cfd140af15eb9Don Garrett  }
5276646b44ac128d07b33435d0bbf7cfd140af15eb9Don Garrett
52828e479c3b08cb4d1280905f5d3510f8ec4ed719cChris Sosa  bool is_rollback_allowed = false;
52928e479c3b08cb4d1280905f5d3510f8ec4ed719cChris Sosa
530d38b113179e6d238ad7db16629b1146222c57c85Chris Sosa  // We only allow rollback on devices that are not enterprise enrolled and
531d38b113179e6d238ad7db16629b1146222c57c85Chris Sosa  // which have a valid slot to rollback to.
532d38b113179e6d238ad7db16629b1146222c57c85Chris Sosa  if (!enterprise_rollback && valid_slot) {
53328e479c3b08cb4d1280905f5d3510f8ec4ed719cChris Sosa     is_rollback_allowed = true;
53428e479c3b08cb4d1280905f5d3510f8ec4ed719cChris Sosa  }
53576a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa
53628e479c3b08cb4d1280905f5d3510f8ec4ed719cChris Sosa  if (is_rollback_allowed) {
53776a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa    InSequence s;
53876a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa    for (size_t i = 0; i < arraysize(kRollbackActionTypes); ++i) {
53976a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa      EXPECT_CALL(*processor_,
54076a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa                  EnqueueAction(Property(&AbstractAction::Type,
54174b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold                                         kRollbackActionTypes[i])));
54276a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa    }
54374b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold    EXPECT_CALL(*processor_, StartProcessing());
54476a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa
54544b9b7ed0a702e54afccb86228668c59151859beChris Sosa    EXPECT_TRUE(attempter_.Rollback(true));
54660ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo    loop_.PostTask(FROM_HERE,
54760ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo                   base::Bind(&UpdateAttempterTest::RollbackTestVerify,
54860ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo                              base::Unretained(this)));
54976a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa  } else {
55044b9b7ed0a702e54afccb86228668c59151859beChris Sosa    EXPECT_FALSE(attempter_.Rollback(true));
55160ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo    loop_.BreakLoop();
55276a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa  }
55376a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa}
55476a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa
55576a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosavoid UpdateAttempterTest::RollbackTestVerify() {
55676a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa  // Verifies the actions that were enqueued.
55776a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa  EXPECT_EQ(&attempter_, processor_->delegate());
55876a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa  EXPECT_EQ(arraysize(kRollbackActionTypes), attempter_.actions_.size());
55976a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa  for (size_t i = 0; i < arraysize(kRollbackActionTypes); ++i) {
56076a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa    EXPECT_EQ(kRollbackActionTypes[i], attempter_.actions_[i]->Type());
56176a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa  }
5626b6cc1b788af989fb64116fb2e2299abac697510Christopher Wiley  EXPECT_EQ(UpdateStatus::ATTEMPTING_ROLLBACK, attempter_.status());
56380f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo  AbstractAction* action_0 = attempter_.actions_[0].get();
56480f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo  ASSERT_NE(nullptr, action_0);
56580f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo  ASSERT_EQ(InstallPlanAction::StaticType(), action_0->Type());
56676a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa  InstallPlanAction* install_plan_action =
56780f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo      static_cast<InstallPlanAction*>(action_0);
56876a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa  InstallPlan* install_plan = install_plan_action->install_plan();
56980f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo  EXPECT_EQ(0U, install_plan->partitions.size());
57076a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa  EXPECT_EQ(install_plan->powerwash_required, true);
57160ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop_.BreakLoop();
57276a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa}
57376a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa
574e6ef2f8bb08facf8939adc9a9e8c48912ffe0a3eDarin PetkovTEST_F(UpdateAttempterTest, UpdateTest) {
575461b259af8815d782200782c5ba3599d8de4a66cAlex Deymo  UpdateTestStart();
57660ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop_.Run();
577f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov}
578f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov
57976a29aef71c1602d6dcec6fc7062d2162b03c9ecChris SosaTEST_F(UpdateAttempterTest, RollbackTest) {
58060ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop_.PostTask(FROM_HERE,
58160ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo                 base::Bind(&UpdateAttempterTest::RollbackTestStart,
58260ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo                            base::Unretained(this),
58360ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo                            false, true));
58460ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop_.Run();
58576a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa}
58676a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa
5876646b44ac128d07b33435d0bbf7cfd140af15eb9Don GarrettTEST_F(UpdateAttempterTest, InvalidSlotRollbackTest) {
58860ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop_.PostTask(FROM_HERE,
58960ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo                 base::Bind(&UpdateAttempterTest::RollbackTestStart,
59060ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo                            base::Unretained(this),
59160ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo                            false, false));
59260ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop_.Run();
5936646b44ac128d07b33435d0bbf7cfd140af15eb9Don Garrett}
5946646b44ac128d07b33435d0bbf7cfd140af15eb9Don Garrett
59576a29aef71c1602d6dcec6fc7062d2162b03c9ecChris SosaTEST_F(UpdateAttempterTest, EnterpriseRollbackTest) {
59660ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop_.PostTask(FROM_HERE,
59760ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo                 base::Bind(&UpdateAttempterTest::RollbackTestStart,
59860ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo                            base::Unretained(this),
59960ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo                            true, true));
60060ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop_.Run();
60176a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa}
60276a29aef71c1602d6dcec6fc7062d2162b03c9ecChris Sosa
603116fda3221ff3df037ea1feb271883c87644c839Thieu Levoid UpdateAttempterTest::PingOmahaTestStart() {
604116fda3221ff3df037ea1feb271883c87644c839Thieu Le  EXPECT_CALL(*processor_,
605116fda3221ff3df037ea1feb271883c87644c839Thieu Le              EnqueueAction(Property(&AbstractAction::Type,
60674b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold                                     OmahaRequestAction::StaticType())));
60774b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  EXPECT_CALL(*processor_, StartProcessing());
608116fda3221ff3df037ea1feb271883c87644c839Thieu Le  attempter_.PingOmaha();
60960ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  ScheduleQuitMainLoop();
610116fda3221ff3df037ea1feb271883c87644c839Thieu Le}
611116fda3221ff3df037ea1feb271883c87644c839Thieu Le
612116fda3221ff3df037ea1feb271883c87644c839Thieu LeTEST_F(UpdateAttempterTest, PingOmahaTest) {
613ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold  EXPECT_FALSE(attempter_.waiting_for_scheduled_check_);
614ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold  EXPECT_FALSE(attempter_.schedule_updates_called());
615ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold  // Disable scheduling of subsequnet checks; we're using the DefaultPolicy in
616ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold  // testing, which is more permissive than we want to handle here.
617ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold  attempter_.DisableScheduleUpdates();
61860ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop_.PostTask(FROM_HERE,
61960ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo                 base::Bind(&UpdateAttempterTest::PingOmahaTestStart,
62060ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo                            base::Unretained(this)));
6213f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko  brillo::MessageLoopRunMaxIterations(&loop_, 100);
6226b6cc1b788af989fb64116fb2e2299abac697510Christopher Wiley  EXPECT_EQ(UpdateStatus::UPDATED_NEED_REBOOT, attempter_.status());
623ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold  EXPECT_TRUE(attempter_.schedule_updates_called());
624116fda3221ff3df037ea1feb271883c87644c839Thieu Le}
625116fda3221ff3df037ea1feb271883c87644c839Thieu Le
62618c7bce69dc040dc8e9c2a1dc207f7447fb06e84Darin PetkovTEST_F(UpdateAttempterTest, CreatePendingErrorEventTest) {
6278427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo  MockAction action;
628d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold  const ErrorCode kCode = ErrorCode::kDownloadTransferError;
62918c7bce69dc040dc8e9c2a1dc207f7447fb06e84Darin Petkov  attempter_.CreatePendingErrorEvent(&action, kCode);
63088b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko  ASSERT_NE(nullptr, attempter_.error_event_.get());
63118c7bce69dc040dc8e9c2a1dc207f7447fb06e84Darin Petkov  EXPECT_EQ(OmahaEvent::kTypeUpdateComplete, attempter_.error_event_->type);
63218c7bce69dc040dc8e9c2a1dc207f7447fb06e84Darin Petkov  EXPECT_EQ(OmahaEvent::kResultError, attempter_.error_event_->result);
633d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold  EXPECT_EQ(
634d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold      static_cast<ErrorCode>(static_cast<int>(kCode) |
635d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold                             static_cast<int>(ErrorCode::kTestOmahaUrlFlag)),
636d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold      attempter_.error_event_->error_code);
63718c7bce69dc040dc8e9c2a1dc207f7447fb06e84Darin Petkov}
63818c7bce69dc040dc8e9c2a1dc207f7447fb06e84Darin Petkov
63918c7bce69dc040dc8e9c2a1dc207f7447fb06e84Darin PetkovTEST_F(UpdateAttempterTest, CreatePendingErrorEventResumedTest) {
64018c7bce69dc040dc8e9c2a1dc207f7447fb06e84Darin Petkov  OmahaResponseHandlerAction *response_action =
6415bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold      new OmahaResponseHandlerAction(&fake_system_state_);
64218c7bce69dc040dc8e9c2a1dc207f7447fb06e84Darin Petkov  response_action->install_plan_.is_resume = true;
64318c7bce69dc040dc8e9c2a1dc207f7447fb06e84Darin Petkov  attempter_.response_handler_action_.reset(response_action);
6448427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo  MockAction action;
645d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold  const ErrorCode kCode = ErrorCode::kInstallDeviceOpenError;
64618c7bce69dc040dc8e9c2a1dc207f7447fb06e84Darin Petkov  attempter_.CreatePendingErrorEvent(&action, kCode);
64788b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko  ASSERT_NE(nullptr, attempter_.error_event_.get());
64818c7bce69dc040dc8e9c2a1dc207f7447fb06e84Darin Petkov  EXPECT_EQ(OmahaEvent::kTypeUpdateComplete, attempter_.error_event_->type);
64918c7bce69dc040dc8e9c2a1dc207f7447fb06e84Darin Petkov  EXPECT_EQ(OmahaEvent::kResultError, attempter_.error_event_->result);
650d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold  EXPECT_EQ(
651d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold      static_cast<ErrorCode>(
652d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold          static_cast<int>(kCode) |
653d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold          static_cast<int>(ErrorCode::kResumedFlag) |
654d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold          static_cast<int>(ErrorCode::kTestOmahaUrlFlag)),
655d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold      attempter_.error_event_->error_code);
65618c7bce69dc040dc8e9c2a1dc207f7447fb06e84Darin Petkov}
65718c7bce69dc040dc8e9c2a1dc207f7447fb06e84Darin Petkov
6588f191b22a1a1ab2b803d65ee488729206e648695David ZeuthenTEST_F(UpdateAttempterTest, P2PNotStartedAtStartupWhenNotEnabled) {
6598f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  MockP2PManager mock_p2p_manager;
6605bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  fake_system_state_.set_p2p_manager(&mock_p2p_manager);
6618f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  mock_p2p_manager.fake().SetP2PEnabled(false);
6628f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  EXPECT_CALL(mock_p2p_manager, EnsureP2PRunning()).Times(0);
6638f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  attempter_.UpdateEngineStarted();
6648f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
6658f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
6668f191b22a1a1ab2b803d65ee488729206e648695David ZeuthenTEST_F(UpdateAttempterTest, P2PNotStartedAtStartupWhenEnabledButNotSharing) {
6678f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  MockP2PManager mock_p2p_manager;
6685bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  fake_system_state_.set_p2p_manager(&mock_p2p_manager);
6698f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  mock_p2p_manager.fake().SetP2PEnabled(true);
6708f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  EXPECT_CALL(mock_p2p_manager, EnsureP2PRunning()).Times(0);
6718f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  attempter_.UpdateEngineStarted();
6728f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
6738f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
6748f191b22a1a1ab2b803d65ee488729206e648695David ZeuthenTEST_F(UpdateAttempterTest, P2PStartedAtStartupWhenEnabledAndSharing) {
6758f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  MockP2PManager mock_p2p_manager;
6765bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  fake_system_state_.set_p2p_manager(&mock_p2p_manager);
6778f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  mock_p2p_manager.fake().SetP2PEnabled(true);
6788f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  mock_p2p_manager.fake().SetCountSharedFilesResult(1);
67974b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  EXPECT_CALL(mock_p2p_manager, EnsureP2PRunning());
6808f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  attempter_.UpdateEngineStarted();
6818f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
6828f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
6838f191b22a1a1ab2b803d65ee488729206e648695David ZeuthenTEST_F(UpdateAttempterTest, P2PNotEnabled) {
68460ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop_.PostTask(FROM_HERE,
68560ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo                 base::Bind(&UpdateAttempterTest::P2PNotEnabledStart,
68660ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo                            base::Unretained(this)));
68760ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop_.Run();
6888f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
68960ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo
6908f191b22a1a1ab2b803d65ee488729206e648695David Zeuthenvoid UpdateAttempterTest::P2PNotEnabledStart() {
6918f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  // If P2P is not enabled, check that we do not attempt housekeeping
6928f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  // and do not convey that p2p is to be used.
6938f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  MockP2PManager mock_p2p_manager;
6945bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  fake_system_state_.set_p2p_manager(&mock_p2p_manager);
6958f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  mock_p2p_manager.fake().SetP2PEnabled(false);
6968f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  EXPECT_CALL(mock_p2p_manager, PerformHousekeeping()).Times(0);
697ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold  attempter_.Update("", "", "", "", false, false);
69860ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  EXPECT_FALSE(actual_using_p2p_for_downloading_);
69974b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  EXPECT_FALSE(actual_using_p2p_for_sharing());
70060ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  ScheduleQuitMainLoop();
7018f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
7028f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
7038f191b22a1a1ab2b803d65ee488729206e648695David ZeuthenTEST_F(UpdateAttempterTest, P2PEnabledStartingFails) {
70460ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop_.PostTask(FROM_HERE,
70560ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo                 base::Bind(&UpdateAttempterTest::P2PEnabledStartingFailsStart,
70660ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo                            base::Unretained(this)));
70760ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop_.Run();
7088f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
70960ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo
7108f191b22a1a1ab2b803d65ee488729206e648695David Zeuthenvoid UpdateAttempterTest::P2PEnabledStartingFailsStart() {
7118f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  // If p2p is enabled, but starting it fails ensure we don't do
7128f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  // any housekeeping and do not convey that p2p should be used.
7138f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  MockP2PManager mock_p2p_manager;
7145bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  fake_system_state_.set_p2p_manager(&mock_p2p_manager);
7158f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  mock_p2p_manager.fake().SetP2PEnabled(true);
7168f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  mock_p2p_manager.fake().SetEnsureP2PRunningResult(false);
7178f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  mock_p2p_manager.fake().SetPerformHousekeepingResult(false);
7188f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  EXPECT_CALL(mock_p2p_manager, PerformHousekeeping()).Times(0);
719ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold  attempter_.Update("", "", "", "", false, false);
72074b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  EXPECT_FALSE(actual_using_p2p_for_downloading());
72174b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  EXPECT_FALSE(actual_using_p2p_for_sharing());
72260ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  ScheduleQuitMainLoop();
7238f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
7248f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
7258f191b22a1a1ab2b803d65ee488729206e648695David ZeuthenTEST_F(UpdateAttempterTest, P2PEnabledHousekeepingFails) {
72660ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop_.PostTask(
72760ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo      FROM_HERE,
72860ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo      base::Bind(&UpdateAttempterTest::P2PEnabledHousekeepingFailsStart,
72960ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo                 base::Unretained(this)));
73060ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop_.Run();
7318f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
73260ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo
7338f191b22a1a1ab2b803d65ee488729206e648695David Zeuthenvoid UpdateAttempterTest::P2PEnabledHousekeepingFailsStart() {
7348f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  // If p2p is enabled, starting it works but housekeeping fails, ensure
7358f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  // we do not convey p2p is to be used.
7368f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  MockP2PManager mock_p2p_manager;
7375bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  fake_system_state_.set_p2p_manager(&mock_p2p_manager);
7388f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  mock_p2p_manager.fake().SetP2PEnabled(true);
7398f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  mock_p2p_manager.fake().SetEnsureP2PRunningResult(true);
7408f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  mock_p2p_manager.fake().SetPerformHousekeepingResult(false);
74174b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  EXPECT_CALL(mock_p2p_manager, PerformHousekeeping());
742ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold  attempter_.Update("", "", "", "", false, false);
74374b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  EXPECT_FALSE(actual_using_p2p_for_downloading());
74474b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  EXPECT_FALSE(actual_using_p2p_for_sharing());
74560ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  ScheduleQuitMainLoop();
7468f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
7478f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
7488f191b22a1a1ab2b803d65ee488729206e648695David ZeuthenTEST_F(UpdateAttempterTest, P2PEnabled) {
74960ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop_.PostTask(FROM_HERE,
75060ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo                 base::Bind(&UpdateAttempterTest::P2PEnabledStart,
75160ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo                            base::Unretained(this)));
75260ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop_.Run();
7538f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
75460ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo
7558f191b22a1a1ab2b803d65ee488729206e648695David Zeuthenvoid UpdateAttempterTest::P2PEnabledStart() {
7568f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  MockP2PManager mock_p2p_manager;
7575bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  fake_system_state_.set_p2p_manager(&mock_p2p_manager);
7588f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  // If P2P is enabled and starting it works, check that we performed
7598f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  // housekeeping and that we convey p2p should be used.
7608f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  mock_p2p_manager.fake().SetP2PEnabled(true);
7618f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  mock_p2p_manager.fake().SetEnsureP2PRunningResult(true);
7628f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  mock_p2p_manager.fake().SetPerformHousekeepingResult(true);
76374b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  EXPECT_CALL(mock_p2p_manager, PerformHousekeeping());
764ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold  attempter_.Update("", "", "", "", false, false);
76574b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  EXPECT_TRUE(actual_using_p2p_for_downloading());
76674b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  EXPECT_TRUE(actual_using_p2p_for_sharing());
76760ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  ScheduleQuitMainLoop();
7688f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
7698f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
7708f191b22a1a1ab2b803d65ee488729206e648695David ZeuthenTEST_F(UpdateAttempterTest, P2PEnabledInteractive) {
77160ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop_.PostTask(FROM_HERE,
77260ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo                 base::Bind(&UpdateAttempterTest::P2PEnabledInteractiveStart,
77360ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo                            base::Unretained(this)));
77460ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop_.Run();
7758f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
77660ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo
7778f191b22a1a1ab2b803d65ee488729206e648695David Zeuthenvoid UpdateAttempterTest::P2PEnabledInteractiveStart() {
7788f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  MockP2PManager mock_p2p_manager;
7795bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  fake_system_state_.set_p2p_manager(&mock_p2p_manager);
7808f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  // For an interactive check, if P2P is enabled and starting it
7818f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  // works, check that we performed housekeeping and that we convey
7828f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  // p2p should be used for sharing but NOT for downloading.
7838f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  mock_p2p_manager.fake().SetP2PEnabled(true);
7848f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  mock_p2p_manager.fake().SetEnsureP2PRunningResult(true);
7858f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen  mock_p2p_manager.fake().SetPerformHousekeepingResult(true);
78674b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  EXPECT_CALL(mock_p2p_manager, PerformHousekeeping());
787ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold  attempter_.Update("", "", "", "", false, true /* interactive */);
78874b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  EXPECT_FALSE(actual_using_p2p_for_downloading());
78974b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold  EXPECT_TRUE(actual_using_p2p_for_sharing());
79060ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  ScheduleQuitMainLoop();
7918f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen}
7928f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen
793480ddfa079ebd01ed87e495332dec121d9ae781fJay SrinivasanTEST_F(UpdateAttempterTest, ReadScatterFactorFromPolicy) {
79460ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop_.PostTask(
79560ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo      FROM_HERE,
79660ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo      base::Bind(&UpdateAttempterTest::ReadScatterFactorFromPolicyTestStart,
79760ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo                 base::Unretained(this)));
79860ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop_.Run();
799480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan}
800480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
801480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan// Tests that the scatter_factor_in_seconds value is properly fetched
802480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan// from the device policy.
803480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasanvoid UpdateAttempterTest::ReadScatterFactorFromPolicyTestStart() {
8049abb763fa3840d69cc1098c0233162557a7f99eaBen Chan  int64_t scatter_factor_in_seconds = 36000;
805480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
8069fd76b6b1dc4a80f8464427e981220c29abc1d66Igor  auto device_policy = std::make_unique<policy::MockDevicePolicy>();
807480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
8089fd76b6b1dc4a80f8464427e981220c29abc1d66Igor  fake_system_state_.set_device_policy(device_policy.get());
809480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
810480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  EXPECT_CALL(*device_policy, GetScatterFactorInSeconds(_))
811480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan      .WillRepeatedly(DoAll(
812672c1f54a499a825cc0bb9bc4f240bf1887550d9Ben Chan          SetArgPointee<0>(scatter_factor_in_seconds),
813480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan          Return(true)));
814480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
8159fd76b6b1dc4a80f8464427e981220c29abc1d66Igor  attempter_.policy_provider_.reset(
8169fd76b6b1dc4a80f8464427e981220c29abc1d66Igor      new policy::PolicyProvider(std::move(device_policy)));
8179fd76b6b1dc4a80f8464427e981220c29abc1d66Igor
818ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold  attempter_.Update("", "", "", "", false, false);
819480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  EXPECT_EQ(scatter_factor_in_seconds, attempter_.scatter_factor_.InSeconds());
820480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
82160ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  ScheduleQuitMainLoop();
822480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan}
823480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
824480ddfa079ebd01ed87e495332dec121d9ae781fJay SrinivasanTEST_F(UpdateAttempterTest, DecrementUpdateCheckCountTest) {
82560ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop_.PostTask(
82660ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo      FROM_HERE,
82760ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo      base::Bind(&UpdateAttempterTest::DecrementUpdateCheckCountTestStart,
82860ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo                 base::Unretained(this)));
82960ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop_.Run();
830480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan}
831480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
832480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasanvoid UpdateAttempterTest::DecrementUpdateCheckCountTestStart() {
833480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  // Tests that the scatter_factor_in_seconds value is properly fetched
834480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  // from the device policy and is decremented if value > 0.
8359abb763fa3840d69cc1098c0233162557a7f99eaBen Chan  int64_t initial_value = 5;
8362c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo  FakePrefs fake_prefs;
8372c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo  attempter_.prefs_ = &fake_prefs;
838480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
8395bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  fake_system_state_.fake_hardware()->SetIsOOBEComplete(Time::UnixEpoch());
84008fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan
8412c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo  EXPECT_TRUE(fake_prefs.SetInt64(kPrefsUpdateCheckCount, initial_value));
842480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
8439abb763fa3840d69cc1098c0233162557a7f99eaBen Chan  int64_t scatter_factor_in_seconds = 10;
844480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
8459fd76b6b1dc4a80f8464427e981220c29abc1d66Igor  auto device_policy = std::make_unique<policy::MockDevicePolicy>();
846480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
8479fd76b6b1dc4a80f8464427e981220c29abc1d66Igor  fake_system_state_.set_device_policy(device_policy.get());
848480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
849480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  EXPECT_CALL(*device_policy, GetScatterFactorInSeconds(_))
850480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan      .WillRepeatedly(DoAll(
851672c1f54a499a825cc0bb9bc4f240bf1887550d9Ben Chan          SetArgPointee<0>(scatter_factor_in_seconds),
852480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan          Return(true)));
853480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
8549fd76b6b1dc4a80f8464427e981220c29abc1d66Igor  attempter_.policy_provider_.reset(
8559fd76b6b1dc4a80f8464427e981220c29abc1d66Igor      new policy::PolicyProvider(std::move(device_policy)));
8569fd76b6b1dc4a80f8464427e981220c29abc1d66Igor
857ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold  attempter_.Update("", "", "", "", false, false);
858480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  EXPECT_EQ(scatter_factor_in_seconds, attempter_.scatter_factor_.InSeconds());
859480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
860480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  // Make sure the file still exists.
8612c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo  EXPECT_TRUE(fake_prefs.Exists(kPrefsUpdateCheckCount));
862480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
8639abb763fa3840d69cc1098c0233162557a7f99eaBen Chan  int64_t new_value;
8642c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo  EXPECT_TRUE(fake_prefs.GetInt64(kPrefsUpdateCheckCount, &new_value));
865480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  EXPECT_EQ(initial_value - 1, new_value);
866480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
867ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_TRUE(
868ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      attempter_.omaha_request_params_->update_check_count_wait_enabled());
869480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
870480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  // However, if the count is already 0, it's not decremented. Test that.
871480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  initial_value = 0;
8722c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo  EXPECT_TRUE(fake_prefs.SetInt64(kPrefsUpdateCheckCount, initial_value));
873ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold  attempter_.Update("", "", "", "", false, false);
8742c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo  EXPECT_TRUE(fake_prefs.Exists(kPrefsUpdateCheckCount));
8752c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo  EXPECT_TRUE(fake_prefs.GetInt64(kPrefsUpdateCheckCount, &new_value));
876480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan  EXPECT_EQ(initial_value, new_value);
877480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
87860ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  ScheduleQuitMainLoop();
879480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan}
880480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan
88108fce04e5341c99f308ee7462b1f351f5232eacdJay SrinivasanTEST_F(UpdateAttempterTest, NoScatteringDoneDuringManualUpdateTestStart) {
88260ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop_.PostTask(FROM_HERE, base::Bind(
88360ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo      &UpdateAttempterTest::NoScatteringDoneDuringManualUpdateTestStart,
88460ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo      base::Unretained(this)));
88560ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  loop_.Run();
88608fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan}
88708fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan
88808fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasanvoid UpdateAttempterTest::NoScatteringDoneDuringManualUpdateTestStart() {
88908fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan  // Tests that no scattering logic is enabled if the update check
89008fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan  // is manually done (as opposed to a scheduled update check)
8919abb763fa3840d69cc1098c0233162557a7f99eaBen Chan  int64_t initial_value = 8;
8922c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo  FakePrefs fake_prefs;
8932c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo  attempter_.prefs_ = &fake_prefs;
89408fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan
8955bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  fake_system_state_.fake_hardware()->SetIsOOBEComplete(Time::UnixEpoch());
8962c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo  fake_system_state_.set_prefs(&fake_prefs);
89708fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan
8982c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo  EXPECT_TRUE(fake_prefs.SetInt64(kPrefsWallClockWaitPeriod, initial_value));
8992c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo  EXPECT_TRUE(fake_prefs.SetInt64(kPrefsUpdateCheckCount, initial_value));
90008fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan
90108fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan  // make sure scatter_factor is non-zero as scattering is disabled
90208fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan  // otherwise.
9039abb763fa3840d69cc1098c0233162557a7f99eaBen Chan  int64_t scatter_factor_in_seconds = 50;
90408fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan
9059fd76b6b1dc4a80f8464427e981220c29abc1d66Igor  auto device_policy = std::make_unique<policy::MockDevicePolicy>();
90608fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan  EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
9079fd76b6b1dc4a80f8464427e981220c29abc1d66Igor  fake_system_state_.set_device_policy(device_policy.get());
90808fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan
90908fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan  EXPECT_CALL(*device_policy, GetScatterFactorInSeconds(_))
91008fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan      .WillRepeatedly(DoAll(
911672c1f54a499a825cc0bb9bc4f240bf1887550d9Ben Chan          SetArgPointee<0>(scatter_factor_in_seconds),
91208fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan          Return(true)));
91308fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan
9149fd76b6b1dc4a80f8464427e981220c29abc1d66Igor  attempter_.policy_provider_.reset(
9159fd76b6b1dc4a80f8464427e981220c29abc1d66Igor      new policy::PolicyProvider(std::move(device_policy)));
9169fd76b6b1dc4a80f8464427e981220c29abc1d66Igor
917b92f0df60b3b1d8ad0ac95fea74cc4fbbf93d204Gilad Arnold  // Trigger an interactive check so we can test that scattering is disabled.
918ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold  attempter_.Update("", "", "", "", false, true);
91908fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan  EXPECT_EQ(scatter_factor_in_seconds, attempter_.scatter_factor_.InSeconds());
92008fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan
92108fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan  // Make sure scattering is disabled for manual (i.e. user initiated) update
92221be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan  // checks and all artifacts are removed.
923ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_FALSE(
924ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      attempter_.omaha_request_params_->wall_clock_based_wait_enabled());
9252c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo  EXPECT_FALSE(fake_prefs.Exists(kPrefsWallClockWaitPeriod));
926ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_EQ(0, attempter_.omaha_request_params_->waiting_period().InSeconds());
927ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan  EXPECT_FALSE(
928ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan      attempter_.omaha_request_params_->update_check_count_wait_enabled());
9292c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo  EXPECT_FALSE(fake_prefs.Exists(kPrefsUpdateCheckCount));
93008fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan
93160ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo  ScheduleQuitMainLoop();
93208fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan}
93308fce04e5341c99f308ee7462b1f351f5232eacdJay Srinivasan
934985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen// Checks that we only report daily metrics at most every 24 hours.
935985b112a749ccbe025ea4aa0245b13f92c28a057David ZeuthenTEST_F(UpdateAttempterTest, ReportDailyMetrics) {
936985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  FakeClock fake_clock;
9372c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo  FakePrefs fake_prefs;
938985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen
9395bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  fake_system_state_.set_clock(&fake_clock);
9402c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo  fake_system_state_.set_prefs(&fake_prefs);
941985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen
942985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  Time epoch = Time::FromInternalValue(0);
943985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  fake_clock.SetWallclockTime(epoch);
944985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen
945985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  // If there is no kPrefsDailyMetricsLastReportedAt state variable,
946985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  // we should report.
947985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  EXPECT_TRUE(attempter_.CheckAndReportDailyMetrics());
948985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  // We should not report again if no time has passed.
949985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
950985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen
951985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  // We should not report if only 10 hours has passed.
952985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(10));
953985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
954985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen
955985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  // We should not report if only 24 hours - 1 sec has passed.
956985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(24) -
957985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen                              TimeDelta::FromSeconds(1));
958985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
959985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen
960985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  // We should report if 24 hours has passed.
961985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(24));
962985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  EXPECT_TRUE(attempter_.CheckAndReportDailyMetrics());
963985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen
964985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  // But then we should not report again..
965985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
966985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen
967985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  // .. until another 24 hours has passed
968985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(47));
969985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
970985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(48));
971985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  EXPECT_TRUE(attempter_.CheckAndReportDailyMetrics());
972985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
973985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen
974985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  // .. and another 24 hours
975985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(71));
976985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
977985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(72));
978985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  EXPECT_TRUE(attempter_.CheckAndReportDailyMetrics());
979985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
980985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen
981985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  // If the span between time of reporting and present time is
982985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  // negative, we report. This is in order to reset the timestamp and
983985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  // avoid an edge condition whereby a distant point in the future is
984985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  // in the state variable resulting in us never ever reporting again.
985985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(71));
986985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  EXPECT_TRUE(attempter_.CheckAndReportDailyMetrics());
987985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
988985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen
989985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  // In this case we should not update until the clock reads 71 + 24 = 95.
990985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  // Check that.
991985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(94));
992985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
993985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(95));
994985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  EXPECT_TRUE(attempter_.CheckAndReportDailyMetrics());
995985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen  EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
996985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen}
997985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen
9983c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid ZeuthenTEST_F(UpdateAttempterTest, BootTimeInUpdateMarkerFile) {
9993c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen  FakeClock fake_clock;
10003c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen  fake_clock.SetBootTime(Time::FromTimeT(42));
10015bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold  fake_system_state_.set_clock(&fake_clock);
1002906191f88cb2448691e54f7a6a3b464854053154Alex Deymo  FakePrefs fake_prefs;
1003906191f88cb2448691e54f7a6a3b464854053154Alex Deymo  fake_system_state_.set_prefs(&fake_prefs);
1004aeeb2e015ef5ef046c744d3c5daa7f353eb71b4eSen Jiang  attempter_.Init();
10053c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen
10063c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen  Time boot_time;
1007aeeb2e015ef5ef046c744d3c5daa7f353eb71b4eSen Jiang  EXPECT_FALSE(attempter_.GetBootTimeAtUpdate(&boot_time));
10083c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen
1009aeeb2e015ef5ef046c744d3c5daa7f353eb71b4eSen Jiang  attempter_.WriteUpdateCompletedMarker();
10103c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen
1011aeeb2e015ef5ef046c744d3c5daa7f353eb71b4eSen Jiang  EXPECT_TRUE(attempter_.GetBootTimeAtUpdate(&boot_time));
10123c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen  EXPECT_EQ(boot_time.ToTimeT(), 42);
10133c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen}
10143c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen
101502c1864e204997175302b1aebe3e0be9c6699ea5David PursellTEST_F(UpdateAttempterTest, AnyUpdateSourceAllowedUnofficial) {
101602c1864e204997175302b1aebe3e0be9c6699ea5David Pursell  fake_system_state_.fake_hardware()->SetIsOfficialBuild(false);
101702c1864e204997175302b1aebe3e0be9c6699ea5David Pursell  EXPECT_TRUE(attempter_.IsAnyUpdateSourceAllowed());
101802c1864e204997175302b1aebe3e0be9c6699ea5David Pursell}
101902c1864e204997175302b1aebe3e0be9c6699ea5David Pursell
102002c1864e204997175302b1aebe3e0be9c6699ea5David PursellTEST_F(UpdateAttempterTest, AnyUpdateSourceAllowedOfficialDevmode) {
102102c1864e204997175302b1aebe3e0be9c6699ea5David Pursell  fake_system_state_.fake_hardware()->SetIsOfficialBuild(true);
1022e67bb5b953d4551d6ef51a9900117e3ddd0a32c5Sen Jiang  fake_system_state_.fake_hardware()->SetAreDevFeaturesEnabled(true);
102302c1864e204997175302b1aebe3e0be9c6699ea5David Pursell  EXPECT_TRUE(attempter_.IsAnyUpdateSourceAllowed());
102402c1864e204997175302b1aebe3e0be9c6699ea5David Pursell}
102502c1864e204997175302b1aebe3e0be9c6699ea5David Pursell
102602c1864e204997175302b1aebe3e0be9c6699ea5David PursellTEST_F(UpdateAttempterTest, AnyUpdateSourceDisallowedOfficialNormal) {
102702c1864e204997175302b1aebe3e0be9c6699ea5David Pursell  fake_system_state_.fake_hardware()->SetIsOfficialBuild(true);
1028e67bb5b953d4551d6ef51a9900117e3ddd0a32c5Sen Jiang  fake_system_state_.fake_hardware()->SetAreDevFeaturesEnabled(false);
102902c1864e204997175302b1aebe3e0be9c6699ea5David Pursell  EXPECT_FALSE(attempter_.IsAnyUpdateSourceAllowed());
103002c1864e204997175302b1aebe3e0be9c6699ea5David Pursell}
103102c1864e204997175302b1aebe3e0be9c6699ea5David Pursell
103202c1864e204997175302b1aebe3e0be9c6699ea5David PursellTEST_F(UpdateAttempterTest, CheckForUpdateAUTest) {
103302c1864e204997175302b1aebe3e0be9c6699ea5David Pursell  fake_system_state_.fake_hardware()->SetIsOfficialBuild(true);
1034e67bb5b953d4551d6ef51a9900117e3ddd0a32c5Sen Jiang  fake_system_state_.fake_hardware()->SetAreDevFeaturesEnabled(false);
1035081c023b533dc15eb1995b2a9dc1508c88c8508bAaron Wood  attempter_.CheckForUpdate("", "autest", UpdateAttemptFlags::kNone);
1036ac41a82e4be1be43913292d13d58b5eb2c572f53Alex Deymo  EXPECT_EQ(constants::kOmahaDefaultAUTestURL, attempter_.forced_omaha_url());
103702c1864e204997175302b1aebe3e0be9c6699ea5David Pursell}
103802c1864e204997175302b1aebe3e0be9c6699ea5David Pursell
103902c1864e204997175302b1aebe3e0be9c6699ea5David PursellTEST_F(UpdateAttempterTest, CheckForUpdateScheduledAUTest) {
104002c1864e204997175302b1aebe3e0be9c6699ea5David Pursell  fake_system_state_.fake_hardware()->SetIsOfficialBuild(true);
1041e67bb5b953d4551d6ef51a9900117e3ddd0a32c5Sen Jiang  fake_system_state_.fake_hardware()->SetAreDevFeaturesEnabled(false);
1042081c023b533dc15eb1995b2a9dc1508c88c8508bAaron Wood  attempter_.CheckForUpdate("", "autest-scheduled", UpdateAttemptFlags::kNone);
1043ac41a82e4be1be43913292d13d58b5eb2c572f53Alex Deymo  EXPECT_EQ(constants::kOmahaDefaultAUTestURL, attempter_.forced_omaha_url());
104402c1864e204997175302b1aebe3e0be9c6699ea5David Pursell}
104502c1864e204997175302b1aebe3e0be9c6699ea5David Pursell
1046c0e8f9acecf3c8919035961a1b44f3de1937deedXiyuan XiaTEST_F(UpdateAttempterTest, TargetVersionPrefixSetAndReset) {
1047c0e8f9acecf3c8919035961a1b44f3de1937deedXiyuan Xia  attempter_.CalculateUpdateParams("", "", "", "1234", false, false);
1048c0e8f9acecf3c8919035961a1b44f3de1937deedXiyuan Xia  EXPECT_EQ("1234",
1049c0e8f9acecf3c8919035961a1b44f3de1937deedXiyuan Xia            fake_system_state_.request_params()->target_version_prefix());
1050c0e8f9acecf3c8919035961a1b44f3de1937deedXiyuan Xia
1051c0e8f9acecf3c8919035961a1b44f3de1937deedXiyuan Xia  attempter_.CalculateUpdateParams("", "", "", "", false, false);
1052c0e8f9acecf3c8919035961a1b44f3de1937deedXiyuan Xia  EXPECT_TRUE(
1053c0e8f9acecf3c8919035961a1b44f3de1937deedXiyuan Xia      fake_system_state_.request_params()->target_version_prefix().empty());
1054c0e8f9acecf3c8919035961a1b44f3de1937deedXiyuan Xia}
1055c0e8f9acecf3c8919035961a1b44f3de1937deedXiyuan Xia
105623bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron WoodTEST_F(UpdateAttempterTest, UpdateDeferredByPolicyTest) {
105723bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood  // Construct an OmahaResponseHandlerAction that has processed an InstallPlan,
105823bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood  // but the update is being deferred by the Policy.
105923bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood  OmahaResponseHandlerAction* response_action =
106023bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood      new OmahaResponseHandlerAction(&fake_system_state_);
106123bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood  response_action->install_plan_.version = "a.b.c.d";
106223bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood  response_action->install_plan_.system_version = "b.c.d.e";
106323bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood  response_action->install_plan_.payloads.push_back(
106423bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood      {.size = 1234ULL, .type = InstallPayloadType::kFull});
106523bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood  attempter_.response_handler_action_.reset(response_action);
106623bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood  // Inform the UpdateAttempter that the OmahaResponseHandlerAction has
106723bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood  // completed, with the deferred-update error code.
106823bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood  attempter_.ActionCompleted(
106923bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood      nullptr, response_action, ErrorCode::kOmahaUpdateDeferredPerPolicy);
107023bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood  {
107123bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood    UpdateEngineStatus status;
107223bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood    attempter_.GetStatus(&status);
107323bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood    EXPECT_EQ(UpdateStatus::UPDATE_AVAILABLE, status.status);
107423bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood    EXPECT_EQ(response_action->install_plan_.version, status.new_version);
107523bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood    EXPECT_EQ(response_action->install_plan_.system_version,
107623bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood              status.new_system_version);
107723bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood    EXPECT_EQ(response_action->install_plan_.payloads[0].size,
107823bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood              status.new_size_bytes);
107923bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood  }
108023bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood  // An "error" event should have been created to tell Omaha that the update is
108123bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood  // being deferred.
108223bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood  EXPECT_TRUE(nullptr != attempter_.error_event_);
108323bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood  EXPECT_EQ(OmahaEvent::kTypeUpdateComplete, attempter_.error_event_->type);
108423bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood  EXPECT_EQ(OmahaEvent::kResultUpdateDeferred, attempter_.error_event_->result);
108523bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood  ErrorCode expected_code = static_cast<ErrorCode>(
108623bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood      static_cast<int>(ErrorCode::kOmahaUpdateDeferredPerPolicy) |
108723bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood      static_cast<int>(ErrorCode::kTestOmahaUrlFlag));
108823bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood  EXPECT_EQ(expected_code, attempter_.error_event_->error_code);
108923bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood  // End the processing
109023bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood  attempter_.ProcessingDone(nullptr, ErrorCode::kOmahaUpdateDeferredPerPolicy);
109123bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood  // Validate the state of the attempter.
109223bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood  {
109323bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood    UpdateEngineStatus status;
109423bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood    attempter_.GetStatus(&status);
109523bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood    EXPECT_EQ(UpdateStatus::REPORTING_ERROR_EVENT, status.status);
109623bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood    EXPECT_EQ(response_action->install_plan_.version, status.new_version);
109723bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood    EXPECT_EQ(response_action->install_plan_.system_version,
109823bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood              status.new_system_version);
109923bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood    EXPECT_EQ(response_action->install_plan_.payloads[0].size,
110023bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood              status.new_size_bytes);
110123bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood  }
110223bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood}
110323bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood
110423bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron WoodTEST_F(UpdateAttempterTest, UpdateIsNotRunningWhenUpdateAvailable) {
110523bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood  EXPECT_FALSE(attempter_.IsUpdateRunningOrScheduled());
110623bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood  // Verify in-progress update with UPDATE_AVAILABLE is running
110723bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood  attempter_.status_ = UpdateStatus::UPDATE_AVAILABLE;
110823bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood  EXPECT_TRUE(attempter_.IsUpdateRunningOrScheduled());
110923bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood}
111023bd339a82b350f146dd93cd0bcbe75f1a24a7b3Aaron Wood
1111bf5a2522481c1e26a8d645a1575824dcd5fbd08eAaron WoodTEST_F(UpdateAttempterTest, UpdateAttemptFlagsCachedAtUpdateStart) {
1112bf5a2522481c1e26a8d645a1575824dcd5fbd08eAaron Wood  attempter_.SetUpdateAttemptFlags(UpdateAttemptFlags::kFlagRestrictDownload);
1113bf5a2522481c1e26a8d645a1575824dcd5fbd08eAaron Wood
1114bf5a2522481c1e26a8d645a1575824dcd5fbd08eAaron Wood  UpdateCheckParams params = {.updates_enabled = true};
1115bf5a2522481c1e26a8d645a1575824dcd5fbd08eAaron Wood  attempter_.OnUpdateScheduled(EvalStatus::kSucceeded, params);
1116bf5a2522481c1e26a8d645a1575824dcd5fbd08eAaron Wood
1117bf5a2522481c1e26a8d645a1575824dcd5fbd08eAaron Wood  EXPECT_EQ(UpdateAttemptFlags::kFlagRestrictDownload,
1118bf5a2522481c1e26a8d645a1575824dcd5fbd08eAaron Wood            attempter_.GetCurrentUpdateAttemptFlags());
1119bf5a2522481c1e26a8d645a1575824dcd5fbd08eAaron Wood}
1120bf5a2522481c1e26a8d645a1575824dcd5fbd08eAaron Wood
1121081c023b533dc15eb1995b2a9dc1508c88c8508bAaron WoodTEST_F(UpdateAttempterTest, InteractiveUpdateUsesPassedRestrictions) {
1122081c023b533dc15eb1995b2a9dc1508c88c8508bAaron Wood  attempter_.SetUpdateAttemptFlags(UpdateAttemptFlags::kFlagRestrictDownload);
1123081c023b533dc15eb1995b2a9dc1508c88c8508bAaron Wood
1124081c023b533dc15eb1995b2a9dc1508c88c8508bAaron Wood  attempter_.CheckForUpdate("", "", UpdateAttemptFlags::kNone);
1125081c023b533dc15eb1995b2a9dc1508c88c8508bAaron Wood  EXPECT_EQ(UpdateAttemptFlags::kNone,
1126081c023b533dc15eb1995b2a9dc1508c88c8508bAaron Wood            attempter_.GetCurrentUpdateAttemptFlags());
1127081c023b533dc15eb1995b2a9dc1508c88c8508bAaron Wood}
1128081c023b533dc15eb1995b2a9dc1508c88c8508bAaron Wood
1129081c023b533dc15eb1995b2a9dc1508c88c8508bAaron WoodTEST_F(UpdateAttempterTest, NonInteractiveUpdateUsesSetRestrictions) {
1130081c023b533dc15eb1995b2a9dc1508c88c8508bAaron Wood  attempter_.SetUpdateAttemptFlags(UpdateAttemptFlags::kNone);
1131081c023b533dc15eb1995b2a9dc1508c88c8508bAaron Wood
1132081c023b533dc15eb1995b2a9dc1508c88c8508bAaron Wood  // This tests that when CheckForUpdate() is called with the non-interactive
1133081c023b533dc15eb1995b2a9dc1508c88c8508bAaron Wood  // flag set, that it doesn't change the current UpdateAttemptFlags.
1134081c023b533dc15eb1995b2a9dc1508c88c8508bAaron Wood  attempter_.CheckForUpdate("",
1135081c023b533dc15eb1995b2a9dc1508c88c8508bAaron Wood                            "",
1136081c023b533dc15eb1995b2a9dc1508c88c8508bAaron Wood                            UpdateAttemptFlags::kFlagNonInteractive |
1137081c023b533dc15eb1995b2a9dc1508c88c8508bAaron Wood                                UpdateAttemptFlags::kFlagRestrictDownload);
1138081c023b533dc15eb1995b2a9dc1508c88c8508bAaron Wood  EXPECT_EQ(UpdateAttemptFlags::kNone,
1139081c023b533dc15eb1995b2a9dc1508c88c8508bAaron Wood            attempter_.GetCurrentUpdateAttemptFlags());
1140081c023b533dc15eb1995b2a9dc1508c88c8508bAaron Wood}
1141081c023b533dc15eb1995b2a9dc1508c88c8508bAaron Wood
1142f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov}  // namespace chromeos_update_engine
1143