blob: 7036c834051b8410a64d2a7122e9d0ded5693c95 [file] [log] [blame]
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Darin Petkovf42cc1c2010-09-01 09:03:02 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <base/file_util.h>
6#include <gtest/gtest.h>
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +02007#include <policy/libpolicy.h>
8#include <policy/mock_device_policy.h>
Darin Petkovf42cc1c2010-09-01 09:03:02 -07009
10#include "update_engine/action_mock.h"
11#include "update_engine/action_processor_mock.h"
12#include "update_engine/filesystem_copier_action.h"
Chris Sosa76a29ae2013-07-11 17:59:24 -070013#include "update_engine/install_plan.h"
Andrew de los Reyes45168102010-11-22 11:13:50 -080014#include "update_engine/mock_dbus_interface.h"
Darin Petkov1b003102010-11-30 10:18:36 -080015#include "update_engine/mock_http_fetcher.h"
David Zeuthen8f191b22013-08-06 12:27:50 -070016#include "update_engine/mock_p2p_manager.h"
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080017#include "update_engine/mock_payload_state.h"
Jay Srinivasan08fce042012-06-07 16:31:01 -070018#include "update_engine/mock_system_state.h"
Darin Petkovf42cc1c2010-09-01 09:03:02 -070019#include "update_engine/postinstall_runner_action.h"
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070020#include "update_engine/prefs.h"
Darin Petkov36275772010-10-01 11:40:57 -070021#include "update_engine/prefs_mock.h"
Darin Petkov1b003102010-11-30 10:18:36 -080022#include "update_engine/test_utils.h"
Darin Petkovf42cc1c2010-09-01 09:03:02 -070023#include "update_engine/update_attempter.h"
Darin Petkov1b003102010-11-30 10:18:36 -080024#include "update_engine/update_check_scheduler.h"
Gilad Arnoldeff87cc2013-07-22 18:32:09 -070025#include "update_engine/utils.h"
Darin Petkovf42cc1c2010-09-01 09:03:02 -070026
27using std::string;
Darin Petkov36275772010-10-01 11:40:57 -070028using testing::_;
29using testing::DoAll;
Darin Petkovf42cc1c2010-09-01 09:03:02 -070030using testing::InSequence;
Darin Petkov2dd01092010-10-08 15:43:05 -070031using testing::Ne;
Darin Petkov9c096d62010-11-17 14:49:04 -080032using testing::NiceMock;
Darin Petkovf42cc1c2010-09-01 09:03:02 -070033using testing::Property;
34using testing::Return;
Darin Petkov36275772010-10-01 11:40:57 -070035using testing::SetArgumentPointee;
Darin Petkovf42cc1c2010-09-01 09:03:02 -070036
37namespace chromeos_update_engine {
38
39// Test a subclass rather than the main class directly so that we can mock out
Darin Petkovcd1666f2010-09-23 09:53:44 -070040// methods within the class. There're explicit unit tests for the mocked out
Darin Petkovf42cc1c2010-09-01 09:03:02 -070041// methods.
42class UpdateAttempterUnderTest : public UpdateAttempter {
43 public:
Gilad Arnold70e476e2013-07-30 16:01:13 -070044 // We always feed an explicit update completed marker name; however, unless
45 // explicitly specified, we feed an empty string, which causes the
46 // UpdateAttempter class to ignore / not write the marker file.
47 UpdateAttempterUnderTest(MockSystemState* mock_system_state,
48 MockDbusGlib* dbus)
49 : UpdateAttempter(mock_system_state, dbus, "") {}
50
51 UpdateAttempterUnderTest(MockSystemState* mock_system_state,
52 MockDbusGlib* dbus,
53 const string& update_completed_marker)
54 : UpdateAttempter(mock_system_state, dbus, update_completed_marker) {}
Darin Petkovf42cc1c2010-09-01 09:03:02 -070055};
56
57class UpdateAttempterTest : public ::testing::Test {
58 protected:
Jay Srinivasan43488792012-06-19 00:25:31 -070059 UpdateAttempterTest()
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080060 : attempter_(&mock_system_state_, &dbus_),
Jay Srinivasan43488792012-06-19 00:25:31 -070061 mock_connection_manager(&mock_system_state_),
62 loop_(NULL) {
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080063 mock_system_state_.set_connection_manager(&mock_connection_manager);
Jay Srinivasan43488792012-06-19 00:25:31 -070064 }
Gilad Arnoldeff87cc2013-07-22 18:32:09 -070065
Darin Petkovf42cc1c2010-09-01 09:03:02 -070066 virtual void SetUp() {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -070067 CHECK(utils::MakeTempDirectory("UpdateAttempterTest-XXXXXX", &test_dir_));
68
Darin Petkovf42cc1c2010-09-01 09:03:02 -070069 EXPECT_EQ(NULL, attempter_.dbus_service_);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080070 EXPECT_TRUE(attempter_.system_state_ != NULL);
Darin Petkovf42cc1c2010-09-01 09:03:02 -070071 EXPECT_EQ(NULL, attempter_.update_check_scheduler_);
72 EXPECT_EQ(0, attempter_.http_response_code_);
Chris Sosa4f8ee272012-11-30 13:01:54 -080073 EXPECT_EQ(utils::kCpuSharesNormal, attempter_.shares_);
74 EXPECT_EQ(NULL, attempter_.manage_shares_source_);
Darin Petkovf42cc1c2010-09-01 09:03:02 -070075 EXPECT_FALSE(attempter_.download_active_);
76 EXPECT_EQ(UPDATE_STATUS_IDLE, attempter_.status_);
77 EXPECT_EQ(0.0, attempter_.download_progress_);
78 EXPECT_EQ(0, attempter_.last_checked_time_);
79 EXPECT_EQ("0.0.0.0", attempter_.new_version_);
Jay Srinivasan51dcf262012-09-13 17:24:32 -070080 EXPECT_EQ(0, attempter_.new_payload_size_);
Jay Srinivasan55f50c22013-01-10 19:24:35 -080081 processor_ = new NiceMock<ActionProcessorMock>();
Darin Petkovf42cc1c2010-09-01 09:03:02 -070082 attempter_.processor_.reset(processor_); // Transfers ownership.
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080083 prefs_ = mock_system_state_.mock_prefs();
Darin Petkovf42cc1c2010-09-01 09:03:02 -070084 }
85
Gilad Arnoldeff87cc2013-07-22 18:32:09 -070086 virtual void TearDown() {
87 utils::RecursiveUnlinkDir(test_dir_);
88 }
89
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +020090 void QuitMainLoop();
91 static gboolean StaticQuitMainLoop(gpointer data);
92
Darin Petkove6ef2f82011-03-07 17:31:11 -080093 void UpdateTestStart();
94 void UpdateTestVerify();
Chris Sosa28e479c2013-07-12 11:39:53 -070095 void RollbackTestStart(bool enterprise_rollback, bool stable_channel);
Chris Sosa76a29ae2013-07-11 17:59:24 -070096 void RollbackTestVerify();
Darin Petkove6ef2f82011-03-07 17:31:11 -080097 static gboolean StaticUpdateTestStart(gpointer data);
98 static gboolean StaticUpdateTestVerify(gpointer data);
Chris Sosa76a29ae2013-07-11 17:59:24 -070099 static gboolean StaticRollbackTestStart(gpointer data);
100 static gboolean StaticEnterpriseRollbackTestStart(gpointer data);
Chris Sosa28e479c2013-07-12 11:39:53 -0700101 static gboolean StaticStableChannelRollbackTestStart(gpointer data);
Chris Sosa76a29ae2013-07-11 17:59:24 -0700102 static gboolean StaticRollbackTestVerify(gpointer data);
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200103
Thieu Le116fda32011-04-19 11:01:54 -0700104 void PingOmahaTestStart();
Thieu Le116fda32011-04-19 11:01:54 -0700105 static gboolean StaticPingOmahaTestStart(gpointer data);
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200106
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700107 void ReadChannelFromPolicyTestStart();
108 static gboolean StaticReadChannelFromPolicyTestStart(gpointer data);
Darin Petkove6ef2f82011-03-07 17:31:11 -0800109
Jay Srinivasan0a708742012-03-20 11:26:12 -0700110 void ReadUpdateDisabledFromPolicyTestStart();
111 static gboolean StaticReadUpdateDisabledFromPolicyTestStart(gpointer data);
112
113 void ReadTargetVersionPrefixFromPolicyTestStart();
114 static gboolean StaticReadTargetVersionPrefixFromPolicyTestStart(
115 gpointer data);
116
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700117 void ReadScatterFactorFromPolicyTestStart();
118 static gboolean StaticReadScatterFactorFromPolicyTestStart(
119 gpointer data);
120
121 void DecrementUpdateCheckCountTestStart();
122 static gboolean StaticDecrementUpdateCheckCountTestStart(
123 gpointer data);
124
Jay Srinivasan08fce042012-06-07 16:31:01 -0700125 void NoScatteringDoneDuringManualUpdateTestStart();
126 static gboolean StaticNoScatteringDoneDuringManualUpdateTestStart(
127 gpointer data);
128
David Zeuthen8f191b22013-08-06 12:27:50 -0700129 void P2PNotEnabledStart();
130 static gboolean StaticP2PNotEnabled(gpointer data);
131
132 void P2PEnabledStart();
133 static gboolean StaticP2PEnabled(gpointer data);
134
135 void P2PEnabledInteractiveStart();
136 static gboolean StaticP2PEnabledInteractive(gpointer data);
137
138 void P2PEnabledStartingFailsStart();
139 static gboolean StaticP2PEnabledStartingFails(gpointer data);
140
141 void P2PEnabledHousekeepingFailsStart();
142 static gboolean StaticP2PEnabledHousekeepingFails(gpointer data);
143
Jay Srinivasan55f50c22013-01-10 19:24:35 -0800144 NiceMock<MockSystemState> mock_system_state_;
145 NiceMock<MockDbusGlib> dbus_;
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700146 UpdateAttempterUnderTest attempter_;
Jay Srinivasan55f50c22013-01-10 19:24:35 -0800147 NiceMock<ActionProcessorMock>* processor_;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800148 NiceMock<PrefsMock>* prefs_; // shortcut to mock_system_state_->mock_prefs()
Jay Srinivasan55f50c22013-01-10 19:24:35 -0800149 NiceMock<MockConnectionManager> mock_connection_manager;
Darin Petkove6ef2f82011-03-07 17:31:11 -0800150 GMainLoop* loop_;
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700151
152 string test_dir_;
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700153};
154
Darin Petkov1b003102010-11-30 10:18:36 -0800155TEST_F(UpdateAttempterTest, ActionCompletedDownloadTest) {
156 scoped_ptr<MockHttpFetcher> fetcher(new MockHttpFetcher("", 0, NULL));
157 fetcher->FailTransfer(503); // Sets the HTTP response code.
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800158 DownloadAction action(prefs_, NULL, fetcher.release());
159 EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _)).Times(0);
David Zeuthena99981f2013-04-29 13:42:47 -0700160 attempter_.ActionCompleted(NULL, &action, kErrorCodeSuccess);
Darin Petkov1b003102010-11-30 10:18:36 -0800161 EXPECT_EQ(503, attempter_.http_response_code());
162 EXPECT_EQ(UPDATE_STATUS_FINALIZING, attempter_.status());
163 ASSERT_TRUE(attempter_.error_event_.get() == NULL);
164}
165
166TEST_F(UpdateAttempterTest, ActionCompletedErrorTest) {
167 ActionMock action;
168 EXPECT_CALL(action, Type()).WillRepeatedly(Return("ActionMock"));
169 attempter_.status_ = UPDATE_STATUS_DOWNLOADING;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800170 EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
Darin Petkov1b003102010-11-30 10:18:36 -0800171 .WillOnce(Return(false));
David Zeuthena99981f2013-04-29 13:42:47 -0700172 attempter_.ActionCompleted(NULL, &action, kErrorCodeError);
Darin Petkov1b003102010-11-30 10:18:36 -0800173 ASSERT_TRUE(attempter_.error_event_.get() != NULL);
174}
175
176TEST_F(UpdateAttempterTest, ActionCompletedOmahaRequestTest) {
177 scoped_ptr<MockHttpFetcher> fetcher(new MockHttpFetcher("", 0, NULL));
178 fetcher->FailTransfer(500); // Sets the HTTP response code.
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700179 OmahaRequestAction action(&mock_system_state_, NULL,
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800180 fetcher.release(), false);
Darin Petkov1b003102010-11-30 10:18:36 -0800181 ObjectCollectorAction<OmahaResponse> collector_action;
182 BondActions(&action, &collector_action);
183 OmahaResponse response;
184 response.poll_interval = 234;
185 action.SetOutputObject(response);
Gilad Arnoldbf7919b2013-01-08 13:07:37 -0800186 UpdateCheckScheduler scheduler(&attempter_, &mock_system_state_);
Darin Petkov1b003102010-11-30 10:18:36 -0800187 attempter_.set_update_check_scheduler(&scheduler);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800188 EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _)).Times(0);
David Zeuthena99981f2013-04-29 13:42:47 -0700189 attempter_.ActionCompleted(NULL, &action, kErrorCodeSuccess);
Darin Petkov1b003102010-11-30 10:18:36 -0800190 EXPECT_EQ(500, attempter_.http_response_code());
191 EXPECT_EQ(UPDATE_STATUS_IDLE, attempter_.status());
192 EXPECT_EQ(234, scheduler.poll_interval());
193 ASSERT_TRUE(attempter_.error_event_.get() == NULL);
194}
195
Darin Petkovcd1666f2010-09-23 09:53:44 -0700196TEST_F(UpdateAttempterTest, RunAsRootConstructWithUpdatedMarkerTest) {
Gilad Arnold70e476e2013-07-30 16:01:13 -0700197 string test_update_completed_marker;
198 CHECK(utils::MakeTempFile(
199 "/tmp/update_attempter_unittest-update_completed_marker-XXXXXX",
200 &test_update_completed_marker, NULL));
201 ScopedPathUnlinker completed_marker_unlinker(test_update_completed_marker);
202 const FilePath marker(test_update_completed_marker);
203 EXPECT_EQ(0, file_util::WriteFile(marker, "", 0));
204 UpdateAttempterUnderTest attempter(&mock_system_state_, &dbus_,
205 test_update_completed_marker);
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700206 EXPECT_EQ(UPDATE_STATUS_UPDATED_NEED_REBOOT, attempter.status());
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700207}
208
209TEST_F(UpdateAttempterTest, GetErrorCodeForActionTest) {
David Zeuthena99981f2013-04-29 13:42:47 -0700210 extern ErrorCode GetErrorCodeForAction(AbstractAction* action,
211 ErrorCode code);
212 EXPECT_EQ(kErrorCodeSuccess,
213 GetErrorCodeForAction(NULL, kErrorCodeSuccess));
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700214
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800215 MockSystemState mock_system_state;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700216 OmahaRequestAction omaha_request_action(&mock_system_state, NULL,
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800217 NULL, false);
David Zeuthena99981f2013-04-29 13:42:47 -0700218 EXPECT_EQ(kErrorCodeOmahaRequestError,
219 GetErrorCodeForAction(&omaha_request_action, kErrorCodeError));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800220 OmahaResponseHandlerAction omaha_response_handler_action(&mock_system_state_);
David Zeuthena99981f2013-04-29 13:42:47 -0700221 EXPECT_EQ(kErrorCodeOmahaResponseHandlerError,
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700222 GetErrorCodeForAction(&omaha_response_handler_action,
David Zeuthena99981f2013-04-29 13:42:47 -0700223 kErrorCodeError));
Alex Deymo42432912013-07-12 20:21:15 -0700224 FilesystemCopierAction filesystem_copier_action(
225 &mock_system_state_, false, false);
David Zeuthena99981f2013-04-29 13:42:47 -0700226 EXPECT_EQ(kErrorCodeFilesystemCopierError,
227 GetErrorCodeForAction(&filesystem_copier_action, kErrorCodeError));
Darin Petkov6d5dbf62010-11-08 16:09:55 -0800228 PostinstallRunnerAction postinstall_runner_action;
David Zeuthena99981f2013-04-29 13:42:47 -0700229 EXPECT_EQ(kErrorCodePostinstallRunnerError,
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700230 GetErrorCodeForAction(&postinstall_runner_action,
David Zeuthena99981f2013-04-29 13:42:47 -0700231 kErrorCodeError));
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700232 ActionMock action_mock;
233 EXPECT_CALL(action_mock, Type()).Times(1).WillOnce(Return("ActionMock"));
David Zeuthena99981f2013-04-29 13:42:47 -0700234 EXPECT_EQ(kErrorCodeError,
235 GetErrorCodeForAction(&action_mock, kErrorCodeError));
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700236}
237
Darin Petkov36275772010-10-01 11:40:57 -0700238TEST_F(UpdateAttempterTest, DisableDeltaUpdateIfNeededTest) {
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700239 attempter_.omaha_request_params_->set_delta_okay(true);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800240 EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
Darin Petkov36275772010-10-01 11:40:57 -0700241 .WillOnce(Return(false));
242 attempter_.DisableDeltaUpdateIfNeeded();
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700243 EXPECT_TRUE(attempter_.omaha_request_params_->delta_okay());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800244 EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
Darin Petkov36275772010-10-01 11:40:57 -0700245 .WillOnce(DoAll(
246 SetArgumentPointee<1>(UpdateAttempter::kMaxDeltaUpdateFailures - 1),
247 Return(true)));
248 attempter_.DisableDeltaUpdateIfNeeded();
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700249 EXPECT_TRUE(attempter_.omaha_request_params_->delta_okay());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800250 EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
Darin Petkov36275772010-10-01 11:40:57 -0700251 .WillOnce(DoAll(
252 SetArgumentPointee<1>(UpdateAttempter::kMaxDeltaUpdateFailures),
253 Return(true)));
254 attempter_.DisableDeltaUpdateIfNeeded();
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700255 EXPECT_FALSE(attempter_.omaha_request_params_->delta_okay());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800256 EXPECT_CALL(*prefs_, GetInt64(_, _)).Times(0);
Darin Petkov36275772010-10-01 11:40:57 -0700257 attempter_.DisableDeltaUpdateIfNeeded();
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700258 EXPECT_FALSE(attempter_.omaha_request_params_->delta_okay());
Darin Petkov36275772010-10-01 11:40:57 -0700259}
260
261TEST_F(UpdateAttempterTest, MarkDeltaUpdateFailureTest) {
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800262 EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
Darin Petkov36275772010-10-01 11:40:57 -0700263 .WillOnce(Return(false))
264 .WillOnce(DoAll(SetArgumentPointee<1>(-1), Return(true)))
265 .WillOnce(DoAll(SetArgumentPointee<1>(1), Return(true)))
266 .WillOnce(DoAll(
267 SetArgumentPointee<1>(UpdateAttempter::kMaxDeltaUpdateFailures),
268 Return(true)));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800269 EXPECT_CALL(*prefs_, SetInt64(Ne(kPrefsDeltaUpdateFailures), _))
Darin Petkov2dd01092010-10-08 15:43:05 -0700270 .WillRepeatedly(Return(true));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800271 EXPECT_CALL(*prefs_, SetInt64(kPrefsDeltaUpdateFailures, 1)).Times(2);
272 EXPECT_CALL(*prefs_, SetInt64(kPrefsDeltaUpdateFailures, 2)).Times(1);
273 EXPECT_CALL(*prefs_, SetInt64(kPrefsDeltaUpdateFailures,
Darin Petkov36275772010-10-01 11:40:57 -0700274 UpdateAttempter::kMaxDeltaUpdateFailures + 1))
275 .Times(1);
276 for (int i = 0; i < 4; i ++)
277 attempter_.MarkDeltaUpdateFailure();
278}
279
Darin Petkov1b003102010-11-30 10:18:36 -0800280TEST_F(UpdateAttempterTest, ScheduleErrorEventActionNoEventTest) {
281 EXPECT_CALL(*processor_, EnqueueAction(_)).Times(0);
282 EXPECT_CALL(*processor_, StartProcessing()).Times(0);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800283 EXPECT_CALL(*mock_system_state_.mock_payload_state(), UpdateFailed(_))
284 .Times(0);
285 OmahaResponse response;
Jay Srinivasan53173b92013-05-17 17:13:01 -0700286 string url1 = "http://url1";
287 response.payload_urls.push_back(url1);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800288 response.payload_urls.push_back("https://url");
Jay Srinivasan53173b92013-05-17 17:13:01 -0700289 EXPECT_CALL(*(mock_system_state_.mock_payload_state()), GetCurrentUrl())
290 .WillRepeatedly(Return(url1));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800291 mock_system_state_.mock_payload_state()->SetResponse(response);
Darin Petkov1b003102010-11-30 10:18:36 -0800292 attempter_.ScheduleErrorEventAction();
Jay Srinivasan53173b92013-05-17 17:13:01 -0700293 EXPECT_EQ(url1, mock_system_state_.mock_payload_state()->GetCurrentUrl());
Darin Petkov1b003102010-11-30 10:18:36 -0800294}
295
296TEST_F(UpdateAttempterTest, ScheduleErrorEventActionTest) {
297 EXPECT_CALL(*processor_,
298 EnqueueAction(Property(&AbstractAction::Type,
299 OmahaRequestAction::StaticType())))
300 .Times(1);
301 EXPECT_CALL(*processor_, StartProcessing()).Times(1);
David Zeuthena99981f2013-04-29 13:42:47 -0700302 ErrorCode err = kErrorCodeError;
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800303 EXPECT_CALL(*mock_system_state_.mock_payload_state(), UpdateFailed(err));
Darin Petkov1b003102010-11-30 10:18:36 -0800304 attempter_.error_event_.reset(new OmahaEvent(OmahaEvent::kTypeUpdateComplete,
305 OmahaEvent::kResultError,
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800306 err));
Darin Petkov1b003102010-11-30 10:18:36 -0800307 attempter_.ScheduleErrorEventAction();
308 EXPECT_EQ(UPDATE_STATUS_REPORTING_ERROR_EVENT, attempter_.status());
309}
310
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700311TEST_F(UpdateAttempterTest, UpdateStatusToStringTest) {
312 extern const char* UpdateStatusToString(UpdateStatus);
313 EXPECT_STREQ("UPDATE_STATUS_IDLE", UpdateStatusToString(UPDATE_STATUS_IDLE));
314 EXPECT_STREQ("UPDATE_STATUS_CHECKING_FOR_UPDATE",
315 UpdateStatusToString(UPDATE_STATUS_CHECKING_FOR_UPDATE));
316 EXPECT_STREQ("UPDATE_STATUS_UPDATE_AVAILABLE",
317 UpdateStatusToString(UPDATE_STATUS_UPDATE_AVAILABLE));
318 EXPECT_STREQ("UPDATE_STATUS_DOWNLOADING",
319 UpdateStatusToString(UPDATE_STATUS_DOWNLOADING));
320 EXPECT_STREQ("UPDATE_STATUS_VERIFYING",
321 UpdateStatusToString(UPDATE_STATUS_VERIFYING));
322 EXPECT_STREQ("UPDATE_STATUS_FINALIZING",
323 UpdateStatusToString(UPDATE_STATUS_FINALIZING));
324 EXPECT_STREQ("UPDATE_STATUS_UPDATED_NEED_REBOOT",
325 UpdateStatusToString(UPDATE_STATUS_UPDATED_NEED_REBOOT));
326 EXPECT_STREQ("UPDATE_STATUS_REPORTING_ERROR_EVENT",
327 UpdateStatusToString(UPDATE_STATUS_REPORTING_ERROR_EVENT));
328 EXPECT_STREQ("unknown status",
329 UpdateStatusToString(static_cast<UpdateStatus>(-1)));
330}
331
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200332void UpdateAttempterTest::QuitMainLoop() {
333 g_main_loop_quit(loop_);
334}
335
336gboolean UpdateAttempterTest::StaticQuitMainLoop(gpointer data) {
337 reinterpret_cast<UpdateAttempterTest*>(data)->QuitMainLoop();
338 return FALSE;
339}
340
Darin Petkove6ef2f82011-03-07 17:31:11 -0800341gboolean UpdateAttempterTest::StaticUpdateTestStart(gpointer data) {
342 reinterpret_cast<UpdateAttempterTest*>(data)->UpdateTestStart();
343 return FALSE;
344}
345
346gboolean UpdateAttempterTest::StaticUpdateTestVerify(gpointer data) {
347 reinterpret_cast<UpdateAttempterTest*>(data)->UpdateTestVerify();
348 return FALSE;
349}
350
Chris Sosa76a29ae2013-07-11 17:59:24 -0700351gboolean UpdateAttempterTest::StaticRollbackTestStart(gpointer data) {
Chris Sosa28e479c2013-07-12 11:39:53 -0700352 reinterpret_cast<UpdateAttempterTest*>(data)->RollbackTestStart(false, false);
Chris Sosa76a29ae2013-07-11 17:59:24 -0700353 return FALSE;
354}
355
356gboolean UpdateAttempterTest::StaticEnterpriseRollbackTestStart(gpointer data) {
Chris Sosa28e479c2013-07-12 11:39:53 -0700357 reinterpret_cast<UpdateAttempterTest*>(data)->RollbackTestStart(true, false);
358 return FALSE;
359}
360
361gboolean UpdateAttempterTest::StaticStableChannelRollbackTestStart(
362 gpointer data) {
363 reinterpret_cast<UpdateAttempterTest*>(data)->RollbackTestStart(
364 false, true);
Chris Sosa76a29ae2013-07-11 17:59:24 -0700365 return FALSE;
366}
367
368gboolean UpdateAttempterTest::StaticRollbackTestVerify(gpointer data) {
369 reinterpret_cast<UpdateAttempterTest*>(data)->RollbackTestVerify();
370 return FALSE;
371}
372
Thieu Le116fda32011-04-19 11:01:54 -0700373gboolean UpdateAttempterTest::StaticPingOmahaTestStart(gpointer data) {
374 reinterpret_cast<UpdateAttempterTest*>(data)->PingOmahaTestStart();
375 return FALSE;
376}
377
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700378gboolean UpdateAttempterTest::StaticReadChannelFromPolicyTestStart(
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200379 gpointer data) {
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700380 UpdateAttempterTest* ua_test = reinterpret_cast<UpdateAttempterTest*>(data);
381 ua_test->ReadChannelFromPolicyTestStart();
Thieu Le116fda32011-04-19 11:01:54 -0700382 return FALSE;
383}
384
Jay Srinivasan0a708742012-03-20 11:26:12 -0700385gboolean UpdateAttempterTest::StaticReadUpdateDisabledFromPolicyTestStart(
386 gpointer data) {
387 UpdateAttempterTest* ua_test = reinterpret_cast<UpdateAttempterTest*>(data);
388 ua_test->ReadUpdateDisabledFromPolicyTestStart();
389 return FALSE;
390}
391
392gboolean UpdateAttempterTest::StaticReadTargetVersionPrefixFromPolicyTestStart(
393 gpointer data) {
394 UpdateAttempterTest* ua_test = reinterpret_cast<UpdateAttempterTest*>(data);
395 ua_test->ReadTargetVersionPrefixFromPolicyTestStart();
396 return FALSE;
397}
398
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700399gboolean UpdateAttempterTest::StaticReadScatterFactorFromPolicyTestStart(
400 gpointer data) {
401 UpdateAttempterTest* ua_test = reinterpret_cast<UpdateAttempterTest*>(data);
402 ua_test->ReadScatterFactorFromPolicyTestStart();
403 return FALSE;
404}
405
406gboolean UpdateAttempterTest::StaticDecrementUpdateCheckCountTestStart(
407 gpointer data) {
408 UpdateAttempterTest* ua_test = reinterpret_cast<UpdateAttempterTest*>(data);
409 ua_test->DecrementUpdateCheckCountTestStart();
410 return FALSE;
411}
412
Jay Srinivasan08fce042012-06-07 16:31:01 -0700413gboolean UpdateAttempterTest::StaticNoScatteringDoneDuringManualUpdateTestStart(
414 gpointer data) {
415 UpdateAttempterTest* ua_test = reinterpret_cast<UpdateAttempterTest*>(data);
416 ua_test->NoScatteringDoneDuringManualUpdateTestStart();
417 return FALSE;
418}
419
Darin Petkove6ef2f82011-03-07 17:31:11 -0800420namespace {
Chris Sosa76a29ae2013-07-11 17:59:24 -0700421// Actions that will be built as part of an update check.
422const string kUpdateActionTypes[] = {
Darin Petkove6ef2f82011-03-07 17:31:11 -0800423 OmahaRequestAction::StaticType(),
424 OmahaResponseHandlerAction::StaticType(),
425 FilesystemCopierAction::StaticType(),
426 FilesystemCopierAction::StaticType(),
427 OmahaRequestAction::StaticType(),
428 DownloadAction::StaticType(),
429 OmahaRequestAction::StaticType(),
430 FilesystemCopierAction::StaticType(),
431 FilesystemCopierAction::StaticType(),
432 PostinstallRunnerAction::StaticType(),
433 OmahaRequestAction::StaticType()
434};
Chris Sosa76a29ae2013-07-11 17:59:24 -0700435
436// Actions that will be built as part of a user-initiated rollback.
437const string kRollbackActionTypes[] = {
438 InstallPlanAction::StaticType(),
439 PostinstallRunnerAction::StaticType(),
440};
441
Darin Petkove6ef2f82011-03-07 17:31:11 -0800442} // namespace {}
443
444void UpdateAttempterTest::UpdateTestStart() {
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700445 attempter_.set_http_response_code(200);
446 InSequence s;
Chris Sosa76a29ae2013-07-11 17:59:24 -0700447 for (size_t i = 0; i < arraysize(kUpdateActionTypes); ++i) {
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700448 EXPECT_CALL(*processor_,
449 EnqueueAction(Property(&AbstractAction::Type,
Chris Sosa76a29ae2013-07-11 17:59:24 -0700450 kUpdateActionTypes[i]))).Times(1);
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700451 }
452 EXPECT_CALL(*processor_, StartProcessing()).Times(1);
453
Gilad Arnoldb92f0df2013-01-10 16:32:45 -0800454 attempter_.Update("", "", false, false, false);
Darin Petkove6ef2f82011-03-07 17:31:11 -0800455 g_idle_add(&StaticUpdateTestVerify, this);
456}
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700457
Darin Petkove6ef2f82011-03-07 17:31:11 -0800458void UpdateAttempterTest::UpdateTestVerify() {
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700459 EXPECT_EQ(0, attempter_.http_response_code());
460 EXPECT_EQ(&attempter_, processor_->delegate());
Chris Sosa76a29ae2013-07-11 17:59:24 -0700461 EXPECT_EQ(arraysize(kUpdateActionTypes), attempter_.actions_.size());
462 for (size_t i = 0; i < arraysize(kUpdateActionTypes); ++i) {
463 EXPECT_EQ(kUpdateActionTypes[i], attempter_.actions_[i]->Type());
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700464 }
465 EXPECT_EQ(attempter_.response_handler_action_.get(),
466 attempter_.actions_[1].get());
467 DownloadAction* download_action =
468 dynamic_cast<DownloadAction*>(attempter_.actions_[5].get());
469 ASSERT_TRUE(download_action != NULL);
470 EXPECT_EQ(&attempter_, download_action->delegate());
471 EXPECT_EQ(UPDATE_STATUS_CHECKING_FOR_UPDATE, attempter_.status());
Darin Petkove6ef2f82011-03-07 17:31:11 -0800472 g_main_loop_quit(loop_);
473}
474
Chris Sosa28e479c2013-07-12 11:39:53 -0700475void UpdateAttempterTest::RollbackTestStart(
476 bool enterprise_rollback, bool stable_channel) {
Chris Sosa76a29ae2013-07-11 17:59:24 -0700477 // Create a device policy so that we can change settings.
478 policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
479 attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
480
481 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
482 EXPECT_CALL(mock_system_state_, device_policy()).WillRepeatedly(
483 Return(device_policy));
484
485 string install_path = "/dev/sda3";
Chris Sosa28e479c2013-07-12 11:39:53 -0700486 bool is_rollback_allowed = false;
Chris Sosa76a29ae2013-07-11 17:59:24 -0700487
Chris Sosa28e479c2013-07-12 11:39:53 -0700488 // We only allow rollback on devices that are neither enterprise enrolled or
489 // not on the stable channel.
490 if (!(enterprise_rollback || stable_channel)) {
491 is_rollback_allowed = true;
492 }
493
494 // Set up the policy for the test given our args.
495 if (stable_channel) {
496 attempter_.omaha_request_params_->set_current_channel(
497 string("stable-channel"));
498 } else if (enterprise_rollback) {
499 // We return an empty owner as this is an enterprise.
500 EXPECT_CALL(*device_policy, GetOwner(_)).WillOnce(
501 DoAll(SetArgumentPointee<0>(std::string("")),
502 Return(true)));
503 } else {
504 // We return a fake owner as this is an owned consumer device.
Chris Sosa76a29ae2013-07-11 17:59:24 -0700505 EXPECT_CALL(*device_policy, GetOwner(_)).WillOnce(
506 DoAll(SetArgumentPointee<0>(std::string("fake.mail@fake.com")),
507 Return(true)));
Chris Sosa28e479c2013-07-12 11:39:53 -0700508 }
Chris Sosa76a29ae2013-07-11 17:59:24 -0700509
Chris Sosa28e479c2013-07-12 11:39:53 -0700510 if (is_rollback_allowed) {
Chris Sosa76a29ae2013-07-11 17:59:24 -0700511 InSequence s;
512 for (size_t i = 0; i < arraysize(kRollbackActionTypes); ++i) {
513 EXPECT_CALL(*processor_,
514 EnqueueAction(Property(&AbstractAction::Type,
515 kRollbackActionTypes[i]))).Times(1);
516 }
517 EXPECT_CALL(*processor_, StartProcessing()).Times(1);
518
519 EXPECT_TRUE(attempter_.Rollback(true, &install_path));
520 g_idle_add(&StaticRollbackTestVerify, this);
521 } else {
Chris Sosa76a29ae2013-07-11 17:59:24 -0700522 EXPECT_FALSE(attempter_.Rollback(true, &install_path));
523 g_main_loop_quit(loop_);
524 }
525}
526
527void UpdateAttempterTest::RollbackTestVerify() {
528 // Verifies the actions that were enqueued.
529 EXPECT_EQ(&attempter_, processor_->delegate());
530 EXPECT_EQ(arraysize(kRollbackActionTypes), attempter_.actions_.size());
531 for (size_t i = 0; i < arraysize(kRollbackActionTypes); ++i) {
532 EXPECT_EQ(kRollbackActionTypes[i], attempter_.actions_[i]->Type());
533 }
534 EXPECT_EQ(UPDATE_STATUS_ATTEMPTING_ROLLBACK, attempter_.status());
535 InstallPlanAction* install_plan_action =
536 dynamic_cast<InstallPlanAction*>(attempter_.actions_[0].get());
537 InstallPlan* install_plan = install_plan_action->install_plan();
538 EXPECT_EQ(install_plan->install_path, string("/dev/sda3"));
539 EXPECT_EQ(install_plan->kernel_install_path, string("/dev/sda2"));
540 EXPECT_EQ(install_plan->powerwash_required, true);
541 g_main_loop_quit(loop_);
542}
543
Darin Petkove6ef2f82011-03-07 17:31:11 -0800544TEST_F(UpdateAttempterTest, UpdateTest) {
545 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
546 g_idle_add(&StaticUpdateTestStart, this);
547 g_main_loop_run(loop_);
548 g_main_loop_unref(loop_);
549 loop_ = NULL;
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700550}
551
Chris Sosa76a29ae2013-07-11 17:59:24 -0700552TEST_F(UpdateAttempterTest, RollbackTest) {
553 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
554 g_idle_add(&StaticRollbackTestStart, this);
555 g_main_loop_run(loop_);
556 g_main_loop_unref(loop_);
557 loop_ = NULL;
558}
559
Chris Sosa28e479c2013-07-12 11:39:53 -0700560TEST_F(UpdateAttempterTest, StableChannelRollbackTest) {
561 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
562 g_idle_add(&StaticStableChannelRollbackTestStart, this);
563 g_main_loop_run(loop_);
564 g_main_loop_unref(loop_);
565 loop_ = NULL;
566}
567
Chris Sosa76a29ae2013-07-11 17:59:24 -0700568TEST_F(UpdateAttempterTest, EnterpriseRollbackTest) {
569 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
570 g_idle_add(&StaticEnterpriseRollbackTestStart, this);
571 g_main_loop_run(loop_);
572 g_main_loop_unref(loop_);
573 loop_ = NULL;
574}
575
Thieu Le116fda32011-04-19 11:01:54 -0700576void UpdateAttempterTest::PingOmahaTestStart() {
577 EXPECT_CALL(*processor_,
578 EnqueueAction(Property(&AbstractAction::Type,
579 OmahaRequestAction::StaticType())))
580 .Times(1);
581 EXPECT_CALL(*processor_, StartProcessing()).Times(1);
582 attempter_.PingOmaha();
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200583 g_idle_add(&StaticQuitMainLoop, this);
Thieu Le116fda32011-04-19 11:01:54 -0700584}
585
586TEST_F(UpdateAttempterTest, PingOmahaTest) {
Gilad Arnoldbf7919b2013-01-08 13:07:37 -0800587 UpdateCheckScheduler scheduler(&attempter_, &mock_system_state_);
Thieu Le116fda32011-04-19 11:01:54 -0700588 scheduler.enabled_ = true;
Andrew de los Reyese05fc282011-06-02 09:50:08 -0700589 EXPECT_FALSE(scheduler.scheduled_);
Thieu Le116fda32011-04-19 11:01:54 -0700590 attempter_.set_update_check_scheduler(&scheduler);
591 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
592 g_idle_add(&StaticPingOmahaTestStart, this);
593 g_main_loop_run(loop_);
594 g_main_loop_unref(loop_);
595 loop_ = NULL;
596 EXPECT_EQ(UPDATE_STATUS_UPDATED_NEED_REBOOT, attempter_.status());
597 EXPECT_EQ(true, scheduler.scheduled_);
598}
599
Darin Petkov18c7bce2011-06-16 14:07:00 -0700600TEST_F(UpdateAttempterTest, CreatePendingErrorEventTest) {
601 ActionMock action;
David Zeuthena99981f2013-04-29 13:42:47 -0700602 const ErrorCode kCode = kErrorCodeDownloadTransferError;
Darin Petkov18c7bce2011-06-16 14:07:00 -0700603 attempter_.CreatePendingErrorEvent(&action, kCode);
604 ASSERT_TRUE(attempter_.error_event_.get() != NULL);
605 EXPECT_EQ(OmahaEvent::kTypeUpdateComplete, attempter_.error_event_->type);
606 EXPECT_EQ(OmahaEvent::kResultError, attempter_.error_event_->result);
David Zeuthena99981f2013-04-29 13:42:47 -0700607 EXPECT_EQ(kCode | kErrorCodeTestOmahaUrlFlag,
Jay Srinivasan55f50c22013-01-10 19:24:35 -0800608 attempter_.error_event_->error_code);
Darin Petkov18c7bce2011-06-16 14:07:00 -0700609}
610
611TEST_F(UpdateAttempterTest, CreatePendingErrorEventResumedTest) {
612 OmahaResponseHandlerAction *response_action =
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800613 new OmahaResponseHandlerAction(&mock_system_state_);
Darin Petkov18c7bce2011-06-16 14:07:00 -0700614 response_action->install_plan_.is_resume = true;
615 attempter_.response_handler_action_.reset(response_action);
616 ActionMock action;
David Zeuthena99981f2013-04-29 13:42:47 -0700617 const ErrorCode kCode = kErrorCodeInstallDeviceOpenError;
Darin Petkov18c7bce2011-06-16 14:07:00 -0700618 attempter_.CreatePendingErrorEvent(&action, kCode);
619 ASSERT_TRUE(attempter_.error_event_.get() != NULL);
620 EXPECT_EQ(OmahaEvent::kTypeUpdateComplete, attempter_.error_event_->type);
621 EXPECT_EQ(OmahaEvent::kResultError, attempter_.error_event_->result);
David Zeuthena99981f2013-04-29 13:42:47 -0700622 EXPECT_EQ(kCode | kErrorCodeResumedFlag | kErrorCodeTestOmahaUrlFlag,
Darin Petkov18c7bce2011-06-16 14:07:00 -0700623 attempter_.error_event_->error_code);
624}
625
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700626TEST_F(UpdateAttempterTest, ReadChannelFromPolicy) {
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200627 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700628 g_idle_add(&StaticReadChannelFromPolicyTestStart, this);
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200629 g_main_loop_run(loop_);
630 g_main_loop_unref(loop_);
631 loop_ = NULL;
632}
633
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700634void UpdateAttempterTest::ReadChannelFromPolicyTestStart() {
635 // Tests that the update channel (aka release channel) is properly fetched
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200636 // from the device policy.
637
638 policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
639 attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
640
641 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700642 EXPECT_CALL(mock_system_state_, device_policy()).WillRepeatedly(
643 Return(device_policy));
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200644
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700645 EXPECT_CALL(*device_policy, GetReleaseChannelDelegated(_)).WillRepeatedly(
646 DoAll(SetArgumentPointee<0>(bool(false)),
647 Return(true)));
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200648
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700649 EXPECT_CALL(*device_policy, GetReleaseChannel(_)).WillRepeatedly(
650 DoAll(SetArgumentPointee<0>(std::string("beta-channel")),
651 Return(true)));
652
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700653 ASSERT_FALSE(test_dir_.empty());
654 attempter_.omaha_request_params_->set_root(test_dir_);
Gilad Arnoldb92f0df2013-01-10 16:32:45 -0800655 attempter_.Update("", "", false, false, false);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700656 EXPECT_EQ("beta-channel",
657 attempter_.omaha_request_params_->target_channel());
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200658
659 g_idle_add(&StaticQuitMainLoop, this);
660}
661
Jay Srinivasan0a708742012-03-20 11:26:12 -0700662TEST_F(UpdateAttempterTest, ReadUpdateDisabledFromPolicy) {
663 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
664 g_idle_add(&StaticReadUpdateDisabledFromPolicyTestStart, this);
665 g_main_loop_run(loop_);
666 g_main_loop_unref(loop_);
667 loop_ = NULL;
668}
669
670void UpdateAttempterTest::ReadUpdateDisabledFromPolicyTestStart() {
671 // Tests that the update_disbled flag is properly fetched
672 // from the device policy.
673
674 policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
675 attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
676
677 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700678 EXPECT_CALL(mock_system_state_, device_policy()).WillRepeatedly(
679 Return(device_policy));
Jay Srinivasan0a708742012-03-20 11:26:12 -0700680
681 EXPECT_CALL(*device_policy, GetUpdateDisabled(_))
682 .WillRepeatedly(DoAll(
683 SetArgumentPointee<0>(true),
684 Return(true)));
685
Gilad Arnoldb92f0df2013-01-10 16:32:45 -0800686 attempter_.Update("", "", false, false, false);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700687 EXPECT_TRUE(attempter_.omaha_request_params_->update_disabled());
Jay Srinivasan0a708742012-03-20 11:26:12 -0700688
689 g_idle_add(&StaticQuitMainLoop, this);
690}
691
David Zeuthen8f191b22013-08-06 12:27:50 -0700692TEST_F(UpdateAttempterTest, P2PNotStartedAtStartupWhenNotEnabled) {
693 MockP2PManager mock_p2p_manager;
694 mock_system_state_.set_p2p_manager(&mock_p2p_manager);
695 mock_p2p_manager.fake().SetP2PEnabled(false);
696 EXPECT_CALL(mock_p2p_manager, EnsureP2PRunning()).Times(0);
697 attempter_.UpdateEngineStarted();
698}
699
700TEST_F(UpdateAttempterTest, P2PNotStartedAtStartupWhenEnabledButNotSharing) {
701 MockP2PManager mock_p2p_manager;
702 mock_system_state_.set_p2p_manager(&mock_p2p_manager);
703 mock_p2p_manager.fake().SetP2PEnabled(true);
704 EXPECT_CALL(mock_p2p_manager, EnsureP2PRunning()).Times(0);
705 attempter_.UpdateEngineStarted();
706}
707
708TEST_F(UpdateAttempterTest, P2PStartedAtStartupWhenEnabledAndSharing) {
709 MockP2PManager mock_p2p_manager;
710 mock_system_state_.set_p2p_manager(&mock_p2p_manager);
711 mock_p2p_manager.fake().SetP2PEnabled(true);
712 mock_p2p_manager.fake().SetCountSharedFilesResult(1);
713 EXPECT_CALL(mock_p2p_manager, EnsureP2PRunning()).Times(1);
714 attempter_.UpdateEngineStarted();
715}
716
717TEST_F(UpdateAttempterTest, P2PNotEnabled) {
718 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
719 g_idle_add(&StaticP2PNotEnabled, this);
720 g_main_loop_run(loop_);
721 g_main_loop_unref(loop_);
722 loop_ = NULL;
723}
724gboolean UpdateAttempterTest::StaticP2PNotEnabled(gpointer data) {
725 UpdateAttempterTest* ua_test = reinterpret_cast<UpdateAttempterTest*>(data);
726 ua_test->P2PNotEnabledStart();
727 return FALSE;
728}
729void UpdateAttempterTest::P2PNotEnabledStart() {
730 // If P2P is not enabled, check that we do not attempt housekeeping
731 // and do not convey that p2p is to be used.
732 MockP2PManager mock_p2p_manager;
733 mock_system_state_.set_p2p_manager(&mock_p2p_manager);
734 mock_p2p_manager.fake().SetP2PEnabled(false);
735 EXPECT_CALL(mock_p2p_manager, PerformHousekeeping()).Times(0);
736 attempter_.Update("", "", false, false, false);
737 EXPECT_FALSE(attempter_.omaha_request_params_->use_p2p_for_downloading());
738 EXPECT_FALSE(attempter_.omaha_request_params_->use_p2p_for_sharing());
739 g_idle_add(&StaticQuitMainLoop, this);
740}
741
742TEST_F(UpdateAttempterTest, P2PEnabledStartingFails) {
743 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
744 g_idle_add(&StaticP2PEnabledStartingFails, this);
745 g_main_loop_run(loop_);
746 g_main_loop_unref(loop_);
747 loop_ = NULL;
748}
749gboolean UpdateAttempterTest::StaticP2PEnabledStartingFails(
750 gpointer data) {
751 UpdateAttempterTest* ua_test = reinterpret_cast<UpdateAttempterTest*>(data);
752 ua_test->P2PEnabledStartingFailsStart();
753 return FALSE;
754}
755void UpdateAttempterTest::P2PEnabledStartingFailsStart() {
756 // If p2p is enabled, but starting it fails ensure we don't do
757 // any housekeeping and do not convey that p2p should be used.
758 MockP2PManager mock_p2p_manager;
759 mock_system_state_.set_p2p_manager(&mock_p2p_manager);
760 mock_p2p_manager.fake().SetP2PEnabled(true);
761 mock_p2p_manager.fake().SetEnsureP2PRunningResult(false);
762 mock_p2p_manager.fake().SetPerformHousekeepingResult(false);
763 EXPECT_CALL(mock_p2p_manager, PerformHousekeeping()).Times(0);
764 attempter_.Update("", "", false, false, false);
765 EXPECT_FALSE(attempter_.omaha_request_params_->use_p2p_for_downloading());
766 EXPECT_FALSE(attempter_.omaha_request_params_->use_p2p_for_sharing());
767 g_idle_add(&StaticQuitMainLoop, this);
768}
769
770TEST_F(UpdateAttempterTest, P2PEnabledHousekeepingFails) {
771 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
772 g_idle_add(&StaticP2PEnabledHousekeepingFails, this);
773 g_main_loop_run(loop_);
774 g_main_loop_unref(loop_);
775 loop_ = NULL;
776}
777gboolean UpdateAttempterTest::StaticP2PEnabledHousekeepingFails(
778 gpointer data) {
779 UpdateAttempterTest* ua_test = reinterpret_cast<UpdateAttempterTest*>(data);
780 ua_test->P2PEnabledHousekeepingFailsStart();
781 return FALSE;
782}
783void UpdateAttempterTest::P2PEnabledHousekeepingFailsStart() {
784 // If p2p is enabled, starting it works but housekeeping fails, ensure
785 // we do not convey p2p is to be used.
786 MockP2PManager mock_p2p_manager;
787 mock_system_state_.set_p2p_manager(&mock_p2p_manager);
788 mock_p2p_manager.fake().SetP2PEnabled(true);
789 mock_p2p_manager.fake().SetEnsureP2PRunningResult(true);
790 mock_p2p_manager.fake().SetPerformHousekeepingResult(false);
791 EXPECT_CALL(mock_p2p_manager, PerformHousekeeping()).Times(1);
792 attempter_.Update("", "", false, false, false);
793 EXPECT_FALSE(attempter_.omaha_request_params_->use_p2p_for_downloading());
794 EXPECT_FALSE(attempter_.omaha_request_params_->use_p2p_for_sharing());
795 g_idle_add(&StaticQuitMainLoop, this);
796}
797
798TEST_F(UpdateAttempterTest, P2PEnabled) {
799 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
800 g_idle_add(&StaticP2PEnabled, this);
801 g_main_loop_run(loop_);
802 g_main_loop_unref(loop_);
803 loop_ = NULL;
804}
805gboolean UpdateAttempterTest::StaticP2PEnabled(gpointer data) {
806 UpdateAttempterTest* ua_test = reinterpret_cast<UpdateAttempterTest*>(data);
807 ua_test->P2PEnabledStart();
808 return FALSE;
809}
810void UpdateAttempterTest::P2PEnabledStart() {
811 MockP2PManager mock_p2p_manager;
812 mock_system_state_.set_p2p_manager(&mock_p2p_manager);
813 // If P2P is enabled and starting it works, check that we performed
814 // housekeeping and that we convey p2p should be used.
815 mock_p2p_manager.fake().SetP2PEnabled(true);
816 mock_p2p_manager.fake().SetEnsureP2PRunningResult(true);
817 mock_p2p_manager.fake().SetPerformHousekeepingResult(true);
818 EXPECT_CALL(mock_p2p_manager, PerformHousekeeping()).Times(1);
819 attempter_.Update("", "", false, false, false);
820 EXPECT_TRUE(attempter_.omaha_request_params_->use_p2p_for_downloading());
821 EXPECT_TRUE(attempter_.omaha_request_params_->use_p2p_for_sharing());
822 g_idle_add(&StaticQuitMainLoop, this);
823}
824
825TEST_F(UpdateAttempterTest, P2PEnabledInteractive) {
826 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
827 g_idle_add(&StaticP2PEnabledInteractive, this);
828 g_main_loop_run(loop_);
829 g_main_loop_unref(loop_);
830 loop_ = NULL;
831}
832gboolean UpdateAttempterTest::StaticP2PEnabledInteractive(gpointer data) {
833 UpdateAttempterTest* ua_test = reinterpret_cast<UpdateAttempterTest*>(data);
834 ua_test->P2PEnabledInteractiveStart();
835 return FALSE;
836}
837void UpdateAttempterTest::P2PEnabledInteractiveStart() {
838 MockP2PManager mock_p2p_manager;
839 mock_system_state_.set_p2p_manager(&mock_p2p_manager);
840 // For an interactive check, if P2P is enabled and starting it
841 // works, check that we performed housekeeping and that we convey
842 // p2p should be used for sharing but NOT for downloading.
843 mock_p2p_manager.fake().SetP2PEnabled(true);
844 mock_p2p_manager.fake().SetEnsureP2PRunningResult(true);
845 mock_p2p_manager.fake().SetPerformHousekeepingResult(true);
846 EXPECT_CALL(mock_p2p_manager, PerformHousekeeping()).Times(1);
847 attempter_.Update("", "", false, true /* interactive */, false);
848 EXPECT_FALSE(attempter_.omaha_request_params_->use_p2p_for_downloading());
849 EXPECT_TRUE(attempter_.omaha_request_params_->use_p2p_for_sharing());
850 g_idle_add(&StaticQuitMainLoop, this);
851}
852
Jay Srinivasan0a708742012-03-20 11:26:12 -0700853TEST_F(UpdateAttempterTest, ReadTargetVersionPrefixFromPolicy) {
854 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
855 g_idle_add(&StaticReadTargetVersionPrefixFromPolicyTestStart, this);
856 g_main_loop_run(loop_);
857 g_main_loop_unref(loop_);
858 loop_ = NULL;
859}
860
861void UpdateAttempterTest::ReadTargetVersionPrefixFromPolicyTestStart() {
862 // Tests that the target_version_prefix value is properly fetched
863 // from the device policy.
864
865 const std::string target_version_prefix = "1412.";
866
867 policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
868 attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
869
870 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700871 EXPECT_CALL(mock_system_state_, device_policy()).WillRepeatedly(
872 Return(device_policy));
Jay Srinivasan0a708742012-03-20 11:26:12 -0700873
874 EXPECT_CALL(*device_policy, GetTargetVersionPrefix(_))
875 .WillRepeatedly(DoAll(
876 SetArgumentPointee<0>(target_version_prefix),
877 Return(true)));
878
Gilad Arnoldb92f0df2013-01-10 16:32:45 -0800879 attempter_.Update("", "", false, false, false);
Jay Srinivasan0a708742012-03-20 11:26:12 -0700880 EXPECT_EQ(target_version_prefix.c_str(),
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700881 attempter_.omaha_request_params_->target_version_prefix());
Jay Srinivasan0a708742012-03-20 11:26:12 -0700882
883 g_idle_add(&StaticQuitMainLoop, this);
884}
885
886
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700887TEST_F(UpdateAttempterTest, ReadScatterFactorFromPolicy) {
888 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
889 g_idle_add(&StaticReadScatterFactorFromPolicyTestStart, this);
890 g_main_loop_run(loop_);
891 g_main_loop_unref(loop_);
892 loop_ = NULL;
893}
894
895// Tests that the scatter_factor_in_seconds value is properly fetched
896// from the device policy.
897void UpdateAttempterTest::ReadScatterFactorFromPolicyTestStart() {
898 int64 scatter_factor_in_seconds = 36000;
899
900 policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
901 attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
902
903 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800904 EXPECT_CALL(mock_system_state_, device_policy()).WillRepeatedly(
Jay Srinivasan21be0752012-07-25 15:44:56 -0700905 Return(device_policy));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700906
907 EXPECT_CALL(*device_policy, GetScatterFactorInSeconds(_))
908 .WillRepeatedly(DoAll(
909 SetArgumentPointee<0>(scatter_factor_in_seconds),
910 Return(true)));
911
Gilad Arnoldb92f0df2013-01-10 16:32:45 -0800912 attempter_.Update("", "", false, false, false);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700913 EXPECT_EQ(scatter_factor_in_seconds, attempter_.scatter_factor_.InSeconds());
914
915 g_idle_add(&StaticQuitMainLoop, this);
916}
917
918TEST_F(UpdateAttempterTest, DecrementUpdateCheckCountTest) {
919 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
920 g_idle_add(&StaticDecrementUpdateCheckCountTestStart, this);
921 g_main_loop_run(loop_);
922 g_main_loop_unref(loop_);
923 loop_ = NULL;
924}
925
926void UpdateAttempterTest::DecrementUpdateCheckCountTestStart() {
927 // Tests that the scatter_factor_in_seconds value is properly fetched
928 // from the device policy and is decremented if value > 0.
929 int64 initial_value = 5;
930 Prefs prefs;
931 attempter_.prefs_ = &prefs;
932
Jay Srinivasan08fce042012-06-07 16:31:01 -0700933 EXPECT_CALL(mock_system_state_,
934 IsOOBEComplete()).WillRepeatedly(Return(true));
935
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700936 string prefs_dir;
937 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
938 &prefs_dir));
939 ScopedDirRemover temp_dir_remover(prefs_dir);
940
941 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
942 << "Failed to initialize preferences.";
943 EXPECT_TRUE(prefs.SetInt64(kPrefsUpdateCheckCount, initial_value));
944
945 int64 scatter_factor_in_seconds = 10;
946
947 policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
948 attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
949
950 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800951 EXPECT_CALL(mock_system_state_, device_policy()).WillRepeatedly(
Jay Srinivasan21be0752012-07-25 15:44:56 -0700952 Return(device_policy));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700953
954 EXPECT_CALL(*device_policy, GetScatterFactorInSeconds(_))
955 .WillRepeatedly(DoAll(
956 SetArgumentPointee<0>(scatter_factor_in_seconds),
957 Return(true)));
958
Gilad Arnoldb92f0df2013-01-10 16:32:45 -0800959 attempter_.Update("", "", false, false, false);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700960 EXPECT_EQ(scatter_factor_in_seconds, attempter_.scatter_factor_.InSeconds());
961
962 // Make sure the file still exists.
963 EXPECT_TRUE(prefs.Exists(kPrefsUpdateCheckCount));
964
965 int64 new_value;
966 EXPECT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &new_value));
967 EXPECT_EQ(initial_value - 1, new_value);
968
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700969 EXPECT_TRUE(
970 attempter_.omaha_request_params_->update_check_count_wait_enabled());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700971
972 // However, if the count is already 0, it's not decremented. Test that.
973 initial_value = 0;
974 EXPECT_TRUE(prefs.SetInt64(kPrefsUpdateCheckCount, initial_value));
Gilad Arnoldb92f0df2013-01-10 16:32:45 -0800975 attempter_.Update("", "", false, false, false);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700976 EXPECT_TRUE(prefs.Exists(kPrefsUpdateCheckCount));
977 EXPECT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &new_value));
978 EXPECT_EQ(initial_value, new_value);
979
980 g_idle_add(&StaticQuitMainLoop, this);
981}
982
Jay Srinivasan08fce042012-06-07 16:31:01 -0700983TEST_F(UpdateAttempterTest, NoScatteringDoneDuringManualUpdateTestStart) {
984 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
985 g_idle_add(&StaticNoScatteringDoneDuringManualUpdateTestStart, this);
986 g_main_loop_run(loop_);
987 g_main_loop_unref(loop_);
988 loop_ = NULL;
989}
990
991void UpdateAttempterTest::NoScatteringDoneDuringManualUpdateTestStart() {
992 // Tests that no scattering logic is enabled if the update check
993 // is manually done (as opposed to a scheduled update check)
994 int64 initial_value = 8;
995 Prefs prefs;
996 attempter_.prefs_ = &prefs;
997
998 EXPECT_CALL(mock_system_state_,
999 IsOOBEComplete()).WillRepeatedly(Return(true));
1000
1001 string prefs_dir;
1002 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
1003 &prefs_dir));
1004 ScopedDirRemover temp_dir_remover(prefs_dir);
1005
1006 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
1007 << "Failed to initialize preferences.";
Jay Srinivasan21be0752012-07-25 15:44:56 -07001008 EXPECT_TRUE(prefs.SetInt64(kPrefsWallClockWaitPeriod, initial_value));
Jay Srinivasan08fce042012-06-07 16:31:01 -07001009 EXPECT_TRUE(prefs.SetInt64(kPrefsUpdateCheckCount, initial_value));
1010
1011 // make sure scatter_factor is non-zero as scattering is disabled
1012 // otherwise.
1013 int64 scatter_factor_in_seconds = 50;
1014
1015 policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
1016 attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
1017
1018 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001019 EXPECT_CALL(mock_system_state_, device_policy()).WillRepeatedly(
Jay Srinivasan21be0752012-07-25 15:44:56 -07001020 Return(device_policy));
Jay Srinivasan08fce042012-06-07 16:31:01 -07001021
1022 EXPECT_CALL(*device_policy, GetScatterFactorInSeconds(_))
1023 .WillRepeatedly(DoAll(
1024 SetArgumentPointee<0>(scatter_factor_in_seconds),
1025 Return(true)));
1026
Gilad Arnoldb92f0df2013-01-10 16:32:45 -08001027 // Trigger an interactive check so we can test that scattering is disabled.
1028 attempter_.Update("", "", false, true, false);
Jay Srinivasan08fce042012-06-07 16:31:01 -07001029 EXPECT_EQ(scatter_factor_in_seconds, attempter_.scatter_factor_.InSeconds());
1030
1031 // Make sure scattering is disabled for manual (i.e. user initiated) update
Jay Srinivasan21be0752012-07-25 15:44:56 -07001032 // checks and all artifacts are removed.
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001033 EXPECT_FALSE(
1034 attempter_.omaha_request_params_->wall_clock_based_wait_enabled());
Jay Srinivasan08fce042012-06-07 16:31:01 -07001035 EXPECT_FALSE(prefs.Exists(kPrefsWallClockWaitPeriod));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001036 EXPECT_EQ(0, attempter_.omaha_request_params_->waiting_period().InSeconds());
1037 EXPECT_FALSE(
1038 attempter_.omaha_request_params_->update_check_count_wait_enabled());
Jay Srinivasan08fce042012-06-07 16:31:01 -07001039 EXPECT_FALSE(prefs.Exists(kPrefsUpdateCheckCount));
1040
1041 g_idle_add(&StaticQuitMainLoop, this);
1042}
1043
Darin Petkovf42cc1c2010-09-01 09:03:02 -07001044} // namespace chromeos_update_engine