blob: dfeebcf18c0ef6b3432c73b29ac505249c6b6729 [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>
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070025#include <brillo/bind_lambda.h>
26#include <brillo/make_unique_ptr.h>
27#include <brillo/message_loops/base_message_loop.h>
28#include <brillo/message_loops/message_loop.h>
29#include <brillo/message_loops/message_loop_utils.h>
Darin Petkovf42cc1c2010-09-01 09:03:02 -070030#include <gtest/gtest.h>
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +020031#include <policy/libpolicy.h>
32#include <policy/mock_device_policy.h>
Darin Petkovf42cc1c2010-09-01 09:03:02 -070033
Amin Hassanie94ece52017-08-01 15:03:08 -070034#if USE_CHROME_NETWORK_PROXY
Daniel Erate5f6f252017-04-20 12:09:58 -060035#include "network_proxy/dbus-proxies.h"
36#include "network_proxy/dbus-proxy-mocks.h"
Amin Hassanie94ece52017-08-01 15:03:08 -070037#endif // USE_CHROME_NETWORK_PROXY
Alex Deymo39910dc2015-11-09 17:04:30 -080038#include "update_engine/common/fake_clock.h"
39#include "update_engine/common/fake_prefs.h"
Alex Deymo14fd1ec2016-02-24 22:03:57 -080040#include "update_engine/common/mock_action.h"
41#include "update_engine/common/mock_action_processor.h"
Alex Deymo39910dc2015-11-09 17:04:30 -080042#include "update_engine/common/mock_http_fetcher.h"
43#include "update_engine/common/mock_prefs.h"
44#include "update_engine/common/platform_constants.h"
45#include "update_engine/common/prefs.h"
46#include "update_engine/common/test_utils.h"
47#include "update_engine/common/utils.h"
Gilad Arnold5bb4c902014-04-10 12:32:13 -070048#include "update_engine/fake_system_state.h"
David Zeuthen8f191b22013-08-06 12:27:50 -070049#include "update_engine/mock_p2p_manager.h"
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080050#include "update_engine/mock_payload_state.h"
Aaron Wood9321f502017-09-07 11:18:54 -070051#include "update_engine/mock_service_observer.h"
Alex Deymo39910dc2015-11-09 17:04:30 -080052#include "update_engine/payload_consumer/filesystem_verifier_action.h"
53#include "update_engine/payload_consumer/install_plan.h"
54#include "update_engine/payload_consumer/payload_constants.h"
55#include "update_engine/payload_consumer/postinstall_runner_action.h"
Darin Petkovf42cc1c2010-09-01 09:03:02 -070056
Daniel Erate5f6f252017-04-20 12:09:58 -060057namespace org {
58namespace chromium {
59class NetworkProxyServiceInterfaceProxyMock;
60} // namespace chromium
61} // namespace org
62
David Zeuthen985b1122013-10-09 12:13:15 -070063using base::Time;
64using base::TimeDelta;
Daniel Erate5f6f252017-04-20 12:09:58 -060065using org::chromium::NetworkProxyServiceInterfaceProxyInterface;
66using org::chromium::NetworkProxyServiceInterfaceProxyMock;
Darin Petkovf42cc1c2010-09-01 09:03:02 -070067using std::string;
Ben Chan02f7c1d2014-10-18 15:18:02 -070068using std::unique_ptr;
Darin Petkov36275772010-10-01 11:40:57 -070069using testing::DoAll;
Aaron Wood7f92e2b2017-08-28 14:51:21 -070070using testing::Field;
Darin Petkovf42cc1c2010-09-01 09:03:02 -070071using testing::InSequence;
Darin Petkov2dd01092010-10-08 15:43:05 -070072using testing::Ne;
Darin Petkov9c096d62010-11-17 14:49:04 -080073using testing::NiceMock;
Darin Petkovf42cc1c2010-09-01 09:03:02 -070074using testing::Property;
75using testing::Return;
Gilad Arnold74b5f552014-10-07 08:17:16 -070076using testing::ReturnPointee;
Alex Deymo2c0db7b2014-11-04 12:23:39 -080077using testing::SaveArg;
Darin Petkov36275772010-10-01 11:40:57 -070078using testing::SetArgumentPointee;
Alex Deymof329b932014-10-30 01:37:48 -070079using testing::_;
Aaron Wood7f92e2b2017-08-28 14:51:21 -070080using update_engine::UpdateEngineStatus;
Christopher Wiley6b6cc1b2015-10-05 17:50:07 -070081using update_engine::UpdateStatus;
Darin Petkovf42cc1c2010-09-01 09:03:02 -070082
83namespace chromeos_update_engine {
84
85// Test a subclass rather than the main class directly so that we can mock out
Darin Petkovcd1666f2010-09-23 09:53:44 -070086// methods within the class. There're explicit unit tests for the mocked out
Darin Petkovf42cc1c2010-09-01 09:03:02 -070087// methods.
88class UpdateAttempterUnderTest : public UpdateAttempter {
89 public:
Daniel Erate5f6f252017-04-20 12:09:58 -060090 UpdateAttempterUnderTest(
91 SystemState* system_state,
92 NetworkProxyServiceInterfaceProxyInterface* network_proxy_service_proxy)
93 : UpdateAttempter(system_state, nullptr, network_proxy_service_proxy) {}
Gilad Arnoldec7f9162014-07-15 13:24:46 -070094
95 // Wrap the update scheduling method, allowing us to opt out of scheduled
96 // updates for testing purposes.
97 void ScheduleUpdates() override {
98 schedule_updates_called_ = true;
99 if (do_schedule_updates_) {
100 UpdateAttempter::ScheduleUpdates();
101 } else {
102 LOG(INFO) << "[TEST] Update scheduling disabled.";
103 }
104 }
105 void EnableScheduleUpdates() { do_schedule_updates_ = true; }
106 void DisableScheduleUpdates() { do_schedule_updates_ = false; }
107
108 // Indicates whether ScheduleUpdates() was called.
109 bool schedule_updates_called() const { return schedule_updates_called_; }
110
David Pursell02c18642014-11-06 11:26:11 -0800111 // Need to expose forced_omaha_url_ so we can test it.
Alex Deymo60ca1a72015-06-18 18:19:15 -0700112 const string& forced_omaha_url() const { return forced_omaha_url_; }
David Pursell02c18642014-11-06 11:26:11 -0800113
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700114 private:
115 bool schedule_updates_called_ = false;
116 bool do_schedule_updates_ = true;
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700117};
118
119class UpdateAttempterTest : public ::testing::Test {
120 protected:
Jay Srinivasan43488792012-06-19 00:25:31 -0700121 UpdateAttempterTest()
Daniel Erate5f6f252017-04-20 12:09:58 -0600122 : certificate_checker_(fake_system_state_.mock_prefs(),
Alex Deymo33e91e72015-12-01 18:26:08 -0300123 &openssl_wrapper_) {
Gilad Arnold1f847232014-04-07 12:07:49 -0700124 // Override system state members.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700125 fake_system_state_.set_connection_manager(&mock_connection_manager);
126 fake_system_state_.set_update_attempter(&attempter_);
Alex Deymo60ca1a72015-06-18 18:19:15 -0700127 loop_.SetAsCurrent();
Gilad Arnold1f847232014-04-07 12:07:49 -0700128
Alex Deymo33e91e72015-12-01 18:26:08 -0300129 certificate_checker_.Init();
130
Sen Jiange67bb5b2016-06-20 15:53:56 -0700131 // Finish initializing the attempter.
Gilad Arnold1f847232014-04-07 12:07:49 -0700132 attempter_.Init();
Jay Srinivasan43488792012-06-19 00:25:31 -0700133 }
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700134
Alex Deymo610277e2014-11-11 21:18:11 -0800135 void SetUp() override {
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700136 EXPECT_NE(nullptr, attempter_.system_state_);
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700137 EXPECT_EQ(0, attempter_.http_response_code_);
Christopher Wiley6b6cc1b2015-10-05 17:50:07 -0700138 EXPECT_EQ(UpdateStatus::IDLE, attempter_.status_);
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700139 EXPECT_EQ(0.0, attempter_.download_progress_);
140 EXPECT_EQ(0, attempter_.last_checked_time_);
141 EXPECT_EQ("0.0.0.0", attempter_.new_version_);
Aaron Wood7f92e2b2017-08-28 14:51:21 -0700142 EXPECT_EQ(0ULL, attempter_.new_payload_size_);
Alex Deymo8427b4a2014-11-05 14:00:32 -0800143 processor_ = new NiceMock<MockActionProcessor>();
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700144 attempter_.processor_.reset(processor_); // Transfers ownership.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700145 prefs_ = fake_system_state_.mock_prefs();
Gilad Arnold74b5f552014-10-07 08:17:16 -0700146
147 // Set up store/load semantics of P2P properties via the mock PayloadState.
148 actual_using_p2p_for_downloading_ = false;
149 EXPECT_CALL(*fake_system_state_.mock_payload_state(),
150 SetUsingP2PForDownloading(_))
151 .WillRepeatedly(SaveArg<0>(&actual_using_p2p_for_downloading_));
152 EXPECT_CALL(*fake_system_state_.mock_payload_state(),
153 GetUsingP2PForDownloading())
154 .WillRepeatedly(ReturnPointee(&actual_using_p2p_for_downloading_));
155 actual_using_p2p_for_sharing_ = false;
156 EXPECT_CALL(*fake_system_state_.mock_payload_state(),
157 SetUsingP2PForSharing(_))
158 .WillRepeatedly(SaveArg<0>(&actual_using_p2p_for_sharing_));
159 EXPECT_CALL(*fake_system_state_.mock_payload_state(),
160 GetUsingP2PForDownloading())
161 .WillRepeatedly(ReturnPointee(&actual_using_p2p_for_sharing_));
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700162 }
163
Alex Deymo60ca1a72015-06-18 18:19:15 -0700164 public:
165 void ScheduleQuitMainLoop();
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200166
Alex Deymo60ca1a72015-06-18 18:19:15 -0700167 // Callbacks to run the different tests from the main loop.
Darin Petkove6ef2f82011-03-07 17:31:11 -0800168 void UpdateTestStart();
169 void UpdateTestVerify();
Alex Deymo60ca1a72015-06-18 18:19:15 -0700170 void RollbackTestStart(bool enterprise_rollback, bool valid_slot);
Chris Sosa76a29ae2013-07-11 17:59:24 -0700171 void RollbackTestVerify();
Thieu Le116fda32011-04-19 11:01:54 -0700172 void PingOmahaTestStart();
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700173 void ReadScatterFactorFromPolicyTestStart();
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700174 void DecrementUpdateCheckCountTestStart();
Jay Srinivasan08fce042012-06-07 16:31:01 -0700175 void NoScatteringDoneDuringManualUpdateTestStart();
David Zeuthen8f191b22013-08-06 12:27:50 -0700176 void P2PNotEnabledStart();
David Zeuthen8f191b22013-08-06 12:27:50 -0700177 void P2PEnabledStart();
David Zeuthen8f191b22013-08-06 12:27:50 -0700178 void P2PEnabledInteractiveStart();
David Zeuthen8f191b22013-08-06 12:27:50 -0700179 void P2PEnabledStartingFailsStart();
David Zeuthen8f191b22013-08-06 12:27:50 -0700180 void P2PEnabledHousekeepingFailsStart();
David Zeuthen8f191b22013-08-06 12:27:50 -0700181
Gilad Arnold74b5f552014-10-07 08:17:16 -0700182 bool actual_using_p2p_for_downloading() {
183 return actual_using_p2p_for_downloading_;
184 }
185 bool actual_using_p2p_for_sharing() {
186 return actual_using_p2p_for_sharing_;
187 }
188
Alex Deymo0b3db6b2015-08-10 15:19:37 -0700189 base::MessageLoopForIO base_loop_;
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700190 brillo::BaseMessageLoop loop_{&base_loop_};
Alex Deymo60ca1a72015-06-18 18:19:15 -0700191
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700192 FakeSystemState fake_system_state_;
Amin Hassanie94ece52017-08-01 15:03:08 -0700193#if USE_CHROME_NETWORK_PROXY
Daniel Erate5f6f252017-04-20 12:09:58 -0600194 NetworkProxyServiceInterfaceProxyMock network_proxy_service_proxy_mock_;
195 UpdateAttempterUnderTest attempter_{&fake_system_state_,
196 &network_proxy_service_proxy_mock_};
Sen Jiangc92195c2016-06-13 15:48:44 -0700197#else
198 UpdateAttempterUnderTest attempter_{&fake_system_state_, nullptr};
Amin Hassanie94ece52017-08-01 15:03:08 -0700199#endif // USE_CHROME_NETWORK_PROXY
Alex Deymo33e91e72015-12-01 18:26:08 -0300200 OpenSSLWrapper openssl_wrapper_;
201 CertificateChecker certificate_checker_;
Alex Deymo30534502015-07-20 15:06:33 -0700202
Alex Deymo8427b4a2014-11-05 14:00:32 -0800203 NiceMock<MockActionProcessor>* processor_;
204 NiceMock<MockPrefs>* prefs_; // Shortcut to fake_system_state_->mock_prefs().
Jay Srinivasan55f50c22013-01-10 19:24:35 -0800205 NiceMock<MockConnectionManager> mock_connection_manager;
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700206
Gilad Arnold74b5f552014-10-07 08:17:16 -0700207 bool actual_using_p2p_for_downloading_;
208 bool actual_using_p2p_for_sharing_;
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700209};
210
Alex Deymo60ca1a72015-06-18 18:19:15 -0700211void UpdateAttempterTest::ScheduleQuitMainLoop() {
Luis Hector Chavezf1cf3482016-07-19 14:29:19 -0700212 loop_.PostTask(
213 FROM_HERE,
214 base::Bind([](brillo::BaseMessageLoop* loop) { loop->BreakLoop(); },
215 base::Unretained(&loop_)));
Alex Deymo60ca1a72015-06-18 18:19:15 -0700216}
217
Darin Petkov1b003102010-11-30 10:18:36 -0800218TEST_F(UpdateAttempterTest, ActionCompletedDownloadTest) {
Ben Chan02f7c1d2014-10-18 15:18:02 -0700219 unique_ptr<MockHttpFetcher> fetcher(new MockHttpFetcher("", 0, nullptr));
Darin Petkov1b003102010-11-30 10:18:36 -0800220 fetcher->FailTransfer(503); // Sets the HTTP response code.
Alex Deymo1b3556c2016-02-03 09:54:02 -0800221 DownloadAction action(prefs_, nullptr, nullptr, nullptr, fetcher.release());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800222 EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _)).Times(0);
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700223 attempter_.ActionCompleted(nullptr, &action, ErrorCode::kSuccess);
Christopher Wiley6b6cc1b2015-10-05 17:50:07 -0700224 EXPECT_EQ(UpdateStatus::FINALIZING, attempter_.status());
Aaron Wood9321f502017-09-07 11:18:54 -0700225 EXPECT_EQ(0.0, attempter_.download_progress_);
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700226 ASSERT_EQ(nullptr, attempter_.error_event_.get());
Darin Petkov1b003102010-11-30 10:18:36 -0800227}
228
229TEST_F(UpdateAttempterTest, ActionCompletedErrorTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -0800230 MockAction action;
231 EXPECT_CALL(action, Type()).WillRepeatedly(Return("MockAction"));
Christopher Wiley6b6cc1b2015-10-05 17:50:07 -0700232 attempter_.status_ = UpdateStatus::DOWNLOADING;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800233 EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
Darin Petkov1b003102010-11-30 10:18:36 -0800234 .WillOnce(Return(false));
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700235 attempter_.ActionCompleted(nullptr, &action, ErrorCode::kError);
236 ASSERT_NE(nullptr, attempter_.error_event_.get());
Darin Petkov1b003102010-11-30 10:18:36 -0800237}
238
Aaron Wood9321f502017-09-07 11:18:54 -0700239TEST_F(UpdateAttempterTest, DownloadProgressAccumulationTest) {
240 // Simple test case, where all the values match (nothing was skipped)
241 uint64_t bytes_progressed_1 = 1024 * 1024; // 1MB
242 uint64_t bytes_progressed_2 = 1024 * 1024; // 1MB
243 uint64_t bytes_received_1 = bytes_progressed_1;
244 uint64_t bytes_received_2 = bytes_received_1 + bytes_progressed_2;
245 uint64_t bytes_total = 20 * 1024 * 1024; // 20MB
246
247 double progress_1 =
248 static_cast<double>(bytes_received_1) / static_cast<double>(bytes_total);
249 double progress_2 =
250 static_cast<double>(bytes_received_2) / static_cast<double>(bytes_total);
251
252 EXPECT_EQ(0.0, attempter_.download_progress_);
253 // This is set via inspecting the InstallPlan payloads when the
254 // OmahaResponseAction is completed
255 attempter_.new_payload_size_ = bytes_total;
256 NiceMock<MockServiceObserver> observer;
257 EXPECT_CALL(observer,
Aaron Wood7f92e2b2017-08-28 14:51:21 -0700258 SendStatusUpdate(AllOf(
259 Field(&UpdateEngineStatus::progress, progress_1),
260 Field(&UpdateEngineStatus::status, UpdateStatus::DOWNLOADING),
261 Field(&UpdateEngineStatus::new_size_bytes, bytes_total))));
Aaron Wood9321f502017-09-07 11:18:54 -0700262 EXPECT_CALL(observer,
Aaron Wood7f92e2b2017-08-28 14:51:21 -0700263 SendStatusUpdate(AllOf(
264 Field(&UpdateEngineStatus::progress, progress_2),
265 Field(&UpdateEngineStatus::status, UpdateStatus::DOWNLOADING),
266 Field(&UpdateEngineStatus::new_size_bytes, bytes_total))));
Aaron Wood9321f502017-09-07 11:18:54 -0700267 attempter_.AddObserver(&observer);
268 attempter_.BytesReceived(bytes_progressed_1, bytes_received_1, bytes_total);
269 EXPECT_EQ(progress_1, attempter_.download_progress_);
270 // This iteration validates that a later set of updates to the variables are
271 // properly handled (so that |getStatus()| will return the same progress info
272 // as the callback is receiving.
273 attempter_.BytesReceived(bytes_progressed_2, bytes_received_2, bytes_total);
274 EXPECT_EQ(progress_2, attempter_.download_progress_);
275}
276
277TEST_F(UpdateAttempterTest, ChangeToDownloadingOnReceivedBytesTest) {
278 // The transition into UpdateStatus::DOWNLOADING happens when the
279 // first bytes are received.
280 uint64_t bytes_progressed = 1024 * 1024; // 1MB
281 uint64_t bytes_received = 2 * 1024 * 1024; // 2MB
282 uint64_t bytes_total = 20 * 1024 * 1024; // 300MB
283 attempter_.status_ = UpdateStatus::CHECKING_FOR_UPDATE;
284 // This is set via inspecting the InstallPlan payloads when the
285 // OmahaResponseAction is completed
286 attempter_.new_payload_size_ = bytes_total;
287 EXPECT_EQ(0.0, attempter_.download_progress_);
288 NiceMock<MockServiceObserver> observer;
Aaron Wood7f92e2b2017-08-28 14:51:21 -0700289 EXPECT_CALL(observer,
290 SendStatusUpdate(AllOf(
291 Field(&UpdateEngineStatus::status, UpdateStatus::DOWNLOADING),
292 Field(&UpdateEngineStatus::new_size_bytes, bytes_total))));
Aaron Wood9321f502017-09-07 11:18:54 -0700293 attempter_.AddObserver(&observer);
294 attempter_.BytesReceived(bytes_progressed, bytes_received, bytes_total);
295 EXPECT_EQ(UpdateStatus::DOWNLOADING, attempter_.status_);
296}
297
298TEST_F(UpdateAttempterTest, BroadcastCompleteDownloadTest) {
299 // There is a special case to ensure that at 100% downloaded,
300 // download_progress_ is updated and that value broadcast. This test confirms
301 // that.
302 uint64_t bytes_progressed = 0; // ignored
303 uint64_t bytes_received = 5 * 1024 * 1024; // ignored
304 uint64_t bytes_total = 5 * 1024 * 1024; // 300MB
305 attempter_.status_ = UpdateStatus::DOWNLOADING;
306 attempter_.new_payload_size_ = bytes_total;
307 EXPECT_EQ(0.0, attempter_.download_progress_);
308 NiceMock<MockServiceObserver> observer;
Aaron Wood7f92e2b2017-08-28 14:51:21 -0700309 EXPECT_CALL(observer,
310 SendStatusUpdate(AllOf(
311 Field(&UpdateEngineStatus::progress, 1.0),
312 Field(&UpdateEngineStatus::status, UpdateStatus::DOWNLOADING),
313 Field(&UpdateEngineStatus::new_size_bytes, bytes_total))));
Aaron Wood9321f502017-09-07 11:18:54 -0700314 attempter_.AddObserver(&observer);
315 attempter_.BytesReceived(bytes_progressed, bytes_received, bytes_total);
316 EXPECT_EQ(1.0, attempter_.download_progress_);
317}
318
Darin Petkov1b003102010-11-30 10:18:36 -0800319TEST_F(UpdateAttempterTest, ActionCompletedOmahaRequestTest) {
Ben Chan02f7c1d2014-10-18 15:18:02 -0700320 unique_ptr<MockHttpFetcher> fetcher(new MockHttpFetcher("", 0, nullptr));
Darin Petkov1b003102010-11-30 10:18:36 -0800321 fetcher->FailTransfer(500); // Sets the HTTP response code.
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700322 OmahaRequestAction action(&fake_system_state_, nullptr,
Alex Deymoc1c17b42015-11-23 03:53:15 -0300323 std::move(fetcher), false);
Darin Petkov1b003102010-11-30 10:18:36 -0800324 ObjectCollectorAction<OmahaResponse> collector_action;
325 BondActions(&action, &collector_action);
326 OmahaResponse response;
327 response.poll_interval = 234;
328 action.SetOutputObject(response);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800329 EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _)).Times(0);
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700330 attempter_.ActionCompleted(nullptr, &action, ErrorCode::kSuccess);
Darin Petkov1b003102010-11-30 10:18:36 -0800331 EXPECT_EQ(500, attempter_.http_response_code());
Christopher Wiley6b6cc1b2015-10-05 17:50:07 -0700332 EXPECT_EQ(UpdateStatus::IDLE, attempter_.status());
Alex Deymo80f70ff2016-02-10 16:08:11 -0800333 EXPECT_EQ(234U, attempter_.server_dictated_poll_interval_);
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700334 ASSERT_TRUE(attempter_.error_event_.get() == nullptr);
Darin Petkov1b003102010-11-30 10:18:36 -0800335}
336
Alex Deymo30534502015-07-20 15:06:33 -0700337TEST_F(UpdateAttempterTest, ConstructWithUpdatedMarkerTest) {
Alex Deymo906191f2015-10-12 12:22:44 -0700338 FakePrefs fake_prefs;
339 string boot_id;
340 EXPECT_TRUE(utils::GetBootId(&boot_id));
341 fake_prefs.SetString(kPrefsUpdateCompletedOnBootId, boot_id);
342 fake_system_state_.set_prefs(&fake_prefs);
Sen Jiangaeeb2e02016-06-09 15:00:16 -0700343 attempter_.Init();
344 EXPECT_EQ(UpdateStatus::UPDATED_NEED_REBOOT, attempter_.status());
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700345}
346
347TEST_F(UpdateAttempterTest, GetErrorCodeForActionTest) {
David Zeuthena99981f2013-04-29 13:42:47 -0700348 extern ErrorCode GetErrorCodeForAction(AbstractAction* action,
349 ErrorCode code);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700350 EXPECT_EQ(ErrorCode::kSuccess,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700351 GetErrorCodeForAction(nullptr, ErrorCode::kSuccess));
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700352
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700353 FakeSystemState fake_system_state;
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700354 OmahaRequestAction omaha_request_action(&fake_system_state, nullptr,
355 nullptr, false);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700356 EXPECT_EQ(ErrorCode::kOmahaRequestError,
357 GetErrorCodeForAction(&omaha_request_action, ErrorCode::kError));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700358 OmahaResponseHandlerAction omaha_response_handler_action(&fake_system_state_);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700359 EXPECT_EQ(ErrorCode::kOmahaResponseHandlerError,
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700360 GetErrorCodeForAction(&omaha_response_handler_action,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700361 ErrorCode::kError));
Sen Jiange6e4bb92016-04-05 14:59:12 -0700362 FilesystemVerifierAction filesystem_verifier_action;
Allie Woodeb9e6d82015-04-17 13:55:30 -0700363 EXPECT_EQ(ErrorCode::kFilesystemVerifierError,
364 GetErrorCodeForAction(&filesystem_verifier_action,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700365 ErrorCode::kError));
Alex Deymob15a0b82015-11-25 20:30:40 -0300366 PostinstallRunnerAction postinstall_runner_action(
Alex Deymofb905d92016-06-03 19:26:58 -0700367 fake_system_state.fake_boot_control(), fake_system_state.fake_hardware());
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700368 EXPECT_EQ(ErrorCode::kPostinstallRunnerError,
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700369 GetErrorCodeForAction(&postinstall_runner_action,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700370 ErrorCode::kError));
Alex Deymo8427b4a2014-11-05 14:00:32 -0800371 MockAction action_mock;
372 EXPECT_CALL(action_mock, Type()).WillOnce(Return("MockAction"));
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700373 EXPECT_EQ(ErrorCode::kError,
374 GetErrorCodeForAction(&action_mock, ErrorCode::kError));
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700375}
376
Darin Petkov36275772010-10-01 11:40:57 -0700377TEST_F(UpdateAttempterTest, DisableDeltaUpdateIfNeededTest) {
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700378 attempter_.omaha_request_params_->set_delta_okay(true);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800379 EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
Darin Petkov36275772010-10-01 11:40:57 -0700380 .WillOnce(Return(false));
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(
385 SetArgumentPointee<1>(UpdateAttempter::kMaxDeltaUpdateFailures - 1),
386 Return(true)));
387 attempter_.DisableDeltaUpdateIfNeeded();
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700388 EXPECT_TRUE(attempter_.omaha_request_params_->delta_okay());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800389 EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
Darin Petkov36275772010-10-01 11:40:57 -0700390 .WillOnce(DoAll(
391 SetArgumentPointee<1>(UpdateAttempter::kMaxDeltaUpdateFailures),
392 Return(true)));
393 attempter_.DisableDeltaUpdateIfNeeded();
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700394 EXPECT_FALSE(attempter_.omaha_request_params_->delta_okay());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800395 EXPECT_CALL(*prefs_, GetInt64(_, _)).Times(0);
Darin Petkov36275772010-10-01 11:40:57 -0700396 attempter_.DisableDeltaUpdateIfNeeded();
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700397 EXPECT_FALSE(attempter_.omaha_request_params_->delta_okay());
Darin Petkov36275772010-10-01 11:40:57 -0700398}
399
400TEST_F(UpdateAttempterTest, MarkDeltaUpdateFailureTest) {
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800401 EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
Darin Petkov36275772010-10-01 11:40:57 -0700402 .WillOnce(Return(false))
403 .WillOnce(DoAll(SetArgumentPointee<1>(-1), Return(true)))
404 .WillOnce(DoAll(SetArgumentPointee<1>(1), Return(true)))
405 .WillOnce(DoAll(
406 SetArgumentPointee<1>(UpdateAttempter::kMaxDeltaUpdateFailures),
407 Return(true)));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800408 EXPECT_CALL(*prefs_, SetInt64(Ne(kPrefsDeltaUpdateFailures), _))
Darin Petkov2dd01092010-10-08 15:43:05 -0700409 .WillRepeatedly(Return(true));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800410 EXPECT_CALL(*prefs_, SetInt64(kPrefsDeltaUpdateFailures, 1)).Times(2);
Gilad Arnold74b5f552014-10-07 08:17:16 -0700411 EXPECT_CALL(*prefs_, SetInt64(kPrefsDeltaUpdateFailures, 2));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800412 EXPECT_CALL(*prefs_, SetInt64(kPrefsDeltaUpdateFailures,
Gilad Arnold74b5f552014-10-07 08:17:16 -0700413 UpdateAttempter::kMaxDeltaUpdateFailures + 1));
Darin Petkov36275772010-10-01 11:40:57 -0700414 for (int i = 0; i < 4; i ++)
415 attempter_.MarkDeltaUpdateFailure();
416}
417
Darin Petkov1b003102010-11-30 10:18:36 -0800418TEST_F(UpdateAttempterTest, ScheduleErrorEventActionNoEventTest) {
419 EXPECT_CALL(*processor_, EnqueueAction(_)).Times(0);
420 EXPECT_CALL(*processor_, StartProcessing()).Times(0);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700421 EXPECT_CALL(*fake_system_state_.mock_payload_state(), UpdateFailed(_))
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800422 .Times(0);
423 OmahaResponse response;
Jay Srinivasan53173b92013-05-17 17:13:01 -0700424 string url1 = "http://url1";
Sen Jiang0affc2c2017-02-10 15:55:05 -0800425 response.packages.push_back({.payload_urls = {url1, "https://url"}});
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700426 EXPECT_CALL(*(fake_system_state_.mock_payload_state()), GetCurrentUrl())
Jay Srinivasan53173b92013-05-17 17:13:01 -0700427 .WillRepeatedly(Return(url1));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700428 fake_system_state_.mock_payload_state()->SetResponse(response);
Darin Petkov1b003102010-11-30 10:18:36 -0800429 attempter_.ScheduleErrorEventAction();
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700430 EXPECT_EQ(url1, fake_system_state_.mock_payload_state()->GetCurrentUrl());
Darin Petkov1b003102010-11-30 10:18:36 -0800431}
432
433TEST_F(UpdateAttempterTest, ScheduleErrorEventActionTest) {
434 EXPECT_CALL(*processor_,
435 EnqueueAction(Property(&AbstractAction::Type,
Gilad Arnold74b5f552014-10-07 08:17:16 -0700436 OmahaRequestAction::StaticType())));
437 EXPECT_CALL(*processor_, StartProcessing());
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700438 ErrorCode err = ErrorCode::kError;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700439 EXPECT_CALL(*fake_system_state_.mock_payload_state(), UpdateFailed(err));
Darin Petkov1b003102010-11-30 10:18:36 -0800440 attempter_.error_event_.reset(new OmahaEvent(OmahaEvent::kTypeUpdateComplete,
441 OmahaEvent::kResultError,
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800442 err));
Darin Petkov1b003102010-11-30 10:18:36 -0800443 attempter_.ScheduleErrorEventAction();
Christopher Wiley6b6cc1b2015-10-05 17:50:07 -0700444 EXPECT_EQ(UpdateStatus::REPORTING_ERROR_EVENT, attempter_.status());
Darin Petkov1b003102010-11-30 10:18:36 -0800445}
446
Darin Petkove6ef2f82011-03-07 17:31:11 -0800447namespace {
Chris Sosa76a29ae2013-07-11 17:59:24 -0700448// Actions that will be built as part of an update check.
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700449const string kUpdateActionTypes[] = { // NOLINT(runtime/string)
Darin Petkove6ef2f82011-03-07 17:31:11 -0800450 OmahaRequestAction::StaticType(),
451 OmahaResponseHandlerAction::StaticType(),
Darin Petkove6ef2f82011-03-07 17:31:11 -0800452 OmahaRequestAction::StaticType(),
453 DownloadAction::StaticType(),
454 OmahaRequestAction::StaticType(),
Allie Woodeb9e6d82015-04-17 13:55:30 -0700455 FilesystemVerifierAction::StaticType(),
Darin Petkove6ef2f82011-03-07 17:31:11 -0800456 PostinstallRunnerAction::StaticType(),
457 OmahaRequestAction::StaticType()
458};
Chris Sosa76a29ae2013-07-11 17:59:24 -0700459
460// Actions that will be built as part of a user-initiated rollback.
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700461const string kRollbackActionTypes[] = { // NOLINT(runtime/string)
Chris Sosa76a29ae2013-07-11 17:59:24 -0700462 InstallPlanAction::StaticType(),
463 PostinstallRunnerAction::StaticType(),
464};
465
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700466} // namespace
Darin Petkove6ef2f82011-03-07 17:31:11 -0800467
468void UpdateAttempterTest::UpdateTestStart() {
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700469 attempter_.set_http_response_code(200);
Alex Deymo749ecf12014-10-21 20:06:57 -0700470
471 // Expect that the device policy is loaded by the UpdateAttempter at some
472 // point by calling RefreshDevicePolicy.
473 policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
474 attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
475 EXPECT_CALL(*device_policy, LoadPolicy())
476 .Times(testing::AtLeast(1)).WillRepeatedly(Return(true));
477
478 {
479 InSequence s;
480 for (size_t i = 0; i < arraysize(kUpdateActionTypes); ++i) {
481 EXPECT_CALL(*processor_,
482 EnqueueAction(Property(&AbstractAction::Type,
Gilad Arnold74b5f552014-10-07 08:17:16 -0700483 kUpdateActionTypes[i])));
Alex Deymo749ecf12014-10-21 20:06:57 -0700484 }
Gilad Arnold74b5f552014-10-07 08:17:16 -0700485 EXPECT_CALL(*processor_, StartProcessing());
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700486 }
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700487
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700488 attempter_.Update("", "", "", "", false, false);
Alex Deymo60ca1a72015-06-18 18:19:15 -0700489 loop_.PostTask(FROM_HERE,
490 base::Bind(&UpdateAttempterTest::UpdateTestVerify,
491 base::Unretained(this)));
Darin Petkove6ef2f82011-03-07 17:31:11 -0800492}
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700493
Darin Petkove6ef2f82011-03-07 17:31:11 -0800494void UpdateAttempterTest::UpdateTestVerify() {
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700495 EXPECT_EQ(0, attempter_.http_response_code());
496 EXPECT_EQ(&attempter_, processor_->delegate());
Chris Sosa76a29ae2013-07-11 17:59:24 -0700497 EXPECT_EQ(arraysize(kUpdateActionTypes), attempter_.actions_.size());
498 for (size_t i = 0; i < arraysize(kUpdateActionTypes); ++i) {
499 EXPECT_EQ(kUpdateActionTypes[i], attempter_.actions_[i]->Type());
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700500 }
501 EXPECT_EQ(attempter_.response_handler_action_.get(),
502 attempter_.actions_[1].get());
Sen Jiangfef85fd2016-03-25 15:32:49 -0700503 AbstractAction* action_3 = attempter_.actions_[3].get();
504 ASSERT_NE(nullptr, action_3);
505 ASSERT_EQ(DownloadAction::StaticType(), action_3->Type());
506 DownloadAction* download_action = static_cast<DownloadAction*>(action_3);
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700507 EXPECT_EQ(&attempter_, download_action->delegate());
Christopher Wiley6b6cc1b2015-10-05 17:50:07 -0700508 EXPECT_EQ(UpdateStatus::CHECKING_FOR_UPDATE, attempter_.status());
Alex Deymo60ca1a72015-06-18 18:19:15 -0700509 loop_.BreakLoop();
Darin Petkove6ef2f82011-03-07 17:31:11 -0800510}
511
Chris Sosa28e479c2013-07-12 11:39:53 -0700512void UpdateAttempterTest::RollbackTestStart(
Chris Sosa44b9b7e2014-04-02 13:53:46 -0700513 bool enterprise_rollback, bool valid_slot) {
Chris Sosa76a29ae2013-07-11 17:59:24 -0700514 // Create a device policy so that we can change settings.
515 policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
516 attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
517
518 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700519 fake_system_state_.set_device_policy(device_policy);
Chris Sosa76a29ae2013-07-11 17:59:24 -0700520
Alex Deymo763e7db2015-08-27 21:08:08 -0700521 if (valid_slot) {
522 BootControlInterface::Slot rollback_slot = 1;
523 LOG(INFO) << "Test Mark Bootable: "
524 << BootControlInterface::SlotName(rollback_slot);
Alex Deymoe5e5fe92015-10-05 09:28:19 -0700525 fake_system_state_.fake_boot_control()->SetSlotBootable(rollback_slot,
526 true);
Don Garrett6646b442013-11-13 15:29:11 -0800527 }
528
Chris Sosa28e479c2013-07-12 11:39:53 -0700529 bool is_rollback_allowed = false;
Chris Sosa76a29ae2013-07-11 17:59:24 -0700530
Chris Sosad38b1132014-03-25 10:43:59 -0700531 // We only allow rollback on devices that are not enterprise enrolled and
532 // which have a valid slot to rollback to.
533 if (!enterprise_rollback && valid_slot) {
Chris Sosa28e479c2013-07-12 11:39:53 -0700534 is_rollback_allowed = true;
535 }
536
Don Garrett6646b442013-11-13 15:29:11 -0800537 if (enterprise_rollback) {
Chris Sosa28e479c2013-07-12 11:39:53 -0700538 // We return an empty owner as this is an enterprise.
Don Garrett6646b442013-11-13 15:29:11 -0800539 EXPECT_CALL(*device_policy, GetOwner(_)).WillRepeatedly(
Alex Deymof329b932014-10-30 01:37:48 -0700540 DoAll(SetArgumentPointee<0>(string("")),
Chris Sosa28e479c2013-07-12 11:39:53 -0700541 Return(true)));
542 } else {
543 // We return a fake owner as this is an owned consumer device.
Don Garrett6646b442013-11-13 15:29:11 -0800544 EXPECT_CALL(*device_policy, GetOwner(_)).WillRepeatedly(
Alex Deymof329b932014-10-30 01:37:48 -0700545 DoAll(SetArgumentPointee<0>(string("fake.mail@fake.com")),
Chris Sosa76a29ae2013-07-11 17:59:24 -0700546 Return(true)));
Chris Sosa28e479c2013-07-12 11:39:53 -0700547 }
Chris Sosa76a29ae2013-07-11 17:59:24 -0700548
Chris Sosa28e479c2013-07-12 11:39:53 -0700549 if (is_rollback_allowed) {
Chris Sosa76a29ae2013-07-11 17:59:24 -0700550 InSequence s;
551 for (size_t i = 0; i < arraysize(kRollbackActionTypes); ++i) {
552 EXPECT_CALL(*processor_,
553 EnqueueAction(Property(&AbstractAction::Type,
Gilad Arnold74b5f552014-10-07 08:17:16 -0700554 kRollbackActionTypes[i])));
Chris Sosa76a29ae2013-07-11 17:59:24 -0700555 }
Gilad Arnold74b5f552014-10-07 08:17:16 -0700556 EXPECT_CALL(*processor_, StartProcessing());
Chris Sosa76a29ae2013-07-11 17:59:24 -0700557
Chris Sosa44b9b7e2014-04-02 13:53:46 -0700558 EXPECT_TRUE(attempter_.Rollback(true));
Alex Deymo60ca1a72015-06-18 18:19:15 -0700559 loop_.PostTask(FROM_HERE,
560 base::Bind(&UpdateAttempterTest::RollbackTestVerify,
561 base::Unretained(this)));
Chris Sosa76a29ae2013-07-11 17:59:24 -0700562 } else {
Chris Sosa44b9b7e2014-04-02 13:53:46 -0700563 EXPECT_FALSE(attempter_.Rollback(true));
Alex Deymo60ca1a72015-06-18 18:19:15 -0700564 loop_.BreakLoop();
Chris Sosa76a29ae2013-07-11 17:59:24 -0700565 }
566}
567
568void UpdateAttempterTest::RollbackTestVerify() {
569 // Verifies the actions that were enqueued.
570 EXPECT_EQ(&attempter_, processor_->delegate());
571 EXPECT_EQ(arraysize(kRollbackActionTypes), attempter_.actions_.size());
572 for (size_t i = 0; i < arraysize(kRollbackActionTypes); ++i) {
573 EXPECT_EQ(kRollbackActionTypes[i], attempter_.actions_[i]->Type());
574 }
Christopher Wiley6b6cc1b2015-10-05 17:50:07 -0700575 EXPECT_EQ(UpdateStatus::ATTEMPTING_ROLLBACK, attempter_.status());
Alex Deymo80f70ff2016-02-10 16:08:11 -0800576 AbstractAction* action_0 = attempter_.actions_[0].get();
577 ASSERT_NE(nullptr, action_0);
578 ASSERT_EQ(InstallPlanAction::StaticType(), action_0->Type());
Chris Sosa76a29ae2013-07-11 17:59:24 -0700579 InstallPlanAction* install_plan_action =
Alex Deymo80f70ff2016-02-10 16:08:11 -0800580 static_cast<InstallPlanAction*>(action_0);
Chris Sosa76a29ae2013-07-11 17:59:24 -0700581 InstallPlan* install_plan = install_plan_action->install_plan();
Alex Deymo80f70ff2016-02-10 16:08:11 -0800582 EXPECT_EQ(0U, install_plan->partitions.size());
Chris Sosa76a29ae2013-07-11 17:59:24 -0700583 EXPECT_EQ(install_plan->powerwash_required, true);
Alex Deymo60ca1a72015-06-18 18:19:15 -0700584 loop_.BreakLoop();
Chris Sosa76a29ae2013-07-11 17:59:24 -0700585}
586
Darin Petkove6ef2f82011-03-07 17:31:11 -0800587TEST_F(UpdateAttempterTest, UpdateTest) {
Alex Deymo461b2592015-07-24 20:10:52 -0700588 UpdateTestStart();
Alex Deymo60ca1a72015-06-18 18:19:15 -0700589 loop_.Run();
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700590}
591
Chris Sosa76a29ae2013-07-11 17:59:24 -0700592TEST_F(UpdateAttempterTest, RollbackTest) {
Alex Deymo60ca1a72015-06-18 18:19:15 -0700593 loop_.PostTask(FROM_HERE,
594 base::Bind(&UpdateAttempterTest::RollbackTestStart,
595 base::Unretained(this),
596 false, true));
597 loop_.Run();
Chris Sosa76a29ae2013-07-11 17:59:24 -0700598}
599
Don Garrett6646b442013-11-13 15:29:11 -0800600TEST_F(UpdateAttempterTest, InvalidSlotRollbackTest) {
Alex Deymo60ca1a72015-06-18 18:19:15 -0700601 loop_.PostTask(FROM_HERE,
602 base::Bind(&UpdateAttempterTest::RollbackTestStart,
603 base::Unretained(this),
604 false, false));
605 loop_.Run();
Don Garrett6646b442013-11-13 15:29:11 -0800606}
607
Chris Sosa76a29ae2013-07-11 17:59:24 -0700608TEST_F(UpdateAttempterTest, EnterpriseRollbackTest) {
Alex Deymo60ca1a72015-06-18 18:19:15 -0700609 loop_.PostTask(FROM_HERE,
610 base::Bind(&UpdateAttempterTest::RollbackTestStart,
611 base::Unretained(this),
612 true, true));
613 loop_.Run();
Chris Sosa76a29ae2013-07-11 17:59:24 -0700614}
615
Thieu Le116fda32011-04-19 11:01:54 -0700616void UpdateAttempterTest::PingOmahaTestStart() {
617 EXPECT_CALL(*processor_,
618 EnqueueAction(Property(&AbstractAction::Type,
Gilad Arnold74b5f552014-10-07 08:17:16 -0700619 OmahaRequestAction::StaticType())));
620 EXPECT_CALL(*processor_, StartProcessing());
Thieu Le116fda32011-04-19 11:01:54 -0700621 attempter_.PingOmaha();
Alex Deymo60ca1a72015-06-18 18:19:15 -0700622 ScheduleQuitMainLoop();
Thieu Le116fda32011-04-19 11:01:54 -0700623}
624
625TEST_F(UpdateAttempterTest, PingOmahaTest) {
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700626 EXPECT_FALSE(attempter_.waiting_for_scheduled_check_);
627 EXPECT_FALSE(attempter_.schedule_updates_called());
628 // Disable scheduling of subsequnet checks; we're using the DefaultPolicy in
629 // testing, which is more permissive than we want to handle here.
630 attempter_.DisableScheduleUpdates();
Alex Deymo60ca1a72015-06-18 18:19:15 -0700631 loop_.PostTask(FROM_HERE,
632 base::Bind(&UpdateAttempterTest::PingOmahaTestStart,
633 base::Unretained(this)));
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700634 brillo::MessageLoopRunMaxIterations(&loop_, 100);
Christopher Wiley6b6cc1b2015-10-05 17:50:07 -0700635 EXPECT_EQ(UpdateStatus::UPDATED_NEED_REBOOT, attempter_.status());
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700636 EXPECT_TRUE(attempter_.schedule_updates_called());
Thieu Le116fda32011-04-19 11:01:54 -0700637}
638
Darin Petkov18c7bce2011-06-16 14:07:00 -0700639TEST_F(UpdateAttempterTest, CreatePendingErrorEventTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -0800640 MockAction action;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700641 const ErrorCode kCode = ErrorCode::kDownloadTransferError;
Darin Petkov18c7bce2011-06-16 14:07:00 -0700642 attempter_.CreatePendingErrorEvent(&action, kCode);
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700643 ASSERT_NE(nullptr, attempter_.error_event_.get());
Darin Petkov18c7bce2011-06-16 14:07:00 -0700644 EXPECT_EQ(OmahaEvent::kTypeUpdateComplete, attempter_.error_event_->type);
645 EXPECT_EQ(OmahaEvent::kResultError, attempter_.error_event_->result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700646 EXPECT_EQ(
647 static_cast<ErrorCode>(static_cast<int>(kCode) |
648 static_cast<int>(ErrorCode::kTestOmahaUrlFlag)),
649 attempter_.error_event_->error_code);
Darin Petkov18c7bce2011-06-16 14:07:00 -0700650}
651
652TEST_F(UpdateAttempterTest, CreatePendingErrorEventResumedTest) {
653 OmahaResponseHandlerAction *response_action =
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700654 new OmahaResponseHandlerAction(&fake_system_state_);
Darin Petkov18c7bce2011-06-16 14:07:00 -0700655 response_action->install_plan_.is_resume = true;
656 attempter_.response_handler_action_.reset(response_action);
Alex Deymo8427b4a2014-11-05 14:00:32 -0800657 MockAction action;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700658 const ErrorCode kCode = ErrorCode::kInstallDeviceOpenError;
Darin Petkov18c7bce2011-06-16 14:07:00 -0700659 attempter_.CreatePendingErrorEvent(&action, kCode);
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700660 ASSERT_NE(nullptr, attempter_.error_event_.get());
Darin Petkov18c7bce2011-06-16 14:07:00 -0700661 EXPECT_EQ(OmahaEvent::kTypeUpdateComplete, attempter_.error_event_->type);
662 EXPECT_EQ(OmahaEvent::kResultError, attempter_.error_event_->result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700663 EXPECT_EQ(
664 static_cast<ErrorCode>(
665 static_cast<int>(kCode) |
666 static_cast<int>(ErrorCode::kResumedFlag) |
667 static_cast<int>(ErrorCode::kTestOmahaUrlFlag)),
668 attempter_.error_event_->error_code);
Darin Petkov18c7bce2011-06-16 14:07:00 -0700669}
670
David Zeuthen8f191b22013-08-06 12:27:50 -0700671TEST_F(UpdateAttempterTest, P2PNotStartedAtStartupWhenNotEnabled) {
672 MockP2PManager mock_p2p_manager;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700673 fake_system_state_.set_p2p_manager(&mock_p2p_manager);
David Zeuthen8f191b22013-08-06 12:27:50 -0700674 mock_p2p_manager.fake().SetP2PEnabled(false);
675 EXPECT_CALL(mock_p2p_manager, EnsureP2PRunning()).Times(0);
676 attempter_.UpdateEngineStarted();
677}
678
679TEST_F(UpdateAttempterTest, P2PNotStartedAtStartupWhenEnabledButNotSharing) {
680 MockP2PManager mock_p2p_manager;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700681 fake_system_state_.set_p2p_manager(&mock_p2p_manager);
David Zeuthen8f191b22013-08-06 12:27:50 -0700682 mock_p2p_manager.fake().SetP2PEnabled(true);
683 EXPECT_CALL(mock_p2p_manager, EnsureP2PRunning()).Times(0);
684 attempter_.UpdateEngineStarted();
685}
686
687TEST_F(UpdateAttempterTest, P2PStartedAtStartupWhenEnabledAndSharing) {
688 MockP2PManager mock_p2p_manager;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700689 fake_system_state_.set_p2p_manager(&mock_p2p_manager);
David Zeuthen8f191b22013-08-06 12:27:50 -0700690 mock_p2p_manager.fake().SetP2PEnabled(true);
691 mock_p2p_manager.fake().SetCountSharedFilesResult(1);
Gilad Arnold74b5f552014-10-07 08:17:16 -0700692 EXPECT_CALL(mock_p2p_manager, EnsureP2PRunning());
David Zeuthen8f191b22013-08-06 12:27:50 -0700693 attempter_.UpdateEngineStarted();
694}
695
696TEST_F(UpdateAttempterTest, P2PNotEnabled) {
Alex Deymo60ca1a72015-06-18 18:19:15 -0700697 loop_.PostTask(FROM_HERE,
698 base::Bind(&UpdateAttempterTest::P2PNotEnabledStart,
699 base::Unretained(this)));
700 loop_.Run();
David Zeuthen8f191b22013-08-06 12:27:50 -0700701}
Alex Deymo60ca1a72015-06-18 18:19:15 -0700702
David Zeuthen8f191b22013-08-06 12:27:50 -0700703void UpdateAttempterTest::P2PNotEnabledStart() {
704 // If P2P is not enabled, check that we do not attempt housekeeping
705 // and do not convey that p2p is to be used.
706 MockP2PManager mock_p2p_manager;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700707 fake_system_state_.set_p2p_manager(&mock_p2p_manager);
David Zeuthen8f191b22013-08-06 12:27:50 -0700708 mock_p2p_manager.fake().SetP2PEnabled(false);
709 EXPECT_CALL(mock_p2p_manager, PerformHousekeeping()).Times(0);
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700710 attempter_.Update("", "", "", "", false, false);
Alex Deymo60ca1a72015-06-18 18:19:15 -0700711 EXPECT_FALSE(actual_using_p2p_for_downloading_);
Gilad Arnold74b5f552014-10-07 08:17:16 -0700712 EXPECT_FALSE(actual_using_p2p_for_sharing());
Alex Deymo60ca1a72015-06-18 18:19:15 -0700713 ScheduleQuitMainLoop();
David Zeuthen8f191b22013-08-06 12:27:50 -0700714}
715
716TEST_F(UpdateAttempterTest, P2PEnabledStartingFails) {
Alex Deymo60ca1a72015-06-18 18:19:15 -0700717 loop_.PostTask(FROM_HERE,
718 base::Bind(&UpdateAttempterTest::P2PEnabledStartingFailsStart,
719 base::Unretained(this)));
720 loop_.Run();
David Zeuthen8f191b22013-08-06 12:27:50 -0700721}
Alex Deymo60ca1a72015-06-18 18:19:15 -0700722
David Zeuthen8f191b22013-08-06 12:27:50 -0700723void UpdateAttempterTest::P2PEnabledStartingFailsStart() {
724 // If p2p is enabled, but starting it fails ensure we don't do
725 // any housekeeping and do not convey that p2p should be used.
726 MockP2PManager mock_p2p_manager;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700727 fake_system_state_.set_p2p_manager(&mock_p2p_manager);
David Zeuthen8f191b22013-08-06 12:27:50 -0700728 mock_p2p_manager.fake().SetP2PEnabled(true);
729 mock_p2p_manager.fake().SetEnsureP2PRunningResult(false);
730 mock_p2p_manager.fake().SetPerformHousekeepingResult(false);
731 EXPECT_CALL(mock_p2p_manager, PerformHousekeeping()).Times(0);
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700732 attempter_.Update("", "", "", "", false, false);
Gilad Arnold74b5f552014-10-07 08:17:16 -0700733 EXPECT_FALSE(actual_using_p2p_for_downloading());
734 EXPECT_FALSE(actual_using_p2p_for_sharing());
Alex Deymo60ca1a72015-06-18 18:19:15 -0700735 ScheduleQuitMainLoop();
David Zeuthen8f191b22013-08-06 12:27:50 -0700736}
737
738TEST_F(UpdateAttempterTest, P2PEnabledHousekeepingFails) {
Alex Deymo60ca1a72015-06-18 18:19:15 -0700739 loop_.PostTask(
740 FROM_HERE,
741 base::Bind(&UpdateAttempterTest::P2PEnabledHousekeepingFailsStart,
742 base::Unretained(this)));
743 loop_.Run();
David Zeuthen8f191b22013-08-06 12:27:50 -0700744}
Alex Deymo60ca1a72015-06-18 18:19:15 -0700745
David Zeuthen8f191b22013-08-06 12:27:50 -0700746void UpdateAttempterTest::P2PEnabledHousekeepingFailsStart() {
747 // If p2p is enabled, starting it works but housekeeping fails, ensure
748 // we do not convey p2p is to be used.
749 MockP2PManager mock_p2p_manager;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700750 fake_system_state_.set_p2p_manager(&mock_p2p_manager);
David Zeuthen8f191b22013-08-06 12:27:50 -0700751 mock_p2p_manager.fake().SetP2PEnabled(true);
752 mock_p2p_manager.fake().SetEnsureP2PRunningResult(true);
753 mock_p2p_manager.fake().SetPerformHousekeepingResult(false);
Gilad Arnold74b5f552014-10-07 08:17:16 -0700754 EXPECT_CALL(mock_p2p_manager, PerformHousekeeping());
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700755 attempter_.Update("", "", "", "", false, false);
Gilad Arnold74b5f552014-10-07 08:17:16 -0700756 EXPECT_FALSE(actual_using_p2p_for_downloading());
757 EXPECT_FALSE(actual_using_p2p_for_sharing());
Alex Deymo60ca1a72015-06-18 18:19:15 -0700758 ScheduleQuitMainLoop();
David Zeuthen8f191b22013-08-06 12:27:50 -0700759}
760
761TEST_F(UpdateAttempterTest, P2PEnabled) {
Alex Deymo60ca1a72015-06-18 18:19:15 -0700762 loop_.PostTask(FROM_HERE,
763 base::Bind(&UpdateAttempterTest::P2PEnabledStart,
764 base::Unretained(this)));
765 loop_.Run();
David Zeuthen8f191b22013-08-06 12:27:50 -0700766}
Alex Deymo60ca1a72015-06-18 18:19:15 -0700767
David Zeuthen8f191b22013-08-06 12:27:50 -0700768void UpdateAttempterTest::P2PEnabledStart() {
769 MockP2PManager mock_p2p_manager;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700770 fake_system_state_.set_p2p_manager(&mock_p2p_manager);
David Zeuthen8f191b22013-08-06 12:27:50 -0700771 // If P2P is enabled and starting it works, check that we performed
772 // housekeeping and that we convey p2p should be used.
773 mock_p2p_manager.fake().SetP2PEnabled(true);
774 mock_p2p_manager.fake().SetEnsureP2PRunningResult(true);
775 mock_p2p_manager.fake().SetPerformHousekeepingResult(true);
Gilad Arnold74b5f552014-10-07 08:17:16 -0700776 EXPECT_CALL(mock_p2p_manager, PerformHousekeeping());
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700777 attempter_.Update("", "", "", "", false, false);
Gilad Arnold74b5f552014-10-07 08:17:16 -0700778 EXPECT_TRUE(actual_using_p2p_for_downloading());
779 EXPECT_TRUE(actual_using_p2p_for_sharing());
Alex Deymo60ca1a72015-06-18 18:19:15 -0700780 ScheduleQuitMainLoop();
David Zeuthen8f191b22013-08-06 12:27:50 -0700781}
782
783TEST_F(UpdateAttempterTest, P2PEnabledInteractive) {
Alex Deymo60ca1a72015-06-18 18:19:15 -0700784 loop_.PostTask(FROM_HERE,
785 base::Bind(&UpdateAttempterTest::P2PEnabledInteractiveStart,
786 base::Unretained(this)));
787 loop_.Run();
David Zeuthen8f191b22013-08-06 12:27:50 -0700788}
Alex Deymo60ca1a72015-06-18 18:19:15 -0700789
David Zeuthen8f191b22013-08-06 12:27:50 -0700790void UpdateAttempterTest::P2PEnabledInteractiveStart() {
791 MockP2PManager mock_p2p_manager;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700792 fake_system_state_.set_p2p_manager(&mock_p2p_manager);
David Zeuthen8f191b22013-08-06 12:27:50 -0700793 // For an interactive check, if P2P is enabled and starting it
794 // works, check that we performed housekeeping and that we convey
795 // p2p should be used for sharing but NOT for downloading.
796 mock_p2p_manager.fake().SetP2PEnabled(true);
797 mock_p2p_manager.fake().SetEnsureP2PRunningResult(true);
798 mock_p2p_manager.fake().SetPerformHousekeepingResult(true);
Gilad Arnold74b5f552014-10-07 08:17:16 -0700799 EXPECT_CALL(mock_p2p_manager, PerformHousekeeping());
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700800 attempter_.Update("", "", "", "", false, true /* interactive */);
Gilad Arnold74b5f552014-10-07 08:17:16 -0700801 EXPECT_FALSE(actual_using_p2p_for_downloading());
802 EXPECT_TRUE(actual_using_p2p_for_sharing());
Alex Deymo60ca1a72015-06-18 18:19:15 -0700803 ScheduleQuitMainLoop();
David Zeuthen8f191b22013-08-06 12:27:50 -0700804}
805
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700806TEST_F(UpdateAttempterTest, ReadScatterFactorFromPolicy) {
Alex Deymo60ca1a72015-06-18 18:19:15 -0700807 loop_.PostTask(
808 FROM_HERE,
809 base::Bind(&UpdateAttempterTest::ReadScatterFactorFromPolicyTestStart,
810 base::Unretained(this)));
811 loop_.Run();
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700812}
813
814// Tests that the scatter_factor_in_seconds value is properly fetched
815// from the device policy.
816void UpdateAttempterTest::ReadScatterFactorFromPolicyTestStart() {
Ben Chan9abb7632014-08-07 00:10:53 -0700817 int64_t scatter_factor_in_seconds = 36000;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700818
819 policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
820 attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
821
822 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700823 fake_system_state_.set_device_policy(device_policy);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700824
825 EXPECT_CALL(*device_policy, GetScatterFactorInSeconds(_))
826 .WillRepeatedly(DoAll(
827 SetArgumentPointee<0>(scatter_factor_in_seconds),
828 Return(true)));
829
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700830 attempter_.Update("", "", "", "", false, false);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700831 EXPECT_EQ(scatter_factor_in_seconds, attempter_.scatter_factor_.InSeconds());
832
Alex Deymo60ca1a72015-06-18 18:19:15 -0700833 ScheduleQuitMainLoop();
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700834}
835
836TEST_F(UpdateAttempterTest, DecrementUpdateCheckCountTest) {
Alex Deymo60ca1a72015-06-18 18:19:15 -0700837 loop_.PostTask(
838 FROM_HERE,
839 base::Bind(&UpdateAttempterTest::DecrementUpdateCheckCountTestStart,
840 base::Unretained(this)));
841 loop_.Run();
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700842}
843
844void UpdateAttempterTest::DecrementUpdateCheckCountTestStart() {
845 // Tests that the scatter_factor_in_seconds value is properly fetched
846 // from the device policy and is decremented if value > 0.
Ben Chan9abb7632014-08-07 00:10:53 -0700847 int64_t initial_value = 5;
Alex Deymo2c0db7b2014-11-04 12:23:39 -0800848 FakePrefs fake_prefs;
849 attempter_.prefs_ = &fake_prefs;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700850
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700851 fake_system_state_.fake_hardware()->SetIsOOBEComplete(Time::UnixEpoch());
Jay Srinivasan08fce042012-06-07 16:31:01 -0700852
Alex Deymo2c0db7b2014-11-04 12:23:39 -0800853 EXPECT_TRUE(fake_prefs.SetInt64(kPrefsUpdateCheckCount, initial_value));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700854
Ben Chan9abb7632014-08-07 00:10:53 -0700855 int64_t scatter_factor_in_seconds = 10;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700856
857 policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
858 attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
859
860 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700861 fake_system_state_.set_device_policy(device_policy);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700862
863 EXPECT_CALL(*device_policy, GetScatterFactorInSeconds(_))
864 .WillRepeatedly(DoAll(
865 SetArgumentPointee<0>(scatter_factor_in_seconds),
866 Return(true)));
867
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700868 attempter_.Update("", "", "", "", false, false);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700869 EXPECT_EQ(scatter_factor_in_seconds, attempter_.scatter_factor_.InSeconds());
870
871 // Make sure the file still exists.
Alex Deymo2c0db7b2014-11-04 12:23:39 -0800872 EXPECT_TRUE(fake_prefs.Exists(kPrefsUpdateCheckCount));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700873
Ben Chan9abb7632014-08-07 00:10:53 -0700874 int64_t new_value;
Alex Deymo2c0db7b2014-11-04 12:23:39 -0800875 EXPECT_TRUE(fake_prefs.GetInt64(kPrefsUpdateCheckCount, &new_value));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700876 EXPECT_EQ(initial_value - 1, new_value);
877
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700878 EXPECT_TRUE(
879 attempter_.omaha_request_params_->update_check_count_wait_enabled());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700880
881 // However, if the count is already 0, it's not decremented. Test that.
882 initial_value = 0;
Alex Deymo2c0db7b2014-11-04 12:23:39 -0800883 EXPECT_TRUE(fake_prefs.SetInt64(kPrefsUpdateCheckCount, initial_value));
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700884 attempter_.Update("", "", "", "", false, false);
Alex Deymo2c0db7b2014-11-04 12:23:39 -0800885 EXPECT_TRUE(fake_prefs.Exists(kPrefsUpdateCheckCount));
886 EXPECT_TRUE(fake_prefs.GetInt64(kPrefsUpdateCheckCount, &new_value));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700887 EXPECT_EQ(initial_value, new_value);
888
Alex Deymo60ca1a72015-06-18 18:19:15 -0700889 ScheduleQuitMainLoop();
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700890}
891
Jay Srinivasan08fce042012-06-07 16:31:01 -0700892TEST_F(UpdateAttempterTest, NoScatteringDoneDuringManualUpdateTestStart) {
Alex Deymo60ca1a72015-06-18 18:19:15 -0700893 loop_.PostTask(FROM_HERE, base::Bind(
894 &UpdateAttempterTest::NoScatteringDoneDuringManualUpdateTestStart,
895 base::Unretained(this)));
896 loop_.Run();
Jay Srinivasan08fce042012-06-07 16:31:01 -0700897}
898
899void UpdateAttempterTest::NoScatteringDoneDuringManualUpdateTestStart() {
900 // Tests that no scattering logic is enabled if the update check
901 // is manually done (as opposed to a scheduled update check)
Ben Chan9abb7632014-08-07 00:10:53 -0700902 int64_t initial_value = 8;
Alex Deymo2c0db7b2014-11-04 12:23:39 -0800903 FakePrefs fake_prefs;
904 attempter_.prefs_ = &fake_prefs;
Jay Srinivasan08fce042012-06-07 16:31:01 -0700905
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700906 fake_system_state_.fake_hardware()->SetIsOOBEComplete(Time::UnixEpoch());
Alex Deymo2c0db7b2014-11-04 12:23:39 -0800907 fake_system_state_.set_prefs(&fake_prefs);
Jay Srinivasan08fce042012-06-07 16:31:01 -0700908
Alex Deymo2c0db7b2014-11-04 12:23:39 -0800909 EXPECT_TRUE(fake_prefs.SetInt64(kPrefsWallClockWaitPeriod, initial_value));
910 EXPECT_TRUE(fake_prefs.SetInt64(kPrefsUpdateCheckCount, initial_value));
Jay Srinivasan08fce042012-06-07 16:31:01 -0700911
912 // make sure scatter_factor is non-zero as scattering is disabled
913 // otherwise.
Ben Chan9abb7632014-08-07 00:10:53 -0700914 int64_t scatter_factor_in_seconds = 50;
Jay Srinivasan08fce042012-06-07 16:31:01 -0700915
916 policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
917 attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
918
919 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700920 fake_system_state_.set_device_policy(device_policy);
Jay Srinivasan08fce042012-06-07 16:31:01 -0700921
922 EXPECT_CALL(*device_policy, GetScatterFactorInSeconds(_))
923 .WillRepeatedly(DoAll(
924 SetArgumentPointee<0>(scatter_factor_in_seconds),
925 Return(true)));
926
Gilad Arnoldb92f0df2013-01-10 16:32:45 -0800927 // Trigger an interactive check so we can test that scattering is disabled.
Gilad Arnoldec7f9162014-07-15 13:24:46 -0700928 attempter_.Update("", "", "", "", false, true);
Jay Srinivasan08fce042012-06-07 16:31:01 -0700929 EXPECT_EQ(scatter_factor_in_seconds, attempter_.scatter_factor_.InSeconds());
930
931 // Make sure scattering is disabled for manual (i.e. user initiated) update
Jay Srinivasan21be0752012-07-25 15:44:56 -0700932 // checks and all artifacts are removed.
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700933 EXPECT_FALSE(
934 attempter_.omaha_request_params_->wall_clock_based_wait_enabled());
Alex Deymo2c0db7b2014-11-04 12:23:39 -0800935 EXPECT_FALSE(fake_prefs.Exists(kPrefsWallClockWaitPeriod));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700936 EXPECT_EQ(0, attempter_.omaha_request_params_->waiting_period().InSeconds());
937 EXPECT_FALSE(
938 attempter_.omaha_request_params_->update_check_count_wait_enabled());
Alex Deymo2c0db7b2014-11-04 12:23:39 -0800939 EXPECT_FALSE(fake_prefs.Exists(kPrefsUpdateCheckCount));
Jay Srinivasan08fce042012-06-07 16:31:01 -0700940
Alex Deymo60ca1a72015-06-18 18:19:15 -0700941 ScheduleQuitMainLoop();
Jay Srinivasan08fce042012-06-07 16:31:01 -0700942}
943
David Zeuthen985b1122013-10-09 12:13:15 -0700944// Checks that we only report daily metrics at most every 24 hours.
945TEST_F(UpdateAttempterTest, ReportDailyMetrics) {
946 FakeClock fake_clock;
Alex Deymo2c0db7b2014-11-04 12:23:39 -0800947 FakePrefs fake_prefs;
David Zeuthen985b1122013-10-09 12:13:15 -0700948
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700949 fake_system_state_.set_clock(&fake_clock);
Alex Deymo2c0db7b2014-11-04 12:23:39 -0800950 fake_system_state_.set_prefs(&fake_prefs);
David Zeuthen985b1122013-10-09 12:13:15 -0700951
952 Time epoch = Time::FromInternalValue(0);
953 fake_clock.SetWallclockTime(epoch);
954
955 // If there is no kPrefsDailyMetricsLastReportedAt state variable,
956 // we should report.
957 EXPECT_TRUE(attempter_.CheckAndReportDailyMetrics());
958 // We should not report again if no time has passed.
959 EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
960
961 // We should not report if only 10 hours has passed.
962 fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(10));
963 EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
964
965 // We should not report if only 24 hours - 1 sec has passed.
966 fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(24) -
967 TimeDelta::FromSeconds(1));
968 EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
969
970 // We should report if 24 hours has passed.
971 fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(24));
972 EXPECT_TRUE(attempter_.CheckAndReportDailyMetrics());
973
974 // But then we should not report again..
975 EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
976
977 // .. until another 24 hours has passed
978 fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(47));
979 EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
980 fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(48));
981 EXPECT_TRUE(attempter_.CheckAndReportDailyMetrics());
982 EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
983
984 // .. and another 24 hours
985 fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(71));
986 EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
987 fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(72));
988 EXPECT_TRUE(attempter_.CheckAndReportDailyMetrics());
989 EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
990
991 // If the span between time of reporting and present time is
992 // negative, we report. This is in order to reset the timestamp and
993 // avoid an edge condition whereby a distant point in the future is
994 // in the state variable resulting in us never ever reporting again.
995 fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(71));
996 EXPECT_TRUE(attempter_.CheckAndReportDailyMetrics());
997 EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
998
999 // In this case we should not update until the clock reads 71 + 24 = 95.
1000 // Check that.
1001 fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(94));
1002 EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
1003 fake_clock.SetWallclockTime(epoch + TimeDelta::FromHours(95));
1004 EXPECT_TRUE(attempter_.CheckAndReportDailyMetrics());
1005 EXPECT_FALSE(attempter_.CheckAndReportDailyMetrics());
David Zeuthen985b1122013-10-09 12:13:15 -07001006}
1007
David Zeuthen3c55abd2013-10-14 12:48:03 -07001008TEST_F(UpdateAttempterTest, BootTimeInUpdateMarkerFile) {
David Zeuthen3c55abd2013-10-14 12:48:03 -07001009 FakeClock fake_clock;
1010 fake_clock.SetBootTime(Time::FromTimeT(42));
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001011 fake_system_state_.set_clock(&fake_clock);
Alex Deymo906191f2015-10-12 12:22:44 -07001012 FakePrefs fake_prefs;
1013 fake_system_state_.set_prefs(&fake_prefs);
Sen Jiangaeeb2e02016-06-09 15:00:16 -07001014 attempter_.Init();
David Zeuthen3c55abd2013-10-14 12:48:03 -07001015
1016 Time boot_time;
Sen Jiangaeeb2e02016-06-09 15:00:16 -07001017 EXPECT_FALSE(attempter_.GetBootTimeAtUpdate(&boot_time));
David Zeuthen3c55abd2013-10-14 12:48:03 -07001018
Sen Jiangaeeb2e02016-06-09 15:00:16 -07001019 attempter_.WriteUpdateCompletedMarker();
David Zeuthen3c55abd2013-10-14 12:48:03 -07001020
Sen Jiangaeeb2e02016-06-09 15:00:16 -07001021 EXPECT_TRUE(attempter_.GetBootTimeAtUpdate(&boot_time));
David Zeuthen3c55abd2013-10-14 12:48:03 -07001022 EXPECT_EQ(boot_time.ToTimeT(), 42);
1023}
1024
David Pursell02c18642014-11-06 11:26:11 -08001025TEST_F(UpdateAttempterTest, AnyUpdateSourceAllowedUnofficial) {
1026 fake_system_state_.fake_hardware()->SetIsOfficialBuild(false);
1027 EXPECT_TRUE(attempter_.IsAnyUpdateSourceAllowed());
1028}
1029
1030TEST_F(UpdateAttempterTest, AnyUpdateSourceAllowedOfficialDevmode) {
1031 fake_system_state_.fake_hardware()->SetIsOfficialBuild(true);
Sen Jiange67bb5b2016-06-20 15:53:56 -07001032 fake_system_state_.fake_hardware()->SetAreDevFeaturesEnabled(true);
David Pursell02c18642014-11-06 11:26:11 -08001033 EXPECT_TRUE(attempter_.IsAnyUpdateSourceAllowed());
1034}
1035
1036TEST_F(UpdateAttempterTest, AnyUpdateSourceDisallowedOfficialNormal) {
1037 fake_system_state_.fake_hardware()->SetIsOfficialBuild(true);
Sen Jiange67bb5b2016-06-20 15:53:56 -07001038 fake_system_state_.fake_hardware()->SetAreDevFeaturesEnabled(false);
David Pursell02c18642014-11-06 11:26:11 -08001039 EXPECT_FALSE(attempter_.IsAnyUpdateSourceAllowed());
1040}
1041
1042TEST_F(UpdateAttempterTest, CheckForUpdateAUTest) {
1043 fake_system_state_.fake_hardware()->SetIsOfficialBuild(true);
Sen Jiange67bb5b2016-06-20 15:53:56 -07001044 fake_system_state_.fake_hardware()->SetAreDevFeaturesEnabled(false);
David Pursell02c18642014-11-06 11:26:11 -08001045 attempter_.CheckForUpdate("", "autest", true);
Alex Deymoac41a822015-09-15 20:52:53 -07001046 EXPECT_EQ(constants::kOmahaDefaultAUTestURL, attempter_.forced_omaha_url());
David Pursell02c18642014-11-06 11:26:11 -08001047}
1048
1049TEST_F(UpdateAttempterTest, CheckForUpdateScheduledAUTest) {
1050 fake_system_state_.fake_hardware()->SetIsOfficialBuild(true);
Sen Jiange67bb5b2016-06-20 15:53:56 -07001051 fake_system_state_.fake_hardware()->SetAreDevFeaturesEnabled(false);
David Pursell02c18642014-11-06 11:26:11 -08001052 attempter_.CheckForUpdate("", "autest-scheduled", true);
Alex Deymoac41a822015-09-15 20:52:53 -07001053 EXPECT_EQ(constants::kOmahaDefaultAUTestURL, attempter_.forced_omaha_url());
David Pursell02c18642014-11-06 11:26:11 -08001054}
1055
Xiyuan Xiac0e8f9a2017-02-22 13:19:35 -08001056TEST_F(UpdateAttempterTest, TargetVersionPrefixSetAndReset) {
1057 attempter_.CalculateUpdateParams("", "", "", "1234", false, false);
1058 EXPECT_EQ("1234",
1059 fake_system_state_.request_params()->target_version_prefix());
1060
1061 attempter_.CalculateUpdateParams("", "", "", "", false, false);
1062 EXPECT_TRUE(
1063 fake_system_state_.request_params()->target_version_prefix().empty());
1064}
1065
Darin Petkovf42cc1c2010-09-01 09:03:02 -07001066} // namespace chromeos_update_engine