blob: 2de8ca2b248ef1f2913acc8ed6601f118a256ed8 [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"
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080016#include "update_engine/mock_payload_state.h"
Jay Srinivasan08fce042012-06-07 16:31:01 -070017#include "update_engine/mock_system_state.h"
Darin Petkovf42cc1c2010-09-01 09:03:02 -070018#include "update_engine/postinstall_runner_action.h"
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070019#include "update_engine/prefs.h"
Darin Petkov36275772010-10-01 11:40:57 -070020#include "update_engine/prefs_mock.h"
Darin Petkov1b003102010-11-30 10:18:36 -080021#include "update_engine/test_utils.h"
Darin Petkovf42cc1c2010-09-01 09:03:02 -070022#include "update_engine/update_attempter.h"
Darin Petkov1b003102010-11-30 10:18:36 -080023#include "update_engine/update_check_scheduler.h"
Darin Petkovf42cc1c2010-09-01 09:03:02 -070024
25using std::string;
Darin Petkov36275772010-10-01 11:40:57 -070026using testing::_;
27using testing::DoAll;
Darin Petkovf42cc1c2010-09-01 09:03:02 -070028using testing::InSequence;
Darin Petkov2dd01092010-10-08 15:43:05 -070029using testing::Ne;
Darin Petkov9c096d62010-11-17 14:49:04 -080030using testing::NiceMock;
Darin Petkovf42cc1c2010-09-01 09:03:02 -070031using testing::Property;
32using testing::Return;
Darin Petkov36275772010-10-01 11:40:57 -070033using testing::SetArgumentPointee;
Darin Petkovf42cc1c2010-09-01 09:03:02 -070034
35namespace chromeos_update_engine {
36
37// Test a subclass rather than the main class directly so that we can mock out
Darin Petkovcd1666f2010-09-23 09:53:44 -070038// methods within the class. There're explicit unit tests for the mocked out
Darin Petkovf42cc1c2010-09-01 09:03:02 -070039// methods.
40class UpdateAttempterUnderTest : public UpdateAttempter {
41 public:
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080042 explicit UpdateAttempterUnderTest(MockSystemState* mock_system_state,
43 MockDbusGlib* dbus)
Gilad Arnoldbf7919b2013-01-08 13:07:37 -080044 : UpdateAttempter(mock_system_state, dbus) {}
Darin Petkovf42cc1c2010-09-01 09:03:02 -070045};
46
47class UpdateAttempterTest : public ::testing::Test {
48 protected:
Jay Srinivasan43488792012-06-19 00:25:31 -070049 UpdateAttempterTest()
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080050 : attempter_(&mock_system_state_, &dbus_),
Jay Srinivasan43488792012-06-19 00:25:31 -070051 mock_connection_manager(&mock_system_state_),
52 loop_(NULL) {
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080053 mock_system_state_.set_connection_manager(&mock_connection_manager);
Jay Srinivasan43488792012-06-19 00:25:31 -070054 }
Darin Petkovf42cc1c2010-09-01 09:03:02 -070055 virtual void SetUp() {
56 EXPECT_EQ(NULL, attempter_.dbus_service_);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080057 EXPECT_TRUE(attempter_.system_state_ != NULL);
Darin Petkovf42cc1c2010-09-01 09:03:02 -070058 EXPECT_EQ(NULL, attempter_.update_check_scheduler_);
59 EXPECT_EQ(0, attempter_.http_response_code_);
Chris Sosa4f8ee272012-11-30 13:01:54 -080060 EXPECT_EQ(utils::kCpuSharesNormal, attempter_.shares_);
61 EXPECT_EQ(NULL, attempter_.manage_shares_source_);
Darin Petkovf42cc1c2010-09-01 09:03:02 -070062 EXPECT_FALSE(attempter_.download_active_);
63 EXPECT_EQ(UPDATE_STATUS_IDLE, attempter_.status_);
64 EXPECT_EQ(0.0, attempter_.download_progress_);
65 EXPECT_EQ(0, attempter_.last_checked_time_);
66 EXPECT_EQ("0.0.0.0", attempter_.new_version_);
Jay Srinivasan51dcf262012-09-13 17:24:32 -070067 EXPECT_EQ(0, attempter_.new_payload_size_);
Jay Srinivasan55f50c22013-01-10 19:24:35 -080068 processor_ = new NiceMock<ActionProcessorMock>();
Darin Petkovf42cc1c2010-09-01 09:03:02 -070069 attempter_.processor_.reset(processor_); // Transfers ownership.
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080070 prefs_ = mock_system_state_.mock_prefs();
Darin Petkovf42cc1c2010-09-01 09:03:02 -070071 }
72
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +020073 void QuitMainLoop();
74 static gboolean StaticQuitMainLoop(gpointer data);
75
Darin Petkove6ef2f82011-03-07 17:31:11 -080076 void UpdateTestStart();
77 void UpdateTestVerify();
Chris Sosa76a29ae2013-07-11 17:59:24 -070078 void RollbackTestStart(bool enterprise_rollback);
79 void RollbackTestVerify();
Darin Petkove6ef2f82011-03-07 17:31:11 -080080 static gboolean StaticUpdateTestStart(gpointer data);
81 static gboolean StaticUpdateTestVerify(gpointer data);
Chris Sosa76a29ae2013-07-11 17:59:24 -070082 static gboolean StaticRollbackTestStart(gpointer data);
83 static gboolean StaticEnterpriseRollbackTestStart(gpointer data);
84 static gboolean StaticRollbackTestVerify(gpointer data);
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +020085
Thieu Le116fda32011-04-19 11:01:54 -070086 void PingOmahaTestStart();
Thieu Le116fda32011-04-19 11:01:54 -070087 static gboolean StaticPingOmahaTestStart(gpointer data);
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +020088
Jay Srinivasanae4697c2013-03-18 17:08:08 -070089 void ReadChannelFromPolicyTestStart();
90 static gboolean StaticReadChannelFromPolicyTestStart(gpointer data);
Darin Petkove6ef2f82011-03-07 17:31:11 -080091
Jay Srinivasan0a708742012-03-20 11:26:12 -070092 void ReadUpdateDisabledFromPolicyTestStart();
93 static gboolean StaticReadUpdateDisabledFromPolicyTestStart(gpointer data);
94
95 void ReadTargetVersionPrefixFromPolicyTestStart();
96 static gboolean StaticReadTargetVersionPrefixFromPolicyTestStart(
97 gpointer data);
98
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070099 void ReadScatterFactorFromPolicyTestStart();
100 static gboolean StaticReadScatterFactorFromPolicyTestStart(
101 gpointer data);
102
103 void DecrementUpdateCheckCountTestStart();
104 static gboolean StaticDecrementUpdateCheckCountTestStart(
105 gpointer data);
106
Jay Srinivasan08fce042012-06-07 16:31:01 -0700107 void NoScatteringDoneDuringManualUpdateTestStart();
108 static gboolean StaticNoScatteringDoneDuringManualUpdateTestStart(
109 gpointer data);
110
Jay Srinivasan55f50c22013-01-10 19:24:35 -0800111 NiceMock<MockSystemState> mock_system_state_;
112 NiceMock<MockDbusGlib> dbus_;
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700113 UpdateAttempterUnderTest attempter_;
Jay Srinivasan55f50c22013-01-10 19:24:35 -0800114 NiceMock<ActionProcessorMock>* processor_;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800115 NiceMock<PrefsMock>* prefs_; // shortcut to mock_system_state_->mock_prefs()
Jay Srinivasan55f50c22013-01-10 19:24:35 -0800116 NiceMock<MockConnectionManager> mock_connection_manager;
Darin Petkove6ef2f82011-03-07 17:31:11 -0800117 GMainLoop* loop_;
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700118};
119
Darin Petkov1b003102010-11-30 10:18:36 -0800120TEST_F(UpdateAttempterTest, ActionCompletedDownloadTest) {
121 scoped_ptr<MockHttpFetcher> fetcher(new MockHttpFetcher("", 0, NULL));
122 fetcher->FailTransfer(503); // Sets the HTTP response code.
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800123 DownloadAction action(prefs_, NULL, fetcher.release());
124 EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _)).Times(0);
David Zeuthena99981f2013-04-29 13:42:47 -0700125 attempter_.ActionCompleted(NULL, &action, kErrorCodeSuccess);
Darin Petkov1b003102010-11-30 10:18:36 -0800126 EXPECT_EQ(503, attempter_.http_response_code());
127 EXPECT_EQ(UPDATE_STATUS_FINALIZING, attempter_.status());
128 ASSERT_TRUE(attempter_.error_event_.get() == NULL);
129}
130
131TEST_F(UpdateAttempterTest, ActionCompletedErrorTest) {
132 ActionMock action;
133 EXPECT_CALL(action, Type()).WillRepeatedly(Return("ActionMock"));
134 attempter_.status_ = UPDATE_STATUS_DOWNLOADING;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800135 EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
Darin Petkov1b003102010-11-30 10:18:36 -0800136 .WillOnce(Return(false));
David Zeuthena99981f2013-04-29 13:42:47 -0700137 attempter_.ActionCompleted(NULL, &action, kErrorCodeError);
Darin Petkov1b003102010-11-30 10:18:36 -0800138 ASSERT_TRUE(attempter_.error_event_.get() != NULL);
139}
140
141TEST_F(UpdateAttempterTest, ActionCompletedOmahaRequestTest) {
142 scoped_ptr<MockHttpFetcher> fetcher(new MockHttpFetcher("", 0, NULL));
143 fetcher->FailTransfer(500); // Sets the HTTP response code.
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700144 OmahaRequestAction action(&mock_system_state_, NULL,
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800145 fetcher.release(), false);
Darin Petkov1b003102010-11-30 10:18:36 -0800146 ObjectCollectorAction<OmahaResponse> collector_action;
147 BondActions(&action, &collector_action);
148 OmahaResponse response;
149 response.poll_interval = 234;
150 action.SetOutputObject(response);
Gilad Arnoldbf7919b2013-01-08 13:07:37 -0800151 UpdateCheckScheduler scheduler(&attempter_, &mock_system_state_);
Darin Petkov1b003102010-11-30 10:18:36 -0800152 attempter_.set_update_check_scheduler(&scheduler);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800153 EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _)).Times(0);
David Zeuthena99981f2013-04-29 13:42:47 -0700154 attempter_.ActionCompleted(NULL, &action, kErrorCodeSuccess);
Darin Petkov1b003102010-11-30 10:18:36 -0800155 EXPECT_EQ(500, attempter_.http_response_code());
156 EXPECT_EQ(UPDATE_STATUS_IDLE, attempter_.status());
157 EXPECT_EQ(234, scheduler.poll_interval());
158 ASSERT_TRUE(attempter_.error_event_.get() == NULL);
159}
160
Darin Petkovcd1666f2010-09-23 09:53:44 -0700161TEST_F(UpdateAttempterTest, RunAsRootConstructWithUpdatedMarkerTest) {
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700162 extern const char* kUpdateCompletedMarker;
163 const FilePath kMarker(kUpdateCompletedMarker);
164 EXPECT_EQ(0, file_util::WriteFile(kMarker, "", 0));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800165 UpdateAttempterUnderTest attempter(&mock_system_state_, &dbus_);
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700166 EXPECT_EQ(UPDATE_STATUS_UPDATED_NEED_REBOOT, attempter.status());
167 EXPECT_TRUE(file_util::Delete(kMarker, false));
168}
169
170TEST_F(UpdateAttempterTest, GetErrorCodeForActionTest) {
David Zeuthena99981f2013-04-29 13:42:47 -0700171 extern ErrorCode GetErrorCodeForAction(AbstractAction* action,
172 ErrorCode code);
173 EXPECT_EQ(kErrorCodeSuccess,
174 GetErrorCodeForAction(NULL, kErrorCodeSuccess));
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700175
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800176 MockSystemState mock_system_state;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700177 OmahaRequestAction omaha_request_action(&mock_system_state, NULL,
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800178 NULL, false);
David Zeuthena99981f2013-04-29 13:42:47 -0700179 EXPECT_EQ(kErrorCodeOmahaRequestError,
180 GetErrorCodeForAction(&omaha_request_action, kErrorCodeError));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800181 OmahaResponseHandlerAction omaha_response_handler_action(&mock_system_state_);
David Zeuthena99981f2013-04-29 13:42:47 -0700182 EXPECT_EQ(kErrorCodeOmahaResponseHandlerError,
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700183 GetErrorCodeForAction(&omaha_response_handler_action,
David Zeuthena99981f2013-04-29 13:42:47 -0700184 kErrorCodeError));
Gilad Arnold581c2ea2012-07-19 12:33:49 -0700185 FilesystemCopierAction filesystem_copier_action(false, false);
David Zeuthena99981f2013-04-29 13:42:47 -0700186 EXPECT_EQ(kErrorCodeFilesystemCopierError,
187 GetErrorCodeForAction(&filesystem_copier_action, kErrorCodeError));
Darin Petkov6d5dbf62010-11-08 16:09:55 -0800188 PostinstallRunnerAction postinstall_runner_action;
David Zeuthena99981f2013-04-29 13:42:47 -0700189 EXPECT_EQ(kErrorCodePostinstallRunnerError,
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700190 GetErrorCodeForAction(&postinstall_runner_action,
David Zeuthena99981f2013-04-29 13:42:47 -0700191 kErrorCodeError));
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700192 ActionMock action_mock;
193 EXPECT_CALL(action_mock, Type()).Times(1).WillOnce(Return("ActionMock"));
David Zeuthena99981f2013-04-29 13:42:47 -0700194 EXPECT_EQ(kErrorCodeError,
195 GetErrorCodeForAction(&action_mock, kErrorCodeError));
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700196}
197
Darin Petkov36275772010-10-01 11:40:57 -0700198TEST_F(UpdateAttempterTest, DisableDeltaUpdateIfNeededTest) {
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700199 attempter_.omaha_request_params_->set_delta_okay(true);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800200 EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
Darin Petkov36275772010-10-01 11:40:57 -0700201 .WillOnce(Return(false));
202 attempter_.DisableDeltaUpdateIfNeeded();
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700203 EXPECT_TRUE(attempter_.omaha_request_params_->delta_okay());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800204 EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
Darin Petkov36275772010-10-01 11:40:57 -0700205 .WillOnce(DoAll(
206 SetArgumentPointee<1>(UpdateAttempter::kMaxDeltaUpdateFailures - 1),
207 Return(true)));
208 attempter_.DisableDeltaUpdateIfNeeded();
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700209 EXPECT_TRUE(attempter_.omaha_request_params_->delta_okay());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800210 EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
Darin Petkov36275772010-10-01 11:40:57 -0700211 .WillOnce(DoAll(
212 SetArgumentPointee<1>(UpdateAttempter::kMaxDeltaUpdateFailures),
213 Return(true)));
214 attempter_.DisableDeltaUpdateIfNeeded();
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700215 EXPECT_FALSE(attempter_.omaha_request_params_->delta_okay());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800216 EXPECT_CALL(*prefs_, GetInt64(_, _)).Times(0);
Darin Petkov36275772010-10-01 11:40:57 -0700217 attempter_.DisableDeltaUpdateIfNeeded();
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700218 EXPECT_FALSE(attempter_.omaha_request_params_->delta_okay());
Darin Petkov36275772010-10-01 11:40:57 -0700219}
220
221TEST_F(UpdateAttempterTest, MarkDeltaUpdateFailureTest) {
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800222 EXPECT_CALL(*prefs_, GetInt64(kPrefsDeltaUpdateFailures, _))
Darin Petkov36275772010-10-01 11:40:57 -0700223 .WillOnce(Return(false))
224 .WillOnce(DoAll(SetArgumentPointee<1>(-1), Return(true)))
225 .WillOnce(DoAll(SetArgumentPointee<1>(1), Return(true)))
226 .WillOnce(DoAll(
227 SetArgumentPointee<1>(UpdateAttempter::kMaxDeltaUpdateFailures),
228 Return(true)));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800229 EXPECT_CALL(*prefs_, SetInt64(Ne(kPrefsDeltaUpdateFailures), _))
Darin Petkov2dd01092010-10-08 15:43:05 -0700230 .WillRepeatedly(Return(true));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800231 EXPECT_CALL(*prefs_, SetInt64(kPrefsDeltaUpdateFailures, 1)).Times(2);
232 EXPECT_CALL(*prefs_, SetInt64(kPrefsDeltaUpdateFailures, 2)).Times(1);
233 EXPECT_CALL(*prefs_, SetInt64(kPrefsDeltaUpdateFailures,
Darin Petkov36275772010-10-01 11:40:57 -0700234 UpdateAttempter::kMaxDeltaUpdateFailures + 1))
235 .Times(1);
236 for (int i = 0; i < 4; i ++)
237 attempter_.MarkDeltaUpdateFailure();
238}
239
Darin Petkov1b003102010-11-30 10:18:36 -0800240TEST_F(UpdateAttempterTest, ScheduleErrorEventActionNoEventTest) {
241 EXPECT_CALL(*processor_, EnqueueAction(_)).Times(0);
242 EXPECT_CALL(*processor_, StartProcessing()).Times(0);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800243 EXPECT_CALL(*mock_system_state_.mock_payload_state(), UpdateFailed(_))
244 .Times(0);
245 OmahaResponse response;
Jay Srinivasan53173b92013-05-17 17:13:01 -0700246 string url1 = "http://url1";
247 response.payload_urls.push_back(url1);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800248 response.payload_urls.push_back("https://url");
Jay Srinivasan53173b92013-05-17 17:13:01 -0700249 EXPECT_CALL(*(mock_system_state_.mock_payload_state()), GetCurrentUrl())
250 .WillRepeatedly(Return(url1));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800251 mock_system_state_.mock_payload_state()->SetResponse(response);
Darin Petkov1b003102010-11-30 10:18:36 -0800252 attempter_.ScheduleErrorEventAction();
Jay Srinivasan53173b92013-05-17 17:13:01 -0700253 EXPECT_EQ(url1, mock_system_state_.mock_payload_state()->GetCurrentUrl());
Darin Petkov1b003102010-11-30 10:18:36 -0800254}
255
256TEST_F(UpdateAttempterTest, ScheduleErrorEventActionTest) {
257 EXPECT_CALL(*processor_,
258 EnqueueAction(Property(&AbstractAction::Type,
259 OmahaRequestAction::StaticType())))
260 .Times(1);
261 EXPECT_CALL(*processor_, StartProcessing()).Times(1);
David Zeuthena99981f2013-04-29 13:42:47 -0700262 ErrorCode err = kErrorCodeError;
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800263 EXPECT_CALL(*mock_system_state_.mock_payload_state(), UpdateFailed(err));
Darin Petkov1b003102010-11-30 10:18:36 -0800264 attempter_.error_event_.reset(new OmahaEvent(OmahaEvent::kTypeUpdateComplete,
265 OmahaEvent::kResultError,
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800266 err));
Darin Petkov1b003102010-11-30 10:18:36 -0800267 attempter_.ScheduleErrorEventAction();
268 EXPECT_EQ(UPDATE_STATUS_REPORTING_ERROR_EVENT, attempter_.status());
269}
270
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700271TEST_F(UpdateAttempterTest, UpdateStatusToStringTest) {
272 extern const char* UpdateStatusToString(UpdateStatus);
273 EXPECT_STREQ("UPDATE_STATUS_IDLE", UpdateStatusToString(UPDATE_STATUS_IDLE));
274 EXPECT_STREQ("UPDATE_STATUS_CHECKING_FOR_UPDATE",
275 UpdateStatusToString(UPDATE_STATUS_CHECKING_FOR_UPDATE));
276 EXPECT_STREQ("UPDATE_STATUS_UPDATE_AVAILABLE",
277 UpdateStatusToString(UPDATE_STATUS_UPDATE_AVAILABLE));
278 EXPECT_STREQ("UPDATE_STATUS_DOWNLOADING",
279 UpdateStatusToString(UPDATE_STATUS_DOWNLOADING));
280 EXPECT_STREQ("UPDATE_STATUS_VERIFYING",
281 UpdateStatusToString(UPDATE_STATUS_VERIFYING));
282 EXPECT_STREQ("UPDATE_STATUS_FINALIZING",
283 UpdateStatusToString(UPDATE_STATUS_FINALIZING));
284 EXPECT_STREQ("UPDATE_STATUS_UPDATED_NEED_REBOOT",
285 UpdateStatusToString(UPDATE_STATUS_UPDATED_NEED_REBOOT));
286 EXPECT_STREQ("UPDATE_STATUS_REPORTING_ERROR_EVENT",
287 UpdateStatusToString(UPDATE_STATUS_REPORTING_ERROR_EVENT));
288 EXPECT_STREQ("unknown status",
289 UpdateStatusToString(static_cast<UpdateStatus>(-1)));
290}
291
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200292void UpdateAttempterTest::QuitMainLoop() {
293 g_main_loop_quit(loop_);
294}
295
296gboolean UpdateAttempterTest::StaticQuitMainLoop(gpointer data) {
297 reinterpret_cast<UpdateAttempterTest*>(data)->QuitMainLoop();
298 return FALSE;
299}
300
Darin Petkove6ef2f82011-03-07 17:31:11 -0800301gboolean UpdateAttempterTest::StaticUpdateTestStart(gpointer data) {
302 reinterpret_cast<UpdateAttempterTest*>(data)->UpdateTestStart();
303 return FALSE;
304}
305
306gboolean UpdateAttempterTest::StaticUpdateTestVerify(gpointer data) {
307 reinterpret_cast<UpdateAttempterTest*>(data)->UpdateTestVerify();
308 return FALSE;
309}
310
Chris Sosa76a29ae2013-07-11 17:59:24 -0700311gboolean UpdateAttempterTest::StaticRollbackTestStart(gpointer data) {
312 reinterpret_cast<UpdateAttempterTest*>(data)->RollbackTestStart(false);
313 return FALSE;
314}
315
316gboolean UpdateAttempterTest::StaticEnterpriseRollbackTestStart(gpointer data) {
317 reinterpret_cast<UpdateAttempterTest*>(data)->RollbackTestStart(true);
318 return FALSE;
319}
320
321gboolean UpdateAttempterTest::StaticRollbackTestVerify(gpointer data) {
322 reinterpret_cast<UpdateAttempterTest*>(data)->RollbackTestVerify();
323 return FALSE;
324}
325
Thieu Le116fda32011-04-19 11:01:54 -0700326gboolean UpdateAttempterTest::StaticPingOmahaTestStart(gpointer data) {
327 reinterpret_cast<UpdateAttempterTest*>(data)->PingOmahaTestStart();
328 return FALSE;
329}
330
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700331gboolean UpdateAttempterTest::StaticReadChannelFromPolicyTestStart(
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200332 gpointer data) {
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700333 UpdateAttempterTest* ua_test = reinterpret_cast<UpdateAttempterTest*>(data);
334 ua_test->ReadChannelFromPolicyTestStart();
Thieu Le116fda32011-04-19 11:01:54 -0700335 return FALSE;
336}
337
Jay Srinivasan0a708742012-03-20 11:26:12 -0700338gboolean UpdateAttempterTest::StaticReadUpdateDisabledFromPolicyTestStart(
339 gpointer data) {
340 UpdateAttempterTest* ua_test = reinterpret_cast<UpdateAttempterTest*>(data);
341 ua_test->ReadUpdateDisabledFromPolicyTestStart();
342 return FALSE;
343}
344
345gboolean UpdateAttempterTest::StaticReadTargetVersionPrefixFromPolicyTestStart(
346 gpointer data) {
347 UpdateAttempterTest* ua_test = reinterpret_cast<UpdateAttempterTest*>(data);
348 ua_test->ReadTargetVersionPrefixFromPolicyTestStart();
349 return FALSE;
350}
351
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700352gboolean UpdateAttempterTest::StaticReadScatterFactorFromPolicyTestStart(
353 gpointer data) {
354 UpdateAttempterTest* ua_test = reinterpret_cast<UpdateAttempterTest*>(data);
355 ua_test->ReadScatterFactorFromPolicyTestStart();
356 return FALSE;
357}
358
359gboolean UpdateAttempterTest::StaticDecrementUpdateCheckCountTestStart(
360 gpointer data) {
361 UpdateAttempterTest* ua_test = reinterpret_cast<UpdateAttempterTest*>(data);
362 ua_test->DecrementUpdateCheckCountTestStart();
363 return FALSE;
364}
365
Jay Srinivasan08fce042012-06-07 16:31:01 -0700366gboolean UpdateAttempterTest::StaticNoScatteringDoneDuringManualUpdateTestStart(
367 gpointer data) {
368 UpdateAttempterTest* ua_test = reinterpret_cast<UpdateAttempterTest*>(data);
369 ua_test->NoScatteringDoneDuringManualUpdateTestStart();
370 return FALSE;
371}
372
Darin Petkove6ef2f82011-03-07 17:31:11 -0800373namespace {
Chris Sosa76a29ae2013-07-11 17:59:24 -0700374// Actions that will be built as part of an update check.
375const string kUpdateActionTypes[] = {
Darin Petkove6ef2f82011-03-07 17:31:11 -0800376 OmahaRequestAction::StaticType(),
377 OmahaResponseHandlerAction::StaticType(),
378 FilesystemCopierAction::StaticType(),
379 FilesystemCopierAction::StaticType(),
380 OmahaRequestAction::StaticType(),
381 DownloadAction::StaticType(),
382 OmahaRequestAction::StaticType(),
383 FilesystemCopierAction::StaticType(),
384 FilesystemCopierAction::StaticType(),
385 PostinstallRunnerAction::StaticType(),
386 OmahaRequestAction::StaticType()
387};
Chris Sosa76a29ae2013-07-11 17:59:24 -0700388
389// Actions that will be built as part of a user-initiated rollback.
390const string kRollbackActionTypes[] = {
391 InstallPlanAction::StaticType(),
392 PostinstallRunnerAction::StaticType(),
393};
394
Darin Petkove6ef2f82011-03-07 17:31:11 -0800395} // namespace {}
396
397void UpdateAttempterTest::UpdateTestStart() {
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700398 attempter_.set_http_response_code(200);
399 InSequence s;
Chris Sosa76a29ae2013-07-11 17:59:24 -0700400 for (size_t i = 0; i < arraysize(kUpdateActionTypes); ++i) {
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700401 EXPECT_CALL(*processor_,
402 EnqueueAction(Property(&AbstractAction::Type,
Chris Sosa76a29ae2013-07-11 17:59:24 -0700403 kUpdateActionTypes[i]))).Times(1);
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700404 }
405 EXPECT_CALL(*processor_, StartProcessing()).Times(1);
406
Gilad Arnoldb92f0df2013-01-10 16:32:45 -0800407 attempter_.Update("", "", false, false, false);
Darin Petkove6ef2f82011-03-07 17:31:11 -0800408 g_idle_add(&StaticUpdateTestVerify, this);
409}
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700410
Darin Petkove6ef2f82011-03-07 17:31:11 -0800411void UpdateAttempterTest::UpdateTestVerify() {
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700412 EXPECT_EQ(0, attempter_.http_response_code());
413 EXPECT_EQ(&attempter_, processor_->delegate());
Chris Sosa76a29ae2013-07-11 17:59:24 -0700414 EXPECT_EQ(arraysize(kUpdateActionTypes), attempter_.actions_.size());
415 for (size_t i = 0; i < arraysize(kUpdateActionTypes); ++i) {
416 EXPECT_EQ(kUpdateActionTypes[i], attempter_.actions_[i]->Type());
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700417 }
418 EXPECT_EQ(attempter_.response_handler_action_.get(),
419 attempter_.actions_[1].get());
420 DownloadAction* download_action =
421 dynamic_cast<DownloadAction*>(attempter_.actions_[5].get());
422 ASSERT_TRUE(download_action != NULL);
423 EXPECT_EQ(&attempter_, download_action->delegate());
424 EXPECT_EQ(UPDATE_STATUS_CHECKING_FOR_UPDATE, attempter_.status());
Darin Petkove6ef2f82011-03-07 17:31:11 -0800425 g_main_loop_quit(loop_);
426}
427
Chris Sosa76a29ae2013-07-11 17:59:24 -0700428void UpdateAttempterTest::RollbackTestStart(bool enterprise_rollback) {
429 // Create a device policy so that we can change settings.
430 policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
431 attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
432
433 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
434 EXPECT_CALL(mock_system_state_, device_policy()).WillRepeatedly(
435 Return(device_policy));
436
437 string install_path = "/dev/sda3";
438
439 // Non-enterprise enrolled device account with an owner in the device policy.
440 if (!enterprise_rollback) {
441 EXPECT_CALL(*device_policy, GetOwner(_)).WillOnce(
442 DoAll(SetArgumentPointee<0>(std::string("fake.mail@fake.com")),
443 Return(true)));
444
445 InSequence s;
446 for (size_t i = 0; i < arraysize(kRollbackActionTypes); ++i) {
447 EXPECT_CALL(*processor_,
448 EnqueueAction(Property(&AbstractAction::Type,
449 kRollbackActionTypes[i]))).Times(1);
450 }
451 EXPECT_CALL(*processor_, StartProcessing()).Times(1);
452
453 EXPECT_TRUE(attempter_.Rollback(true, &install_path));
454 g_idle_add(&StaticRollbackTestVerify, this);
455 } else {
456 // We return an empty owner as this is an enterprise.
457 EXPECT_CALL(*device_policy, GetOwner(_)).WillOnce(
458 DoAll(SetArgumentPointee<0>(std::string("")),
459 Return(true)));
460
461 // We do not currently support rollbacks for enterprises.
462 EXPECT_FALSE(attempter_.Rollback(true, &install_path));
463 g_main_loop_quit(loop_);
464 }
465}
466
467void UpdateAttempterTest::RollbackTestVerify() {
468 // Verifies the actions that were enqueued.
469 EXPECT_EQ(&attempter_, processor_->delegate());
470 EXPECT_EQ(arraysize(kRollbackActionTypes), attempter_.actions_.size());
471 for (size_t i = 0; i < arraysize(kRollbackActionTypes); ++i) {
472 EXPECT_EQ(kRollbackActionTypes[i], attempter_.actions_[i]->Type());
473 }
474 EXPECT_EQ(UPDATE_STATUS_ATTEMPTING_ROLLBACK, attempter_.status());
475 InstallPlanAction* install_plan_action =
476 dynamic_cast<InstallPlanAction*>(attempter_.actions_[0].get());
477 InstallPlan* install_plan = install_plan_action->install_plan();
478 EXPECT_EQ(install_plan->install_path, string("/dev/sda3"));
479 EXPECT_EQ(install_plan->kernel_install_path, string("/dev/sda2"));
480 EXPECT_EQ(install_plan->powerwash_required, true);
481 g_main_loop_quit(loop_);
482}
483
Darin Petkove6ef2f82011-03-07 17:31:11 -0800484TEST_F(UpdateAttempterTest, UpdateTest) {
485 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
486 g_idle_add(&StaticUpdateTestStart, this);
487 g_main_loop_run(loop_);
488 g_main_loop_unref(loop_);
489 loop_ = NULL;
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700490}
491
Chris Sosa76a29ae2013-07-11 17:59:24 -0700492TEST_F(UpdateAttempterTest, RollbackTest) {
493 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
494 g_idle_add(&StaticRollbackTestStart, this);
495 g_main_loop_run(loop_);
496 g_main_loop_unref(loop_);
497 loop_ = NULL;
498}
499
500TEST_F(UpdateAttempterTest, EnterpriseRollbackTest) {
501 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
502 g_idle_add(&StaticEnterpriseRollbackTestStart, this);
503 g_main_loop_run(loop_);
504 g_main_loop_unref(loop_);
505 loop_ = NULL;
506}
507
Thieu Le116fda32011-04-19 11:01:54 -0700508void UpdateAttempterTest::PingOmahaTestStart() {
509 EXPECT_CALL(*processor_,
510 EnqueueAction(Property(&AbstractAction::Type,
511 OmahaRequestAction::StaticType())))
512 .Times(1);
513 EXPECT_CALL(*processor_, StartProcessing()).Times(1);
514 attempter_.PingOmaha();
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200515 g_idle_add(&StaticQuitMainLoop, this);
Thieu Le116fda32011-04-19 11:01:54 -0700516}
517
518TEST_F(UpdateAttempterTest, PingOmahaTest) {
Gilad Arnoldbf7919b2013-01-08 13:07:37 -0800519 UpdateCheckScheduler scheduler(&attempter_, &mock_system_state_);
Thieu Le116fda32011-04-19 11:01:54 -0700520 scheduler.enabled_ = true;
Andrew de los Reyese05fc282011-06-02 09:50:08 -0700521 EXPECT_FALSE(scheduler.scheduled_);
Thieu Le116fda32011-04-19 11:01:54 -0700522 attempter_.set_update_check_scheduler(&scheduler);
523 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
524 g_idle_add(&StaticPingOmahaTestStart, this);
525 g_main_loop_run(loop_);
526 g_main_loop_unref(loop_);
527 loop_ = NULL;
528 EXPECT_EQ(UPDATE_STATUS_UPDATED_NEED_REBOOT, attempter_.status());
529 EXPECT_EQ(true, scheduler.scheduled_);
530}
531
Darin Petkov18c7bce2011-06-16 14:07:00 -0700532TEST_F(UpdateAttempterTest, CreatePendingErrorEventTest) {
533 ActionMock action;
David Zeuthena99981f2013-04-29 13:42:47 -0700534 const ErrorCode kCode = kErrorCodeDownloadTransferError;
Darin Petkov18c7bce2011-06-16 14:07:00 -0700535 attempter_.CreatePendingErrorEvent(&action, kCode);
536 ASSERT_TRUE(attempter_.error_event_.get() != NULL);
537 EXPECT_EQ(OmahaEvent::kTypeUpdateComplete, attempter_.error_event_->type);
538 EXPECT_EQ(OmahaEvent::kResultError, attempter_.error_event_->result);
David Zeuthena99981f2013-04-29 13:42:47 -0700539 EXPECT_EQ(kCode | kErrorCodeTestOmahaUrlFlag,
Jay Srinivasan55f50c22013-01-10 19:24:35 -0800540 attempter_.error_event_->error_code);
Darin Petkov18c7bce2011-06-16 14:07:00 -0700541}
542
543TEST_F(UpdateAttempterTest, CreatePendingErrorEventResumedTest) {
544 OmahaResponseHandlerAction *response_action =
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800545 new OmahaResponseHandlerAction(&mock_system_state_);
Darin Petkov18c7bce2011-06-16 14:07:00 -0700546 response_action->install_plan_.is_resume = true;
547 attempter_.response_handler_action_.reset(response_action);
548 ActionMock action;
David Zeuthena99981f2013-04-29 13:42:47 -0700549 const ErrorCode kCode = kErrorCodeInstallDeviceOpenError;
Darin Petkov18c7bce2011-06-16 14:07:00 -0700550 attempter_.CreatePendingErrorEvent(&action, kCode);
551 ASSERT_TRUE(attempter_.error_event_.get() != NULL);
552 EXPECT_EQ(OmahaEvent::kTypeUpdateComplete, attempter_.error_event_->type);
553 EXPECT_EQ(OmahaEvent::kResultError, attempter_.error_event_->result);
David Zeuthena99981f2013-04-29 13:42:47 -0700554 EXPECT_EQ(kCode | kErrorCodeResumedFlag | kErrorCodeTestOmahaUrlFlag,
Darin Petkov18c7bce2011-06-16 14:07:00 -0700555 attempter_.error_event_->error_code);
556}
557
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700558TEST_F(UpdateAttempterTest, ReadChannelFromPolicy) {
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200559 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700560 g_idle_add(&StaticReadChannelFromPolicyTestStart, this);
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200561 g_main_loop_run(loop_);
562 g_main_loop_unref(loop_);
563 loop_ = NULL;
564}
565
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700566void UpdateAttempterTest::ReadChannelFromPolicyTestStart() {
567 // Tests that the update channel (aka release channel) is properly fetched
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200568 // from the device policy.
569
570 policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
571 attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
572
573 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700574 EXPECT_CALL(mock_system_state_, device_policy()).WillRepeatedly(
575 Return(device_policy));
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200576
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700577 EXPECT_CALL(*device_policy, GetReleaseChannelDelegated(_)).WillRepeatedly(
578 DoAll(SetArgumentPointee<0>(bool(false)),
579 Return(true)));
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200580
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700581 EXPECT_CALL(*device_policy, GetReleaseChannel(_)).WillRepeatedly(
582 DoAll(SetArgumentPointee<0>(std::string("beta-channel")),
583 Return(true)));
584
585 attempter_.omaha_request_params_->set_root("./UpdateAttempterTest");
Gilad Arnoldb92f0df2013-01-10 16:32:45 -0800586 attempter_.Update("", "", false, false, false);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700587 EXPECT_EQ("beta-channel",
588 attempter_.omaha_request_params_->target_channel());
Patrick Dubroy7fbbe8a2011-08-01 17:28:22 +0200589
590 g_idle_add(&StaticQuitMainLoop, this);
591}
592
Jay Srinivasan0a708742012-03-20 11:26:12 -0700593TEST_F(UpdateAttempterTest, ReadUpdateDisabledFromPolicy) {
594 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
595 g_idle_add(&StaticReadUpdateDisabledFromPolicyTestStart, this);
596 g_main_loop_run(loop_);
597 g_main_loop_unref(loop_);
598 loop_ = NULL;
599}
600
601void UpdateAttempterTest::ReadUpdateDisabledFromPolicyTestStart() {
602 // Tests that the update_disbled flag is properly fetched
603 // from the device policy.
604
605 policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
606 attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
607
608 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700609 EXPECT_CALL(mock_system_state_, device_policy()).WillRepeatedly(
610 Return(device_policy));
Jay Srinivasan0a708742012-03-20 11:26:12 -0700611
612 EXPECT_CALL(*device_policy, GetUpdateDisabled(_))
613 .WillRepeatedly(DoAll(
614 SetArgumentPointee<0>(true),
615 Return(true)));
616
Gilad Arnoldb92f0df2013-01-10 16:32:45 -0800617 attempter_.Update("", "", false, false, false);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700618 EXPECT_TRUE(attempter_.omaha_request_params_->update_disabled());
Jay Srinivasan0a708742012-03-20 11:26:12 -0700619
620 g_idle_add(&StaticQuitMainLoop, this);
621}
622
623TEST_F(UpdateAttempterTest, ReadTargetVersionPrefixFromPolicy) {
624 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
625 g_idle_add(&StaticReadTargetVersionPrefixFromPolicyTestStart, this);
626 g_main_loop_run(loop_);
627 g_main_loop_unref(loop_);
628 loop_ = NULL;
629}
630
631void UpdateAttempterTest::ReadTargetVersionPrefixFromPolicyTestStart() {
632 // Tests that the target_version_prefix value is properly fetched
633 // from the device policy.
634
635 const std::string target_version_prefix = "1412.";
636
637 policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
638 attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
639
640 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700641 EXPECT_CALL(mock_system_state_, device_policy()).WillRepeatedly(
642 Return(device_policy));
Jay Srinivasan0a708742012-03-20 11:26:12 -0700643
644 EXPECT_CALL(*device_policy, GetTargetVersionPrefix(_))
645 .WillRepeatedly(DoAll(
646 SetArgumentPointee<0>(target_version_prefix),
647 Return(true)));
648
Gilad Arnoldb92f0df2013-01-10 16:32:45 -0800649 attempter_.Update("", "", false, false, false);
Jay Srinivasan0a708742012-03-20 11:26:12 -0700650 EXPECT_EQ(target_version_prefix.c_str(),
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700651 attempter_.omaha_request_params_->target_version_prefix());
Jay Srinivasan0a708742012-03-20 11:26:12 -0700652
653 g_idle_add(&StaticQuitMainLoop, this);
654}
655
656
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700657TEST_F(UpdateAttempterTest, ReadScatterFactorFromPolicy) {
658 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
659 g_idle_add(&StaticReadScatterFactorFromPolicyTestStart, this);
660 g_main_loop_run(loop_);
661 g_main_loop_unref(loop_);
662 loop_ = NULL;
663}
664
665// Tests that the scatter_factor_in_seconds value is properly fetched
666// from the device policy.
667void UpdateAttempterTest::ReadScatterFactorFromPolicyTestStart() {
668 int64 scatter_factor_in_seconds = 36000;
669
670 policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
671 attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
672
673 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800674 EXPECT_CALL(mock_system_state_, device_policy()).WillRepeatedly(
Jay Srinivasan21be0752012-07-25 15:44:56 -0700675 Return(device_policy));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700676
677 EXPECT_CALL(*device_policy, GetScatterFactorInSeconds(_))
678 .WillRepeatedly(DoAll(
679 SetArgumentPointee<0>(scatter_factor_in_seconds),
680 Return(true)));
681
Gilad Arnoldb92f0df2013-01-10 16:32:45 -0800682 attempter_.Update("", "", false, false, false);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700683 EXPECT_EQ(scatter_factor_in_seconds, attempter_.scatter_factor_.InSeconds());
684
685 g_idle_add(&StaticQuitMainLoop, this);
686}
687
688TEST_F(UpdateAttempterTest, DecrementUpdateCheckCountTest) {
689 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
690 g_idle_add(&StaticDecrementUpdateCheckCountTestStart, this);
691 g_main_loop_run(loop_);
692 g_main_loop_unref(loop_);
693 loop_ = NULL;
694}
695
696void UpdateAttempterTest::DecrementUpdateCheckCountTestStart() {
697 // Tests that the scatter_factor_in_seconds value is properly fetched
698 // from the device policy and is decremented if value > 0.
699 int64 initial_value = 5;
700 Prefs prefs;
701 attempter_.prefs_ = &prefs;
702
Jay Srinivasan08fce042012-06-07 16:31:01 -0700703 EXPECT_CALL(mock_system_state_,
704 IsOOBEComplete()).WillRepeatedly(Return(true));
705
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700706 string prefs_dir;
707 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
708 &prefs_dir));
709 ScopedDirRemover temp_dir_remover(prefs_dir);
710
711 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
712 << "Failed to initialize preferences.";
713 EXPECT_TRUE(prefs.SetInt64(kPrefsUpdateCheckCount, initial_value));
714
715 int64 scatter_factor_in_seconds = 10;
716
717 policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
718 attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
719
720 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800721 EXPECT_CALL(mock_system_state_, device_policy()).WillRepeatedly(
Jay Srinivasan21be0752012-07-25 15:44:56 -0700722 Return(device_policy));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700723
724 EXPECT_CALL(*device_policy, GetScatterFactorInSeconds(_))
725 .WillRepeatedly(DoAll(
726 SetArgumentPointee<0>(scatter_factor_in_seconds),
727 Return(true)));
728
Gilad Arnoldb92f0df2013-01-10 16:32:45 -0800729 attempter_.Update("", "", false, false, false);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700730 EXPECT_EQ(scatter_factor_in_seconds, attempter_.scatter_factor_.InSeconds());
731
732 // Make sure the file still exists.
733 EXPECT_TRUE(prefs.Exists(kPrefsUpdateCheckCount));
734
735 int64 new_value;
736 EXPECT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &new_value));
737 EXPECT_EQ(initial_value - 1, new_value);
738
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700739 EXPECT_TRUE(
740 attempter_.omaha_request_params_->update_check_count_wait_enabled());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700741
742 // However, if the count is already 0, it's not decremented. Test that.
743 initial_value = 0;
744 EXPECT_TRUE(prefs.SetInt64(kPrefsUpdateCheckCount, initial_value));
Gilad Arnoldb92f0df2013-01-10 16:32:45 -0800745 attempter_.Update("", "", false, false, false);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700746 EXPECT_TRUE(prefs.Exists(kPrefsUpdateCheckCount));
747 EXPECT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &new_value));
748 EXPECT_EQ(initial_value, new_value);
749
750 g_idle_add(&StaticQuitMainLoop, this);
751}
752
Jay Srinivasan08fce042012-06-07 16:31:01 -0700753TEST_F(UpdateAttempterTest, NoScatteringDoneDuringManualUpdateTestStart) {
754 loop_ = g_main_loop_new(g_main_context_default(), FALSE);
755 g_idle_add(&StaticNoScatteringDoneDuringManualUpdateTestStart, this);
756 g_main_loop_run(loop_);
757 g_main_loop_unref(loop_);
758 loop_ = NULL;
759}
760
761void UpdateAttempterTest::NoScatteringDoneDuringManualUpdateTestStart() {
762 // Tests that no scattering logic is enabled if the update check
763 // is manually done (as opposed to a scheduled update check)
764 int64 initial_value = 8;
765 Prefs prefs;
766 attempter_.prefs_ = &prefs;
767
768 EXPECT_CALL(mock_system_state_,
769 IsOOBEComplete()).WillRepeatedly(Return(true));
770
771 string prefs_dir;
772 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
773 &prefs_dir));
774 ScopedDirRemover temp_dir_remover(prefs_dir);
775
776 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
777 << "Failed to initialize preferences.";
Jay Srinivasan21be0752012-07-25 15:44:56 -0700778 EXPECT_TRUE(prefs.SetInt64(kPrefsWallClockWaitPeriod, initial_value));
Jay Srinivasan08fce042012-06-07 16:31:01 -0700779 EXPECT_TRUE(prefs.SetInt64(kPrefsUpdateCheckCount, initial_value));
780
781 // make sure scatter_factor is non-zero as scattering is disabled
782 // otherwise.
783 int64 scatter_factor_in_seconds = 50;
784
785 policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
786 attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
787
788 EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800789 EXPECT_CALL(mock_system_state_, device_policy()).WillRepeatedly(
Jay Srinivasan21be0752012-07-25 15:44:56 -0700790 Return(device_policy));
Jay Srinivasan08fce042012-06-07 16:31:01 -0700791
792 EXPECT_CALL(*device_policy, GetScatterFactorInSeconds(_))
793 .WillRepeatedly(DoAll(
794 SetArgumentPointee<0>(scatter_factor_in_seconds),
795 Return(true)));
796
Gilad Arnoldb92f0df2013-01-10 16:32:45 -0800797 // Trigger an interactive check so we can test that scattering is disabled.
798 attempter_.Update("", "", false, true, false);
Jay Srinivasan08fce042012-06-07 16:31:01 -0700799 EXPECT_EQ(scatter_factor_in_seconds, attempter_.scatter_factor_.InSeconds());
800
801 // Make sure scattering is disabled for manual (i.e. user initiated) update
Jay Srinivasan21be0752012-07-25 15:44:56 -0700802 // checks and all artifacts are removed.
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700803 EXPECT_FALSE(
804 attempter_.omaha_request_params_->wall_clock_based_wait_enabled());
Jay Srinivasan08fce042012-06-07 16:31:01 -0700805 EXPECT_FALSE(prefs.Exists(kPrefsWallClockWaitPeriod));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700806 EXPECT_EQ(0, attempter_.omaha_request_params_->waiting_period().InSeconds());
807 EXPECT_FALSE(
808 attempter_.omaha_request_params_->update_check_count_wait_enabled());
Jay Srinivasan08fce042012-06-07 16:31:01 -0700809 EXPECT_FALSE(prefs.Exists(kPrefsUpdateCheckCount));
810
811 g_idle_add(&StaticQuitMainLoop, this);
812}
813
Darin Petkovf42cc1c2010-09-01 09:03:02 -0700814} // namespace chromeos_update_engine