blob: 937a70f6026fc81f49348fb9ea0d00fd20426f93 [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"
Andrew de los Reyes45168102010-11-22 11:13:50 -080013#include "update_engine/mock_dbus_interface.h"
Darin Petkov1b003102010-11-30 10:18:36 -080014#include "update_engine/mock_http_fetcher.h"
Jay Srinivasan08fce042012-06-07 16:31:01 -070015#include "update_engine/mock_system_state.h"
Darin Petkovf42cc1c2010-09-01 09:03:02 -070016#include "update_engine/postinstall_runner_action.h"
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070017#include "update_engine/prefs.h"
Darin Petkov36275772010-10-01 11:40:57 -070018#include "update_engine/prefs_mock.h"
Darin Petkov1b003102010-11-30 10:18:36 -080019#include "update_engine/test_utils.h"
Darin Petkovf42cc1c2010-09-01 09:03:02 -070020#include "update_engine/update_attempter.h"
Darin Petkov1b003102010-11-30 10:18:36 -080021#include "update_engine/update_check_scheduler.h"
Darin Petkovf42cc1c2010-09-01 09:03:02 -070022
23using std::string;
Darin Petkov36275772010-10-01 11:40:57 -070024using testing::_;
25using testing::DoAll;
Darin Petkovf42cc1c2010-09-01 09:03:02 -070026using testing::InSequence;
Darin Petkov2dd01092010-10-08 15:43:05 -070027using testing::Ne;
Darin Petkov9c096d62010-11-17 14:49:04 -080028using testing::NiceMock;
Darin Petkovf42cc1c2010-09-01 09:03:02 -070029using testing::Property;
30using testing::Return;
Darin Petkov36275772010-10-01 11:40:57 -070031using testing::SetArgumentPointee;
Darin Petkovf42cc1c2010-09-01 09:03:02 -070032
33namespace chromeos_update_engine {
34
35// Test a subclass rather than the main class directly so that we can mock out
Darin Petkovcd1666f2010-09-23 09:53:44 -070036// methods within the class. There're explicit unit tests for the mocked out
Darin Petkovf42cc1c2010-09-01 09:03:02 -070037// methods.
38class UpdateAttempterUnderTest : public UpdateAttempter {
39 public:
Andrew de los Reyes000d8952011-03-02 15:21:14 -080040 explicit UpdateAttempterUnderTest(MockDbusGlib* dbus)
Jay Srinivasanf0572052012-10-23 18:12:56 -070041 : UpdateAttempter(NULL, dbus, NULL, NULL) {}
Darin Petkovf42cc1c2010-09-01 09:03:02 -070042};
43
44class UpdateAttempterTest : public ::testing::Test {
45 protected:
Jay Srinivasan43488792012-06-19 00:25:31 -070046 UpdateAttempterTest()
47 : attempter_(&dbus_),
48 mock_connection_manager(&mock_system_state_),
49 loop_(NULL) {
50 mock_system_state_.SetConnectionManager(&mock_connection_manager);
51 }
Darin Petkovf42cc1c2010-09-01 09:03:02 -070052 virtual void SetUp() {
53 EXPECT_EQ(NULL, attempter_.dbus_service_);
54 EXPECT_EQ(NULL, attempter_.prefs_);
Jay Srinivasan08fce042012-06-07 16:31:01 -070055 EXPECT_EQ(NULL, attempter_.system_state_);
Darin Petkovf42cc1c2010-09-01 09:03:02 -070056 EXPECT_EQ(NULL, attempter_.update_check_scheduler_);
57 EXPECT_EQ(0, attempter_.http_response_code_);
Chris Sosa4f8ee272012-11-30 13:01:54 -080058 EXPECT_EQ(utils::kCpuSharesNormal, attempter_.shares_);
59 EXPECT_EQ(NULL, attempter_.manage_shares_source_);
Darin Petkovf42cc1c2010-09-01 09:03:02 -070060 EXPECT_FALSE(attempter_.download_active_);
61 EXPECT_EQ(UPDATE_STATUS_IDLE, attempter_.status_);
62 EXPECT_EQ(0.0, attempter_.download_progress_);
63 EXPECT_EQ(0, attempter_.last_checked_time_);
64 EXPECT_EQ("0.0.0.0", attempter_.new_version_);
Jay Srinivasan51dcf262012-09-13 17:24:32 -070065 EXPECT_EQ(0, attempter_.new_payload_size_);
Darin Petkovf42cc1c2010-09-01 09:03:02 -070066 processor_ = new ActionProcessorMock();
67 attempter_.processor_.reset(processor_); // Transfers ownership.
Darin Petkov36275772010-10-01 11:40:57 -070068 attempter_.prefs_ = &prefs_;
Jay Srinivasan08fce042012-06-07 16:31:01 -070069 attempter_.system_state_ = &mock_system_state_;
Darin Petkovf42cc1c2010-09-01 09:03:02 -070070 }
71
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +020072 void QuitMainLoop();
73 static gboolean StaticQuitMainLoop(gpointer data);
74
Darin Petkove6ef2f82011-03-07 17:31:11 -080075 void UpdateTestStart();
76 void UpdateTestVerify();
77 static gboolean StaticUpdateTestStart(gpointer data);
78 static gboolean StaticUpdateTestVerify(gpointer data);
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +020079
Thieu Le116fda32011-04-19 11:01:54 -070080 void PingOmahaTestStart();
Thieu Le116fda32011-04-19 11:01:54 -070081 static gboolean StaticPingOmahaTestStart(gpointer data);
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +020082
83 void ReadTrackFromPolicyTestStart();
84 static gboolean StaticReadTrackFromPolicyTestStart(gpointer data);
Darin Petkove6ef2f82011-03-07 17:31:11 -080085
Jay Srinivasan0a708742012-03-20 11:26:12 -070086 void ReadUpdateDisabledFromPolicyTestStart();
87 static gboolean StaticReadUpdateDisabledFromPolicyTestStart(gpointer data);
88
89 void ReadTargetVersionPrefixFromPolicyTestStart();
90 static gboolean StaticReadTargetVersionPrefixFromPolicyTestStart(
91 gpointer data);
92
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070093 void ReadScatterFactorFromPolicyTestStart();
94 static gboolean StaticReadScatterFactorFromPolicyTestStart(
95 gpointer data);
96
97 void DecrementUpdateCheckCountTestStart();
98 static gboolean StaticDecrementUpdateCheckCountTestStart(
99 gpointer data);
100
Jay Srinivasan08fce042012-06-07 16:31:01 -0700101 void NoScatteringDoneDuringManualUpdateTestStart();
102 static gboolean StaticNoScatteringDoneDuringManualUpdateTestStart(
103 gpointer data);
104
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800105 MockDbusGlib dbus_;
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700106 UpdateAttempterUnderTest attempter_;
107 ActionProcessorMock* processor_;
Darin Petkov9c096d62010-11-17 14:49:04 -0800108 NiceMock<PrefsMock> prefs_;
Jay Srinivasan08fce042012-06-07 16:31:01 -0700109 MockSystemState mock_system_state_;
Jay Srinivasan43488792012-06-19 00:25:31 -0700110 MockConnectionManager mock_connection_manager;
Darin Petkove6ef2f82011-03-07 17:31:11 -0800111 GMainLoop* loop_;
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700112};
113
Darin Petkov1b003102010-11-30 10:18:36 -0800114TEST_F(UpdateAttempterTest, ActionCompletedDownloadTest) {
115 scoped_ptr<MockHttpFetcher> fetcher(new MockHttpFetcher("", 0, NULL));
116 fetcher->FailTransfer(503); // Sets the HTTP response code.
Jay Srinivasanf0572052012-10-23 18:12:56 -0700117 DownloadAction action(&prefs_, NULL, fetcher.release());
Darin Petkov1b003102010-11-30 10:18:36 -0800118 EXPECT_CALL(prefs_, GetInt64(kPrefsDeltaUpdateFailures, _)).Times(0);
119 attempter_.ActionCompleted(NULL, &action, kActionCodeSuccess);
120 EXPECT_EQ(503, attempter_.http_response_code());
121 EXPECT_EQ(UPDATE_STATUS_FINALIZING, attempter_.status());
122 ASSERT_TRUE(attempter_.error_event_.get() == NULL);
123}
124
125TEST_F(UpdateAttempterTest, ActionCompletedErrorTest) {
126 ActionMock action;
127 EXPECT_CALL(action, Type()).WillRepeatedly(Return("ActionMock"));
128 attempter_.status_ = UPDATE_STATUS_DOWNLOADING;
129 EXPECT_CALL(prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
130 .WillOnce(Return(false));
131 attempter_.ActionCompleted(NULL, &action, kActionCodeError);
132 ASSERT_TRUE(attempter_.error_event_.get() != NULL);
133}
134
135TEST_F(UpdateAttempterTest, ActionCompletedOmahaRequestTest) {
136 scoped_ptr<MockHttpFetcher> fetcher(new MockHttpFetcher("", 0, NULL));
137 fetcher->FailTransfer(500); // Sets the HTTP response code.
138 OmahaRequestParams params;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700139 OmahaRequestAction action(&prefs_, &params, NULL, fetcher.release(), false);
Darin Petkov1b003102010-11-30 10:18:36 -0800140 ObjectCollectorAction<OmahaResponse> collector_action;
141 BondActions(&action, &collector_action);
142 OmahaResponse response;
143 response.poll_interval = 234;
144 action.SetOutputObject(response);
Jay Srinivasan08fce042012-06-07 16:31:01 -0700145 UpdateCheckScheduler scheduler(&attempter_, NULL, &mock_system_state_);
Darin Petkov1b003102010-11-30 10:18:36 -0800146 attempter_.set_update_check_scheduler(&scheduler);
147 EXPECT_CALL(prefs_, GetInt64(kPrefsDeltaUpdateFailures, _)).Times(0);
148 attempter_.ActionCompleted(NULL, &action, kActionCodeSuccess);
149 EXPECT_EQ(500, attempter_.http_response_code());
150 EXPECT_EQ(UPDATE_STATUS_IDLE, attempter_.status());
151 EXPECT_EQ(234, scheduler.poll_interval());
152 ASSERT_TRUE(attempter_.error_event_.get() == NULL);
153}
154
Darin Petkovcd1666f2010-09-23 09:53:44 -0700155TEST_F(UpdateAttempterTest, RunAsRootConstructWithUpdatedMarkerTest) {
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700156 extern const char* kUpdateCompletedMarker;
157 const FilePath kMarker(kUpdateCompletedMarker);
158 EXPECT_EQ(0, file_util::WriteFile(kMarker, "", 0));
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800159 MockDbusGlib dbus;
160 UpdateAttempterUnderTest attempter(&dbus);
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700161 EXPECT_EQ(UPDATE_STATUS_UPDATED_NEED_REBOOT, attempter.status());
162 EXPECT_TRUE(file_util::Delete(kMarker, false));
163}
164
165TEST_F(UpdateAttempterTest, GetErrorCodeForActionTest) {
166 extern ActionExitCode GetErrorCodeForAction(AbstractAction* action,
167 ActionExitCode code);
168 EXPECT_EQ(kActionCodeSuccess,
169 GetErrorCodeForAction(NULL, kActionCodeSuccess));
170
171 OmahaRequestParams params;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700172 OmahaRequestAction omaha_request_action(NULL, &params, NULL, NULL, false);
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700173 EXPECT_EQ(kActionCodeOmahaRequestError,
174 GetErrorCodeForAction(&omaha_request_action, kActionCodeError));
Darin Petkov73058b42010-10-06 16:32:19 -0700175 OmahaResponseHandlerAction omaha_response_handler_action(&prefs_);
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700176 EXPECT_EQ(kActionCodeOmahaResponseHandlerError,
177 GetErrorCodeForAction(&omaha_response_handler_action,
178 kActionCodeError));
Gilad Arnold581c2ea2012-07-19 12:33:49 -0700179 FilesystemCopierAction filesystem_copier_action(false, false);
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700180 EXPECT_EQ(kActionCodeFilesystemCopierError,
181 GetErrorCodeForAction(&filesystem_copier_action, kActionCodeError));
Darin Petkov6d5dbf62010-11-08 16:09:55 -0800182 PostinstallRunnerAction postinstall_runner_action;
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700183 EXPECT_EQ(kActionCodePostinstallRunnerError,
184 GetErrorCodeForAction(&postinstall_runner_action,
185 kActionCodeError));
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700186 ActionMock action_mock;
187 EXPECT_CALL(action_mock, Type()).Times(1).WillOnce(Return("ActionMock"));
188 EXPECT_EQ(kActionCodeError,
189 GetErrorCodeForAction(&action_mock, kActionCodeError));
190}
191
Darin Petkov36275772010-10-01 11:40:57 -0700192TEST_F(UpdateAttempterTest, DisableDeltaUpdateIfNeededTest) {
193 attempter_.omaha_request_params_.delta_okay = true;
194 EXPECT_CALL(prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
195 .WillOnce(Return(false));
196 attempter_.DisableDeltaUpdateIfNeeded();
197 EXPECT_TRUE(attempter_.omaha_request_params_.delta_okay);
198 EXPECT_CALL(prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
199 .WillOnce(DoAll(
200 SetArgumentPointee<1>(UpdateAttempter::kMaxDeltaUpdateFailures - 1),
201 Return(true)));
202 attempter_.DisableDeltaUpdateIfNeeded();
203 EXPECT_TRUE(attempter_.omaha_request_params_.delta_okay);
204 EXPECT_CALL(prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
205 .WillOnce(DoAll(
206 SetArgumentPointee<1>(UpdateAttempter::kMaxDeltaUpdateFailures),
207 Return(true)));
208 attempter_.DisableDeltaUpdateIfNeeded();
209 EXPECT_FALSE(attempter_.omaha_request_params_.delta_okay);
210 EXPECT_CALL(prefs_, GetInt64(_, _)).Times(0);
211 attempter_.DisableDeltaUpdateIfNeeded();
212 EXPECT_FALSE(attempter_.omaha_request_params_.delta_okay);
213}
214
215TEST_F(UpdateAttempterTest, MarkDeltaUpdateFailureTest) {
Darin Petkov36275772010-10-01 11:40:57 -0700216 EXPECT_CALL(prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
217 .WillOnce(Return(false))
218 .WillOnce(DoAll(SetArgumentPointee<1>(-1), Return(true)))
219 .WillOnce(DoAll(SetArgumentPointee<1>(1), Return(true)))
220 .WillOnce(DoAll(
221 SetArgumentPointee<1>(UpdateAttempter::kMaxDeltaUpdateFailures),
222 Return(true)));
Darin Petkov2dd01092010-10-08 15:43:05 -0700223 EXPECT_CALL(prefs_, SetInt64(Ne(kPrefsDeltaUpdateFailures), _))
224 .WillRepeatedly(Return(true));
Darin Petkov36275772010-10-01 11:40:57 -0700225 EXPECT_CALL(prefs_, SetInt64(kPrefsDeltaUpdateFailures, 1)).Times(2);
226 EXPECT_CALL(prefs_, SetInt64(kPrefsDeltaUpdateFailures, 2)).Times(1);
227 EXPECT_CALL(prefs_, SetInt64(kPrefsDeltaUpdateFailures,
228 UpdateAttempter::kMaxDeltaUpdateFailures + 1))
229 .Times(1);
230 for (int i = 0; i < 4; i ++)
231 attempter_.MarkDeltaUpdateFailure();
232}
233
Darin Petkov1b003102010-11-30 10:18:36 -0800234TEST_F(UpdateAttempterTest, ScheduleErrorEventActionNoEventTest) {
235 EXPECT_CALL(*processor_, EnqueueAction(_)).Times(0);
236 EXPECT_CALL(*processor_, StartProcessing()).Times(0);
237 attempter_.ScheduleErrorEventAction();
238}
239
240TEST_F(UpdateAttempterTest, ScheduleErrorEventActionTest) {
241 EXPECT_CALL(*processor_,
242 EnqueueAction(Property(&AbstractAction::Type,
243 OmahaRequestAction::StaticType())))
244 .Times(1);
245 EXPECT_CALL(*processor_, StartProcessing()).Times(1);
246 attempter_.error_event_.reset(new OmahaEvent(OmahaEvent::kTypeUpdateComplete,
247 OmahaEvent::kResultError,
248 kActionCodeError));
249 attempter_.ScheduleErrorEventAction();
250 EXPECT_EQ(UPDATE_STATUS_REPORTING_ERROR_EVENT, attempter_.status());
251}
252
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700253TEST_F(UpdateAttempterTest, UpdateStatusToStringTest) {
254 extern const char* UpdateStatusToString(UpdateStatus);
255 EXPECT_STREQ("UPDATE_STATUS_IDLE", UpdateStatusToString(UPDATE_STATUS_IDLE));
256 EXPECT_STREQ("UPDATE_STATUS_CHECKING_FOR_UPDATE",
257 UpdateStatusToString(UPDATE_STATUS_CHECKING_FOR_UPDATE));
258 EXPECT_STREQ("UPDATE_STATUS_UPDATE_AVAILABLE",
259 UpdateStatusToString(UPDATE_STATUS_UPDATE_AVAILABLE));
260 EXPECT_STREQ("UPDATE_STATUS_DOWNLOADING",
261 UpdateStatusToString(UPDATE_STATUS_DOWNLOADING));
262 EXPECT_STREQ("UPDATE_STATUS_VERIFYING",
263 UpdateStatusToString(UPDATE_STATUS_VERIFYING));
264 EXPECT_STREQ("UPDATE_STATUS_FINALIZING",
265 UpdateStatusToString(UPDATE_STATUS_FINALIZING));
266 EXPECT_STREQ("UPDATE_STATUS_UPDATED_NEED_REBOOT",
267 UpdateStatusToString(UPDATE_STATUS_UPDATED_NEED_REBOOT));
268 EXPECT_STREQ("UPDATE_STATUS_REPORTING_ERROR_EVENT",
269 UpdateStatusToString(UPDATE_STATUS_REPORTING_ERROR_EVENT));
270 EXPECT_STREQ("unknown status",
271 UpdateStatusToString(static_cast<UpdateStatus>(-1)));
272}
273
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200274void UpdateAttempterTest::QuitMainLoop() {
275 g_main_loop_quit(loop_);
276}
277
278gboolean UpdateAttempterTest::StaticQuitMainLoop(gpointer data) {
279 reinterpret_cast<UpdateAttempterTest*>(data)->QuitMainLoop();
280 return FALSE;
281}
282
Darin Petkove6ef2f82011-03-07 17:31:11 -0800283gboolean UpdateAttempterTest::StaticUpdateTestStart(gpointer data) {
284 reinterpret_cast<UpdateAttempterTest*>(data)->UpdateTestStart();
285 return FALSE;
286}
287
288gboolean UpdateAttempterTest::StaticUpdateTestVerify(gpointer data) {
289 reinterpret_cast<UpdateAttempterTest*>(data)->UpdateTestVerify();
290 return FALSE;
291}
292
Thieu Le116fda32011-04-19 11:01:54 -0700293gboolean UpdateAttempterTest::StaticPingOmahaTestStart(gpointer data) {
294 reinterpret_cast<UpdateAttempterTest*>(data)->PingOmahaTestStart();
295 return FALSE;
296}
297
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200298gboolean UpdateAttempterTest::StaticReadTrackFromPolicyTestStart(
299 gpointer data) {
300 reinterpret_cast<UpdateAttempterTest*>(data)->ReadTrackFromPolicyTestStart();
Thieu Le116fda32011-04-19 11:01:54 -0700301 return FALSE;
302}
303
Jay Srinivasan0a708742012-03-20 11:26:12 -0700304gboolean UpdateAttempterTest::StaticReadUpdateDisabledFromPolicyTestStart(
305 gpointer data) {
306 UpdateAttempterTest* ua_test = reinterpret_cast<UpdateAttempterTest*>(data);
307 ua_test->ReadUpdateDisabledFromPolicyTestStart();
308 return FALSE;
309}
310
311gboolean UpdateAttempterTest::StaticReadTargetVersionPrefixFromPolicyTestStart(
312 gpointer data) {
313 UpdateAttempterTest* ua_test = reinterpret_cast<UpdateAttempterTest*>(data);
314 ua_test->ReadTargetVersionPrefixFromPolicyTestStart();
315 return FALSE;
316}
317
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700318gboolean UpdateAttempterTest::StaticReadScatterFactorFromPolicyTestStart(
319 gpointer data) {
320 UpdateAttempterTest* ua_test = reinterpret_cast<UpdateAttempterTest*>(data);
321 ua_test->ReadScatterFactorFromPolicyTestStart();
322 return FALSE;
323}
324
325gboolean UpdateAttempterTest::StaticDecrementUpdateCheckCountTestStart(
326 gpointer data) {
327 UpdateAttempterTest* ua_test = reinterpret_cast<UpdateAttempterTest*>(data);
328 ua_test->DecrementUpdateCheckCountTestStart();
329 return FALSE;
330}
331
Jay Srinivasan08fce042012-06-07 16:31:01 -0700332gboolean UpdateAttempterTest::StaticNoScatteringDoneDuringManualUpdateTestStart(
333 gpointer data) {
334 UpdateAttempterTest* ua_test = reinterpret_cast<UpdateAttempterTest*>(data);
335 ua_test->NoScatteringDoneDuringManualUpdateTestStart();
336 return FALSE;
337}
338
Darin Petkove6ef2f82011-03-07 17:31:11 -0800339namespace {
340const string kActionTypes[] = {
341 OmahaRequestAction::StaticType(),
342 OmahaResponseHandlerAction::StaticType(),
343 FilesystemCopierAction::StaticType(),
344 FilesystemCopierAction::StaticType(),
345 OmahaRequestAction::StaticType(),
346 DownloadAction::StaticType(),
347 OmahaRequestAction::StaticType(),
348 FilesystemCopierAction::StaticType(),
349 FilesystemCopierAction::StaticType(),
350 PostinstallRunnerAction::StaticType(),
351 OmahaRequestAction::StaticType()
352};
353} // namespace {}
354
355void UpdateAttempterTest::UpdateTestStart() {
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700356 attempter_.set_http_response_code(200);
357 InSequence s;
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700358 for (size_t i = 0; i < arraysize(kActionTypes); ++i) {
359 EXPECT_CALL(*processor_,
360 EnqueueAction(Property(&AbstractAction::Type,
361 kActionTypes[i]))).Times(1);
362 }
363 EXPECT_CALL(*processor_, StartProcessing()).Times(1);
364
Jay Srinivasan08fce042012-06-07 16:31:01 -0700365 attempter_.Update("", "", false, false, false, false);
Darin Petkove6ef2f82011-03-07 17:31:11 -0800366 g_idle_add(&StaticUpdateTestVerify, this);
367}
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700368
Darin Petkove6ef2f82011-03-07 17:31:11 -0800369void UpdateAttempterTest::UpdateTestVerify() {
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700370 EXPECT_EQ(0, attempter_.http_response_code());
371 EXPECT_EQ(&attempter_, processor_->delegate());
372 EXPECT_EQ(arraysize(kActionTypes), attempter_.actions_.size());
373 for (size_t i = 0; i < arraysize(kActionTypes); ++i) {
374 EXPECT_EQ(kActionTypes[i], attempter_.actions_[i]->Type());
375 }
376 EXPECT_EQ(attempter_.response_handler_action_.get(),
377 attempter_.actions_[1].get());
378 DownloadAction* download_action =
379 dynamic_cast<DownloadAction*>(attempter_.actions_[5].get());
380 ASSERT_TRUE(download_action != NULL);
381 EXPECT_EQ(&attempter_, download_action->delegate());
382 EXPECT_EQ(UPDATE_STATUS_CHECKING_FOR_UPDATE, attempter_.status());
Darin Petkove6ef2f82011-03-07 17:31:11 -0800383 g_main_loop_quit(loop_);
384}
385
386TEST_F(UpdateAttempterTest, UpdateTest) {
387 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
388 g_idle_add(&StaticUpdateTestStart, this);
389 g_main_loop_run(loop_);
390 g_main_loop_unref(loop_);
391 loop_ = NULL;
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700392}
393
Thieu Le116fda32011-04-19 11:01:54 -0700394void UpdateAttempterTest::PingOmahaTestStart() {
395 EXPECT_CALL(*processor_,
396 EnqueueAction(Property(&AbstractAction::Type,
397 OmahaRequestAction::StaticType())))
398 .Times(1);
399 EXPECT_CALL(*processor_, StartProcessing()).Times(1);
400 attempter_.PingOmaha();
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200401 g_idle_add(&StaticQuitMainLoop, this);
Thieu Le116fda32011-04-19 11:01:54 -0700402}
403
404TEST_F(UpdateAttempterTest, PingOmahaTest) {
Jay Srinivasan08fce042012-06-07 16:31:01 -0700405 UpdateCheckScheduler scheduler(&attempter_, NULL, &mock_system_state_);
Thieu Le116fda32011-04-19 11:01:54 -0700406 scheduler.enabled_ = true;
Andrew de los Reyese05fc282011-06-02 09:50:08 -0700407 EXPECT_FALSE(scheduler.scheduled_);
Thieu Le116fda32011-04-19 11:01:54 -0700408 attempter_.set_update_check_scheduler(&scheduler);
409 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
410 g_idle_add(&StaticPingOmahaTestStart, this);
411 g_main_loop_run(loop_);
412 g_main_loop_unref(loop_);
413 loop_ = NULL;
414 EXPECT_EQ(UPDATE_STATUS_UPDATED_NEED_REBOOT, attempter_.status());
415 EXPECT_EQ(true, scheduler.scheduled_);
416}
417
Darin Petkov18c7bce2011-06-16 14:07:00 -0700418TEST_F(UpdateAttempterTest, CreatePendingErrorEventTest) {
419 ActionMock action;
420 const ActionExitCode kCode = kActionCodeDownloadTransferError;
421 attempter_.CreatePendingErrorEvent(&action, kCode);
422 ASSERT_TRUE(attempter_.error_event_.get() != NULL);
423 EXPECT_EQ(OmahaEvent::kTypeUpdateComplete, attempter_.error_event_->type);
424 EXPECT_EQ(OmahaEvent::kResultError, attempter_.error_event_->result);
425 EXPECT_EQ(kCode, attempter_.error_event_->error_code);
426}
427
428TEST_F(UpdateAttempterTest, CreatePendingErrorEventResumedTest) {
429 OmahaResponseHandlerAction *response_action =
430 new OmahaResponseHandlerAction(&prefs_);
431 response_action->install_plan_.is_resume = true;
432 attempter_.response_handler_action_.reset(response_action);
433 ActionMock action;
434 const ActionExitCode kCode = kActionCodeInstallDeviceOpenError;
435 attempter_.CreatePendingErrorEvent(&action, kCode);
436 ASSERT_TRUE(attempter_.error_event_.get() != NULL);
437 EXPECT_EQ(OmahaEvent::kTypeUpdateComplete, attempter_.error_event_->type);
438 EXPECT_EQ(OmahaEvent::kResultError, attempter_.error_event_->result);
439 EXPECT_EQ(kCode | kActionCodeResumedFlag,
440 attempter_.error_event_->error_code);
441}
442
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200443TEST_F(UpdateAttempterTest, ReadTrackFromPolicy) {
444 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
445 g_idle_add(&StaticReadTrackFromPolicyTestStart, this);
446 g_main_loop_run(loop_);
447 g_main_loop_unref(loop_);
448 loop_ = NULL;
449}
450
451void UpdateAttempterTest::ReadTrackFromPolicyTestStart() {
452 // Tests that the update track (aka release channel) is properly fetched
453 // from the device policy.
454
455 policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
456 attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
457
458 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
459
460 EXPECT_CALL(*device_policy, GetReleaseChannel(_))
461 .WillRepeatedly(DoAll(
462 SetArgumentPointee<0>(std::string("canary-channel")),
463 Return(true)));
464
Jay Srinivasan08fce042012-06-07 16:31:01 -0700465 attempter_.Update("", "", false, false, false, false);
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200466 EXPECT_EQ("canary-channel", attempter_.omaha_request_params_.app_track);
467
468 g_idle_add(&StaticQuitMainLoop, this);
469}
470
Jay Srinivasan0a708742012-03-20 11:26:12 -0700471TEST_F(UpdateAttempterTest, ReadUpdateDisabledFromPolicy) {
472 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
473 g_idle_add(&StaticReadUpdateDisabledFromPolicyTestStart, this);
474 g_main_loop_run(loop_);
475 g_main_loop_unref(loop_);
476 loop_ = NULL;
477}
478
479void UpdateAttempterTest::ReadUpdateDisabledFromPolicyTestStart() {
480 // Tests that the update_disbled flag is properly fetched
481 // from the device policy.
482
483 policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
484 attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
485
486 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
487
488 EXPECT_CALL(*device_policy, GetUpdateDisabled(_))
489 .WillRepeatedly(DoAll(
490 SetArgumentPointee<0>(true),
491 Return(true)));
492
Jay Srinivasan08fce042012-06-07 16:31:01 -0700493 attempter_.Update("", "", false, false, false, false);
Jay Srinivasan0a708742012-03-20 11:26:12 -0700494 EXPECT_TRUE(attempter_.omaha_request_params_.update_disabled);
495
496 g_idle_add(&StaticQuitMainLoop, this);
497}
498
499TEST_F(UpdateAttempterTest, ReadTargetVersionPrefixFromPolicy) {
500 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
501 g_idle_add(&StaticReadTargetVersionPrefixFromPolicyTestStart, this);
502 g_main_loop_run(loop_);
503 g_main_loop_unref(loop_);
504 loop_ = NULL;
505}
506
507void UpdateAttempterTest::ReadTargetVersionPrefixFromPolicyTestStart() {
508 // Tests that the target_version_prefix value is properly fetched
509 // from the device policy.
510
511 const std::string target_version_prefix = "1412.";
512
513 policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
514 attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
515
516 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
517
518 EXPECT_CALL(*device_policy, GetTargetVersionPrefix(_))
519 .WillRepeatedly(DoAll(
520 SetArgumentPointee<0>(target_version_prefix),
521 Return(true)));
522
Jay Srinivasan08fce042012-06-07 16:31:01 -0700523 attempter_.Update("", "", false, false, false, false);
Jay Srinivasan0a708742012-03-20 11:26:12 -0700524 EXPECT_EQ(target_version_prefix.c_str(),
525 attempter_.omaha_request_params_.target_version_prefix);
526
527 g_idle_add(&StaticQuitMainLoop, this);
528}
529
530
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700531TEST_F(UpdateAttempterTest, ReadScatterFactorFromPolicy) {
532 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
533 g_idle_add(&StaticReadScatterFactorFromPolicyTestStart, this);
534 g_main_loop_run(loop_);
535 g_main_loop_unref(loop_);
536 loop_ = NULL;
537}
538
539// Tests that the scatter_factor_in_seconds value is properly fetched
540// from the device policy.
541void UpdateAttempterTest::ReadScatterFactorFromPolicyTestStart() {
542 int64 scatter_factor_in_seconds = 36000;
543
544 policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
545 attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
546
547 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
Jay Srinivasan21be0752012-07-25 15:44:56 -0700548 EXPECT_CALL(mock_system_state_, GetDevicePolicy()).WillRepeatedly(
549 Return(device_policy));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700550
551 EXPECT_CALL(*device_policy, GetScatterFactorInSeconds(_))
552 .WillRepeatedly(DoAll(
553 SetArgumentPointee<0>(scatter_factor_in_seconds),
554 Return(true)));
555
Jay Srinivasan08fce042012-06-07 16:31:01 -0700556 attempter_.Update("", "", false, false, false, false);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700557 EXPECT_EQ(scatter_factor_in_seconds, attempter_.scatter_factor_.InSeconds());
558
559 g_idle_add(&StaticQuitMainLoop, this);
560}
561
562TEST_F(UpdateAttempterTest, DecrementUpdateCheckCountTest) {
563 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
564 g_idle_add(&StaticDecrementUpdateCheckCountTestStart, this);
565 g_main_loop_run(loop_);
566 g_main_loop_unref(loop_);
567 loop_ = NULL;
568}
569
570void UpdateAttempterTest::DecrementUpdateCheckCountTestStart() {
571 // Tests that the scatter_factor_in_seconds value is properly fetched
572 // from the device policy and is decremented if value > 0.
573 int64 initial_value = 5;
574 Prefs prefs;
575 attempter_.prefs_ = &prefs;
576
Jay Srinivasan08fce042012-06-07 16:31:01 -0700577 EXPECT_CALL(mock_system_state_,
578 IsOOBEComplete()).WillRepeatedly(Return(true));
579
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700580 string prefs_dir;
581 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
582 &prefs_dir));
583 ScopedDirRemover temp_dir_remover(prefs_dir);
584
585 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
586 << "Failed to initialize preferences.";
587 EXPECT_TRUE(prefs.SetInt64(kPrefsUpdateCheckCount, initial_value));
588
589 int64 scatter_factor_in_seconds = 10;
590
591 policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
592 attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
593
594 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
Jay Srinivasan21be0752012-07-25 15:44:56 -0700595 EXPECT_CALL(mock_system_state_, GetDevicePolicy()).WillRepeatedly(
596 Return(device_policy));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700597
598 EXPECT_CALL(*device_policy, GetScatterFactorInSeconds(_))
599 .WillRepeatedly(DoAll(
600 SetArgumentPointee<0>(scatter_factor_in_seconds),
601 Return(true)));
602
Jay Srinivasan08fce042012-06-07 16:31:01 -0700603 attempter_.Update("", "", false, false, false, false);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700604 EXPECT_EQ(scatter_factor_in_seconds, attempter_.scatter_factor_.InSeconds());
605
606 // Make sure the file still exists.
607 EXPECT_TRUE(prefs.Exists(kPrefsUpdateCheckCount));
608
609 int64 new_value;
610 EXPECT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &new_value));
611 EXPECT_EQ(initial_value - 1, new_value);
612
613 EXPECT_TRUE(attempter_.omaha_request_params_.update_check_count_wait_enabled);
614
615 // However, if the count is already 0, it's not decremented. Test that.
616 initial_value = 0;
617 EXPECT_TRUE(prefs.SetInt64(kPrefsUpdateCheckCount, initial_value));
Jay Srinivasan08fce042012-06-07 16:31:01 -0700618 attempter_.Update("", "", false, false, false, false);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700619 EXPECT_TRUE(prefs.Exists(kPrefsUpdateCheckCount));
620 EXPECT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &new_value));
621 EXPECT_EQ(initial_value, new_value);
622
623 g_idle_add(&StaticQuitMainLoop, this);
624}
625
Jay Srinivasan08fce042012-06-07 16:31:01 -0700626TEST_F(UpdateAttempterTest, NoScatteringDoneDuringManualUpdateTestStart) {
627 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
628 g_idle_add(&StaticNoScatteringDoneDuringManualUpdateTestStart, this);
629 g_main_loop_run(loop_);
630 g_main_loop_unref(loop_);
631 loop_ = NULL;
632}
633
634void UpdateAttempterTest::NoScatteringDoneDuringManualUpdateTestStart() {
635 // Tests that no scattering logic is enabled if the update check
636 // is manually done (as opposed to a scheduled update check)
637 int64 initial_value = 8;
638 Prefs prefs;
639 attempter_.prefs_ = &prefs;
640
641 EXPECT_CALL(mock_system_state_,
642 IsOOBEComplete()).WillRepeatedly(Return(true));
643
644 string prefs_dir;
645 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
646 &prefs_dir));
647 ScopedDirRemover temp_dir_remover(prefs_dir);
648
649 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
650 << "Failed to initialize preferences.";
Jay Srinivasan21be0752012-07-25 15:44:56 -0700651 EXPECT_TRUE(prefs.SetInt64(kPrefsWallClockWaitPeriod, initial_value));
Jay Srinivasan08fce042012-06-07 16:31:01 -0700652 EXPECT_TRUE(prefs.SetInt64(kPrefsUpdateCheckCount, initial_value));
653
654 // make sure scatter_factor is non-zero as scattering is disabled
655 // otherwise.
656 int64 scatter_factor_in_seconds = 50;
657
658 policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
659 attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
660
661 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
Jay Srinivasan21be0752012-07-25 15:44:56 -0700662 EXPECT_CALL(mock_system_state_, GetDevicePolicy()).WillRepeatedly(
663 Return(device_policy));
Jay Srinivasan08fce042012-06-07 16:31:01 -0700664
665 EXPECT_CALL(*device_policy, GetScatterFactorInSeconds(_))
666 .WillRepeatedly(DoAll(
667 SetArgumentPointee<0>(scatter_factor_in_seconds),
668 Return(true)));
669
670 // pass true for is_user_initiated so we can test that the
671 // scattering is disabled.
672 attempter_.Update("", "", false, false, false, true);
673 EXPECT_EQ(scatter_factor_in_seconds, attempter_.scatter_factor_.InSeconds());
674
675 // Make sure scattering is disabled for manual (i.e. user initiated) update
Jay Srinivasan21be0752012-07-25 15:44:56 -0700676 // checks and all artifacts are removed.
Jay Srinivasan08fce042012-06-07 16:31:01 -0700677 EXPECT_FALSE(attempter_.omaha_request_params_.wall_clock_based_wait_enabled);
678 EXPECT_FALSE(prefs.Exists(kPrefsWallClockWaitPeriod));
Jay Srinivasan21be0752012-07-25 15:44:56 -0700679 EXPECT_TRUE(attempter_.omaha_request_params_.waiting_period.InSeconds() == 0);
Jay Srinivasan08fce042012-06-07 16:31:01 -0700680 EXPECT_FALSE(attempter_.omaha_request_params_.
681 update_check_count_wait_enabled);
682 EXPECT_FALSE(prefs.Exists(kPrefsUpdateCheckCount));
683
684 g_idle_add(&StaticQuitMainLoop, this);
685}
686
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700687} // namespace chromeos_update_engine