blob: eceb02b0cb45323ba38f4f714c6ff9d8983a6663 [file] [log] [blame]
Alex Deymoaea4c1c2015-08-19 20:24:43 -07001//
2// Copyright (C) 2012 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
Darin Petkovf42cc1c2010-09-01 09:03:02 -070016
Alex Deymo2c0db7b2014-11-04 12:23:39 -080017#include "update_engine/update_attempter.h"
18
Ben Chan9abb7632014-08-07 00:10:53 -070019#include <stdint.h>
20
Ben Chan02f7c1d2014-10-18 15:18:02 -070021#include <memory>
22
Ben Chan06c76a42014-09-05 08:21:06 -070023#include <base/files/file_util.h>
Alex Deymo0b3db6b2015-08-10 15:19:37 -070024#include <base/message_loop/message_loop.h>
Amin Hassani71818c82018-03-06 13:25:40 -080025#include <brillo/bind_lambda.h>
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070026#include <brillo/message_loops/base_message_loop.h>
27#include <brillo/message_loops/message_loop.h>
28#include <brillo/message_loops/message_loop_utils.h>
Darin Petkovf42cc1c2010-09-01 09:03:02 -070029#include <gtest/gtest.h>
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +020030#include <policy/libpolicy.h>
31#include <policy/mock_device_policy.h>
Marton Hunyadye58bddb2018-04-10 20:27:26 +020032#include <policy/mock_libpolicy.h>
Darin Petkovf42cc1c2010-09-01 09:03:02 -070033
Alex Deymo39910dc2015-11-09 17:04:30 -080034#include "update_engine/common/fake_clock.h"
35#include "update_engine/common/fake_prefs.h"
Alex Deymo14fd1ec2016-02-24 22:03:57 -080036#include "update_engine/common/mock_action.h"
37#include "update_engine/common/mock_action_processor.h"
Alex Deymo39910dc2015-11-09 17:04:30 -080038#include "update_engine/common/mock_http_fetcher.h"
39#include "update_engine/common/mock_prefs.h"
40#include "update_engine/common/platform_constants.h"
41#include "update_engine/common/prefs.h"
42#include "update_engine/common/test_utils.h"
43#include "update_engine/common/utils.h"
Gilad Arnold5bb4c902014-04-10 12:32:13 -070044#include "update_engine/fake_system_state.h"
David Zeuthen8f191b22013-08-06 12:27:50 -070045#include "update_engine/mock_p2p_manager.h"
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080046#include "update_engine/mock_payload_state.h"
Aaron Wood9321f502017-09-07 11:18:54 -070047#include "update_engine/mock_service_observer.h"
Alex Deymo39910dc2015-11-09 17:04:30 -080048#include "update_engine/payload_consumer/filesystem_verifier_action.h"
49#include "update_engine/payload_consumer/install_plan.h"
50#include "update_engine/payload_consumer/payload_constants.h"
51#include "update_engine/payload_consumer/postinstall_runner_action.h"
Darin Petkovf42cc1c2010-09-01 09:03:02 -070052
David Zeuthen985b1122013-10-09 12:13:15 -070053using base::Time;
54using base::TimeDelta;
Aaron Woodbf5a2522017-10-04 10:58:36 -070055using chromeos_update_manager::EvalStatus;
56using chromeos_update_manager::UpdateCheckParams;
Darin Petkovf42cc1c2010-09-01 09:03:02 -070057using std::string;
Ben Chan02f7c1d2014-10-18 15:18:02 -070058using std::unique_ptr;
Aaron Woodbf5a2522017-10-04 10:58:36 -070059using testing::_;
Darin Petkov36275772010-10-01 11:40:57 -070060using testing::DoAll;
Aaron Wood7f92e2b2017-08-28 14:51:21 -070061using testing::Field;
Darin Petkovf42cc1c2010-09-01 09:03:02 -070062using testing::InSequence;
Darin Petkov2dd01092010-10-08 15:43:05 -070063using testing::Ne;
Darin Petkov9c096d62010-11-17 14:49:04 -080064using testing::NiceMock;
Darin Petkovf42cc1c2010-09-01 09:03:02 -070065using testing::Property;
66using testing::Return;
Gilad Arnold74b5f552014-10-07 08:17:16 -070067using testing::ReturnPointee;
Marton Hunyadye58bddb2018-04-10 20:27:26 +020068using testing::ReturnRef;
Alex Deymo2c0db7b2014-11-04 12:23:39 -080069using testing::SaveArg;
Ben Chan672c1f52017-10-23 15:41:39 -070070using testing::SetArgPointee;
Aaron Woodbf5a2522017-10-04 10:58:36 -070071using update_engine::UpdateAttemptFlags;
Aaron Wood7f92e2b2017-08-28 14:51:21 -070072using update_engine::UpdateEngineStatus;
Christopher Wiley6b6cc1b2015-10-05 17:50:07 -070073using update_engine::UpdateStatus;
Darin Petkovf42cc1c2010-09-01 09:03:02 -070074
75namespace chromeos_update_engine {
76
Marton Hunyadya0302682018-05-16 18:52:13 +020077const char kRollbackVersion[] = "10575.39.2";
78
Darin Petkovf42cc1c2010-09-01 09:03:02 -070079// Test a subclass rather than the main class directly so that we can mock out
Darin Petkovcd1666f2010-09-23 09:53:44 -070080// methods within the class. There're explicit unit tests for the mocked out
Darin Petkovf42cc1c2010-09-01 09:03:02 -070081// methods.
82class UpdateAttempterUnderTest : public UpdateAttempter {
83 public:
Jeffrey Kardatzkecf5f1f12017-10-02 16:08:44 -070084 explicit UpdateAttempterUnderTest(SystemState* system_state)
85 : UpdateAttempter(system_state, nullptr) {}
Gilad Arnoldec7f9162014-07-15 13:24:46 -070086
87 // Wrap the update scheduling method, allowing us to opt out of scheduled
88 // updates for testing purposes.
89 void ScheduleUpdates() override {
90 schedule_updates_called_ = true;
91 if (do_schedule_updates_) {
92 UpdateAttempter::ScheduleUpdates();
93 } else {
94 LOG(INFO) << "[TEST] Update scheduling disabled.";
95 }
96 }
97 void EnableScheduleUpdates() { do_schedule_updates_ = true; }
98 void DisableScheduleUpdates() { do_schedule_updates_ = false; }
99
100 // Indicates whether ScheduleUpdates() was called.
101 bool schedule_updates_called() const { return schedule_updates_called_; }
102
David Pursell02c18642014-11-06 11:26:11 -0800103 // Need to expose forced_omaha_url_ so we can test it.
Alex Deymo60ca1a72015-06-18 18:19:15 -0700104 const string& forced_omaha_url() const { return forced_omaha_url_; }
David Pursell02c18642014-11-06 11:26:11 -0800105
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700106 private:
107 bool schedule_updates_called_ = false;
108 bool do_schedule_updates_ = true;
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700109};
110
111class UpdateAttempterTest : public ::testing::Test {
112 protected:
Jay Srinivasan43488792012-06-19 00:25:31 -0700113 UpdateAttempterTest()
Daniel Erate5f6f252017-04-20 12:09:58 -0600114 : certificate_checker_(fake_system_state_.mock_prefs(),
Alex Deymo33e91e72015-12-01 18:26:08 -0300115 &openssl_wrapper_) {
Gilad Arnold1f847232014-04-07 12:07:49 -0700116 // Override system state members.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700117 fake_system_state_.set_connection_manager(&mock_connection_manager);
118 fake_system_state_.set_update_attempter(&attempter_);
Alex Deymo60ca1a72015-06-18 18:19:15 -0700119 loop_.SetAsCurrent();
Gilad Arnold1f847232014-04-07 12:07:49 -0700120
Alex Deymo33e91e72015-12-01 18:26:08 -0300121 certificate_checker_.Init();
122
Sen Jiange67bb5b2016-06-20 15:53:56 -0700123 // Finish initializing the attempter.
Gilad Arnold1f847232014-04-07 12:07:49 -0700124 attempter_.Init();
Jay Srinivasan43488792012-06-19 00:25:31 -0700125 }
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700126
Alex Deymo610277e2014-11-11 21:18:11 -0800127 void SetUp() override {
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700128 EXPECT_NE(nullptr, attempter_.system_state_);
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700129 EXPECT_EQ(0, attempter_.http_response_code_);
Christopher Wiley6b6cc1b2015-10-05 17:50:07 -0700130 EXPECT_EQ(UpdateStatus::IDLE, attempter_.status_);
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700131 EXPECT_EQ(0.0, attempter_.download_progress_);
132 EXPECT_EQ(0, attempter_.last_checked_time_);
133 EXPECT_EQ("0.0.0.0", attempter_.new_version_);
Aaron Wood7f92e2b2017-08-28 14:51:21 -0700134 EXPECT_EQ(0ULL, attempter_.new_payload_size_);
Alex Deymo8427b4a2014-11-05 14:00:32 -0800135 processor_ = new NiceMock<MockActionProcessor>();
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700136 attempter_.processor_.reset(processor_); // Transfers ownership.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700137 prefs_ = fake_system_state_.mock_prefs();
Gilad Arnold74b5f552014-10-07 08:17:16 -0700138
139 // Set up store/load semantics of P2P properties via the mock PayloadState.
140 actual_using_p2p_for_downloading_ = false;
141 EXPECT_CALL(*fake_system_state_.mock_payload_state(),
142 SetUsingP2PForDownloading(_))
143 .WillRepeatedly(SaveArg<0>(&actual_using_p2p_for_downloading_));
144 EXPECT_CALL(*fake_system_state_.mock_payload_state(),
145 GetUsingP2PForDownloading())
146 .WillRepeatedly(ReturnPointee(&actual_using_p2p_for_downloading_));
147 actual_using_p2p_for_sharing_ = false;
148 EXPECT_CALL(*fake_system_state_.mock_payload_state(),
149 SetUsingP2PForSharing(_))
150 .WillRepeatedly(SaveArg<0>(&actual_using_p2p_for_sharing_));
151 EXPECT_CALL(*fake_system_state_.mock_payload_state(),
152 GetUsingP2PForDownloading())
153 .WillRepeatedly(ReturnPointee(&actual_using_p2p_for_sharing_));
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700154 }
155
Alex Deymo60ca1a72015-06-18 18:19:15 -0700156 public:
157 void ScheduleQuitMainLoop();
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200158
Alex Deymo60ca1a72015-06-18 18:19:15 -0700159 // Callbacks to run the different tests from the main loop.
Darin Petkove6ef2f82011-03-07 17:31:11 -0800160 void UpdateTestStart();
161 void UpdateTestVerify();
Alex Deymo60ca1a72015-06-18 18:19:15 -0700162 void RollbackTestStart(bool enterprise_rollback, bool valid_slot);
Chris Sosa76a29ae2013-07-11 17:59:24 -0700163 void RollbackTestVerify();
Thieu Le116fda32011-04-19 11:01:54 -0700164 void PingOmahaTestStart();
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700165 void ReadScatterFactorFromPolicyTestStart();
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700166 void DecrementUpdateCheckCountTestStart();
Jay Srinivasan08fce042012-06-07 16:31:01 -0700167 void NoScatteringDoneDuringManualUpdateTestStart();
David Zeuthen8f191b22013-08-06 12:27:50 -0700168 void P2PNotEnabledStart();
David Zeuthen8f191b22013-08-06 12:27:50 -0700169 void P2PEnabledStart();
David Zeuthen8f191b22013-08-06 12:27:50 -0700170 void P2PEnabledInteractiveStart();
David Zeuthen8f191b22013-08-06 12:27:50 -0700171 void P2PEnabledStartingFailsStart();
David Zeuthen8f191b22013-08-06 12:27:50 -0700172 void P2PEnabledHousekeepingFailsStart();
Marton Hunyadye58bddb2018-04-10 20:27:26 +0200173 void ResetRollbackHappenedStart(bool is_consumer,
174 bool is_policy_available,
175 bool expected_reset);
David Zeuthen8f191b22013-08-06 12:27:50 -0700176
Gilad Arnold74b5f552014-10-07 08:17:16 -0700177 bool actual_using_p2p_for_downloading() {
178 return actual_using_p2p_for_downloading_;
179 }
180 bool actual_using_p2p_for_sharing() {
181 return actual_using_p2p_for_sharing_;
182 }
183
Alex Deymo0b3db6b2015-08-10 15:19:37 -0700184 base::MessageLoopForIO base_loop_;
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700185 brillo::BaseMessageLoop loop_{&base_loop_};
Alex Deymo60ca1a72015-06-18 18:19:15 -0700186
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700187 FakeSystemState fake_system_state_;
Jeffrey Kardatzkecf5f1f12017-10-02 16:08:44 -0700188 UpdateAttempterUnderTest attempter_{&fake_system_state_};
Alex Deymo33e91e72015-12-01 18:26:08 -0300189 OpenSSLWrapper openssl_wrapper_;
190 CertificateChecker certificate_checker_;
Alex Deymo30534502015-07-20 15:06:33 -0700191
Alex Deymo8427b4a2014-11-05 14:00:32 -0800192 NiceMock<MockActionProcessor>* processor_;
193 NiceMock<MockPrefs>* prefs_; // Shortcut to fake_system_state_->mock_prefs().
Jay Srinivasan55f50c22013-01-10 19:24:35 -0800194 NiceMock<MockConnectionManager> mock_connection_manager;
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700195
Gilad Arnold74b5f552014-10-07 08:17:16 -0700196 bool actual_using_p2p_for_downloading_;
197 bool actual_using_p2p_for_sharing_;
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700198};
199
Alex Deymo60ca1a72015-06-18 18:19:15 -0700200void UpdateAttempterTest::ScheduleQuitMainLoop() {
Luis Hector Chavezf1cf3482016-07-19 14:29:19 -0700201 loop_.PostTask(
202 FROM_HERE,
203 base::Bind([](brillo::BaseMessageLoop* loop) { loop->BreakLoop(); },
204 base::Unretained(&loop_)));
Alex Deymo60ca1a72015-06-18 18:19:15 -0700205}
206
Darin Petkov1b003102010-11-30 10:18:36 -0800207TEST_F(UpdateAttempterTest, ActionCompletedDownloadTest) {
Ben Chan02f7c1d2014-10-18 15:18:02 -0700208 unique_ptr<MockHttpFetcher> fetcher(new MockHttpFetcher("", 0, nullptr));
Darin Petkov1b003102010-11-30 10:18:36 -0800209 fetcher->FailTransfer(503); // Sets the HTTP response code.
Amin Hassani7ecda262017-07-11 17:10:50 -0700210 DownloadAction action(prefs_,
211 nullptr,
212 nullptr,
213 nullptr,
214 fetcher.release(),
Amin Hassanied37d682018-04-06 13:22:00 -0700215 false /* interactive */);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800216 EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _)).Times(0);
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700217 attempter_.ActionCompleted(nullptr, &action, ErrorCode::kSuccess);
Christopher Wiley6b6cc1b2015-10-05 17:50:07 -0700218 EXPECT_EQ(UpdateStatus::FINALIZING, attempter_.status());
Aaron Wood9321f502017-09-07 11:18:54 -0700219 EXPECT_EQ(0.0, attempter_.download_progress_);
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700220 ASSERT_EQ(nullptr, attempter_.error_event_.get());
Darin Petkov1b003102010-11-30 10:18:36 -0800221}
222
223TEST_F(UpdateAttempterTest, ActionCompletedErrorTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -0800224 MockAction action;
225 EXPECT_CALL(action, Type()).WillRepeatedly(Return("MockAction"));
Christopher Wiley6b6cc1b2015-10-05 17:50:07 -0700226 attempter_.status_ = UpdateStatus::DOWNLOADING;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800227 EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
Darin Petkov1b003102010-11-30 10:18:36 -0800228 .WillOnce(Return(false));
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700229 attempter_.ActionCompleted(nullptr, &action, ErrorCode::kError);
230 ASSERT_NE(nullptr, attempter_.error_event_.get());
Darin Petkov1b003102010-11-30 10:18:36 -0800231}
232
Aaron Wood9321f502017-09-07 11:18:54 -0700233TEST_F(UpdateAttempterTest, DownloadProgressAccumulationTest) {
234 // Simple test case, where all the values match (nothing was skipped)
235 uint64_t bytes_progressed_1 = 1024 * 1024; // 1MB
236 uint64_t bytes_progressed_2 = 1024 * 1024; // 1MB
237 uint64_t bytes_received_1 = bytes_progressed_1;
238 uint64_t bytes_received_2 = bytes_received_1 + bytes_progressed_2;
239 uint64_t bytes_total = 20 * 1024 * 1024; // 20MB
240
241 double progress_1 =
242 static_cast<double>(bytes_received_1) / static_cast<double>(bytes_total);
243 double progress_2 =
244 static_cast<double>(bytes_received_2) / static_cast<double>(bytes_total);
245
246 EXPECT_EQ(0.0, attempter_.download_progress_);
247 // This is set via inspecting the InstallPlan payloads when the
248 // OmahaResponseAction is completed
249 attempter_.new_payload_size_ = bytes_total;
250 NiceMock<MockServiceObserver> observer;
251 EXPECT_CALL(observer,
Aaron Wood7f92e2b2017-08-28 14:51:21 -0700252 SendStatusUpdate(AllOf(
253 Field(&UpdateEngineStatus::progress, progress_1),
254 Field(&UpdateEngineStatus::status, UpdateStatus::DOWNLOADING),
255 Field(&UpdateEngineStatus::new_size_bytes, bytes_total))));
Aaron Wood9321f502017-09-07 11:18:54 -0700256 EXPECT_CALL(observer,
Aaron Wood7f92e2b2017-08-28 14:51:21 -0700257 SendStatusUpdate(AllOf(
258 Field(&UpdateEngineStatus::progress, progress_2),
259 Field(&UpdateEngineStatus::status, UpdateStatus::DOWNLOADING),
260 Field(&UpdateEngineStatus::new_size_bytes, bytes_total))));
Aaron Wood9321f502017-09-07 11:18:54 -0700261 attempter_.AddObserver(&observer);
262 attempter_.BytesReceived(bytes_progressed_1, bytes_received_1, bytes_total);
263 EXPECT_EQ(progress_1, attempter_.download_progress_);
264 // This iteration validates that a later set of updates to the variables are
265 // properly handled (so that |getStatus()| will return the same progress info
266 // as the callback is receiving.
267 attempter_.BytesReceived(bytes_progressed_2, bytes_received_2, bytes_total);
268 EXPECT_EQ(progress_2, attempter_.download_progress_);
269}
270
271TEST_F(UpdateAttempterTest, ChangeToDownloadingOnReceivedBytesTest) {
272 // The transition into UpdateStatus::DOWNLOADING happens when the
273 // first bytes are received.
274 uint64_t bytes_progressed = 1024 * 1024; // 1MB
275 uint64_t bytes_received = 2 * 1024 * 1024; // 2MB
276 uint64_t bytes_total = 20 * 1024 * 1024; // 300MB
277 attempter_.status_ = UpdateStatus::CHECKING_FOR_UPDATE;
278 // This is set via inspecting the InstallPlan payloads when the
279 // OmahaResponseAction is completed
280 attempter_.new_payload_size_ = bytes_total;
281 EXPECT_EQ(0.0, attempter_.download_progress_);
282 NiceMock<MockServiceObserver> observer;
Aaron Wood7f92e2b2017-08-28 14:51:21 -0700283 EXPECT_CALL(observer,
284 SendStatusUpdate(AllOf(
285 Field(&UpdateEngineStatus::status, UpdateStatus::DOWNLOADING),
286 Field(&UpdateEngineStatus::new_size_bytes, bytes_total))));
Aaron Wood9321f502017-09-07 11:18:54 -0700287 attempter_.AddObserver(&observer);
288 attempter_.BytesReceived(bytes_progressed, bytes_received, bytes_total);
289 EXPECT_EQ(UpdateStatus::DOWNLOADING, attempter_.status_);
290}
291
292TEST_F(UpdateAttempterTest, BroadcastCompleteDownloadTest) {
293 // There is a special case to ensure that at 100% downloaded,
294 // download_progress_ is updated and that value broadcast. This test confirms
295 // that.
296 uint64_t bytes_progressed = 0; // ignored
297 uint64_t bytes_received = 5 * 1024 * 1024; // ignored
298 uint64_t bytes_total = 5 * 1024 * 1024; // 300MB
299 attempter_.status_ = UpdateStatus::DOWNLOADING;
300 attempter_.new_payload_size_ = bytes_total;
301 EXPECT_EQ(0.0, attempter_.download_progress_);
302 NiceMock<MockServiceObserver> observer;
Aaron Wood7f92e2b2017-08-28 14:51:21 -0700303 EXPECT_CALL(observer,
304 SendStatusUpdate(AllOf(
305 Field(&UpdateEngineStatus::progress, 1.0),
306 Field(&UpdateEngineStatus::status, UpdateStatus::DOWNLOADING),
307 Field(&UpdateEngineStatus::new_size_bytes, bytes_total))));
Aaron Wood9321f502017-09-07 11:18:54 -0700308 attempter_.AddObserver(&observer);
309 attempter_.BytesReceived(bytes_progressed, bytes_received, bytes_total);
310 EXPECT_EQ(1.0, attempter_.download_progress_);
311}
312
Darin Petkov1b003102010-11-30 10:18:36 -0800313TEST_F(UpdateAttempterTest, ActionCompletedOmahaRequestTest) {
Ben Chan02f7c1d2014-10-18 15:18:02 -0700314 unique_ptr<MockHttpFetcher> fetcher(new MockHttpFetcher("", 0, nullptr));
Darin Petkov1b003102010-11-30 10:18:36 -0800315 fetcher->FailTransfer(500); // Sets the HTTP response code.
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700316 OmahaRequestAction action(&fake_system_state_, nullptr,
Alex Deymoc1c17b42015-11-23 03:53:15 -0300317 std::move(fetcher), false);
Darin Petkov1b003102010-11-30 10:18:36 -0800318 ObjectCollectorAction<OmahaResponse> collector_action;
319 BondActions(&action, &collector_action);
320 OmahaResponse response;
321 response.poll_interval = 234;
322 action.SetOutputObject(response);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800323 EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _)).Times(0);
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700324 attempter_.ActionCompleted(nullptr, &action, ErrorCode::kSuccess);
Darin Petkov1b003102010-11-30 10:18:36 -0800325 EXPECT_EQ(500, attempter_.http_response_code());
Christopher Wiley6b6cc1b2015-10-05 17:50:07 -0700326 EXPECT_EQ(UpdateStatus::IDLE, attempter_.status());
Alex Deymo80f70ff2016-02-10 16:08:11 -0800327 EXPECT_EQ(234U, attempter_.server_dictated_poll_interval_);
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700328 ASSERT_TRUE(attempter_.error_event_.get() == nullptr);
Darin Petkov1b003102010-11-30 10:18:36 -0800329}
330
Alex Deymo30534502015-07-20 15:06:33 -0700331TEST_F(UpdateAttempterTest, ConstructWithUpdatedMarkerTest) {
Alex Deymo906191f2015-10-12 12:22:44 -0700332 FakePrefs fake_prefs;
333 string boot_id;
334 EXPECT_TRUE(utils::GetBootId(&boot_id));
335 fake_prefs.SetString(kPrefsUpdateCompletedOnBootId, boot_id);
336 fake_system_state_.set_prefs(&fake_prefs);
Sen Jiangaeeb2e02016-06-09 15:00:16 -0700337 attempter_.Init();
338 EXPECT_EQ(UpdateStatus::UPDATED_NEED_REBOOT, attempter_.status());
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700339}
340
341TEST_F(UpdateAttempterTest, GetErrorCodeForActionTest) {
David Zeuthena99981f2013-04-29 13:42:47 -0700342 extern ErrorCode GetErrorCodeForAction(AbstractAction* action,
343 ErrorCode code);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700344 EXPECT_EQ(ErrorCode::kSuccess,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700345 GetErrorCodeForAction(nullptr, ErrorCode::kSuccess));
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700346
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700347 FakeSystemState fake_system_state;
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700348 OmahaRequestAction omaha_request_action(&fake_system_state, nullptr,
349 nullptr, false);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700350 EXPECT_EQ(ErrorCode::kOmahaRequestError,
351 GetErrorCodeForAction(&omaha_request_action, ErrorCode::kError));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700352 OmahaResponseHandlerAction omaha_response_handler_action(&fake_system_state_);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700353 EXPECT_EQ(ErrorCode::kOmahaResponseHandlerError,
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700354 GetErrorCodeForAction(&omaha_response_handler_action,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700355 ErrorCode::kError));
Sen Jiange6e4bb92016-04-05 14:59:12 -0700356 FilesystemVerifierAction filesystem_verifier_action;
Allie Woodeb9e6d82015-04-17 13:55:30 -0700357 EXPECT_EQ(ErrorCode::kFilesystemVerifierError,
358 GetErrorCodeForAction(&filesystem_verifier_action,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700359 ErrorCode::kError));
Alex Deymob15a0b82015-11-25 20:30:40 -0300360 PostinstallRunnerAction postinstall_runner_action(
Alex Deymofb905d92016-06-03 19:26:58 -0700361 fake_system_state.fake_boot_control(), fake_system_state.fake_hardware());
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700362 EXPECT_EQ(ErrorCode::kPostinstallRunnerError,
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700363 GetErrorCodeForAction(&postinstall_runner_action,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700364 ErrorCode::kError));
Alex Deymo8427b4a2014-11-05 14:00:32 -0800365 MockAction action_mock;
366 EXPECT_CALL(action_mock, Type()).WillOnce(Return("MockAction"));
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700367 EXPECT_EQ(ErrorCode::kError,
368 GetErrorCodeForAction(&action_mock, ErrorCode::kError));
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700369}
370
Darin Petkov36275772010-10-01 11:40:57 -0700371TEST_F(UpdateAttempterTest, DisableDeltaUpdateIfNeededTest) {
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700372 attempter_.omaha_request_params_->set_delta_okay(true);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800373 EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
Darin Petkov36275772010-10-01 11:40:57 -0700374 .WillOnce(Return(false));
375 attempter_.DisableDeltaUpdateIfNeeded();
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700376 EXPECT_TRUE(attempter_.omaha_request_params_->delta_okay());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800377 EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
Darin Petkov36275772010-10-01 11:40:57 -0700378 .WillOnce(DoAll(
Ben Chan672c1f52017-10-23 15:41:39 -0700379 SetArgPointee<1>(UpdateAttempter::kMaxDeltaUpdateFailures - 1),
Darin Petkov36275772010-10-01 11:40:57 -0700380 Return(true)));
381 attempter_.DisableDeltaUpdateIfNeeded();
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700382 EXPECT_TRUE(attempter_.omaha_request_params_->delta_okay());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800383 EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
Darin Petkov36275772010-10-01 11:40:57 -0700384 .WillOnce(DoAll(
Ben Chan672c1f52017-10-23 15:41:39 -0700385 SetArgPointee<1>(UpdateAttempter::kMaxDeltaUpdateFailures),
Darin Petkov36275772010-10-01 11:40:57 -0700386 Return(true)));
387 attempter_.DisableDeltaUpdateIfNeeded();
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700388 EXPECT_FALSE(attempter_.omaha_request_params_->delta_okay());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800389 EXPECT_CALL(*prefs_, GetInt64(_, _)).Times(0);
Darin Petkov36275772010-10-01 11:40:57 -0700390 attempter_.DisableDeltaUpdateIfNeeded();
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700391 EXPECT_FALSE(attempter_.omaha_request_params_->delta_okay());
Darin Petkov36275772010-10-01 11:40:57 -0700392}
393
394TEST_F(UpdateAttempterTest, MarkDeltaUpdateFailureTest) {
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800395 EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
Darin Petkov36275772010-10-01 11:40:57 -0700396 .WillOnce(Return(false))
Ben Chan672c1f52017-10-23 15:41:39 -0700397 .WillOnce(DoAll(SetArgPointee<1>(-1), Return(true)))
398 .WillOnce(DoAll(SetArgPointee<1>(1), Return(true)))
Darin Petkov36275772010-10-01 11:40:57 -0700399 .WillOnce(DoAll(
Ben Chan672c1f52017-10-23 15:41:39 -0700400 SetArgPointee<1>(UpdateAttempter::kMaxDeltaUpdateFailures),
Darin Petkov36275772010-10-01 11:40:57 -0700401 Return(true)));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800402 EXPECT_CALL(*prefs_, SetInt64(Ne(kPrefsDeltaUpdateFailures), _))
Darin Petkov2dd01092010-10-08 15:43:05 -0700403 .WillRepeatedly(Return(true));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800404 EXPECT_CALL(*prefs_, SetInt64(kPrefsDeltaUpdateFailures, 1)).Times(2);
Gilad Arnold74b5f552014-10-07 08:17:16 -0700405 EXPECT_CALL(*prefs_, SetInt64(kPrefsDeltaUpdateFailures, 2));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800406 EXPECT_CALL(*prefs_, SetInt64(kPrefsDeltaUpdateFailures,
Gilad Arnold74b5f552014-10-07 08:17:16 -0700407 UpdateAttempter::kMaxDeltaUpdateFailures + 1));
Darin Petkov36275772010-10-01 11:40:57 -0700408 for (int i = 0; i < 4; i ++)
409 attempter_.MarkDeltaUpdateFailure();
410}
411
Darin Petkov1b003102010-11-30 10:18:36 -0800412TEST_F(UpdateAttempterTest, ScheduleErrorEventActionNoEventTest) {
413 EXPECT_CALL(*processor_, EnqueueAction(_)).Times(0);
414 EXPECT_CALL(*processor_, StartProcessing()).Times(0);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700415 EXPECT_CALL(*fake_system_state_.mock_payload_state(), UpdateFailed(_))
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800416 .Times(0);
417 OmahaResponse response;
Jay Srinivasan53173b92013-05-17 17:13:01 -0700418 string url1 = "http://url1";
Sen Jiang0affc2c2017-02-10 15:55:05 -0800419 response.packages.push_back({.payload_urls = {url1, "https://url"}});
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700420 EXPECT_CALL(*(fake_system_state_.mock_payload_state()), GetCurrentUrl())
Jay Srinivasan53173b92013-05-17 17:13:01 -0700421 .WillRepeatedly(Return(url1));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700422 fake_system_state_.mock_payload_state()->SetResponse(response);
Darin Petkov1b003102010-11-30 10:18:36 -0800423 attempter_.ScheduleErrorEventAction();
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700424 EXPECT_EQ(url1, fake_system_state_.mock_payload_state()->GetCurrentUrl());
Darin Petkov1b003102010-11-30 10:18:36 -0800425}
426
427TEST_F(UpdateAttempterTest, ScheduleErrorEventActionTest) {
428 EXPECT_CALL(*processor_,
429 EnqueueAction(Property(&AbstractAction::Type,
Gilad Arnold74b5f552014-10-07 08:17:16 -0700430 OmahaRequestAction::StaticType())));
431 EXPECT_CALL(*processor_, StartProcessing());
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700432 ErrorCode err = ErrorCode::kError;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700433 EXPECT_CALL(*fake_system_state_.mock_payload_state(), UpdateFailed(err));
Darin Petkov1b003102010-11-30 10:18:36 -0800434 attempter_.error_event_.reset(new OmahaEvent(OmahaEvent::kTypeUpdateComplete,
435 OmahaEvent::kResultError,
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800436 err));
Darin Petkov1b003102010-11-30 10:18:36 -0800437 attempter_.ScheduleErrorEventAction();
Christopher Wiley6b6cc1b2015-10-05 17:50:07 -0700438 EXPECT_EQ(UpdateStatus::REPORTING_ERROR_EVENT, attempter_.status());
Darin Petkov1b003102010-11-30 10:18:36 -0800439}
440
Darin Petkove6ef2f82011-03-07 17:31:11 -0800441namespace {
Chris Sosa76a29ae2013-07-11 17:59:24 -0700442// Actions that will be built as part of an update check.
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700443const string kUpdateActionTypes[] = { // NOLINT(runtime/string)
Darin Petkove6ef2f82011-03-07 17:31:11 -0800444 OmahaRequestAction::StaticType(),
445 OmahaResponseHandlerAction::StaticType(),
Darin Petkove6ef2f82011-03-07 17:31:11 -0800446 OmahaRequestAction::StaticType(),
447 DownloadAction::StaticType(),
448 OmahaRequestAction::StaticType(),
Allie Woodeb9e6d82015-04-17 13:55:30 -0700449 FilesystemVerifierAction::StaticType(),
Darin Petkove6ef2f82011-03-07 17:31:11 -0800450 PostinstallRunnerAction::StaticType(),
451 OmahaRequestAction::StaticType()
452};
Chris Sosa76a29ae2013-07-11 17:59:24 -0700453
454// Actions that will be built as part of a user-initiated rollback.
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700455const string kRollbackActionTypes[] = { // NOLINT(runtime/string)
Chris Sosa76a29ae2013-07-11 17:59:24 -0700456 InstallPlanAction::StaticType(),
457 PostinstallRunnerAction::StaticType(),
458};
459
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700460} // namespace
Darin Petkove6ef2f82011-03-07 17:31:11 -0800461
462void UpdateAttempterTest::UpdateTestStart() {
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700463 attempter_.set_http_response_code(200);
Alex Deymo749ecf12014-10-21 20:06:57 -0700464
465 // Expect that the device policy is loaded by the UpdateAttempter at some
466 // point by calling RefreshDevicePolicy.
Igor9fd76b62017-12-11 15:24:18 +0100467 auto device_policy = std::make_unique<policy::MockDevicePolicy>();
Alex Deymo749ecf12014-10-21 20:06:57 -0700468 EXPECT_CALL(*device_policy, LoadPolicy())
469 .Times(testing::AtLeast(1)).WillRepeatedly(Return(true));
Igor9fd76b62017-12-11 15:24:18 +0100470 attempter_.policy_provider_.reset(
471 new policy::PolicyProvider(std::move(device_policy)));
Alex Deymo749ecf12014-10-21 20:06:57 -0700472
473 {
474 InSequence s;
475 for (size_t i = 0; i < arraysize(kUpdateActionTypes); ++i) {
476 EXPECT_CALL(*processor_,
477 EnqueueAction(Property(&AbstractAction::Type,
Gilad Arnold74b5f552014-10-07 08:17:16 -0700478 kUpdateActionTypes[i])));
Alex Deymo749ecf12014-10-21 20:06:57 -0700479 }
Gilad Arnold74b5f552014-10-07 08:17:16 -0700480 EXPECT_CALL(*processor_, StartProcessing());
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700481 }
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700482
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200483 attempter_.Update("", "", "", "", false, false, false);
Alex Deymo60ca1a72015-06-18 18:19:15 -0700484 loop_.PostTask(FROM_HERE,
485 base::Bind(&UpdateAttempterTest::UpdateTestVerify,
486 base::Unretained(this)));
Darin Petkove6ef2f82011-03-07 17:31:11 -0800487}
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700488
Darin Petkove6ef2f82011-03-07 17:31:11 -0800489void UpdateAttempterTest::UpdateTestVerify() {
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700490 EXPECT_EQ(0, attempter_.http_response_code());
491 EXPECT_EQ(&attempter_, processor_->delegate());
Chris Sosa76a29ae2013-07-11 17:59:24 -0700492 EXPECT_EQ(arraysize(kUpdateActionTypes), attempter_.actions_.size());
493 for (size_t i = 0; i < arraysize(kUpdateActionTypes); ++i) {
494 EXPECT_EQ(kUpdateActionTypes[i], attempter_.actions_[i]->Type());
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700495 }
496 EXPECT_EQ(attempter_.response_handler_action_.get(),
497 attempter_.actions_[1].get());
Sen Jiangfef85fd2016-03-25 15:32:49 -0700498 AbstractAction* action_3 = attempter_.actions_[3].get();
499 ASSERT_NE(nullptr, action_3);
500 ASSERT_EQ(DownloadAction::StaticType(), action_3->Type());
501 DownloadAction* download_action = static_cast<DownloadAction*>(action_3);
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700502 EXPECT_EQ(&attempter_, download_action->delegate());
Christopher Wiley6b6cc1b2015-10-05 17:50:07 -0700503 EXPECT_EQ(UpdateStatus::CHECKING_FOR_UPDATE, attempter_.status());
Alex Deymo60ca1a72015-06-18 18:19:15 -0700504 loop_.BreakLoop();
Darin Petkove6ef2f82011-03-07 17:31:11 -0800505}
506
Chris Sosa28e479c2013-07-12 11:39:53 -0700507void UpdateAttempterTest::RollbackTestStart(
Chris Sosa44b9b7e2014-04-02 13:53:46 -0700508 bool enterprise_rollback, bool valid_slot) {
Chris Sosa76a29ae2013-07-11 17:59:24 -0700509 // Create a device policy so that we can change settings.
Igor9fd76b62017-12-11 15:24:18 +0100510 auto device_policy = std::make_unique<policy::MockDevicePolicy>();
Chris Sosa76a29ae2013-07-11 17:59:24 -0700511 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
Igor9fd76b62017-12-11 15:24:18 +0100512 fake_system_state_.set_device_policy(device_policy.get());
513 if (enterprise_rollback) {
514 // We return an empty owner as this is an enterprise.
515 EXPECT_CALL(*device_policy, GetOwner(_)).WillRepeatedly(
516 DoAll(SetArgPointee<0>(string("")),
517 Return(true)));
518 } else {
519 // We return a fake owner as this is an owned consumer device.
520 EXPECT_CALL(*device_policy, GetOwner(_)).WillRepeatedly(
521 DoAll(SetArgPointee<0>(string("fake.mail@fake.com")),
522 Return(true)));
523 }
524
525 attempter_.policy_provider_.reset(
526 new policy::PolicyProvider(std::move(device_policy)));
Chris Sosa76a29ae2013-07-11 17:59:24 -0700527
Alex Deymo763e7db2015-08-27 21:08:08 -0700528 if (valid_slot) {
529 BootControlInterface::Slot rollback_slot = 1;
530 LOG(INFO) << "Test Mark Bootable: "
531 << BootControlInterface::SlotName(rollback_slot);
Alex Deymoe5e5fe92015-10-05 09:28:19 -0700532 fake_system_state_.fake_boot_control()->SetSlotBootable(rollback_slot,
533 true);
Don Garrett6646b442013-11-13 15:29:11 -0800534 }
535
Chris Sosa28e479c2013-07-12 11:39:53 -0700536 bool is_rollback_allowed = false;
Chris Sosa76a29ae2013-07-11 17:59:24 -0700537
Chris Sosad38b1132014-03-25 10:43:59 -0700538 // We only allow rollback on devices that are not enterprise enrolled and
539 // which have a valid slot to rollback to.
540 if (!enterprise_rollback && valid_slot) {
Chris Sosa28e479c2013-07-12 11:39:53 -0700541 is_rollback_allowed = true;
542 }
543
Chris Sosa28e479c2013-07-12 11:39:53 -0700544 if (is_rollback_allowed) {
Chris Sosa76a29ae2013-07-11 17:59:24 -0700545 InSequence s;
546 for (size_t i = 0; i < arraysize(kRollbackActionTypes); ++i) {
547 EXPECT_CALL(*processor_,
548 EnqueueAction(Property(&AbstractAction::Type,
Gilad Arnold74b5f552014-10-07 08:17:16 -0700549 kRollbackActionTypes[i])));
Chris Sosa76a29ae2013-07-11 17:59:24 -0700550 }
Gilad Arnold74b5f552014-10-07 08:17:16 -0700551 EXPECT_CALL(*processor_, StartProcessing());
Chris Sosa76a29ae2013-07-11 17:59:24 -0700552
Chris Sosa44b9b7e2014-04-02 13:53:46 -0700553 EXPECT_TRUE(attempter_.Rollback(true));
Alex Deymo60ca1a72015-06-18 18:19:15 -0700554 loop_.PostTask(FROM_HERE,
555 base::Bind(&UpdateAttempterTest::RollbackTestVerify,
556 base::Unretained(this)));
Chris Sosa76a29ae2013-07-11 17:59:24 -0700557 } else {
Chris Sosa44b9b7e2014-04-02 13:53:46 -0700558 EXPECT_FALSE(attempter_.Rollback(true));
Alex Deymo60ca1a72015-06-18 18:19:15 -0700559 loop_.BreakLoop();
Chris Sosa76a29ae2013-07-11 17:59:24 -0700560 }
561}
562
563void UpdateAttempterTest::RollbackTestVerify() {
564 // Verifies the actions that were enqueued.
565 EXPECT_EQ(&attempter_, processor_->delegate());
566 EXPECT_EQ(arraysize(kRollbackActionTypes), attempter_.actions_.size());
567 for (size_t i = 0; i < arraysize(kRollbackActionTypes); ++i) {
568 EXPECT_EQ(kRollbackActionTypes[i], attempter_.actions_[i]->Type());
569 }
Christopher Wiley6b6cc1b2015-10-05 17:50:07 -0700570 EXPECT_EQ(UpdateStatus::ATTEMPTING_ROLLBACK, attempter_.status());
Alex Deymo80f70ff2016-02-10 16:08:11 -0800571 AbstractAction* action_0 = attempter_.actions_[0].get();
572 ASSERT_NE(nullptr, action_0);
573 ASSERT_EQ(InstallPlanAction::StaticType(), action_0->Type());
Chris Sosa76a29ae2013-07-11 17:59:24 -0700574 InstallPlanAction* install_plan_action =
Alex Deymo80f70ff2016-02-10 16:08:11 -0800575 static_cast<InstallPlanAction*>(action_0);
Chris Sosa76a29ae2013-07-11 17:59:24 -0700576 InstallPlan* install_plan = install_plan_action->install_plan();
Alex Deymo80f70ff2016-02-10 16:08:11 -0800577 EXPECT_EQ(0U, install_plan->partitions.size());
Chris Sosa76a29ae2013-07-11 17:59:24 -0700578 EXPECT_EQ(install_plan->powerwash_required, true);
Alex Deymo60ca1a72015-06-18 18:19:15 -0700579 loop_.BreakLoop();
Chris Sosa76a29ae2013-07-11 17:59:24 -0700580}
581
Darin Petkove6ef2f82011-03-07 17:31:11 -0800582TEST_F(UpdateAttempterTest, UpdateTest) {
Alex Deymo461b2592015-07-24 20:10:52 -0700583 UpdateTestStart();
Alex Deymo60ca1a72015-06-18 18:19:15 -0700584 loop_.Run();
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700585}
586
Chris Sosa76a29ae2013-07-11 17:59:24 -0700587TEST_F(UpdateAttempterTest, RollbackTest) {
Alex Deymo60ca1a72015-06-18 18:19:15 -0700588 loop_.PostTask(FROM_HERE,
589 base::Bind(&UpdateAttempterTest::RollbackTestStart,
590 base::Unretained(this),
591 false, true));
592 loop_.Run();
Chris Sosa76a29ae2013-07-11 17:59:24 -0700593}
594
Don Garrett6646b442013-11-13 15:29:11 -0800595TEST_F(UpdateAttempterTest, InvalidSlotRollbackTest) {
Alex Deymo60ca1a72015-06-18 18:19:15 -0700596 loop_.PostTask(FROM_HERE,
597 base::Bind(&UpdateAttempterTest::RollbackTestStart,
598 base::Unretained(this),
599 false, false));
600 loop_.Run();
Don Garrett6646b442013-11-13 15:29:11 -0800601}
602
Chris Sosa76a29ae2013-07-11 17:59:24 -0700603TEST_F(UpdateAttempterTest, EnterpriseRollbackTest) {
Alex Deymo60ca1a72015-06-18 18:19:15 -0700604 loop_.PostTask(FROM_HERE,
605 base::Bind(&UpdateAttempterTest::RollbackTestStart,
606 base::Unretained(this),
607 true, true));
608 loop_.Run();
Chris Sosa76a29ae2013-07-11 17:59:24 -0700609}
610
Thieu Le116fda32011-04-19 11:01:54 -0700611void UpdateAttempterTest::PingOmahaTestStart() {
612 EXPECT_CALL(*processor_,
613 EnqueueAction(Property(&AbstractAction::Type,
Gilad Arnold74b5f552014-10-07 08:17:16 -0700614 OmahaRequestAction::StaticType())));
615 EXPECT_CALL(*processor_, StartProcessing());
Thieu Le116fda32011-04-19 11:01:54 -0700616 attempter_.PingOmaha();
Alex Deymo60ca1a72015-06-18 18:19:15 -0700617 ScheduleQuitMainLoop();
Thieu Le116fda32011-04-19 11:01:54 -0700618}
619
620TEST_F(UpdateAttempterTest, PingOmahaTest) {
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700621 EXPECT_FALSE(attempter_.waiting_for_scheduled_check_);
622 EXPECT_FALSE(attempter_.schedule_updates_called());
623 // Disable scheduling of subsequnet checks; we're using the DefaultPolicy in
624 // testing, which is more permissive than we want to handle here.
625 attempter_.DisableScheduleUpdates();
Alex Deymo60ca1a72015-06-18 18:19:15 -0700626 loop_.PostTask(FROM_HERE,
627 base::Bind(&UpdateAttempterTest::PingOmahaTestStart,
628 base::Unretained(this)));
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700629 brillo::MessageLoopRunMaxIterations(&loop_, 100);
Christopher Wiley6b6cc1b2015-10-05 17:50:07 -0700630 EXPECT_EQ(UpdateStatus::UPDATED_NEED_REBOOT, attempter_.status());
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700631 EXPECT_TRUE(attempter_.schedule_updates_called());
Thieu Le116fda32011-04-19 11:01:54 -0700632}
633
Darin Petkov18c7bce2011-06-16 14:07:00 -0700634TEST_F(UpdateAttempterTest, CreatePendingErrorEventTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -0800635 MockAction action;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700636 const ErrorCode kCode = ErrorCode::kDownloadTransferError;
Darin Petkov18c7bce2011-06-16 14:07:00 -0700637 attempter_.CreatePendingErrorEvent(&action, kCode);
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700638 ASSERT_NE(nullptr, attempter_.error_event_.get());
Darin Petkov18c7bce2011-06-16 14:07:00 -0700639 EXPECT_EQ(OmahaEvent::kTypeUpdateComplete, attempter_.error_event_->type);
640 EXPECT_EQ(OmahaEvent::kResultError, attempter_.error_event_->result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700641 EXPECT_EQ(
642 static_cast<ErrorCode>(static_cast<int>(kCode) |
643 static_cast<int>(ErrorCode::kTestOmahaUrlFlag)),
644 attempter_.error_event_->error_code);
Darin Petkov18c7bce2011-06-16 14:07:00 -0700645}
646
647TEST_F(UpdateAttempterTest, CreatePendingErrorEventResumedTest) {
648 OmahaResponseHandlerAction *response_action =
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700649 new OmahaResponseHandlerAction(&fake_system_state_);
Darin Petkov18c7bce2011-06-16 14:07:00 -0700650 response_action->install_plan_.is_resume = true;
651 attempter_.response_handler_action_.reset(response_action);
Alex Deymo8427b4a2014-11-05 14:00:32 -0800652 MockAction action;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700653 const ErrorCode kCode = ErrorCode::kInstallDeviceOpenError;
Darin Petkov18c7bce2011-06-16 14:07:00 -0700654 attempter_.CreatePendingErrorEvent(&action, kCode);
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700655 ASSERT_NE(nullptr, attempter_.error_event_.get());
Darin Petkov18c7bce2011-06-16 14:07:00 -0700656 EXPECT_EQ(OmahaEvent::kTypeUpdateComplete, attempter_.error_event_->type);
657 EXPECT_EQ(OmahaEvent::kResultError, attempter_.error_event_->result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700658 EXPECT_EQ(
659 static_cast<ErrorCode>(
660 static_cast<int>(kCode) |
661 static_cast<int>(ErrorCode::kResumedFlag) |
662 static_cast<int>(ErrorCode::kTestOmahaUrlFlag)),
663 attempter_.error_event_->error_code);
Darin Petkov18c7bce2011-06-16 14:07:00 -0700664}
665
David Zeuthen8f191b22013-08-06 12:27:50 -0700666TEST_F(UpdateAttempterTest, P2PNotStartedAtStartupWhenNotEnabled) {
667 MockP2PManager mock_p2p_manager;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700668 fake_system_state_.set_p2p_manager(&mock_p2p_manager);
David Zeuthen8f191b22013-08-06 12:27:50 -0700669 mock_p2p_manager.fake().SetP2PEnabled(false);
670 EXPECT_CALL(mock_p2p_manager, EnsureP2PRunning()).Times(0);
671 attempter_.UpdateEngineStarted();
672}
673
674TEST_F(UpdateAttempterTest, P2PNotStartedAtStartupWhenEnabledButNotSharing) {
675 MockP2PManager mock_p2p_manager;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700676 fake_system_state_.set_p2p_manager(&mock_p2p_manager);
David Zeuthen8f191b22013-08-06 12:27:50 -0700677 mock_p2p_manager.fake().SetP2PEnabled(true);
678 EXPECT_CALL(mock_p2p_manager, EnsureP2PRunning()).Times(0);
679 attempter_.UpdateEngineStarted();
680}
681
682TEST_F(UpdateAttempterTest, P2PStartedAtStartupWhenEnabledAndSharing) {
683 MockP2PManager mock_p2p_manager;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700684 fake_system_state_.set_p2p_manager(&mock_p2p_manager);
David Zeuthen8f191b22013-08-06 12:27:50 -0700685 mock_p2p_manager.fake().SetP2PEnabled(true);
686 mock_p2p_manager.fake().SetCountSharedFilesResult(1);
Gilad Arnold74b5f552014-10-07 08:17:16 -0700687 EXPECT_CALL(mock_p2p_manager, EnsureP2PRunning());
David Zeuthen8f191b22013-08-06 12:27:50 -0700688 attempter_.UpdateEngineStarted();
689}
690
691TEST_F(UpdateAttempterTest, P2PNotEnabled) {
Alex Deymo60ca1a72015-06-18 18:19:15 -0700692 loop_.PostTask(FROM_HERE,
693 base::Bind(&UpdateAttempterTest::P2PNotEnabledStart,
694 base::Unretained(this)));
695 loop_.Run();
David Zeuthen8f191b22013-08-06 12:27:50 -0700696}
Alex Deymo60ca1a72015-06-18 18:19:15 -0700697
David Zeuthen8f191b22013-08-06 12:27:50 -0700698void UpdateAttempterTest::P2PNotEnabledStart() {
699 // If P2P is not enabled, check that we do not attempt housekeeping
700 // and do not convey that p2p is to be used.
701 MockP2PManager mock_p2p_manager;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700702 fake_system_state_.set_p2p_manager(&mock_p2p_manager);
David Zeuthen8f191b22013-08-06 12:27:50 -0700703 mock_p2p_manager.fake().SetP2PEnabled(false);
704 EXPECT_CALL(mock_p2p_manager, PerformHousekeeping()).Times(0);
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200705 attempter_.Update("", "", "", "", false, false, false);
Alex Deymo60ca1a72015-06-18 18:19:15 -0700706 EXPECT_FALSE(actual_using_p2p_for_downloading_);
Gilad Arnold74b5f552014-10-07 08:17:16 -0700707 EXPECT_FALSE(actual_using_p2p_for_sharing());
Alex Deymo60ca1a72015-06-18 18:19:15 -0700708 ScheduleQuitMainLoop();
David Zeuthen8f191b22013-08-06 12:27:50 -0700709}
710
711TEST_F(UpdateAttempterTest, P2PEnabledStartingFails) {
Alex Deymo60ca1a72015-06-18 18:19:15 -0700712 loop_.PostTask(FROM_HERE,
713 base::Bind(&UpdateAttempterTest::P2PEnabledStartingFailsStart,
714 base::Unretained(this)));
715 loop_.Run();
David Zeuthen8f191b22013-08-06 12:27:50 -0700716}
Alex Deymo60ca1a72015-06-18 18:19:15 -0700717
David Zeuthen8f191b22013-08-06 12:27:50 -0700718void UpdateAttempterTest::P2PEnabledStartingFailsStart() {
719 // If p2p is enabled, but starting it fails ensure we don't do
720 // any housekeeping and do not convey that p2p should be used.
721 MockP2PManager mock_p2p_manager;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700722 fake_system_state_.set_p2p_manager(&mock_p2p_manager);
David Zeuthen8f191b22013-08-06 12:27:50 -0700723 mock_p2p_manager.fake().SetP2PEnabled(true);
724 mock_p2p_manager.fake().SetEnsureP2PRunningResult(false);
725 mock_p2p_manager.fake().SetPerformHousekeepingResult(false);
726 EXPECT_CALL(mock_p2p_manager, PerformHousekeeping()).Times(0);
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200727 attempter_.Update("", "", "", "", false, false, false);
Gilad Arnold74b5f552014-10-07 08:17:16 -0700728 EXPECT_FALSE(actual_using_p2p_for_downloading());
729 EXPECT_FALSE(actual_using_p2p_for_sharing());
Alex Deymo60ca1a72015-06-18 18:19:15 -0700730 ScheduleQuitMainLoop();
David Zeuthen8f191b22013-08-06 12:27:50 -0700731}
732
733TEST_F(UpdateAttempterTest, P2PEnabledHousekeepingFails) {
Alex Deymo60ca1a72015-06-18 18:19:15 -0700734 loop_.PostTask(
735 FROM_HERE,
736 base::Bind(&UpdateAttempterTest::P2PEnabledHousekeepingFailsStart,
737 base::Unretained(this)));
738 loop_.Run();
David Zeuthen8f191b22013-08-06 12:27:50 -0700739}
Alex Deymo60ca1a72015-06-18 18:19:15 -0700740
David Zeuthen8f191b22013-08-06 12:27:50 -0700741void UpdateAttempterTest::P2PEnabledHousekeepingFailsStart() {
742 // If p2p is enabled, starting it works but housekeeping fails, ensure
743 // we do not convey p2p is to be used.
744 MockP2PManager mock_p2p_manager;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700745 fake_system_state_.set_p2p_manager(&mock_p2p_manager);
David Zeuthen8f191b22013-08-06 12:27:50 -0700746 mock_p2p_manager.fake().SetP2PEnabled(true);
747 mock_p2p_manager.fake().SetEnsureP2PRunningResult(true);
748 mock_p2p_manager.fake().SetPerformHousekeepingResult(false);
Gilad Arnold74b5f552014-10-07 08:17:16 -0700749 EXPECT_CALL(mock_p2p_manager, PerformHousekeeping());
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200750 attempter_.Update("", "", "", "", false, false, false);
Gilad Arnold74b5f552014-10-07 08:17:16 -0700751 EXPECT_FALSE(actual_using_p2p_for_downloading());
752 EXPECT_FALSE(actual_using_p2p_for_sharing());
Alex Deymo60ca1a72015-06-18 18:19:15 -0700753 ScheduleQuitMainLoop();
David Zeuthen8f191b22013-08-06 12:27:50 -0700754}
755
756TEST_F(UpdateAttempterTest, P2PEnabled) {
Alex Deymo60ca1a72015-06-18 18:19:15 -0700757 loop_.PostTask(FROM_HERE,
758 base::Bind(&UpdateAttempterTest::P2PEnabledStart,
759 base::Unretained(this)));
760 loop_.Run();
David Zeuthen8f191b22013-08-06 12:27:50 -0700761}
Alex Deymo60ca1a72015-06-18 18:19:15 -0700762
David Zeuthen8f191b22013-08-06 12:27:50 -0700763void UpdateAttempterTest::P2PEnabledStart() {
764 MockP2PManager mock_p2p_manager;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700765 fake_system_state_.set_p2p_manager(&mock_p2p_manager);
David Zeuthen8f191b22013-08-06 12:27:50 -0700766 // If P2P is enabled and starting it works, check that we performed
767 // housekeeping and that we convey p2p should be used.
768 mock_p2p_manager.fake().SetP2PEnabled(true);
769 mock_p2p_manager.fake().SetEnsureP2PRunningResult(true);
770 mock_p2p_manager.fake().SetPerformHousekeepingResult(true);
Gilad Arnold74b5f552014-10-07 08:17:16 -0700771 EXPECT_CALL(mock_p2p_manager, PerformHousekeeping());
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200772 attempter_.Update("", "", "", "", false, false, false);
Gilad Arnold74b5f552014-10-07 08:17:16 -0700773 EXPECT_TRUE(actual_using_p2p_for_downloading());
774 EXPECT_TRUE(actual_using_p2p_for_sharing());
Alex Deymo60ca1a72015-06-18 18:19:15 -0700775 ScheduleQuitMainLoop();
David Zeuthen8f191b22013-08-06 12:27:50 -0700776}
777
778TEST_F(UpdateAttempterTest, P2PEnabledInteractive) {
Alex Deymo60ca1a72015-06-18 18:19:15 -0700779 loop_.PostTask(FROM_HERE,
780 base::Bind(&UpdateAttempterTest::P2PEnabledInteractiveStart,
781 base::Unretained(this)));
782 loop_.Run();
David Zeuthen8f191b22013-08-06 12:27:50 -0700783}
Alex Deymo60ca1a72015-06-18 18:19:15 -0700784
David Zeuthen8f191b22013-08-06 12:27:50 -0700785void UpdateAttempterTest::P2PEnabledInteractiveStart() {
786 MockP2PManager mock_p2p_manager;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700787 fake_system_state_.set_p2p_manager(&mock_p2p_manager);
David Zeuthen8f191b22013-08-06 12:27:50 -0700788 // For an interactive check, if P2P is enabled and starting it
789 // works, check that we performed housekeeping and that we convey
790 // p2p should be used for sharing but NOT for downloading.
791 mock_p2p_manager.fake().SetP2PEnabled(true);
792 mock_p2p_manager.fake().SetEnsureP2PRunningResult(true);
793 mock_p2p_manager.fake().SetPerformHousekeepingResult(true);
Gilad Arnold74b5f552014-10-07 08:17:16 -0700794 EXPECT_CALL(mock_p2p_manager, PerformHousekeeping());
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200795 attempter_.Update("",
796 "",
797 "",
798 "",
799 false,
800 false,
801 /*interactive=*/true);
Gilad Arnold74b5f552014-10-07 08:17:16 -0700802 EXPECT_FALSE(actual_using_p2p_for_downloading());
803 EXPECT_TRUE(actual_using_p2p_for_sharing());
Alex Deymo60ca1a72015-06-18 18:19:15 -0700804 ScheduleQuitMainLoop();
David Zeuthen8f191b22013-08-06 12:27:50 -0700805}
806
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700807TEST_F(UpdateAttempterTest, ReadScatterFactorFromPolicy) {
Alex Deymo60ca1a72015-06-18 18:19:15 -0700808 loop_.PostTask(
809 FROM_HERE,
810 base::Bind(&UpdateAttempterTest::ReadScatterFactorFromPolicyTestStart,
811 base::Unretained(this)));
812 loop_.Run();
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700813}
814
815// Tests that the scatter_factor_in_seconds value is properly fetched
816// from the device policy.
817void UpdateAttempterTest::ReadScatterFactorFromPolicyTestStart() {
Ben Chan9abb7632014-08-07 00:10:53 -0700818 int64_t scatter_factor_in_seconds = 36000;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700819
Igor9fd76b62017-12-11 15:24:18 +0100820 auto device_policy = std::make_unique<policy::MockDevicePolicy>();
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700821 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
Igor9fd76b62017-12-11 15:24:18 +0100822 fake_system_state_.set_device_policy(device_policy.get());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700823
824 EXPECT_CALL(*device_policy, GetScatterFactorInSeconds(_))
825 .WillRepeatedly(DoAll(
Ben Chan672c1f52017-10-23 15:41:39 -0700826 SetArgPointee<0>(scatter_factor_in_seconds),
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700827 Return(true)));
828
Igor9fd76b62017-12-11 15:24:18 +0100829 attempter_.policy_provider_.reset(
830 new policy::PolicyProvider(std::move(device_policy)));
831
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200832 attempter_.Update("", "", "", "", false, false, false);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700833 EXPECT_EQ(scatter_factor_in_seconds, attempter_.scatter_factor_.InSeconds());
834
Alex Deymo60ca1a72015-06-18 18:19:15 -0700835 ScheduleQuitMainLoop();
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700836}
837
838TEST_F(UpdateAttempterTest, DecrementUpdateCheckCountTest) {
Alex Deymo60ca1a72015-06-18 18:19:15 -0700839 loop_.PostTask(
840 FROM_HERE,
841 base::Bind(&UpdateAttempterTest::DecrementUpdateCheckCountTestStart,
842 base::Unretained(this)));
843 loop_.Run();
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700844}
845
846void UpdateAttempterTest::DecrementUpdateCheckCountTestStart() {
847 // Tests that the scatter_factor_in_seconds value is properly fetched
848 // from the device policy and is decremented if value > 0.
Ben Chan9abb7632014-08-07 00:10:53 -0700849 int64_t initial_value = 5;
Alex Deymo2c0db7b2014-11-04 12:23:39 -0800850 FakePrefs fake_prefs;
851 attempter_.prefs_ = &fake_prefs;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700852
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700853 fake_system_state_.fake_hardware()->SetIsOOBEComplete(Time::UnixEpoch());
Jay Srinivasan08fce042012-06-07 16:31:01 -0700854
Alex Deymo2c0db7b2014-11-04 12:23:39 -0800855 EXPECT_TRUE(fake_prefs.SetInt64(kPrefsUpdateCheckCount, initial_value));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700856
Ben Chan9abb7632014-08-07 00:10:53 -0700857 int64_t scatter_factor_in_seconds = 10;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700858
Igor9fd76b62017-12-11 15:24:18 +0100859 auto device_policy = std::make_unique<policy::MockDevicePolicy>();
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700860 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
Igor9fd76b62017-12-11 15:24:18 +0100861 fake_system_state_.set_device_policy(device_policy.get());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700862
863 EXPECT_CALL(*device_policy, GetScatterFactorInSeconds(_))
864 .WillRepeatedly(DoAll(
Ben Chan672c1f52017-10-23 15:41:39 -0700865 SetArgPointee<0>(scatter_factor_in_seconds),
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700866 Return(true)));
867
Igor9fd76b62017-12-11 15:24:18 +0100868 attempter_.policy_provider_.reset(
869 new policy::PolicyProvider(std::move(device_policy)));
870
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200871 attempter_.Update("", "", "", "", false, false, false);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700872 EXPECT_EQ(scatter_factor_in_seconds, attempter_.scatter_factor_.InSeconds());
873
874 // Make sure the file still exists.
Alex Deymo2c0db7b2014-11-04 12:23:39 -0800875 EXPECT_TRUE(fake_prefs.Exists(kPrefsUpdateCheckCount));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700876
Ben Chan9abb7632014-08-07 00:10:53 -0700877 int64_t new_value;
Alex Deymo2c0db7b2014-11-04 12:23:39 -0800878 EXPECT_TRUE(fake_prefs.GetInt64(kPrefsUpdateCheckCount, &new_value));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700879 EXPECT_EQ(initial_value - 1, new_value);
880
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700881 EXPECT_TRUE(
882 attempter_.omaha_request_params_->update_check_count_wait_enabled());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700883
884 // However, if the count is already 0, it's not decremented. Test that.
885 initial_value = 0;
Alex Deymo2c0db7b2014-11-04 12:23:39 -0800886 EXPECT_TRUE(fake_prefs.SetInt64(kPrefsUpdateCheckCount, initial_value));
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200887 attempter_.Update("", "", "", "", false, false, false);
Alex Deymo2c0db7b2014-11-04 12:23:39 -0800888 EXPECT_TRUE(fake_prefs.Exists(kPrefsUpdateCheckCount));
889 EXPECT_TRUE(fake_prefs.GetInt64(kPrefsUpdateCheckCount, &new_value));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700890 EXPECT_EQ(initial_value, new_value);
891
Alex Deymo60ca1a72015-06-18 18:19:15 -0700892 ScheduleQuitMainLoop();
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700893}
894
Jay Srinivasan08fce042012-06-07 16:31:01 -0700895TEST_F(UpdateAttempterTest, NoScatteringDoneDuringManualUpdateTestStart) {
Alex Deymo60ca1a72015-06-18 18:19:15 -0700896 loop_.PostTask(FROM_HERE, base::Bind(
897 &UpdateAttempterTest::NoScatteringDoneDuringManualUpdateTestStart,
898 base::Unretained(this)));
899 loop_.Run();
Jay Srinivasan08fce042012-06-07 16:31:01 -0700900}
901
902void UpdateAttempterTest::NoScatteringDoneDuringManualUpdateTestStart() {
903 // Tests that no scattering logic is enabled if the update check
904 // is manually done (as opposed to a scheduled update check)
Ben Chan9abb7632014-08-07 00:10:53 -0700905 int64_t initial_value = 8;
Alex Deymo2c0db7b2014-11-04 12:23:39 -0800906 FakePrefs fake_prefs;
907 attempter_.prefs_ = &fake_prefs;
Jay Srinivasan08fce042012-06-07 16:31:01 -0700908
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700909 fake_system_state_.fake_hardware()->SetIsOOBEComplete(Time::UnixEpoch());
Alex Deymo2c0db7b2014-11-04 12:23:39 -0800910 fake_system_state_.set_prefs(&fake_prefs);
Jay Srinivasan08fce042012-06-07 16:31:01 -0700911
Adolfo Victoriad3a1e352018-07-16 11:40:47 -0700912 EXPECT_TRUE(
913 fake_prefs.SetInt64(kPrefsWallClockScatteringWaitPeriod, initial_value));
Alex Deymo2c0db7b2014-11-04 12:23:39 -0800914 EXPECT_TRUE(fake_prefs.SetInt64(kPrefsUpdateCheckCount, initial_value));
Jay Srinivasan08fce042012-06-07 16:31:01 -0700915
916 // make sure scatter_factor is non-zero as scattering is disabled
917 // otherwise.
Ben Chan9abb7632014-08-07 00:10:53 -0700918 int64_t scatter_factor_in_seconds = 50;
Jay Srinivasan08fce042012-06-07 16:31:01 -0700919
Igor9fd76b62017-12-11 15:24:18 +0100920 auto device_policy = std::make_unique<policy::MockDevicePolicy>();
Jay Srinivasan08fce042012-06-07 16:31:01 -0700921 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
Igor9fd76b62017-12-11 15:24:18 +0100922 fake_system_state_.set_device_policy(device_policy.get());
Jay Srinivasan08fce042012-06-07 16:31:01 -0700923
924 EXPECT_CALL(*device_policy, GetScatterFactorInSeconds(_))
925 .WillRepeatedly(DoAll(
Ben Chan672c1f52017-10-23 15:41:39 -0700926 SetArgPointee<0>(scatter_factor_in_seconds),
Jay Srinivasan08fce042012-06-07 16:31:01 -0700927 Return(true)));
928
Igor9fd76b62017-12-11 15:24:18 +0100929 attempter_.policy_provider_.reset(
930 new policy::PolicyProvider(std::move(device_policy)));
931
Gilad Arnoldb92f0df2013-01-10 16:32:45 -0800932 // Trigger an interactive check so we can test that scattering is disabled.
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200933 attempter_.Update("",
934 "",
935 "",
936 "",
937 false,
938 false,
939 /*interactive=*/true);
Jay Srinivasan08fce042012-06-07 16:31:01 -0700940 EXPECT_EQ(scatter_factor_in_seconds, attempter_.scatter_factor_.InSeconds());
941
942 // Make sure scattering is disabled for manual (i.e. user initiated) update
Jay Srinivasan21be0752012-07-25 15:44:56 -0700943 // checks and all artifacts are removed.
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700944 EXPECT_FALSE(
945 attempter_.omaha_request_params_->wall_clock_based_wait_enabled());
Adolfo Victoriad3a1e352018-07-16 11:40:47 -0700946 EXPECT_FALSE(fake_prefs.Exists(kPrefsWallClockScatteringWaitPeriod));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700947 EXPECT_EQ(0, attempter_.omaha_request_params_->waiting_period().InSeconds());
948 EXPECT_FALSE(
949 attempter_.omaha_request_params_->update_check_count_wait_enabled());
Alex Deymo2c0db7b2014-11-04 12:23:39 -0800950 EXPECT_FALSE(fake_prefs.Exists(kPrefsUpdateCheckCount));
Jay Srinivasan08fce042012-06-07 16:31:01 -0700951
Alex Deymo60ca1a72015-06-18 18:19:15 -0700952 ScheduleQuitMainLoop();
Jay Srinivasan08fce042012-06-07 16:31:01 -0700953}
954
David Zeuthen985b1122013-10-09 12:13:15 -0700955// Checks that we only report daily metrics at most every 24 hours.
956TEST_F(UpdateAttempterTest, ReportDailyMetrics) {
957 FakeClock fake_clock;
Alex Deymo2c0db7b2014-11-04 12:23:39 -0800958 FakePrefs fake_prefs;
David Zeuthen985b1122013-10-09 12:13:15 -0700959
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700960 fake_system_state_.set_clock(&fake_clock);
Alex Deymo2c0db7b2014-11-04 12:23:39 -0800961 fake_system_state_.set_prefs(&fake_prefs);
David Zeuthen985b1122013-10-09 12:13:15 -0700962
963 Time epoch = Time::FromInternalValue(0);
964 fake_clock.SetWallclockTime(epoch);
965
966 // If there is no kPrefsDailyMetricsLastReportedAt state variable,
967 // we should report.
968 EXPECT_TRUE(attempter_.CheckAndReportDailyMetrics());
969 // We should not report again if no time has passed.
970 EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
971
972 // We should not report if only 10 hours has passed.
973 fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(10));
974 EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
975
976 // We should not report if only 24 hours - 1 sec has passed.
977 fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(24) -
978 TimeDelta::FromSeconds(1));
979 EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
980
981 // We should report if 24 hours has passed.
982 fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(24));
983 EXPECT_TRUE(attempter_.CheckAndReportDailyMetrics());
984
985 // But then we should not report again..
986 EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
987
988 // .. until another 24 hours has passed
989 fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(47));
990 EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
991 fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(48));
992 EXPECT_TRUE(attempter_.CheckAndReportDailyMetrics());
993 EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
994
995 // .. and another 24 hours
996 fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(71));
997 EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
998 fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(72));
999 EXPECT_TRUE(attempter_.CheckAndReportDailyMetrics());
1000 EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
1001
1002 // If the span between time of reporting and present time is
1003 // negative, we report. This is in order to reset the timestamp and
1004 // avoid an edge condition whereby a distant point in the future is
1005 // in the state variable resulting in us never ever reporting again.
1006 fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(71));
1007 EXPECT_TRUE(attempter_.CheckAndReportDailyMetrics());
1008 EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
1009
1010 // In this case we should not update until the clock reads 71 + 24 = 95.
1011 // Check that.
1012 fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(94));
1013 EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
1014 fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(95));
1015 EXPECT_TRUE(attempter_.CheckAndReportDailyMetrics());
1016 EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
David Zeuthen985b1122013-10-09 12:13:15 -07001017}
1018
David Zeuthen3c55abd2013-10-14 12:48:03 -07001019TEST_F(UpdateAttempterTest, BootTimeInUpdateMarkerFile) {
David Zeuthen3c55abd2013-10-14 12:48:03 -07001020 FakeClock fake_clock;
1021 fake_clock.SetBootTime(Time::FromTimeT(42));
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001022 fake_system_state_.set_clock(&fake_clock);
Alex Deymo906191f2015-10-12 12:22:44 -07001023 FakePrefs fake_prefs;
1024 fake_system_state_.set_prefs(&fake_prefs);
Sen Jiangaeeb2e02016-06-09 15:00:16 -07001025 attempter_.Init();
David Zeuthen3c55abd2013-10-14 12:48:03 -07001026
1027 Time boot_time;
Sen Jiangaeeb2e02016-06-09 15:00:16 -07001028 EXPECT_FALSE(attempter_.GetBootTimeAtUpdate(&boot_time));
David Zeuthen3c55abd2013-10-14 12:48:03 -07001029
Sen Jiangaeeb2e02016-06-09 15:00:16 -07001030 attempter_.WriteUpdateCompletedMarker();
David Zeuthen3c55abd2013-10-14 12:48:03 -07001031
Sen Jiangaeeb2e02016-06-09 15:00:16 -07001032 EXPECT_TRUE(attempter_.GetBootTimeAtUpdate(&boot_time));
David Zeuthen3c55abd2013-10-14 12:48:03 -07001033 EXPECT_EQ(boot_time.ToTimeT(), 42);
1034}
1035
David Pursell02c18642014-11-06 11:26:11 -08001036TEST_F(UpdateAttempterTest, AnyUpdateSourceAllowedUnofficial) {
1037 fake_system_state_.fake_hardware()->SetIsOfficialBuild(false);
1038 EXPECT_TRUE(attempter_.IsAnyUpdateSourceAllowed());
1039}
1040
1041TEST_F(UpdateAttempterTest, AnyUpdateSourceAllowedOfficialDevmode) {
1042 fake_system_state_.fake_hardware()->SetIsOfficialBuild(true);
Sen Jiange67bb5b2016-06-20 15:53:56 -07001043 fake_system_state_.fake_hardware()->SetAreDevFeaturesEnabled(true);
David Pursell02c18642014-11-06 11:26:11 -08001044 EXPECT_TRUE(attempter_.IsAnyUpdateSourceAllowed());
1045}
1046
1047TEST_F(UpdateAttempterTest, AnyUpdateSourceDisallowedOfficialNormal) {
1048 fake_system_state_.fake_hardware()->SetIsOfficialBuild(true);
Sen Jiange67bb5b2016-06-20 15:53:56 -07001049 fake_system_state_.fake_hardware()->SetAreDevFeaturesEnabled(false);
David Pursell02c18642014-11-06 11:26:11 -08001050 EXPECT_FALSE(attempter_.IsAnyUpdateSourceAllowed());
1051}
1052
1053TEST_F(UpdateAttempterTest, CheckForUpdateAUTest) {
1054 fake_system_state_.fake_hardware()->SetIsOfficialBuild(true);
Sen Jiange67bb5b2016-06-20 15:53:56 -07001055 fake_system_state_.fake_hardware()->SetAreDevFeaturesEnabled(false);
Aaron Wood081c0232017-10-19 17:14:58 -07001056 attempter_.CheckForUpdate("", "autest", UpdateAttemptFlags::kNone);
Alex Deymoac41a822015-09-15 20:52:53 -07001057 EXPECT_EQ(constants::kOmahaDefaultAUTestURL, attempter_.forced_omaha_url());
David Pursell02c18642014-11-06 11:26:11 -08001058}
1059
1060TEST_F(UpdateAttempterTest, CheckForUpdateScheduledAUTest) {
1061 fake_system_state_.fake_hardware()->SetIsOfficialBuild(true);
Sen Jiange67bb5b2016-06-20 15:53:56 -07001062 fake_system_state_.fake_hardware()->SetAreDevFeaturesEnabled(false);
Aaron Wood081c0232017-10-19 17:14:58 -07001063 attempter_.CheckForUpdate("", "autest-scheduled", UpdateAttemptFlags::kNone);
Alex Deymoac41a822015-09-15 20:52:53 -07001064 EXPECT_EQ(constants::kOmahaDefaultAUTestURL, attempter_.forced_omaha_url());
David Pursell02c18642014-11-06 11:26:11 -08001065}
1066
Xiyuan Xiac0e8f9a2017-02-22 13:19:35 -08001067TEST_F(UpdateAttempterTest, TargetVersionPrefixSetAndReset) {
Marton Hunyadyba51c3f2018-04-25 15:18:10 +02001068 attempter_.CalculateUpdateParams("", "", "", "1234", false, false, false);
Xiyuan Xiac0e8f9a2017-02-22 13:19:35 -08001069 EXPECT_EQ("1234",
1070 fake_system_state_.request_params()->target_version_prefix());
1071
Marton Hunyadyba51c3f2018-04-25 15:18:10 +02001072 attempter_.CalculateUpdateParams("", "", "", "", false, false, false);
Xiyuan Xiac0e8f9a2017-02-22 13:19:35 -08001073 EXPECT_TRUE(
1074 fake_system_state_.request_params()->target_version_prefix().empty());
1075}
1076
Marton Hunyadyba51c3f2018-04-25 15:18:10 +02001077TEST_F(UpdateAttempterTest, RollbackAllowedSetAndReset) {
1078 attempter_.CalculateUpdateParams("",
1079 "",
1080 "",
1081 "1234",
1082 /*rollback_allowed=*/true,
1083 false,
1084 false);
1085 EXPECT_TRUE(fake_system_state_.request_params()->rollback_allowed());
1086
1087 attempter_.CalculateUpdateParams("",
1088 "",
1089 "",
1090 "1234",
1091 /*rollback_allowed=*/false,
1092 false,
1093 false);
1094 EXPECT_FALSE(fake_system_state_.request_params()->rollback_allowed());
1095}
1096
Aaron Wood23bd3392017-10-06 14:48:25 -07001097TEST_F(UpdateAttempterTest, UpdateDeferredByPolicyTest) {
1098 // Construct an OmahaResponseHandlerAction that has processed an InstallPlan,
1099 // but the update is being deferred by the Policy.
1100 OmahaResponseHandlerAction* response_action =
1101 new OmahaResponseHandlerAction(&fake_system_state_);
1102 response_action->install_plan_.version = "a.b.c.d";
1103 response_action->install_plan_.system_version = "b.c.d.e";
1104 response_action->install_plan_.payloads.push_back(
1105 {.size = 1234ULL, .type = InstallPayloadType::kFull});
1106 attempter_.response_handler_action_.reset(response_action);
1107 // Inform the UpdateAttempter that the OmahaResponseHandlerAction has
1108 // completed, with the deferred-update error code.
1109 attempter_.ActionCompleted(
1110 nullptr, response_action, ErrorCode::kOmahaUpdateDeferredPerPolicy);
1111 {
1112 UpdateEngineStatus status;
1113 attempter_.GetStatus(&status);
1114 EXPECT_EQ(UpdateStatus::UPDATE_AVAILABLE, status.status);
1115 EXPECT_EQ(response_action->install_plan_.version, status.new_version);
1116 EXPECT_EQ(response_action->install_plan_.system_version,
1117 status.new_system_version);
1118 EXPECT_EQ(response_action->install_plan_.payloads[0].size,
1119 status.new_size_bytes);
1120 }
1121 // An "error" event should have been created to tell Omaha that the update is
1122 // being deferred.
1123 EXPECT_TRUE(nullptr != attempter_.error_event_);
1124 EXPECT_EQ(OmahaEvent::kTypeUpdateComplete, attempter_.error_event_->type);
1125 EXPECT_EQ(OmahaEvent::kResultUpdateDeferred, attempter_.error_event_->result);
1126 ErrorCode expected_code = static_cast<ErrorCode>(
1127 static_cast<int>(ErrorCode::kOmahaUpdateDeferredPerPolicy) |
1128 static_cast<int>(ErrorCode::kTestOmahaUrlFlag));
1129 EXPECT_EQ(expected_code, attempter_.error_event_->error_code);
1130 // End the processing
1131 attempter_.ProcessingDone(nullptr, ErrorCode::kOmahaUpdateDeferredPerPolicy);
1132 // Validate the state of the attempter.
1133 {
1134 UpdateEngineStatus status;
1135 attempter_.GetStatus(&status);
1136 EXPECT_EQ(UpdateStatus::REPORTING_ERROR_EVENT, status.status);
1137 EXPECT_EQ(response_action->install_plan_.version, status.new_version);
1138 EXPECT_EQ(response_action->install_plan_.system_version,
1139 status.new_system_version);
1140 EXPECT_EQ(response_action->install_plan_.payloads[0].size,
1141 status.new_size_bytes);
1142 }
1143}
1144
1145TEST_F(UpdateAttempterTest, UpdateIsNotRunningWhenUpdateAvailable) {
1146 EXPECT_FALSE(attempter_.IsUpdateRunningOrScheduled());
1147 // Verify in-progress update with UPDATE_AVAILABLE is running
1148 attempter_.status_ = UpdateStatus::UPDATE_AVAILABLE;
1149 EXPECT_TRUE(attempter_.IsUpdateRunningOrScheduled());
1150}
1151
Aaron Woodbf5a2522017-10-04 10:58:36 -07001152TEST_F(UpdateAttempterTest, UpdateAttemptFlagsCachedAtUpdateStart) {
1153 attempter_.SetUpdateAttemptFlags(UpdateAttemptFlags::kFlagRestrictDownload);
1154
1155 UpdateCheckParams params = {.updates_enabled = true};
1156 attempter_.OnUpdateScheduled(EvalStatus::kSucceeded, params);
1157
1158 EXPECT_EQ(UpdateAttemptFlags::kFlagRestrictDownload,
1159 attempter_.GetCurrentUpdateAttemptFlags());
1160}
1161
Marton Hunyadyba51c3f2018-04-25 15:18:10 +02001162TEST_F(UpdateAttempterTest, RollbackNotAllowed) {
1163 UpdateCheckParams params = {.updates_enabled = true,
1164 .rollback_allowed = false};
1165 attempter_.OnUpdateScheduled(EvalStatus::kSucceeded, params);
1166 EXPECT_FALSE(fake_system_state_.request_params()->rollback_allowed());
1167}
1168
1169TEST_F(UpdateAttempterTest, RollbackAllowed) {
1170 UpdateCheckParams params = {.updates_enabled = true,
1171 .rollback_allowed = true};
1172 attempter_.OnUpdateScheduled(EvalStatus::kSucceeded, params);
1173 EXPECT_TRUE(fake_system_state_.request_params()->rollback_allowed());
1174}
1175
Aaron Wood081c0232017-10-19 17:14:58 -07001176TEST_F(UpdateAttempterTest, InteractiveUpdateUsesPassedRestrictions) {
1177 attempter_.SetUpdateAttemptFlags(UpdateAttemptFlags::kFlagRestrictDownload);
1178
1179 attempter_.CheckForUpdate("", "", UpdateAttemptFlags::kNone);
1180 EXPECT_EQ(UpdateAttemptFlags::kNone,
1181 attempter_.GetCurrentUpdateAttemptFlags());
1182}
1183
1184TEST_F(UpdateAttempterTest, NonInteractiveUpdateUsesSetRestrictions) {
1185 attempter_.SetUpdateAttemptFlags(UpdateAttemptFlags::kNone);
1186
1187 // This tests that when CheckForUpdate() is called with the non-interactive
1188 // flag set, that it doesn't change the current UpdateAttemptFlags.
1189 attempter_.CheckForUpdate("",
1190 "",
1191 UpdateAttemptFlags::kFlagNonInteractive |
1192 UpdateAttemptFlags::kFlagRestrictDownload);
1193 EXPECT_EQ(UpdateAttemptFlags::kNone,
1194 attempter_.GetCurrentUpdateAttemptFlags());
1195}
1196
Marton Hunyadye58bddb2018-04-10 20:27:26 +02001197void UpdateAttempterTest::ResetRollbackHappenedStart(bool is_consumer,
1198 bool is_policy_loaded,
1199 bool expected_reset) {
1200 EXPECT_CALL(*fake_system_state_.mock_payload_state(), GetRollbackHappened())
1201 .WillRepeatedly(Return(true));
1202 auto mock_policy_provider =
1203 std::make_unique<NiceMock<policy::MockPolicyProvider>>();
1204 EXPECT_CALL(*mock_policy_provider, IsConsumerDevice())
1205 .WillRepeatedly(Return(is_consumer));
1206 EXPECT_CALL(*mock_policy_provider, device_policy_is_loaded())
1207 .WillRepeatedly(Return(is_policy_loaded));
1208 const policy::MockDevicePolicy device_policy;
1209 EXPECT_CALL(*mock_policy_provider, GetDevicePolicy())
1210 .WillRepeatedly(ReturnRef(device_policy));
1211 EXPECT_CALL(*fake_system_state_.mock_payload_state(),
1212 SetRollbackHappened(false))
1213 .Times(expected_reset ? 1 : 0);
1214 attempter_.policy_provider_ = std::move(mock_policy_provider);
Marton Hunyadyba51c3f2018-04-25 15:18:10 +02001215 attempter_.Update("", "", "", "", false, false, false);
Marton Hunyadye58bddb2018-04-10 20:27:26 +02001216 ScheduleQuitMainLoop();
1217}
1218
1219TEST_F(UpdateAttempterTest, ResetRollbackHappenedOobe) {
1220 loop_.PostTask(FROM_HERE,
1221 base::Bind(&UpdateAttempterTest::ResetRollbackHappenedStart,
1222 base::Unretained(this),
1223 /*is_consumer=*/false,
1224 /*is_policy_loaded=*/false,
1225 /*expected_reset=*/false));
1226 loop_.Run();
1227}
1228
1229TEST_F(UpdateAttempterTest, ResetRollbackHappenedConsumer) {
1230 loop_.PostTask(FROM_HERE,
1231 base::Bind(&UpdateAttempterTest::ResetRollbackHappenedStart,
1232 base::Unretained(this),
1233 /*is_consumer=*/true,
1234 /*is_policy_loaded=*/false,
1235 /*expected_reset=*/true));
1236 loop_.Run();
1237}
1238
1239TEST_F(UpdateAttempterTest, ResetRollbackHappenedEnterprise) {
1240 loop_.PostTask(FROM_HERE,
1241 base::Bind(&UpdateAttempterTest::ResetRollbackHappenedStart,
1242 base::Unretained(this),
1243 /*is_consumer=*/false,
1244 /*is_policy_loaded=*/true,
1245 /*expected_reset=*/true));
1246 loop_.Run();
1247}
1248
Marton Hunyady199152d2018-05-07 19:08:48 +02001249TEST_F(UpdateAttempterTest, SetRollbackHappenedRollback) {
1250 OmahaResponseHandlerAction* response_action =
1251 new OmahaResponseHandlerAction(&fake_system_state_);
1252 response_action->install_plan_.is_rollback = true;
1253 attempter_.response_handler_action_.reset(response_action);
1254
1255 EXPECT_CALL(*fake_system_state_.mock_payload_state(),
1256 SetRollbackHappened(true))
1257 .Times(1);
1258 attempter_.ProcessingDone(nullptr, ErrorCode::kSuccess);
1259}
1260
1261TEST_F(UpdateAttempterTest, SetRollbackHappenedNotRollback) {
1262 OmahaResponseHandlerAction* response_action =
1263 new OmahaResponseHandlerAction(&fake_system_state_);
1264 response_action->install_plan_.is_rollback = false;
1265 attempter_.response_handler_action_.reset(response_action);
1266
1267 EXPECT_CALL(*fake_system_state_.mock_payload_state(),
1268 SetRollbackHappened(true))
1269 .Times(0);
1270 attempter_.ProcessingDone(nullptr, ErrorCode::kSuccess);
1271}
1272
Marton Hunyadya0302682018-05-16 18:52:13 +02001273TEST_F(UpdateAttempterTest, RollbackMetricsRollbackSuccess) {
1274 OmahaResponseHandlerAction* response_action =
1275 new OmahaResponseHandlerAction(&fake_system_state_);
1276 response_action->install_plan_.is_rollback = true;
1277 response_action->install_plan_.version = kRollbackVersion;
1278 attempter_.response_handler_action_.reset(response_action);
1279
1280 EXPECT_CALL(*fake_system_state_.mock_metrics_reporter(),
1281 ReportEnterpriseRollbackMetrics(true, kRollbackVersion))
1282 .Times(1);
1283 attempter_.ProcessingDone(nullptr, ErrorCode::kSuccess);
1284}
1285
1286TEST_F(UpdateAttempterTest, RollbackMetricsNotRollbackSuccess) {
1287 OmahaResponseHandlerAction* response_action =
1288 new OmahaResponseHandlerAction(&fake_system_state_);
1289 response_action->install_plan_.is_rollback = false;
1290 response_action->install_plan_.version = kRollbackVersion;
1291 attempter_.response_handler_action_.reset(response_action);
1292
1293 EXPECT_CALL(*fake_system_state_.mock_metrics_reporter(),
1294 ReportEnterpriseRollbackMetrics(_, _))
1295 .Times(0);
1296 attempter_.ProcessingDone(nullptr, ErrorCode::kSuccess);
1297}
1298
1299TEST_F(UpdateAttempterTest, RollbackMetricsRollbackFailure) {
1300 OmahaResponseHandlerAction* response_action =
1301 new OmahaResponseHandlerAction(&fake_system_state_);
1302 response_action->install_plan_.is_rollback = true;
1303 response_action->install_plan_.version = kRollbackVersion;
1304 attempter_.response_handler_action_.reset(response_action);
1305
1306 EXPECT_CALL(*fake_system_state_.mock_metrics_reporter(),
1307 ReportEnterpriseRollbackMetrics(false, kRollbackVersion))
1308 .Times(1);
1309 MockAction action;
1310 attempter_.CreatePendingErrorEvent(&action, ErrorCode::kRollbackNotPossible);
1311 attempter_.ProcessingDone(nullptr, ErrorCode::kRollbackNotPossible);
1312}
1313
1314TEST_F(UpdateAttempterTest, RollbackMetricsNotRollbackFailure) {
1315 OmahaResponseHandlerAction* response_action =
1316 new OmahaResponseHandlerAction(&fake_system_state_);
1317 response_action->install_plan_.is_rollback = false;
1318 response_action->install_plan_.version = kRollbackVersion;
1319 attempter_.response_handler_action_.reset(response_action);
1320
1321 EXPECT_CALL(*fake_system_state_.mock_metrics_reporter(),
1322 ReportEnterpriseRollbackMetrics(_, _))
1323 .Times(0);
1324 MockAction action;
1325 attempter_.CreatePendingErrorEvent(&action, ErrorCode::kRollbackNotPossible);
1326 attempter_.ProcessingDone(nullptr, ErrorCode::kRollbackNotPossible);
1327}
1328
Darin Petkovf42cc1c2010-09-01 09:03:02 -07001329} // namespace chromeos_update_engine