blob: 6402bb657d6714b7700fdc1bf2e4351aac0b2e4c [file] [log] [blame]
Darin Petkov18c7bce2011-06-16 14:07:00 -07001// Copyright (c) 2011 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"
Darin Petkovf42cc1c2010-09-01 09:03:02 -070015#include "update_engine/postinstall_runner_action.h"
Darin Petkov36275772010-10-01 11:40:57 -070016#include "update_engine/prefs_mock.h"
Darin Petkov1b003102010-11-30 10:18:36 -080017#include "update_engine/test_utils.h"
Darin Petkovf42cc1c2010-09-01 09:03:02 -070018#include "update_engine/update_attempter.h"
Darin Petkov1b003102010-11-30 10:18:36 -080019#include "update_engine/update_check_scheduler.h"
Darin Petkovf42cc1c2010-09-01 09:03:02 -070020
21using std::string;
Darin Petkov36275772010-10-01 11:40:57 -070022using testing::_;
23using testing::DoAll;
Darin Petkovf42cc1c2010-09-01 09:03:02 -070024using testing::InSequence;
Darin Petkov2dd01092010-10-08 15:43:05 -070025using testing::Ne;
Darin Petkov9c096d62010-11-17 14:49:04 -080026using testing::NiceMock;
Darin Petkovf42cc1c2010-09-01 09:03:02 -070027using testing::Property;
28using testing::Return;
Darin Petkov36275772010-10-01 11:40:57 -070029using testing::SetArgumentPointee;
Darin Petkovf42cc1c2010-09-01 09:03:02 -070030
31namespace chromeos_update_engine {
32
33// Test a subclass rather than the main class directly so that we can mock out
Darin Petkovcd1666f2010-09-23 09:53:44 -070034// methods within the class. There're explicit unit tests for the mocked out
Darin Petkovf42cc1c2010-09-01 09:03:02 -070035// methods.
36class UpdateAttempterUnderTest : public UpdateAttempter {
37 public:
Andrew de los Reyes000d8952011-03-02 15:21:14 -080038 explicit UpdateAttempterUnderTest(MockDbusGlib* dbus)
39 : UpdateAttempter(NULL, NULL, dbus) {}
Darin Petkovf42cc1c2010-09-01 09:03:02 -070040};
41
42class UpdateAttempterTest : public ::testing::Test {
43 protected:
Darin Petkove6ef2f82011-03-07 17:31:11 -080044 UpdateAttempterTest() : attempter_(&dbus_), loop_(NULL) {}
Darin Petkovf42cc1c2010-09-01 09:03:02 -070045 virtual void SetUp() {
46 EXPECT_EQ(NULL, attempter_.dbus_service_);
47 EXPECT_EQ(NULL, attempter_.prefs_);
48 EXPECT_EQ(NULL, attempter_.metrics_lib_);
49 EXPECT_EQ(NULL, attempter_.update_check_scheduler_);
50 EXPECT_EQ(0, attempter_.http_response_code_);
51 EXPECT_EQ(utils::kProcessPriorityNormal, attempter_.priority_);
52 EXPECT_EQ(NULL, attempter_.manage_priority_source_);
53 EXPECT_FALSE(attempter_.download_active_);
54 EXPECT_EQ(UPDATE_STATUS_IDLE, attempter_.status_);
55 EXPECT_EQ(0.0, attempter_.download_progress_);
56 EXPECT_EQ(0, attempter_.last_checked_time_);
57 EXPECT_EQ("0.0.0.0", attempter_.new_version_);
58 EXPECT_EQ(0, attempter_.new_size_);
59 processor_ = new ActionProcessorMock();
60 attempter_.processor_.reset(processor_); // Transfers ownership.
Darin Petkov36275772010-10-01 11:40:57 -070061 attempter_.prefs_ = &prefs_;
Darin Petkovf42cc1c2010-09-01 09:03:02 -070062 }
63
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +020064 void QuitMainLoop();
65 static gboolean StaticQuitMainLoop(gpointer data);
66
Darin Petkove6ef2f82011-03-07 17:31:11 -080067 void UpdateTestStart();
68 void UpdateTestVerify();
69 static gboolean StaticUpdateTestStart(gpointer data);
70 static gboolean StaticUpdateTestVerify(gpointer data);
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +020071
Thieu Le116fda32011-04-19 11:01:54 -070072 void PingOmahaTestStart();
Thieu Le116fda32011-04-19 11:01:54 -070073 static gboolean StaticPingOmahaTestStart(gpointer data);
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +020074
75 void ReadTrackFromPolicyTestStart();
76 static gboolean StaticReadTrackFromPolicyTestStart(gpointer data);
Darin Petkove6ef2f82011-03-07 17:31:11 -080077
Jay Srinivasan0a708742012-03-20 11:26:12 -070078 void ReadUpdateDisabledFromPolicyTestStart();
79 static gboolean StaticReadUpdateDisabledFromPolicyTestStart(gpointer data);
80
81 void ReadTargetVersionPrefixFromPolicyTestStart();
82 static gboolean StaticReadTargetVersionPrefixFromPolicyTestStart(
83 gpointer data);
84
Andrew de los Reyes000d8952011-03-02 15:21:14 -080085 MockDbusGlib dbus_;
Darin Petkovf42cc1c2010-09-01 09:03:02 -070086 UpdateAttempterUnderTest attempter_;
87 ActionProcessorMock* processor_;
Darin Petkov9c096d62010-11-17 14:49:04 -080088 NiceMock<PrefsMock> prefs_;
Darin Petkove6ef2f82011-03-07 17:31:11 -080089 GMainLoop* loop_;
Darin Petkovf42cc1c2010-09-01 09:03:02 -070090};
91
Darin Petkov1b003102010-11-30 10:18:36 -080092TEST_F(UpdateAttempterTest, ActionCompletedDownloadTest) {
93 scoped_ptr<MockHttpFetcher> fetcher(new MockHttpFetcher("", 0, NULL));
94 fetcher->FailTransfer(503); // Sets the HTTP response code.
95 DownloadAction action(&prefs_, fetcher.release());
96 EXPECT_CALL(prefs_, GetInt64(kPrefsDeltaUpdateFailures, _)).Times(0);
97 attempter_.ActionCompleted(NULL, &action, kActionCodeSuccess);
98 EXPECT_EQ(503, attempter_.http_response_code());
99 EXPECT_EQ(UPDATE_STATUS_FINALIZING, attempter_.status());
100 ASSERT_TRUE(attempter_.error_event_.get() == NULL);
101}
102
103TEST_F(UpdateAttempterTest, ActionCompletedErrorTest) {
104 ActionMock action;
105 EXPECT_CALL(action, Type()).WillRepeatedly(Return("ActionMock"));
106 attempter_.status_ = UPDATE_STATUS_DOWNLOADING;
107 EXPECT_CALL(prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
108 .WillOnce(Return(false));
109 attempter_.ActionCompleted(NULL, &action, kActionCodeError);
110 ASSERT_TRUE(attempter_.error_event_.get() != NULL);
111}
112
113TEST_F(UpdateAttempterTest, ActionCompletedOmahaRequestTest) {
114 scoped_ptr<MockHttpFetcher> fetcher(new MockHttpFetcher("", 0, NULL));
115 fetcher->FailTransfer(500); // Sets the HTTP response code.
116 OmahaRequestParams params;
Thieu Le116fda32011-04-19 11:01:54 -0700117 OmahaRequestAction action(&prefs_, params, NULL, fetcher.release(), false);
Darin Petkov1b003102010-11-30 10:18:36 -0800118 ObjectCollectorAction<OmahaResponse> collector_action;
119 BondActions(&action, &collector_action);
120 OmahaResponse response;
121 response.poll_interval = 234;
122 action.SetOutputObject(response);
123 UpdateCheckScheduler scheduler(&attempter_);
124 attempter_.set_update_check_scheduler(&scheduler);
125 EXPECT_CALL(prefs_, GetInt64(kPrefsDeltaUpdateFailures, _)).Times(0);
126 attempter_.ActionCompleted(NULL, &action, kActionCodeSuccess);
127 EXPECT_EQ(500, attempter_.http_response_code());
128 EXPECT_EQ(UPDATE_STATUS_IDLE, attempter_.status());
129 EXPECT_EQ(234, scheduler.poll_interval());
130 ASSERT_TRUE(attempter_.error_event_.get() == NULL);
131}
132
Darin Petkovcd1666f2010-09-23 09:53:44 -0700133TEST_F(UpdateAttempterTest, RunAsRootConstructWithUpdatedMarkerTest) {
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700134 extern const char* kUpdateCompletedMarker;
135 const FilePath kMarker(kUpdateCompletedMarker);
136 EXPECT_EQ(0, file_util::WriteFile(kMarker, "", 0));
Andrew de los Reyes000d8952011-03-02 15:21:14 -0800137 MockDbusGlib dbus;
138 UpdateAttempterUnderTest attempter(&dbus);
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700139 EXPECT_EQ(UPDATE_STATUS_UPDATED_NEED_REBOOT, attempter.status());
140 EXPECT_TRUE(file_util::Delete(kMarker, false));
141}
142
143TEST_F(UpdateAttempterTest, GetErrorCodeForActionTest) {
144 extern ActionExitCode GetErrorCodeForAction(AbstractAction* action,
145 ActionExitCode code);
146 EXPECT_EQ(kActionCodeSuccess,
147 GetErrorCodeForAction(NULL, kActionCodeSuccess));
148
149 OmahaRequestParams params;
Thieu Le116fda32011-04-19 11:01:54 -0700150 OmahaRequestAction omaha_request_action(NULL, params, NULL, NULL, false);
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700151 EXPECT_EQ(kActionCodeOmahaRequestError,
152 GetErrorCodeForAction(&omaha_request_action, kActionCodeError));
Darin Petkov73058b42010-10-06 16:32:19 -0700153 OmahaResponseHandlerAction omaha_response_handler_action(&prefs_);
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700154 EXPECT_EQ(kActionCodeOmahaResponseHandlerError,
155 GetErrorCodeForAction(&omaha_response_handler_action,
156 kActionCodeError));
Darin Petkov3aefa862010-12-07 14:45:00 -0800157 FilesystemCopierAction filesystem_copier_action(false, false);
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700158 EXPECT_EQ(kActionCodeFilesystemCopierError,
159 GetErrorCodeForAction(&filesystem_copier_action, kActionCodeError));
Darin Petkov6d5dbf62010-11-08 16:09:55 -0800160 PostinstallRunnerAction postinstall_runner_action;
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700161 EXPECT_EQ(kActionCodePostinstallRunnerError,
162 GetErrorCodeForAction(&postinstall_runner_action,
163 kActionCodeError));
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700164 ActionMock action_mock;
165 EXPECT_CALL(action_mock, Type()).Times(1).WillOnce(Return("ActionMock"));
166 EXPECT_EQ(kActionCodeError,
167 GetErrorCodeForAction(&action_mock, kActionCodeError));
168}
169
Darin Petkov36275772010-10-01 11:40:57 -0700170TEST_F(UpdateAttempterTest, DisableDeltaUpdateIfNeededTest) {
171 attempter_.omaha_request_params_.delta_okay = true;
172 EXPECT_CALL(prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
173 .WillOnce(Return(false));
174 attempter_.DisableDeltaUpdateIfNeeded();
175 EXPECT_TRUE(attempter_.omaha_request_params_.delta_okay);
176 EXPECT_CALL(prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
177 .WillOnce(DoAll(
178 SetArgumentPointee<1>(UpdateAttempter::kMaxDeltaUpdateFailures - 1),
179 Return(true)));
180 attempter_.DisableDeltaUpdateIfNeeded();
181 EXPECT_TRUE(attempter_.omaha_request_params_.delta_okay);
182 EXPECT_CALL(prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
183 .WillOnce(DoAll(
184 SetArgumentPointee<1>(UpdateAttempter::kMaxDeltaUpdateFailures),
185 Return(true)));
186 attempter_.DisableDeltaUpdateIfNeeded();
187 EXPECT_FALSE(attempter_.omaha_request_params_.delta_okay);
188 EXPECT_CALL(prefs_, GetInt64(_, _)).Times(0);
189 attempter_.DisableDeltaUpdateIfNeeded();
190 EXPECT_FALSE(attempter_.omaha_request_params_.delta_okay);
191}
192
193TEST_F(UpdateAttempterTest, MarkDeltaUpdateFailureTest) {
Darin Petkov36275772010-10-01 11:40:57 -0700194 EXPECT_CALL(prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
195 .WillOnce(Return(false))
196 .WillOnce(DoAll(SetArgumentPointee<1>(-1), Return(true)))
197 .WillOnce(DoAll(SetArgumentPointee<1>(1), Return(true)))
198 .WillOnce(DoAll(
199 SetArgumentPointee<1>(UpdateAttempter::kMaxDeltaUpdateFailures),
200 Return(true)));
Darin Petkov2dd01092010-10-08 15:43:05 -0700201 EXPECT_CALL(prefs_, SetInt64(Ne(kPrefsDeltaUpdateFailures), _))
202 .WillRepeatedly(Return(true));
Darin Petkov36275772010-10-01 11:40:57 -0700203 EXPECT_CALL(prefs_, SetInt64(kPrefsDeltaUpdateFailures, 1)).Times(2);
204 EXPECT_CALL(prefs_, SetInt64(kPrefsDeltaUpdateFailures, 2)).Times(1);
205 EXPECT_CALL(prefs_, SetInt64(kPrefsDeltaUpdateFailures,
206 UpdateAttempter::kMaxDeltaUpdateFailures + 1))
207 .Times(1);
208 for (int i = 0; i < 4; i ++)
209 attempter_.MarkDeltaUpdateFailure();
210}
211
Darin Petkov1b003102010-11-30 10:18:36 -0800212TEST_F(UpdateAttempterTest, ScheduleErrorEventActionNoEventTest) {
213 EXPECT_CALL(*processor_, EnqueueAction(_)).Times(0);
214 EXPECT_CALL(*processor_, StartProcessing()).Times(0);
215 attempter_.ScheduleErrorEventAction();
216}
217
218TEST_F(UpdateAttempterTest, ScheduleErrorEventActionTest) {
219 EXPECT_CALL(*processor_,
220 EnqueueAction(Property(&AbstractAction::Type,
221 OmahaRequestAction::StaticType())))
222 .Times(1);
223 EXPECT_CALL(*processor_, StartProcessing()).Times(1);
224 attempter_.error_event_.reset(new OmahaEvent(OmahaEvent::kTypeUpdateComplete,
225 OmahaEvent::kResultError,
226 kActionCodeError));
227 attempter_.ScheduleErrorEventAction();
228 EXPECT_EQ(UPDATE_STATUS_REPORTING_ERROR_EVENT, attempter_.status());
229}
230
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700231TEST_F(UpdateAttempterTest, UpdateStatusToStringTest) {
232 extern const char* UpdateStatusToString(UpdateStatus);
233 EXPECT_STREQ("UPDATE_STATUS_IDLE", UpdateStatusToString(UPDATE_STATUS_IDLE));
234 EXPECT_STREQ("UPDATE_STATUS_CHECKING_FOR_UPDATE",
235 UpdateStatusToString(UPDATE_STATUS_CHECKING_FOR_UPDATE));
236 EXPECT_STREQ("UPDATE_STATUS_UPDATE_AVAILABLE",
237 UpdateStatusToString(UPDATE_STATUS_UPDATE_AVAILABLE));
238 EXPECT_STREQ("UPDATE_STATUS_DOWNLOADING",
239 UpdateStatusToString(UPDATE_STATUS_DOWNLOADING));
240 EXPECT_STREQ("UPDATE_STATUS_VERIFYING",
241 UpdateStatusToString(UPDATE_STATUS_VERIFYING));
242 EXPECT_STREQ("UPDATE_STATUS_FINALIZING",
243 UpdateStatusToString(UPDATE_STATUS_FINALIZING));
244 EXPECT_STREQ("UPDATE_STATUS_UPDATED_NEED_REBOOT",
245 UpdateStatusToString(UPDATE_STATUS_UPDATED_NEED_REBOOT));
246 EXPECT_STREQ("UPDATE_STATUS_REPORTING_ERROR_EVENT",
247 UpdateStatusToString(UPDATE_STATUS_REPORTING_ERROR_EVENT));
248 EXPECT_STREQ("unknown status",
249 UpdateStatusToString(static_cast<UpdateStatus>(-1)));
250}
251
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200252void UpdateAttempterTest::QuitMainLoop() {
253 g_main_loop_quit(loop_);
254}
255
256gboolean UpdateAttempterTest::StaticQuitMainLoop(gpointer data) {
257 reinterpret_cast<UpdateAttempterTest*>(data)->QuitMainLoop();
258 return FALSE;
259}
260
Darin Petkove6ef2f82011-03-07 17:31:11 -0800261gboolean UpdateAttempterTest::StaticUpdateTestStart(gpointer data) {
262 reinterpret_cast<UpdateAttempterTest*>(data)->UpdateTestStart();
263 return FALSE;
264}
265
266gboolean UpdateAttempterTest::StaticUpdateTestVerify(gpointer data) {
267 reinterpret_cast<UpdateAttempterTest*>(data)->UpdateTestVerify();
268 return FALSE;
269}
270
Thieu Le116fda32011-04-19 11:01:54 -0700271gboolean UpdateAttempterTest::StaticPingOmahaTestStart(gpointer data) {
272 reinterpret_cast<UpdateAttempterTest*>(data)->PingOmahaTestStart();
273 return FALSE;
274}
275
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200276gboolean UpdateAttempterTest::StaticReadTrackFromPolicyTestStart(
277 gpointer data) {
278 reinterpret_cast<UpdateAttempterTest*>(data)->ReadTrackFromPolicyTestStart();
Thieu Le116fda32011-04-19 11:01:54 -0700279 return FALSE;
280}
281
Jay Srinivasan0a708742012-03-20 11:26:12 -0700282gboolean UpdateAttempterTest::StaticReadUpdateDisabledFromPolicyTestStart(
283 gpointer data) {
284 UpdateAttempterTest* ua_test = reinterpret_cast<UpdateAttempterTest*>(data);
285 ua_test->ReadUpdateDisabledFromPolicyTestStart();
286 return FALSE;
287}
288
289gboolean UpdateAttempterTest::StaticReadTargetVersionPrefixFromPolicyTestStart(
290 gpointer data) {
291 UpdateAttempterTest* ua_test = reinterpret_cast<UpdateAttempterTest*>(data);
292 ua_test->ReadTargetVersionPrefixFromPolicyTestStart();
293 return FALSE;
294}
295
Darin Petkove6ef2f82011-03-07 17:31:11 -0800296namespace {
297const string kActionTypes[] = {
298 OmahaRequestAction::StaticType(),
299 OmahaResponseHandlerAction::StaticType(),
300 FilesystemCopierAction::StaticType(),
301 FilesystemCopierAction::StaticType(),
302 OmahaRequestAction::StaticType(),
303 DownloadAction::StaticType(),
304 OmahaRequestAction::StaticType(),
305 FilesystemCopierAction::StaticType(),
306 FilesystemCopierAction::StaticType(),
307 PostinstallRunnerAction::StaticType(),
308 OmahaRequestAction::StaticType()
309};
310} // namespace {}
311
312void UpdateAttempterTest::UpdateTestStart() {
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700313 attempter_.set_http_response_code(200);
314 InSequence s;
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700315 for (size_t i = 0; i < arraysize(kActionTypes); ++i) {
316 EXPECT_CALL(*processor_,
317 EnqueueAction(Property(&AbstractAction::Type,
318 kActionTypes[i]))).Times(1);
319 }
320 EXPECT_CALL(*processor_, StartProcessing()).Times(1);
321
Gilad Arnold1ebd8132012-03-05 10:19:29 -0800322 attempter_.Update("", "", false, false, false);
Darin Petkove6ef2f82011-03-07 17:31:11 -0800323 g_idle_add(&StaticUpdateTestVerify, this);
324}
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700325
Darin Petkove6ef2f82011-03-07 17:31:11 -0800326void UpdateAttempterTest::UpdateTestVerify() {
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700327 EXPECT_EQ(0, attempter_.http_response_code());
328 EXPECT_EQ(&attempter_, processor_->delegate());
329 EXPECT_EQ(arraysize(kActionTypes), attempter_.actions_.size());
330 for (size_t i = 0; i < arraysize(kActionTypes); ++i) {
331 EXPECT_EQ(kActionTypes[i], attempter_.actions_[i]->Type());
332 }
333 EXPECT_EQ(attempter_.response_handler_action_.get(),
334 attempter_.actions_[1].get());
335 DownloadAction* download_action =
336 dynamic_cast<DownloadAction*>(attempter_.actions_[5].get());
337 ASSERT_TRUE(download_action != NULL);
338 EXPECT_EQ(&attempter_, download_action->delegate());
339 EXPECT_EQ(UPDATE_STATUS_CHECKING_FOR_UPDATE, attempter_.status());
Darin Petkove6ef2f82011-03-07 17:31:11 -0800340 g_main_loop_quit(loop_);
341}
342
343TEST_F(UpdateAttempterTest, UpdateTest) {
344 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
345 g_idle_add(&StaticUpdateTestStart, this);
346 g_main_loop_run(loop_);
347 g_main_loop_unref(loop_);
348 loop_ = NULL;
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700349}
350
Thieu Le116fda32011-04-19 11:01:54 -0700351void UpdateAttempterTest::PingOmahaTestStart() {
352 EXPECT_CALL(*processor_,
353 EnqueueAction(Property(&AbstractAction::Type,
354 OmahaRequestAction::StaticType())))
355 .Times(1);
356 EXPECT_CALL(*processor_, StartProcessing()).Times(1);
357 attempter_.PingOmaha();
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200358 g_idle_add(&StaticQuitMainLoop, this);
Thieu Le116fda32011-04-19 11:01:54 -0700359}
360
361TEST_F(UpdateAttempterTest, PingOmahaTest) {
362 UpdateCheckScheduler scheduler(&attempter_);
363 scheduler.enabled_ = true;
Andrew de los Reyese05fc282011-06-02 09:50:08 -0700364 EXPECT_FALSE(scheduler.scheduled_);
Thieu Le116fda32011-04-19 11:01:54 -0700365 attempter_.set_update_check_scheduler(&scheduler);
366 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
367 g_idle_add(&StaticPingOmahaTestStart, this);
368 g_main_loop_run(loop_);
369 g_main_loop_unref(loop_);
370 loop_ = NULL;
371 EXPECT_EQ(UPDATE_STATUS_UPDATED_NEED_REBOOT, attempter_.status());
372 EXPECT_EQ(true, scheduler.scheduled_);
373}
374
Darin Petkov18c7bce2011-06-16 14:07:00 -0700375TEST_F(UpdateAttempterTest, CreatePendingErrorEventTest) {
376 ActionMock action;
377 const ActionExitCode kCode = kActionCodeDownloadTransferError;
378 attempter_.CreatePendingErrorEvent(&action, kCode);
379 ASSERT_TRUE(attempter_.error_event_.get() != NULL);
380 EXPECT_EQ(OmahaEvent::kTypeUpdateComplete, attempter_.error_event_->type);
381 EXPECT_EQ(OmahaEvent::kResultError, attempter_.error_event_->result);
382 EXPECT_EQ(kCode, attempter_.error_event_->error_code);
383}
384
385TEST_F(UpdateAttempterTest, CreatePendingErrorEventResumedTest) {
386 OmahaResponseHandlerAction *response_action =
387 new OmahaResponseHandlerAction(&prefs_);
388 response_action->install_plan_.is_resume = true;
389 attempter_.response_handler_action_.reset(response_action);
390 ActionMock action;
391 const ActionExitCode kCode = kActionCodeInstallDeviceOpenError;
392 attempter_.CreatePendingErrorEvent(&action, kCode);
393 ASSERT_TRUE(attempter_.error_event_.get() != NULL);
394 EXPECT_EQ(OmahaEvent::kTypeUpdateComplete, attempter_.error_event_->type);
395 EXPECT_EQ(OmahaEvent::kResultError, attempter_.error_event_->result);
396 EXPECT_EQ(kCode | kActionCodeResumedFlag,
397 attempter_.error_event_->error_code);
398}
399
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200400TEST_F(UpdateAttempterTest, ReadTrackFromPolicy) {
401 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
402 g_idle_add(&StaticReadTrackFromPolicyTestStart, this);
403 g_main_loop_run(loop_);
404 g_main_loop_unref(loop_);
405 loop_ = NULL;
406}
407
408void UpdateAttempterTest::ReadTrackFromPolicyTestStart() {
409 // Tests that the update track (aka release channel) is properly fetched
410 // from the device policy.
411
412 policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
413 attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
414
415 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
416
417 EXPECT_CALL(*device_policy, GetReleaseChannel(_))
418 .WillRepeatedly(DoAll(
419 SetArgumentPointee<0>(std::string("canary-channel")),
420 Return(true)));
421
Gilad Arnold1ebd8132012-03-05 10:19:29 -0800422 attempter_.Update("", "", false, false, false);
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200423 EXPECT_EQ("canary-channel", attempter_.omaha_request_params_.app_track);
424
425 g_idle_add(&StaticQuitMainLoop, this);
426}
427
Jay Srinivasan0a708742012-03-20 11:26:12 -0700428TEST_F(UpdateAttempterTest, ReadUpdateDisabledFromPolicy) {
429 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
430 g_idle_add(&StaticReadUpdateDisabledFromPolicyTestStart, this);
431 g_main_loop_run(loop_);
432 g_main_loop_unref(loop_);
433 loop_ = NULL;
434}
435
436void UpdateAttempterTest::ReadUpdateDisabledFromPolicyTestStart() {
437 // Tests that the update_disbled flag is properly fetched
438 // from the device policy.
439
440 policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
441 attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
442
443 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
444
445 EXPECT_CALL(*device_policy, GetUpdateDisabled(_))
446 .WillRepeatedly(DoAll(
447 SetArgumentPointee<0>(true),
448 Return(true)));
449
450 attempter_.Update("", "", false, false, false);
451 EXPECT_TRUE(attempter_.omaha_request_params_.update_disabled);
452
453 g_idle_add(&StaticQuitMainLoop, this);
454}
455
456TEST_F(UpdateAttempterTest, ReadTargetVersionPrefixFromPolicy) {
457 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
458 g_idle_add(&StaticReadTargetVersionPrefixFromPolicyTestStart, this);
459 g_main_loop_run(loop_);
460 g_main_loop_unref(loop_);
461 loop_ = NULL;
462}
463
464void UpdateAttempterTest::ReadTargetVersionPrefixFromPolicyTestStart() {
465 // Tests that the target_version_prefix value is properly fetched
466 // from the device policy.
467
468 const std::string target_version_prefix = "1412.";
469
470 policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
471 attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
472
473 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
474
475 EXPECT_CALL(*device_policy, GetTargetVersionPrefix(_))
476 .WillRepeatedly(DoAll(
477 SetArgumentPointee<0>(target_version_prefix),
478 Return(true)));
479
480 attempter_.Update("", "", false, false, false);
481 EXPECT_EQ(target_version_prefix.c_str(),
482 attempter_.omaha_request_params_.target_version_prefix);
483
484 g_idle_add(&StaticQuitMainLoop, this);
485}
486
487
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700488} // namespace chromeos_update_engine