blob: 80dfc5c3a8365632a46342523b00abf531be0815 [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()
Darin Petkovc1a8b422010-07-19 11:34:49 -070038 : code_(kActionCodeError),
39 code_set_(false) {}
adlr@google.com3defe6a2009-12-04 20:57:17 +000040 void ActionCompleted(ActionProcessor* processor,
41 AbstractAction* action,
Darin Petkovc1a8b422010-07-19 11:34:49 -070042 ActionExitCode 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 }
Darin Petkovc1a8b422010-07-19 11:34:49 -070048 ActionExitCode code_;
49 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 Srinivasanae4697c2013-03-18 17:08:08 -070080 OmahaResponseHandlerAction response_handler_action(mock_system_state);
adlr@google.com3defe6a2009-12-04 20:57:17 +000081 response_handler_action.set_boot_device(boot_dev);
82 BondActions(&feeder_action, &response_handler_action);
83 ObjectCollectorAction<InstallPlan> collector_action;
84 BondActions(&response_handler_action, &collector_action);
85 processor.EnqueueAction(&feeder_action);
86 processor.EnqueueAction(&response_handler_action);
87 processor.EnqueueAction(&collector_action);
88 processor.StartProcessing();
89 EXPECT_TRUE(!processor.IsRunning())
90 << "Update test to handle non-asynch actions";
91 if (out)
92 *out = collector_action.object();
Darin Petkovc1a8b422010-07-19 11:34:49 -070093 EXPECT_TRUE(delegate.code_set_);
Darin Petkov7ed561b2011-10-04 02:59:03 -070094 return delegate.code_ == kActionCodeSuccess;
adlr@google.com3defe6a2009-12-04 20:57:17 +000095}
96
Jay Srinivasanae4697c2013-03-18 17:08:08 -070097bool OmahaResponseHandlerActionTest::DoTest(const OmahaResponse& in,
98 const string& boot_dev,
99 InstallPlan* out) {
100 MockSystemState mock_system_state;
101 return DoTestCommon(&mock_system_state, in, boot_dev, out);
102}
103
adlr@google.com3defe6a2009-12-04 20:57:17 +0000104TEST_F(OmahaResponseHandlerActionTest, SimpleTest) {
Darin Petkov6c118642010-10-21 12:06:30 -0700105 ScopedPathUnlinker deadline_unlinker(
106 OmahaResponseHandlerAction::kDeadlineFile);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000107 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700108 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000109 in.update_exists = true;
110 in.display_version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800111 in.payload_urls.push_back("http://foo/the_update_a.b.c.d.tgz");
adlr@google.com3defe6a2009-12-04 20:57:17 +0000112 in.more_info_url = "http://more/info";
113 in.hash = "HASH+";
114 in.size = 12;
115 in.needs_admin = true;
116 in.prompt = false;
Darin Petkov6c118642010-10-21 12:06:30 -0700117 in.deadline = "20101020";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000118 InstallPlan install_plan;
Darin Petkov7ed561b2011-10-04 02:59:03 -0700119 EXPECT_TRUE(DoTest(in, "/dev/sda3", &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800120 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700121 EXPECT_EQ(in.hash, install_plan.payload_hash);
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700122 EXPECT_EQ("/dev/sda5", install_plan.install_path);
Darin Petkov6c118642010-10-21 12:06:30 -0700123 string deadline;
Gilad Arnold19a45f02012-07-19 12:36:10 -0700124 EXPECT_TRUE(utils::ReadFile(
Darin Petkov6c118642010-10-21 12:06:30 -0700125 OmahaResponseHandlerAction::kDeadlineFile,
126 &deadline));
127 EXPECT_EQ("20101020", deadline);
128 struct stat deadline_stat;
129 EXPECT_EQ(0, stat(OmahaResponseHandlerAction::kDeadlineFile,
130 &deadline_stat));
131 EXPECT_EQ(S_IFREG | S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH,
132 deadline_stat.st_mode);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000133 }
134 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700135 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000136 in.update_exists = true;
137 in.display_version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800138 in.payload_urls.push_back("http://foo/the_update_a.b.c.d.tgz");
adlr@google.com3defe6a2009-12-04 20:57:17 +0000139 in.more_info_url = "http://more/info";
140 in.hash = "HASHj+";
141 in.size = 12;
142 in.needs_admin = true;
143 in.prompt = true;
144 InstallPlan install_plan;
Darin Petkov7ed561b2011-10-04 02:59:03 -0700145 EXPECT_TRUE(DoTest(in, "/dev/sda5", &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800146 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700147 EXPECT_EQ(in.hash, install_plan.payload_hash);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000148 EXPECT_EQ("/dev/sda3", install_plan.install_path);
Darin Petkov6c118642010-10-21 12:06:30 -0700149 string deadline;
Gilad Arnold19a45f02012-07-19 12:36:10 -0700150 EXPECT_TRUE(utils::ReadFile(
Darin Petkov6c118642010-10-21 12:06:30 -0700151 OmahaResponseHandlerAction::kDeadlineFile,
152 &deadline) && deadline.empty());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000153 }
154 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700155 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000156 in.update_exists = true;
157 in.display_version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800158 in.payload_urls.push_back(kLongName);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000159 in.more_info_url = "http://more/info";
160 in.hash = "HASHj+";
161 in.size = 12;
162 in.needs_admin = true;
163 in.prompt = true;
Darin Petkov6c118642010-10-21 12:06:30 -0700164 in.deadline = "some-deadline";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000165 InstallPlan install_plan;
Darin Petkov7ed561b2011-10-04 02:59:03 -0700166 EXPECT_TRUE(DoTest(in, "/dev/sda3", &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800167 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700168 EXPECT_EQ(in.hash, install_plan.payload_hash);
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700169 EXPECT_EQ("/dev/sda5", install_plan.install_path);
Darin Petkov6c118642010-10-21 12:06:30 -0700170 string deadline;
Gilad Arnold19a45f02012-07-19 12:36:10 -0700171 EXPECT_TRUE(utils::ReadFile(
Darin Petkov6c118642010-10-21 12:06:30 -0700172 OmahaResponseHandlerAction::kDeadlineFile,
173 &deadline));
174 EXPECT_EQ("some-deadline", deadline);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000175 }
176}
177
178TEST_F(OmahaResponseHandlerActionTest, NoUpdatesTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700179 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000180 in.update_exists = false;
181 InstallPlan install_plan;
Darin Petkov7ed561b2011-10-04 02:59:03 -0700182 EXPECT_FALSE(DoTest(in, "/dev/sda1", &install_plan));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000183 EXPECT_EQ("", install_plan.download_url);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700184 EXPECT_EQ("", install_plan.payload_hash);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000185 EXPECT_EQ("", install_plan.install_path);
186}
187
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800188TEST_F(OmahaResponseHandlerActionTest, HashChecksForHttpTest) {
189 OmahaResponse in;
190 in.update_exists = true;
191 in.display_version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800192 in.payload_urls.push_back("http://test.should/need/hash.checks.signed");
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800193 in.more_info_url = "http://more/info";
194 in.hash = "HASHj+";
195 in.size = 12;
196 InstallPlan install_plan;
197 EXPECT_TRUE(DoTest(in, "/dev/sda5", &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800198 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800199 EXPECT_EQ(in.hash, install_plan.payload_hash);
200 EXPECT_TRUE(install_plan.hash_checks_mandatory);
201}
202
203TEST_F(OmahaResponseHandlerActionTest, HashChecksForHttpsTest) {
204 OmahaResponse in;
205 in.update_exists = true;
206 in.display_version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800207 in.payload_urls.push_back("https://test.should.not/need/hash.checks.signed");
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800208 in.more_info_url = "http://more/info";
209 in.hash = "HASHj+";
210 in.size = 12;
211 InstallPlan install_plan;
212 EXPECT_TRUE(DoTest(in, "/dev/sda5", &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800213 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800214 EXPECT_EQ(in.hash, install_plan.payload_hash);
215 EXPECT_FALSE(install_plan.hash_checks_mandatory);
216}
217
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800218TEST_F(OmahaResponseHandlerActionTest, HashChecksForBothHttpAndHttpsTest) {
219 OmahaResponse in;
220 in.update_exists = true;
221 in.display_version = "a.b.c.d";
222 in.payload_urls.push_back("http://test.should.still/need/hash.checks");
223 in.payload_urls.push_back("https://test.should.still/need/hash.checks");
224 in.more_info_url = "http://more/info";
225 in.hash = "HASHj+";
226 in.size = 12;
227 InstallPlan install_plan;
228 EXPECT_TRUE(DoTest(in, "/dev/sda5", &install_plan));
229 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
230 EXPECT_EQ(in.hash, install_plan.payload_hash);
231 EXPECT_TRUE(install_plan.hash_checks_mandatory);
232}
233
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700234TEST_F(OmahaResponseHandlerActionTest, ChangeToMoreStableChannelTest) {
235 OmahaResponse in;
236 in.update_exists = true;
237 in.display_version = "a.b.c.d";
238 in.payload_urls.push_back("https://MoreStableChannelTest");
239 in.more_info_url = "http://more/info";
240 in.hash = "HASHjk";
241 in.size = 15;
242
243 const string kTestDir = "omaha_response_handler_action-test";
244 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir + "/etc"));
245 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir +
246 utils::kStatefulPartition + "/etc"));
247 ASSERT_TRUE(WriteFileString(
248 kTestDir + "/etc/lsb-release",
249 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
250 ASSERT_TRUE(WriteFileString(
251 kTestDir + utils::kStatefulPartition + "/etc/lsb-release",
252 "CHROMEOS_IS_POWERWASH_ALLOWED=true\n"
253 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
254
255 MockSystemState mock_system_state;
256 OmahaRequestParams params(&mock_system_state);
257 params.set_root(string("./") + kTestDir);
258 params.SetLockDown(false);
259 params.Init("1.2.3.4", "", 0);
260 EXPECT_EQ("canary-channel", params.current_channel());
261 EXPECT_EQ("stable-channel", params.target_channel());
262 EXPECT_TRUE(params.to_more_stable_channel());
263 EXPECT_TRUE(params.is_powerwash_allowed());
264
265 mock_system_state.set_request_params(&params);
266 InstallPlan install_plan;
267 EXPECT_TRUE(DoTestCommon(&mock_system_state, in, "/dev/sda5", &install_plan));
268 EXPECT_TRUE(install_plan.powerwash_required);
269}
270
271TEST_F(OmahaResponseHandlerActionTest, ChangeToLessStableChannelTest) {
272 OmahaResponse in;
273 in.update_exists = true;
274 in.display_version = "a.b.c.d";
275 in.payload_urls.push_back("https://LessStableChannelTest");
276 in.more_info_url = "http://more/info";
277 in.hash = "HASHjk";
278 in.size = 15;
279
280 const string kTestDir = "omaha_response_handler_action-test";
281 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir + "/etc"));
282 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir +
283 utils::kStatefulPartition + "/etc"));
284 ASSERT_TRUE(WriteFileString(
285 kTestDir + "/etc/lsb-release",
286 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
287 ASSERT_TRUE(WriteFileString(
288 kTestDir + utils::kStatefulPartition + "/etc/lsb-release",
289 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
290
291 MockSystemState mock_system_state;
292 OmahaRequestParams params(&mock_system_state);
293 params.set_root(string("./") + kTestDir);
294 params.SetLockDown(false);
295 params.Init("5.6.7.8", "", 0);
296 EXPECT_EQ("stable-channel", params.current_channel());
297 params.SetTargetChannel("canary-channel", false);
298 EXPECT_EQ("canary-channel", params.target_channel());
299 EXPECT_FALSE(params.to_more_stable_channel());
300 EXPECT_FALSE(params.is_powerwash_allowed());
301
302 mock_system_state.set_request_params(&params);
303 InstallPlan install_plan;
304 EXPECT_TRUE(DoTestCommon(&mock_system_state, in, "/dev/sda5", &install_plan));
305 EXPECT_FALSE(install_plan.powerwash_required);
306}
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800307
adlr@google.com3defe6a2009-12-04 20:57:17 +0000308} // namespace chromeos_update_engine