blob: 1cf8d2569b34cda970bcd482c9b0a8296fdafa1e [file] [log] [blame]
Alex Deymoaea4c1c2015-08-19 20:24:43 -07001//
2// Copyright (C) 2011 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
adlr@google.com3defe6a2009-12-04 20:57:17 +000016
Alex Deymoaab50e32014-11-10 19:55:35 -080017#include "update_engine/omaha_response_handler_action.h"
18
adlr@google.com3defe6a2009-12-04 20:57:17 +000019#include <string>
Darin Petkov73058b42010-10-06 16:32:19 -070020
adlr@google.com3defe6a2009-12-04 20:57:17 +000021#include <gtest/gtest.h>
Darin Petkov73058b42010-10-06 16:32:19 -070022
Jay Srinivasand29695d2013-04-08 15:08:05 -070023#include "update_engine/constants.h"
Gilad Arnold5bb4c902014-04-10 12:32:13 -070024#include "update_engine/fake_system_state.h"
Gilad Arnold74b5f552014-10-07 08:17:16 -070025#include "update_engine/mock_payload_state.h"
adlr@google.com3defe6a2009-12-04 20:57:17 +000026#include "update_engine/test_utils.h"
27#include "update_engine/utils.h"
28
Alex Deymo10875d92014-11-10 21:52:57 -080029using chromeos_update_engine::test_utils::System;
30using chromeos_update_engine::test_utils::WriteFileString;
adlr@google.com3defe6a2009-12-04 20:57:17 +000031using std::string;
Darin Petkov73058b42010-10-06 16:32:19 -070032using testing::Return;
adlr@google.com3defe6a2009-12-04 20:57:17 +000033
34namespace chromeos_update_engine {
35
36class OmahaResponseHandlerActionTest : public ::testing::Test {
37 public:
38 // Return true iff the OmahaResponseHandlerAction succeeded.
Alex Vakulenko88b591f2014-08-28 16:48:57 -070039 // If out is non-null, it's set w/ the response from the action.
Gilad Arnold5bb4c902014-04-10 12:32:13 -070040 bool DoTestCommon(FakeSystemState* fake_system_state,
Jay Srinivasanae4697c2013-03-18 17:08:08 -070041 const OmahaResponse& in,
42 const string& boot_dev,
Gilad Arnold4dbd47e2013-07-22 05:39:26 -070043 const string& deadline_file,
Jay Srinivasanae4697c2013-03-18 17:08:08 -070044 InstallPlan* out);
Darin Petkov6a5b3222010-07-13 14:55:28 -070045 bool DoTest(const OmahaResponse& in,
adlr@google.com3defe6a2009-12-04 20:57:17 +000046 const string& boot_dev,
Gilad Arnold4dbd47e2013-07-22 05:39:26 -070047 const string& deadline_file,
adlr@google.com3defe6a2009-12-04 20:57:17 +000048 InstallPlan* out);
49};
50
51class OmahaResponseHandlerActionProcessorDelegate
52 : public ActionProcessorDelegate {
53 public:
54 OmahaResponseHandlerActionProcessorDelegate()
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -070055 : code_(ErrorCode::kError),
Darin Petkovc1a8b422010-07-19 11:34:49 -070056 code_set_(false) {}
adlr@google.com3defe6a2009-12-04 20:57:17 +000057 void ActionCompleted(ActionProcessor* processor,
58 AbstractAction* action,
David Zeuthena99981f2013-04-29 13:42:47 -070059 ErrorCode code) {
adlr@google.com3defe6a2009-12-04 20:57:17 +000060 if (action->Type() == OmahaResponseHandlerAction::StaticType()) {
Darin Petkovc1a8b422010-07-19 11:34:49 -070061 code_ = code;
62 code_set_ = true;
adlr@google.com3defe6a2009-12-04 20:57:17 +000063 }
64 }
David Zeuthena99981f2013-04-29 13:42:47 -070065 ErrorCode code_;
Darin Petkovc1a8b422010-07-19 11:34:49 -070066 bool code_set_;
adlr@google.com3defe6a2009-12-04 20:57:17 +000067};
68
69namespace {
Alex Vakulenkod2779df2014-06-16 13:19:00 -070070const char* const kLongName =
adlr@google.com3defe6a2009-12-04 20:57:17 +000071 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
72 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
73 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
74 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
75 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
76 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
77 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
78 "-the_update_a.b.c.d_DELTA_.tgz";
Alex Vakulenkod2779df2014-06-16 13:19:00 -070079const char* const kBadVersion = "don't update me";
80} // namespace
adlr@google.com3defe6a2009-12-04 20:57:17 +000081
Jay Srinivasanae4697c2013-03-18 17:08:08 -070082bool OmahaResponseHandlerActionTest::DoTestCommon(
Gilad Arnold5bb4c902014-04-10 12:32:13 -070083 FakeSystemState* fake_system_state,
Jay Srinivasanae4697c2013-03-18 17:08:08 -070084 const OmahaResponse& in,
85 const string& boot_dev,
Gilad Arnold4dbd47e2013-07-22 05:39:26 -070086 const string& test_deadline_file,
Jay Srinivasanae4697c2013-03-18 17:08:08 -070087 InstallPlan* out) {
adlr@google.com3defe6a2009-12-04 20:57:17 +000088 ActionProcessor processor;
89 OmahaResponseHandlerActionProcessorDelegate delegate;
90 processor.set_delegate(&delegate);
91
Darin Petkov6a5b3222010-07-13 14:55:28 -070092 ObjectFeederAction<OmahaResponse> feeder_action;
adlr@google.com3defe6a2009-12-04 20:57:17 +000093 feeder_action.set_obj(in);
Alex Vakulenkod2779df2014-06-16 13:19:00 -070094 if (in.update_exists && in.version != kBadVersion) {
Gilad Arnold5bb4c902014-04-10 12:32:13 -070095 EXPECT_CALL(*(fake_system_state->mock_prefs()),
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080096 SetString(kPrefsUpdateCheckResponseHash, in.hash))
Darin Petkov73058b42010-10-06 16:32:19 -070097 .WillOnce(Return(true));
98 }
Jay Srinivasan53173b92013-05-17 17:13:01 -070099
100 string current_url = in.payload_urls.size() ? in.payload_urls[0] : "";
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700101 EXPECT_CALL(*(fake_system_state->mock_payload_state()), GetCurrentUrl())
Jay Srinivasan53173b92013-05-17 17:13:01 -0700102 .WillRepeatedly(Return(current_url));
103
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700104 OmahaResponseHandlerAction response_handler_action(
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700105 fake_system_state,
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700106 (test_deadline_file.empty() ?
107 OmahaResponseHandlerAction::kDeadlineFile : test_deadline_file));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000108 response_handler_action.set_boot_device(boot_dev);
109 BondActions(&feeder_action, &response_handler_action);
110 ObjectCollectorAction<InstallPlan> collector_action;
111 BondActions(&response_handler_action, &collector_action);
112 processor.EnqueueAction(&feeder_action);
113 processor.EnqueueAction(&response_handler_action);
114 processor.EnqueueAction(&collector_action);
115 processor.StartProcessing();
116 EXPECT_TRUE(!processor.IsRunning())
Alex Vakulenko072359c2014-07-18 11:41:07 -0700117 << "Update test to handle non-async actions";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000118 if (out)
119 *out = collector_action.object();
Darin Petkovc1a8b422010-07-19 11:34:49 -0700120 EXPECT_TRUE(delegate.code_set_);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700121 return delegate.code_ == ErrorCode::kSuccess;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000122}
123
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700124bool OmahaResponseHandlerActionTest::DoTest(const OmahaResponse& in,
125 const string& boot_dev,
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700126 const string& deadline_file,
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700127 InstallPlan* out) {
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700128 FakeSystemState fake_system_state;
129 return DoTestCommon(&fake_system_state, in, boot_dev, deadline_file, out);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700130}
131
adlr@google.com3defe6a2009-12-04 20:57:17 +0000132TEST_F(OmahaResponseHandlerActionTest, SimpleTest) {
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700133 string test_deadline_file;
134 CHECK(utils::MakeTempFile(
Gilad Arnolda6742b32014-01-11 00:18:34 -0800135 "omaha_response_handler_action_unittest-XXXXXX",
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700136 &test_deadline_file, nullptr));
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700137 ScopedPathUnlinker deadline_unlinker(test_deadline_file);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000138 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700139 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000140 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700141 in.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 = "HASH+";
145 in.size = 12;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000146 in.prompt = false;
Darin Petkov6c118642010-10-21 12:06:30 -0700147 in.deadline = "20101020";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000148 InstallPlan install_plan;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700149 EXPECT_TRUE(DoTest(in, "/dev/sda3", test_deadline_file, &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800150 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700151 EXPECT_EQ(in.hash, install_plan.payload_hash);
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700152 EXPECT_EQ("/dev/sda5", install_plan.install_path);
Darin Petkov6c118642010-10-21 12:06:30 -0700153 string deadline;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700154 EXPECT_TRUE(utils::ReadFile(test_deadline_file, &deadline));
Darin Petkov6c118642010-10-21 12:06:30 -0700155 EXPECT_EQ("20101020", deadline);
156 struct stat deadline_stat;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700157 EXPECT_EQ(0, stat(test_deadline_file.c_str(), &deadline_stat));
Darin Petkov6c118642010-10-21 12:06:30 -0700158 EXPECT_EQ(S_IFREG | S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH,
159 deadline_stat.st_mode);
Chris Sosafb1020e2013-07-29 17:27:33 -0700160 EXPECT_EQ(in.version, install_plan.version);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000161 }
162 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700163 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000164 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700165 in.version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800166 in.payload_urls.push_back("http://foo/the_update_a.b.c.d.tgz");
adlr@google.com3defe6a2009-12-04 20:57:17 +0000167 in.more_info_url = "http://more/info";
168 in.hash = "HASHj+";
169 in.size = 12;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000170 in.prompt = true;
171 InstallPlan install_plan;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700172 EXPECT_TRUE(DoTest(in, "/dev/sda5", test_deadline_file, &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800173 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700174 EXPECT_EQ(in.hash, install_plan.payload_hash);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000175 EXPECT_EQ("/dev/sda3", install_plan.install_path);
Darin Petkov6c118642010-10-21 12:06:30 -0700176 string deadline;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700177 EXPECT_TRUE(utils::ReadFile(test_deadline_file, &deadline) &&
178 deadline.empty());
Chris Sosafb1020e2013-07-29 17:27:33 -0700179 EXPECT_EQ(in.version, install_plan.version);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000180 }
181 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700182 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000183 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700184 in.version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800185 in.payload_urls.push_back(kLongName);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000186 in.more_info_url = "http://more/info";
187 in.hash = "HASHj+";
188 in.size = 12;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000189 in.prompt = true;
Darin Petkov6c118642010-10-21 12:06:30 -0700190 in.deadline = "some-deadline";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000191 InstallPlan install_plan;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700192 EXPECT_TRUE(DoTest(in, "/dev/sda3", test_deadline_file, &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800193 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700194 EXPECT_EQ(in.hash, install_plan.payload_hash);
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700195 EXPECT_EQ("/dev/sda5", install_plan.install_path);
Darin Petkov6c118642010-10-21 12:06:30 -0700196 string deadline;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700197 EXPECT_TRUE(utils::ReadFile(test_deadline_file, &deadline));
Darin Petkov6c118642010-10-21 12:06:30 -0700198 EXPECT_EQ("some-deadline", deadline);
Chris Sosafb1020e2013-07-29 17:27:33 -0700199 EXPECT_EQ(in.version, install_plan.version);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000200 }
201}
202
203TEST_F(OmahaResponseHandlerActionTest, NoUpdatesTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700204 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000205 in.update_exists = false;
206 InstallPlan install_plan;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700207 EXPECT_FALSE(DoTest(in, "/dev/sda1", "", &install_plan));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000208 EXPECT_EQ("", install_plan.download_url);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700209 EXPECT_EQ("", install_plan.payload_hash);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000210 EXPECT_EQ("", install_plan.install_path);
Chris Sosafb1020e2013-07-29 17:27:33 -0700211 EXPECT_EQ("", install_plan.version);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000212}
213
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800214TEST_F(OmahaResponseHandlerActionTest, HashChecksForHttpTest) {
215 OmahaResponse in;
216 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700217 in.version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800218 in.payload_urls.push_back("http://test.should/need/hash.checks.signed");
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800219 in.more_info_url = "http://more/info";
220 in.hash = "HASHj+";
221 in.size = 12;
David Pursell02c18642014-11-06 11:26:11 -0800222 FakeSystemState fake_system_state;
223 // Hash checks are always skipped for non-official update URLs.
224 EXPECT_CALL(*(fake_system_state.mock_request_params()),
225 IsUpdateUrlOfficial())
226 .WillRepeatedly(Return(true));
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800227 InstallPlan install_plan;
David Pursell02c18642014-11-06 11:26:11 -0800228 EXPECT_TRUE(DoTestCommon(&fake_system_state, in, "/dev/sda5", "",
229 &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800230 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800231 EXPECT_EQ(in.hash, install_plan.payload_hash);
232 EXPECT_TRUE(install_plan.hash_checks_mandatory);
Chris Sosafb1020e2013-07-29 17:27:33 -0700233 EXPECT_EQ(in.version, install_plan.version);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800234}
235
David Pursell02c18642014-11-06 11:26:11 -0800236TEST_F(OmahaResponseHandlerActionTest, HashChecksForUnofficialUpdateUrl) {
237 OmahaResponse in;
238 in.update_exists = true;
239 in.version = "a.b.c.d";
240 in.payload_urls.push_back("http://url.normally/needs/hash.checks.signed");
241 in.more_info_url = "http://more/info";
242 in.hash = "HASHj+";
243 in.size = 12;
244 FakeSystemState fake_system_state;
245 EXPECT_CALL(*(fake_system_state.mock_request_params()),
246 IsUpdateUrlOfficial())
247 .WillRepeatedly(Return(false));
248 InstallPlan install_plan;
249 EXPECT_TRUE(DoTestCommon(&fake_system_state, in, "/dev/sda5", "",
250 &install_plan));
251 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
252 EXPECT_EQ(in.hash, install_plan.payload_hash);
253 EXPECT_FALSE(install_plan.hash_checks_mandatory);
254 EXPECT_EQ(in.version, install_plan.version);
255}
256
David Pursell907b4fa2015-01-27 10:27:38 -0800257TEST_F(OmahaResponseHandlerActionTest,
258 HashChecksForOfficialUrlUnofficialBuildTest) {
259 // Official URLs for unofficial builds (dev/test images) don't require hash.
260 OmahaResponse in;
261 in.update_exists = true;
262 in.version = "a.b.c.d";
263 in.payload_urls.push_back("http://url.normally/needs/hash.checks.signed");
264 in.more_info_url = "http://more/info";
265 in.hash = "HASHj+";
266 in.size = 12;
267 FakeSystemState fake_system_state;
268 EXPECT_CALL(*(fake_system_state.mock_request_params()),
269 IsUpdateUrlOfficial())
270 .WillRepeatedly(Return(true));
271 fake_system_state.fake_hardware()->SetIsOfficialBuild(false);
272 InstallPlan install_plan;
273 EXPECT_TRUE(DoTestCommon(&fake_system_state, in, "/dev/sda5", "",
274 &install_plan));
275 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
276 EXPECT_EQ(in.hash, install_plan.payload_hash);
277 EXPECT_FALSE(install_plan.hash_checks_mandatory);
278 EXPECT_EQ(in.version, install_plan.version);
279}
280
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800281TEST_F(OmahaResponseHandlerActionTest, HashChecksForHttpsTest) {
282 OmahaResponse in;
283 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700284 in.version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800285 in.payload_urls.push_back("https://test.should.not/need/hash.checks.signed");
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800286 in.more_info_url = "http://more/info";
287 in.hash = "HASHj+";
288 in.size = 12;
David Pursell02c18642014-11-06 11:26:11 -0800289 FakeSystemState fake_system_state;
290 EXPECT_CALL(*(fake_system_state.mock_request_params()),
291 IsUpdateUrlOfficial())
292 .WillRepeatedly(Return(true));
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800293 InstallPlan install_plan;
David Pursell02c18642014-11-06 11:26:11 -0800294 EXPECT_TRUE(DoTestCommon(&fake_system_state, in, "/dev/sda5", "",
295 &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800296 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800297 EXPECT_EQ(in.hash, install_plan.payload_hash);
298 EXPECT_FALSE(install_plan.hash_checks_mandatory);
Chris Sosafb1020e2013-07-29 17:27:33 -0700299 EXPECT_EQ(in.version, install_plan.version);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800300}
301
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800302TEST_F(OmahaResponseHandlerActionTest, HashChecksForBothHttpAndHttpsTest) {
303 OmahaResponse in;
304 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700305 in.version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800306 in.payload_urls.push_back("http://test.should.still/need/hash.checks");
307 in.payload_urls.push_back("https://test.should.still/need/hash.checks");
308 in.more_info_url = "http://more/info";
309 in.hash = "HASHj+";
310 in.size = 12;
David Pursell02c18642014-11-06 11:26:11 -0800311 FakeSystemState fake_system_state;
312 EXPECT_CALL(*(fake_system_state.mock_request_params()),
313 IsUpdateUrlOfficial())
314 .WillRepeatedly(Return(true));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800315 InstallPlan install_plan;
David Pursell02c18642014-11-06 11:26:11 -0800316 EXPECT_TRUE(DoTestCommon(&fake_system_state, in, "/dev/sda5", "",
317 &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800318 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
319 EXPECT_EQ(in.hash, install_plan.payload_hash);
320 EXPECT_TRUE(install_plan.hash_checks_mandatory);
Chris Sosafb1020e2013-07-29 17:27:33 -0700321 EXPECT_EQ(in.version, install_plan.version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800322}
323
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700324TEST_F(OmahaResponseHandlerActionTest, ChangeToMoreStableChannelTest) {
325 OmahaResponse in;
326 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700327 in.version = "a.b.c.d";
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700328 in.payload_urls.push_back("https://MoreStableChannelTest");
329 in.more_info_url = "http://more/info";
330 in.hash = "HASHjk";
331 in.size = 15;
332
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700333 // Create a uniquely named test directory.
334 string test_dir;
335 ASSERT_TRUE(utils::MakeTempDirectory(
336 "omaha_response_handler_action-test-XXXXXX", &test_dir));
337
338 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
339 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -0700340 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700341 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700342 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700343 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
344 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700345 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700346 "CHROMEOS_IS_POWERWASH_ALLOWED=true\n"
347 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
348
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700349 FakeSystemState fake_system_state;
350 OmahaRequestParams params(&fake_system_state);
Gilad Arnoldd04f8e22014-01-09 13:13:40 -0800351 params.set_root(test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700352 params.SetLockDown(false);
353 params.Init("1.2.3.4", "", 0);
354 EXPECT_EQ("canary-channel", params.current_channel());
355 EXPECT_EQ("stable-channel", params.target_channel());
356 EXPECT_TRUE(params.to_more_stable_channel());
357 EXPECT_TRUE(params.is_powerwash_allowed());
358
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700359 fake_system_state.set_request_params(&params);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700360 InstallPlan install_plan;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700361 EXPECT_TRUE(DoTestCommon(&fake_system_state, in, "/dev/sda5", "",
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700362 &install_plan));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700363 EXPECT_TRUE(install_plan.powerwash_required);
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700364
Alex Deymo10875d92014-11-10 21:52:57 -0800365 ASSERT_TRUE(test_utils::RecursiveUnlinkDir(test_dir));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700366}
367
368TEST_F(OmahaResponseHandlerActionTest, ChangeToLessStableChannelTest) {
369 OmahaResponse in;
370 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700371 in.version = "a.b.c.d";
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700372 in.payload_urls.push_back("https://LessStableChannelTest");
373 in.more_info_url = "http://more/info";
374 in.hash = "HASHjk";
375 in.size = 15;
376
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700377 // Create a uniquely named test directory.
378 string test_dir;
379 ASSERT_TRUE(utils::MakeTempDirectory(
380 "omaha_response_handler_action-test-XXXXXX", &test_dir));
381
382 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
383 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -0700384 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700385 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700386 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700387 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
388 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700389 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700390 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
391
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700392 FakeSystemState fake_system_state;
393 OmahaRequestParams params(&fake_system_state);
Gilad Arnoldd04f8e22014-01-09 13:13:40 -0800394 params.set_root(test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700395 params.SetLockDown(false);
396 params.Init("5.6.7.8", "", 0);
397 EXPECT_EQ("stable-channel", params.current_channel());
398 params.SetTargetChannel("canary-channel", false);
399 EXPECT_EQ("canary-channel", params.target_channel());
400 EXPECT_FALSE(params.to_more_stable_channel());
401 EXPECT_FALSE(params.is_powerwash_allowed());
402
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700403 fake_system_state.set_request_params(&params);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700404 InstallPlan install_plan;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700405 EXPECT_TRUE(DoTestCommon(&fake_system_state, in, "/dev/sda5", "",
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700406 &install_plan));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700407 EXPECT_FALSE(install_plan.powerwash_required);
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700408
Alex Deymo10875d92014-11-10 21:52:57 -0800409 ASSERT_TRUE(test_utils::RecursiveUnlinkDir(test_dir));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700410}
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800411
David Zeuthen8f191b22013-08-06 12:27:50 -0700412TEST_F(OmahaResponseHandlerActionTest, P2PUrlIsUsedAndHashChecksMandatory) {
413 OmahaResponse in;
414 in.update_exists = true;
415 in.version = "a.b.c.d";
416 in.payload_urls.push_back("https://would.not/cause/hash/checks");
417 in.more_info_url = "http://more/info";
418 in.hash = "HASHj+";
419 in.size = 12;
420
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700421 FakeSystemState fake_system_state;
422 OmahaRequestParams params(&fake_system_state);
David Pursell02c18642014-11-06 11:26:11 -0800423 // We're using a real OmahaRequestParams object here so we can't mock
424 // IsUpdateUrlOfficial(), but setting the update URL to the AutoUpdate test
425 // server will cause IsUpdateUrlOfficial() to return true.
426 params.set_update_url(kAUTestOmahaUrl);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700427 fake_system_state.set_request_params(&params);
David Zeuthen8f191b22013-08-06 12:27:50 -0700428
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700429 EXPECT_CALL(*fake_system_state.mock_payload_state(),
David Zeuthenbb8bdc72013-09-03 13:43:48 -0700430 SetUsingP2PForDownloading(true));
431
David Zeuthen8f191b22013-08-06 12:27:50 -0700432 string p2p_url = "http://9.8.7.6/p2p";
Gilad Arnold74b5f552014-10-07 08:17:16 -0700433 EXPECT_CALL(*fake_system_state.mock_payload_state(), GetP2PUrl())
434 .WillRepeatedly(Return(p2p_url));
435 EXPECT_CALL(*fake_system_state.mock_payload_state(),
436 GetUsingP2PForDownloading()).WillRepeatedly(Return(true));
David Zeuthen8f191b22013-08-06 12:27:50 -0700437
438 InstallPlan install_plan;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700439 EXPECT_TRUE(DoTestCommon(&fake_system_state, in, "/dev/sda5", "",
David Zeuthen8f191b22013-08-06 12:27:50 -0700440 &install_plan));
441 EXPECT_EQ(in.hash, install_plan.payload_hash);
442 EXPECT_EQ(install_plan.download_url, p2p_url);
443 EXPECT_TRUE(install_plan.hash_checks_mandatory);
444}
445
adlr@google.com3defe6a2009-12-04 20:57:17 +0000446} // namespace chromeos_update_engine