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