blob: ae8fccb8a969bbba6b8fe6c762a29481f912d55f [file] [log] [blame]
Darin Petkov7ed561b2011-10-04 02:59:03 -07001// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
adlr@google.com3defe6a2009-12-04 20:57:17 +00002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <string>
Darin Petkov73058b42010-10-06 16:32:19 -07006
adlr@google.com3defe6a2009-12-04 20:57:17 +00007#include <gtest/gtest.h>
Darin Petkov73058b42010-10-06 16:32:19 -07008
Jay Srinivasand29695d2013-04-08 15:08:05 -07009#include "update_engine/constants.h"
adlr@google.com3defe6a2009-12-04 20:57:17 +000010#include "update_engine/omaha_response_handler_action.h"
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080011#include "update_engine/mock_system_state.h"
adlr@google.com3defe6a2009-12-04 20:57:17 +000012#include "update_engine/test_utils.h"
13#include "update_engine/utils.h"
14
15using std::string;
Darin Petkov9c096d62010-11-17 14:49:04 -080016using testing::NiceMock;
Darin Petkov73058b42010-10-06 16:32:19 -070017using testing::Return;
adlr@google.com3defe6a2009-12-04 20:57:17 +000018
19namespace chromeos_update_engine {
20
21class OmahaResponseHandlerActionTest : public ::testing::Test {
22 public:
23 // Return true iff the OmahaResponseHandlerAction succeeded.
24 // If out is non-NULL, it's set w/ the response from the action.
Jay Srinivasanae4697c2013-03-18 17:08:08 -070025 bool DoTestCommon(MockSystemState* mock_system_state,
26 const OmahaResponse& in,
27 const string& boot_dev,
28 InstallPlan* out);
Darin Petkov6a5b3222010-07-13 14:55:28 -070029 bool DoTest(const OmahaResponse& in,
adlr@google.com3defe6a2009-12-04 20:57:17 +000030 const string& boot_dev,
31 InstallPlan* out);
32};
33
34class OmahaResponseHandlerActionProcessorDelegate
35 : public ActionProcessorDelegate {
36 public:
37 OmahaResponseHandlerActionProcessorDelegate()
David Zeuthena99981f2013-04-29 13:42:47 -070038 : code_(kErrorCodeError),
Darin Petkovc1a8b422010-07-19 11:34:49 -070039 code_set_(false) {}
adlr@google.com3defe6a2009-12-04 20:57:17 +000040 void ActionCompleted(ActionProcessor* processor,
41 AbstractAction* action,
David Zeuthena99981f2013-04-29 13:42:47 -070042 ErrorCode code) {
adlr@google.com3defe6a2009-12-04 20:57:17 +000043 if (action->Type() == OmahaResponseHandlerAction::StaticType()) {
Darin Petkovc1a8b422010-07-19 11:34:49 -070044 code_ = code;
45 code_set_ = true;
adlr@google.com3defe6a2009-12-04 20:57:17 +000046 }
47 }
David Zeuthena99981f2013-04-29 13:42:47 -070048 ErrorCode code_;
Darin Petkovc1a8b422010-07-19 11:34:49 -070049 bool code_set_;
adlr@google.com3defe6a2009-12-04 20:57:17 +000050};
51
52namespace {
53const string kLongName =
54 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
55 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
56 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
57 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
58 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
59 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
60 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
61 "-the_update_a.b.c.d_DELTA_.tgz";
62} // namespace {}
63
Jay Srinivasanae4697c2013-03-18 17:08:08 -070064bool OmahaResponseHandlerActionTest::DoTestCommon(
65 MockSystemState* mock_system_state,
66 const OmahaResponse& in,
67 const string& boot_dev,
68 InstallPlan* out) {
adlr@google.com3defe6a2009-12-04 20:57:17 +000069 ActionProcessor processor;
70 OmahaResponseHandlerActionProcessorDelegate delegate;
71 processor.set_delegate(&delegate);
72
Darin Petkov6a5b3222010-07-13 14:55:28 -070073 ObjectFeederAction<OmahaResponse> feeder_action;
adlr@google.com3defe6a2009-12-04 20:57:17 +000074 feeder_action.set_obj(in);
Darin Petkov73058b42010-10-06 16:32:19 -070075 if (in.update_exists) {
Jay Srinivasanae4697c2013-03-18 17:08:08 -070076 EXPECT_CALL(*(mock_system_state->mock_prefs()),
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080077 SetString(kPrefsUpdateCheckResponseHash, in.hash))
Darin Petkov73058b42010-10-06 16:32:19 -070078 .WillOnce(Return(true));
79 }
Jay Srinivasan53173b92013-05-17 17:13:01 -070080
81 string current_url = in.payload_urls.size() ? in.payload_urls[0] : "";
82 EXPECT_CALL(*(mock_system_state->mock_payload_state()), GetCurrentUrl())
83 .WillRepeatedly(Return(current_url));
84
Jay Srinivasanae4697c2013-03-18 17:08:08 -070085 OmahaResponseHandlerAction response_handler_action(mock_system_state);
adlr@google.com3defe6a2009-12-04 20:57:17 +000086 response_handler_action.set_boot_device(boot_dev);
87 BondActions(&feeder_action, &response_handler_action);
88 ObjectCollectorAction<InstallPlan> collector_action;
89 BondActions(&response_handler_action, &collector_action);
90 processor.EnqueueAction(&feeder_action);
91 processor.EnqueueAction(&response_handler_action);
92 processor.EnqueueAction(&collector_action);
93 processor.StartProcessing();
94 EXPECT_TRUE(!processor.IsRunning())
95 << "Update test to handle non-asynch actions";
96 if (out)
97 *out = collector_action.object();
Darin Petkovc1a8b422010-07-19 11:34:49 -070098 EXPECT_TRUE(delegate.code_set_);
David Zeuthena99981f2013-04-29 13:42:47 -070099 return delegate.code_ == kErrorCodeSuccess;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000100}
101
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700102bool OmahaResponseHandlerActionTest::DoTest(const OmahaResponse& in,
103 const string& boot_dev,
104 InstallPlan* out) {
105 MockSystemState mock_system_state;
106 return DoTestCommon(&mock_system_state, in, boot_dev, out);
107}
108
adlr@google.com3defe6a2009-12-04 20:57:17 +0000109TEST_F(OmahaResponseHandlerActionTest, SimpleTest) {
Darin Petkov6c118642010-10-21 12:06:30 -0700110 ScopedPathUnlinker deadline_unlinker(
111 OmahaResponseHandlerAction::kDeadlineFile);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000112 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700113 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000114 in.update_exists = true;
115 in.display_version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800116 in.payload_urls.push_back("http://foo/the_update_a.b.c.d.tgz");
adlr@google.com3defe6a2009-12-04 20:57:17 +0000117 in.more_info_url = "http://more/info";
118 in.hash = "HASH+";
119 in.size = 12;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000120 in.prompt = false;
Darin Petkov6c118642010-10-21 12:06:30 -0700121 in.deadline = "20101020";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000122 InstallPlan install_plan;
Darin Petkov7ed561b2011-10-04 02:59:03 -0700123 EXPECT_TRUE(DoTest(in, "/dev/sda3", &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800124 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700125 EXPECT_EQ(in.hash, install_plan.payload_hash);
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700126 EXPECT_EQ("/dev/sda5", install_plan.install_path);
Darin Petkov6c118642010-10-21 12:06:30 -0700127 string deadline;
Gilad Arnold19a45f02012-07-19 12:36:10 -0700128 EXPECT_TRUE(utils::ReadFile(
Darin Petkov6c118642010-10-21 12:06:30 -0700129 OmahaResponseHandlerAction::kDeadlineFile,
130 &deadline));
131 EXPECT_EQ("20101020", deadline);
132 struct stat deadline_stat;
133 EXPECT_EQ(0, stat(OmahaResponseHandlerAction::kDeadlineFile,
134 &deadline_stat));
135 EXPECT_EQ(S_IFREG | S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH,
136 deadline_stat.st_mode);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000137 }
138 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700139 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000140 in.update_exists = true;
141 in.display_version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800142 in.payload_urls.push_back("http://foo/the_update_a.b.c.d.tgz");
adlr@google.com3defe6a2009-12-04 20:57:17 +0000143 in.more_info_url = "http://more/info";
144 in.hash = "HASHj+";
145 in.size = 12;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000146 in.prompt = true;
147 InstallPlan install_plan;
Darin Petkov7ed561b2011-10-04 02:59:03 -0700148 EXPECT_TRUE(DoTest(in, "/dev/sda5", &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800149 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700150 EXPECT_EQ(in.hash, install_plan.payload_hash);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000151 EXPECT_EQ("/dev/sda3", install_plan.install_path);
Darin Petkov6c118642010-10-21 12:06:30 -0700152 string deadline;
Gilad Arnold19a45f02012-07-19 12:36:10 -0700153 EXPECT_TRUE(utils::ReadFile(
Darin Petkov6c118642010-10-21 12:06:30 -0700154 OmahaResponseHandlerAction::kDeadlineFile,
155 &deadline) && deadline.empty());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000156 }
157 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700158 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000159 in.update_exists = true;
160 in.display_version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800161 in.payload_urls.push_back(kLongName);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000162 in.more_info_url = "http://more/info";
163 in.hash = "HASHj+";
164 in.size = 12;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000165 in.prompt = true;
Darin Petkov6c118642010-10-21 12:06:30 -0700166 in.deadline = "some-deadline";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000167 InstallPlan install_plan;
Darin Petkov7ed561b2011-10-04 02:59:03 -0700168 EXPECT_TRUE(DoTest(in, "/dev/sda3", &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800169 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700170 EXPECT_EQ(in.hash, install_plan.payload_hash);
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700171 EXPECT_EQ("/dev/sda5", install_plan.install_path);
Darin Petkov6c118642010-10-21 12:06:30 -0700172 string deadline;
Gilad Arnold19a45f02012-07-19 12:36:10 -0700173 EXPECT_TRUE(utils::ReadFile(
Darin Petkov6c118642010-10-21 12:06:30 -0700174 OmahaResponseHandlerAction::kDeadlineFile,
175 &deadline));
176 EXPECT_EQ("some-deadline", deadline);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000177 }
178}
179
180TEST_F(OmahaResponseHandlerActionTest, NoUpdatesTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700181 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000182 in.update_exists = false;
183 InstallPlan install_plan;
Darin Petkov7ed561b2011-10-04 02:59:03 -0700184 EXPECT_FALSE(DoTest(in, "/dev/sda1", &install_plan));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000185 EXPECT_EQ("", install_plan.download_url);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700186 EXPECT_EQ("", install_plan.payload_hash);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000187 EXPECT_EQ("", install_plan.install_path);
188}
189
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800190TEST_F(OmahaResponseHandlerActionTest, HashChecksForHttpTest) {
191 OmahaResponse in;
192 in.update_exists = true;
193 in.display_version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800194 in.payload_urls.push_back("http://test.should/need/hash.checks.signed");
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800195 in.more_info_url = "http://more/info";
196 in.hash = "HASHj+";
197 in.size = 12;
198 InstallPlan install_plan;
199 EXPECT_TRUE(DoTest(in, "/dev/sda5", &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800200 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800201 EXPECT_EQ(in.hash, install_plan.payload_hash);
202 EXPECT_TRUE(install_plan.hash_checks_mandatory);
203}
204
205TEST_F(OmahaResponseHandlerActionTest, HashChecksForHttpsTest) {
206 OmahaResponse in;
207 in.update_exists = true;
208 in.display_version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800209 in.payload_urls.push_back("https://test.should.not/need/hash.checks.signed");
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800210 in.more_info_url = "http://more/info";
211 in.hash = "HASHj+";
212 in.size = 12;
213 InstallPlan install_plan;
214 EXPECT_TRUE(DoTest(in, "/dev/sda5", &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800215 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800216 EXPECT_EQ(in.hash, install_plan.payload_hash);
217 EXPECT_FALSE(install_plan.hash_checks_mandatory);
218}
219
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800220TEST_F(OmahaResponseHandlerActionTest, HashChecksForBothHttpAndHttpsTest) {
221 OmahaResponse in;
222 in.update_exists = true;
223 in.display_version = "a.b.c.d";
224 in.payload_urls.push_back("http://test.should.still/need/hash.checks");
225 in.payload_urls.push_back("https://test.should.still/need/hash.checks");
226 in.more_info_url = "http://more/info";
227 in.hash = "HASHj+";
228 in.size = 12;
229 InstallPlan install_plan;
230 EXPECT_TRUE(DoTest(in, "/dev/sda5", &install_plan));
231 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
232 EXPECT_EQ(in.hash, install_plan.payload_hash);
233 EXPECT_TRUE(install_plan.hash_checks_mandatory);
234}
235
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700236TEST_F(OmahaResponseHandlerActionTest, ChangeToMoreStableChannelTest) {
237 OmahaResponse in;
238 in.update_exists = true;
239 in.display_version = "a.b.c.d";
240 in.payload_urls.push_back("https://MoreStableChannelTest");
241 in.more_info_url = "http://more/info";
242 in.hash = "HASHjk";
243 in.size = 15;
244
245 const string kTestDir = "omaha_response_handler_action-test";
246 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir + "/etc"));
247 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir +
Chris Sosabe45bef2013-04-09 18:25:12 -0700248 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700249 ASSERT_TRUE(WriteFileString(
250 kTestDir + "/etc/lsb-release",
251 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
252 ASSERT_TRUE(WriteFileString(
Chris Sosabe45bef2013-04-09 18:25:12 -0700253 kTestDir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700254 "CHROMEOS_IS_POWERWASH_ALLOWED=true\n"
255 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
256
257 MockSystemState mock_system_state;
258 OmahaRequestParams params(&mock_system_state);
259 params.set_root(string("./") + kTestDir);
260 params.SetLockDown(false);
261 params.Init("1.2.3.4", "", 0);
262 EXPECT_EQ("canary-channel", params.current_channel());
263 EXPECT_EQ("stable-channel", params.target_channel());
264 EXPECT_TRUE(params.to_more_stable_channel());
265 EXPECT_TRUE(params.is_powerwash_allowed());
266
267 mock_system_state.set_request_params(&params);
268 InstallPlan install_plan;
269 EXPECT_TRUE(DoTestCommon(&mock_system_state, in, "/dev/sda5", &install_plan));
270 EXPECT_TRUE(install_plan.powerwash_required);
271}
272
273TEST_F(OmahaResponseHandlerActionTest, ChangeToLessStableChannelTest) {
274 OmahaResponse in;
275 in.update_exists = true;
276 in.display_version = "a.b.c.d";
277 in.payload_urls.push_back("https://LessStableChannelTest");
278 in.more_info_url = "http://more/info";
279 in.hash = "HASHjk";
280 in.size = 15;
281
282 const string kTestDir = "omaha_response_handler_action-test";
283 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir + "/etc"));
284 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir +
Chris Sosabe45bef2013-04-09 18:25:12 -0700285 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700286 ASSERT_TRUE(WriteFileString(
287 kTestDir + "/etc/lsb-release",
288 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
289 ASSERT_TRUE(WriteFileString(
Chris Sosabe45bef2013-04-09 18:25:12 -0700290 kTestDir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700291 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
292
293 MockSystemState mock_system_state;
294 OmahaRequestParams params(&mock_system_state);
295 params.set_root(string("./") + kTestDir);
296 params.SetLockDown(false);
297 params.Init("5.6.7.8", "", 0);
298 EXPECT_EQ("stable-channel", params.current_channel());
299 params.SetTargetChannel("canary-channel", false);
300 EXPECT_EQ("canary-channel", params.target_channel());
301 EXPECT_FALSE(params.to_more_stable_channel());
302 EXPECT_FALSE(params.is_powerwash_allowed());
303
304 mock_system_state.set_request_params(&params);
305 InstallPlan install_plan;
306 EXPECT_TRUE(DoTestCommon(&mock_system_state, in, "/dev/sda5", &install_plan));
307 EXPECT_FALSE(install_plan.powerwash_required);
308}
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800309
adlr@google.com3defe6a2009-12-04 20:57:17 +0000310} // namespace chromeos_update_engine