blob: bdbf3a7b758423098317af0d513d904baa7bac38 [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
Alex Deymoaab50e32014-11-10 19:55:35 -08005#include "update_engine/omaha_response_handler_action.h"
6
adlr@google.com3defe6a2009-12-04 20:57:17 +00007#include <string>
Darin Petkov73058b42010-10-06 16:32:19 -07008
adlr@google.com3defe6a2009-12-04 20:57:17 +00009#include <gtest/gtest.h>
Darin Petkov73058b42010-10-06 16:32:19 -070010
Jay Srinivasand29695d2013-04-08 15:08:05 -070011#include "update_engine/constants.h"
Gilad Arnold5bb4c902014-04-10 12:32:13 -070012#include "update_engine/fake_system_state.h"
Gilad Arnold74b5f552014-10-07 08:17:16 -070013#include "update_engine/mock_payload_state.h"
adlr@google.com3defe6a2009-12-04 20:57:17 +000014#include "update_engine/test_utils.h"
15#include "update_engine/utils.h"
16
Alex Deymo10875d92014-11-10 21:52:57 -080017using chromeos_update_engine::test_utils::System;
18using chromeos_update_engine::test_utils::WriteFileString;
adlr@google.com3defe6a2009-12-04 20:57:17 +000019using std::string;
Darin Petkov73058b42010-10-06 16:32:19 -070020using testing::Return;
adlr@google.com3defe6a2009-12-04 20:57:17 +000021
22namespace chromeos_update_engine {
23
24class OmahaResponseHandlerActionTest : public ::testing::Test {
25 public:
26 // Return true iff the OmahaResponseHandlerAction succeeded.
Alex Vakulenko88b591f2014-08-28 16:48:57 -070027 // If out is non-null, it's set w/ the response from the action.
Gilad Arnold5bb4c902014-04-10 12:32:13 -070028 bool DoTestCommon(FakeSystemState* fake_system_state,
Jay Srinivasanae4697c2013-03-18 17:08:08 -070029 const OmahaResponse& in,
30 const string& boot_dev,
Gilad Arnold4dbd47e2013-07-22 05:39:26 -070031 const string& deadline_file,
Jay Srinivasanae4697c2013-03-18 17:08:08 -070032 InstallPlan* out);
Darin Petkov6a5b3222010-07-13 14:55:28 -070033 bool DoTest(const OmahaResponse& in,
adlr@google.com3defe6a2009-12-04 20:57:17 +000034 const string& boot_dev,
Gilad Arnold4dbd47e2013-07-22 05:39:26 -070035 const string& deadline_file,
adlr@google.com3defe6a2009-12-04 20:57:17 +000036 InstallPlan* out);
37};
38
39class OmahaResponseHandlerActionProcessorDelegate
40 : public ActionProcessorDelegate {
41 public:
42 OmahaResponseHandlerActionProcessorDelegate()
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -070043 : code_(ErrorCode::kError),
Darin Petkovc1a8b422010-07-19 11:34:49 -070044 code_set_(false) {}
adlr@google.com3defe6a2009-12-04 20:57:17 +000045 void ActionCompleted(ActionProcessor* processor,
46 AbstractAction* action,
David Zeuthena99981f2013-04-29 13:42:47 -070047 ErrorCode code) {
adlr@google.com3defe6a2009-12-04 20:57:17 +000048 if (action->Type() == OmahaResponseHandlerAction::StaticType()) {
Darin Petkovc1a8b422010-07-19 11:34:49 -070049 code_ = code;
50 code_set_ = true;
adlr@google.com3defe6a2009-12-04 20:57:17 +000051 }
52 }
David Zeuthena99981f2013-04-29 13:42:47 -070053 ErrorCode code_;
Darin Petkovc1a8b422010-07-19 11:34:49 -070054 bool code_set_;
adlr@google.com3defe6a2009-12-04 20:57:17 +000055};
56
57namespace {
Alex Vakulenkod2779df2014-06-16 13:19:00 -070058const char* const kLongName =
adlr@google.com3defe6a2009-12-04 20:57:17 +000059 "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 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
62 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
63 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
64 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
65 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
66 "-the_update_a.b.c.d_DELTA_.tgz";
Alex Vakulenkod2779df2014-06-16 13:19:00 -070067const char* const kBadVersion = "don't update me";
68} // namespace
adlr@google.com3defe6a2009-12-04 20:57:17 +000069
Jay Srinivasanae4697c2013-03-18 17:08:08 -070070bool OmahaResponseHandlerActionTest::DoTestCommon(
Gilad Arnold5bb4c902014-04-10 12:32:13 -070071 FakeSystemState* fake_system_state,
Jay Srinivasanae4697c2013-03-18 17:08:08 -070072 const OmahaResponse& in,
73 const string& boot_dev,
Gilad Arnold4dbd47e2013-07-22 05:39:26 -070074 const string& test_deadline_file,
Jay Srinivasanae4697c2013-03-18 17:08:08 -070075 InstallPlan* out) {
adlr@google.com3defe6a2009-12-04 20:57:17 +000076 ActionProcessor processor;
77 OmahaResponseHandlerActionProcessorDelegate delegate;
78 processor.set_delegate(&delegate);
79
Darin Petkov6a5b3222010-07-13 14:55:28 -070080 ObjectFeederAction<OmahaResponse> feeder_action;
adlr@google.com3defe6a2009-12-04 20:57:17 +000081 feeder_action.set_obj(in);
Alex Vakulenkod2779df2014-06-16 13:19:00 -070082 if (in.update_exists && in.version != kBadVersion) {
Gilad Arnold5bb4c902014-04-10 12:32:13 -070083 EXPECT_CALL(*(fake_system_state->mock_prefs()),
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080084 SetString(kPrefsUpdateCheckResponseHash, in.hash))
Darin Petkov73058b42010-10-06 16:32:19 -070085 .WillOnce(Return(true));
86 }
Jay Srinivasan53173b92013-05-17 17:13:01 -070087
88 string current_url = in.payload_urls.size() ? in.payload_urls[0] : "";
Gilad Arnold5bb4c902014-04-10 12:32:13 -070089 EXPECT_CALL(*(fake_system_state->mock_payload_state()), GetCurrentUrl())
Jay Srinivasan53173b92013-05-17 17:13:01 -070090 .WillRepeatedly(Return(current_url));
91
Gilad Arnold4dbd47e2013-07-22 05:39:26 -070092 OmahaResponseHandlerAction response_handler_action(
Gilad Arnold5bb4c902014-04-10 12:32:13 -070093 fake_system_state,
Gilad Arnold4dbd47e2013-07-22 05:39:26 -070094 (test_deadline_file.empty() ?
95 OmahaResponseHandlerAction::kDeadlineFile : test_deadline_file));
adlr@google.com3defe6a2009-12-04 20:57:17 +000096 response_handler_action.set_boot_device(boot_dev);
97 BondActions(&feeder_action, &response_handler_action);
98 ObjectCollectorAction<InstallPlan> collector_action;
99 BondActions(&response_handler_action, &collector_action);
100 processor.EnqueueAction(&feeder_action);
101 processor.EnqueueAction(&response_handler_action);
102 processor.EnqueueAction(&collector_action);
103 processor.StartProcessing();
104 EXPECT_TRUE(!processor.IsRunning())
Alex Vakulenko072359c2014-07-18 11:41:07 -0700105 << "Update test to handle non-async actions";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000106 if (out)
107 *out = collector_action.object();
Darin Petkovc1a8b422010-07-19 11:34:49 -0700108 EXPECT_TRUE(delegate.code_set_);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700109 return delegate.code_ == ErrorCode::kSuccess;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000110}
111
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700112bool OmahaResponseHandlerActionTest::DoTest(const OmahaResponse& in,
113 const string& boot_dev,
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700114 const string& deadline_file,
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700115 InstallPlan* out) {
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700116 FakeSystemState fake_system_state;
117 return DoTestCommon(&fake_system_state, in, boot_dev, deadline_file, out);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700118}
119
adlr@google.com3defe6a2009-12-04 20:57:17 +0000120TEST_F(OmahaResponseHandlerActionTest, SimpleTest) {
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700121 string test_deadline_file;
122 CHECK(utils::MakeTempFile(
Gilad Arnolda6742b32014-01-11 00:18:34 -0800123 "omaha_response_handler_action_unittest-XXXXXX",
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700124 &test_deadline_file, nullptr));
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700125 ScopedPathUnlinker deadline_unlinker(test_deadline_file);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000126 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700127 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000128 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700129 in.version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800130 in.payload_urls.push_back("http://foo/the_update_a.b.c.d.tgz");
adlr@google.com3defe6a2009-12-04 20:57:17 +0000131 in.more_info_url = "http://more/info";
132 in.hash = "HASH+";
133 in.size = 12;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000134 in.prompt = false;
Darin Petkov6c118642010-10-21 12:06:30 -0700135 in.deadline = "20101020";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000136 InstallPlan install_plan;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700137 EXPECT_TRUE(DoTest(in, "/dev/sda3", test_deadline_file, &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800138 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700139 EXPECT_EQ(in.hash, install_plan.payload_hash);
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700140 EXPECT_EQ("/dev/sda5", install_plan.install_path);
Darin Petkov6c118642010-10-21 12:06:30 -0700141 string deadline;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700142 EXPECT_TRUE(utils::ReadFile(test_deadline_file, &deadline));
Darin Petkov6c118642010-10-21 12:06:30 -0700143 EXPECT_EQ("20101020", deadline);
144 struct stat deadline_stat;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700145 EXPECT_EQ(0, stat(test_deadline_file.c_str(), &deadline_stat));
Darin Petkov6c118642010-10-21 12:06:30 -0700146 EXPECT_EQ(S_IFREG | S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH,
147 deadline_stat.st_mode);
Chris Sosafb1020e2013-07-29 17:27:33 -0700148 EXPECT_EQ(in.version, install_plan.version);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000149 }
150 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700151 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000152 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700153 in.version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800154 in.payload_urls.push_back("http://foo/the_update_a.b.c.d.tgz");
adlr@google.com3defe6a2009-12-04 20:57:17 +0000155 in.more_info_url = "http://more/info";
156 in.hash = "HASHj+";
157 in.size = 12;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000158 in.prompt = true;
159 InstallPlan install_plan;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700160 EXPECT_TRUE(DoTest(in, "/dev/sda5", test_deadline_file, &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800161 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700162 EXPECT_EQ(in.hash, install_plan.payload_hash);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000163 EXPECT_EQ("/dev/sda3", install_plan.install_path);
Darin Petkov6c118642010-10-21 12:06:30 -0700164 string deadline;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700165 EXPECT_TRUE(utils::ReadFile(test_deadline_file, &deadline) &&
166 deadline.empty());
Chris Sosafb1020e2013-07-29 17:27:33 -0700167 EXPECT_EQ(in.version, install_plan.version);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000168 }
169 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700170 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000171 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700172 in.version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800173 in.payload_urls.push_back(kLongName);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000174 in.more_info_url = "http://more/info";
175 in.hash = "HASHj+";
176 in.size = 12;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000177 in.prompt = true;
Darin Petkov6c118642010-10-21 12:06:30 -0700178 in.deadline = "some-deadline";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000179 InstallPlan install_plan;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700180 EXPECT_TRUE(DoTest(in, "/dev/sda3", test_deadline_file, &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800181 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700182 EXPECT_EQ(in.hash, install_plan.payload_hash);
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700183 EXPECT_EQ("/dev/sda5", install_plan.install_path);
Darin Petkov6c118642010-10-21 12:06:30 -0700184 string deadline;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700185 EXPECT_TRUE(utils::ReadFile(test_deadline_file, &deadline));
Darin Petkov6c118642010-10-21 12:06:30 -0700186 EXPECT_EQ("some-deadline", deadline);
Chris Sosafb1020e2013-07-29 17:27:33 -0700187 EXPECT_EQ(in.version, install_plan.version);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000188 }
189}
190
191TEST_F(OmahaResponseHandlerActionTest, NoUpdatesTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700192 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000193 in.update_exists = false;
194 InstallPlan install_plan;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700195 EXPECT_FALSE(DoTest(in, "/dev/sda1", "", &install_plan));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000196 EXPECT_EQ("", install_plan.download_url);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700197 EXPECT_EQ("", install_plan.payload_hash);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000198 EXPECT_EQ("", install_plan.install_path);
Chris Sosafb1020e2013-07-29 17:27:33 -0700199 EXPECT_EQ("", install_plan.version);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000200}
201
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800202TEST_F(OmahaResponseHandlerActionTest, HashChecksForHttpTest) {
203 OmahaResponse in;
204 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700205 in.version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800206 in.payload_urls.push_back("http://test.should/need/hash.checks.signed");
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800207 in.more_info_url = "http://more/info";
208 in.hash = "HASHj+";
209 in.size = 12;
David Pursell02c18642014-11-06 11:26:11 -0800210 FakeSystemState fake_system_state;
211 // Hash checks are always skipped for non-official update URLs.
212 EXPECT_CALL(*(fake_system_state.mock_request_params()),
213 IsUpdateUrlOfficial())
214 .WillRepeatedly(Return(true));
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800215 InstallPlan install_plan;
David Pursell02c18642014-11-06 11:26:11 -0800216 EXPECT_TRUE(DoTestCommon(&fake_system_state, in, "/dev/sda5", "",
217 &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800218 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800219 EXPECT_EQ(in.hash, install_plan.payload_hash);
220 EXPECT_TRUE(install_plan.hash_checks_mandatory);
Chris Sosafb1020e2013-07-29 17:27:33 -0700221 EXPECT_EQ(in.version, install_plan.version);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800222}
223
David Pursell02c18642014-11-06 11:26:11 -0800224TEST_F(OmahaResponseHandlerActionTest, HashChecksForUnofficialUpdateUrl) {
225 OmahaResponse in;
226 in.update_exists = true;
227 in.version = "a.b.c.d";
228 in.payload_urls.push_back("http://url.normally/needs/hash.checks.signed");
229 in.more_info_url = "http://more/info";
230 in.hash = "HASHj+";
231 in.size = 12;
232 FakeSystemState fake_system_state;
233 EXPECT_CALL(*(fake_system_state.mock_request_params()),
234 IsUpdateUrlOfficial())
235 .WillRepeatedly(Return(false));
236 InstallPlan install_plan;
237 EXPECT_TRUE(DoTestCommon(&fake_system_state, in, "/dev/sda5", "",
238 &install_plan));
239 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
240 EXPECT_EQ(in.hash, install_plan.payload_hash);
241 EXPECT_FALSE(install_plan.hash_checks_mandatory);
242 EXPECT_EQ(in.version, install_plan.version);
243}
244
David Pursell907b4fa2015-01-27 10:27:38 -0800245TEST_F(OmahaResponseHandlerActionTest,
246 HashChecksForOfficialUrlUnofficialBuildTest) {
247 // Official URLs for unofficial builds (dev/test images) don't require hash.
248 OmahaResponse in;
249 in.update_exists = true;
250 in.version = "a.b.c.d";
251 in.payload_urls.push_back("http://url.normally/needs/hash.checks.signed");
252 in.more_info_url = "http://more/info";
253 in.hash = "HASHj+";
254 in.size = 12;
255 FakeSystemState fake_system_state;
256 EXPECT_CALL(*(fake_system_state.mock_request_params()),
257 IsUpdateUrlOfficial())
258 .WillRepeatedly(Return(true));
259 fake_system_state.fake_hardware()->SetIsOfficialBuild(false);
260 InstallPlan install_plan;
261 EXPECT_TRUE(DoTestCommon(&fake_system_state, in, "/dev/sda5", "",
262 &install_plan));
263 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
264 EXPECT_EQ(in.hash, install_plan.payload_hash);
265 EXPECT_FALSE(install_plan.hash_checks_mandatory);
266 EXPECT_EQ(in.version, install_plan.version);
267}
268
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800269TEST_F(OmahaResponseHandlerActionTest, HashChecksForHttpsTest) {
270 OmahaResponse in;
271 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700272 in.version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800273 in.payload_urls.push_back("https://test.should.not/need/hash.checks.signed");
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800274 in.more_info_url = "http://more/info";
275 in.hash = "HASHj+";
276 in.size = 12;
David Pursell02c18642014-11-06 11:26:11 -0800277 FakeSystemState fake_system_state;
278 EXPECT_CALL(*(fake_system_state.mock_request_params()),
279 IsUpdateUrlOfficial())
280 .WillRepeatedly(Return(true));
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800281 InstallPlan install_plan;
David Pursell02c18642014-11-06 11:26:11 -0800282 EXPECT_TRUE(DoTestCommon(&fake_system_state, in, "/dev/sda5", "",
283 &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800284 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800285 EXPECT_EQ(in.hash, install_plan.payload_hash);
286 EXPECT_FALSE(install_plan.hash_checks_mandatory);
Chris Sosafb1020e2013-07-29 17:27:33 -0700287 EXPECT_EQ(in.version, install_plan.version);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800288}
289
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800290TEST_F(OmahaResponseHandlerActionTest, HashChecksForBothHttpAndHttpsTest) {
291 OmahaResponse in;
292 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700293 in.version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800294 in.payload_urls.push_back("http://test.should.still/need/hash.checks");
295 in.payload_urls.push_back("https://test.should.still/need/hash.checks");
296 in.more_info_url = "http://more/info";
297 in.hash = "HASHj+";
298 in.size = 12;
David Pursell02c18642014-11-06 11:26:11 -0800299 FakeSystemState fake_system_state;
300 EXPECT_CALL(*(fake_system_state.mock_request_params()),
301 IsUpdateUrlOfficial())
302 .WillRepeatedly(Return(true));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800303 InstallPlan install_plan;
David Pursell02c18642014-11-06 11:26:11 -0800304 EXPECT_TRUE(DoTestCommon(&fake_system_state, in, "/dev/sda5", "",
305 &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800306 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
307 EXPECT_EQ(in.hash, install_plan.payload_hash);
308 EXPECT_TRUE(install_plan.hash_checks_mandatory);
Chris Sosafb1020e2013-07-29 17:27:33 -0700309 EXPECT_EQ(in.version, install_plan.version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800310}
311
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700312TEST_F(OmahaResponseHandlerActionTest, ChangeToMoreStableChannelTest) {
313 OmahaResponse in;
314 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700315 in.version = "a.b.c.d";
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700316 in.payload_urls.push_back("https://MoreStableChannelTest");
317 in.more_info_url = "http://more/info";
318 in.hash = "HASHjk";
319 in.size = 15;
320
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700321 // Create a uniquely named test directory.
322 string test_dir;
323 ASSERT_TRUE(utils::MakeTempDirectory(
324 "omaha_response_handler_action-test-XXXXXX", &test_dir));
325
326 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
327 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -0700328 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700329 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700330 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700331 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
332 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700333 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700334 "CHROMEOS_IS_POWERWASH_ALLOWED=true\n"
335 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
336
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700337 FakeSystemState fake_system_state;
338 OmahaRequestParams params(&fake_system_state);
Gilad Arnoldd04f8e22014-01-09 13:13:40 -0800339 params.set_root(test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700340 params.SetLockDown(false);
341 params.Init("1.2.3.4", "", 0);
342 EXPECT_EQ("canary-channel", params.current_channel());
343 EXPECT_EQ("stable-channel", params.target_channel());
344 EXPECT_TRUE(params.to_more_stable_channel());
345 EXPECT_TRUE(params.is_powerwash_allowed());
346
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700347 fake_system_state.set_request_params(&params);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700348 InstallPlan install_plan;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700349 EXPECT_TRUE(DoTestCommon(&fake_system_state, in, "/dev/sda5", "",
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700350 &install_plan));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700351 EXPECT_TRUE(install_plan.powerwash_required);
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700352
Alex Deymo10875d92014-11-10 21:52:57 -0800353 ASSERT_TRUE(test_utils::RecursiveUnlinkDir(test_dir));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700354}
355
356TEST_F(OmahaResponseHandlerActionTest, ChangeToLessStableChannelTest) {
357 OmahaResponse in;
358 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700359 in.version = "a.b.c.d";
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700360 in.payload_urls.push_back("https://LessStableChannelTest");
361 in.more_info_url = "http://more/info";
362 in.hash = "HASHjk";
363 in.size = 15;
364
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700365 // Create a uniquely named test directory.
366 string test_dir;
367 ASSERT_TRUE(utils::MakeTempDirectory(
368 "omaha_response_handler_action-test-XXXXXX", &test_dir));
369
370 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
371 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -0700372 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700373 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700374 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700375 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
376 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700377 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700378 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
379
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700380 FakeSystemState fake_system_state;
381 OmahaRequestParams params(&fake_system_state);
Gilad Arnoldd04f8e22014-01-09 13:13:40 -0800382 params.set_root(test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700383 params.SetLockDown(false);
384 params.Init("5.6.7.8", "", 0);
385 EXPECT_EQ("stable-channel", params.current_channel());
386 params.SetTargetChannel("canary-channel", false);
387 EXPECT_EQ("canary-channel", params.target_channel());
388 EXPECT_FALSE(params.to_more_stable_channel());
389 EXPECT_FALSE(params.is_powerwash_allowed());
390
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700391 fake_system_state.set_request_params(&params);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700392 InstallPlan install_plan;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700393 EXPECT_TRUE(DoTestCommon(&fake_system_state, in, "/dev/sda5", "",
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700394 &install_plan));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700395 EXPECT_FALSE(install_plan.powerwash_required);
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700396
Alex Deymo10875d92014-11-10 21:52:57 -0800397 ASSERT_TRUE(test_utils::RecursiveUnlinkDir(test_dir));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700398}
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800399
David Zeuthen8f191b22013-08-06 12:27:50 -0700400TEST_F(OmahaResponseHandlerActionTest, P2PUrlIsUsedAndHashChecksMandatory) {
401 OmahaResponse in;
402 in.update_exists = true;
403 in.version = "a.b.c.d";
404 in.payload_urls.push_back("https://would.not/cause/hash/checks");
405 in.more_info_url = "http://more/info";
406 in.hash = "HASHj+";
407 in.size = 12;
408
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700409 FakeSystemState fake_system_state;
410 OmahaRequestParams params(&fake_system_state);
David Pursell02c18642014-11-06 11:26:11 -0800411 // We're using a real OmahaRequestParams object here so we can't mock
412 // IsUpdateUrlOfficial(), but setting the update URL to the AutoUpdate test
413 // server will cause IsUpdateUrlOfficial() to return true.
414 params.set_update_url(kAUTestOmahaUrl);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700415 fake_system_state.set_request_params(&params);
David Zeuthen8f191b22013-08-06 12:27:50 -0700416
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700417 EXPECT_CALL(*fake_system_state.mock_payload_state(),
David Zeuthenbb8bdc72013-09-03 13:43:48 -0700418 SetUsingP2PForDownloading(true));
419
David Zeuthen8f191b22013-08-06 12:27:50 -0700420 string p2p_url = "http://9.8.7.6/p2p";
Gilad Arnold74b5f552014-10-07 08:17:16 -0700421 EXPECT_CALL(*fake_system_state.mock_payload_state(), GetP2PUrl())
422 .WillRepeatedly(Return(p2p_url));
423 EXPECT_CALL(*fake_system_state.mock_payload_state(),
424 GetUsingP2PForDownloading()).WillRepeatedly(Return(true));
David Zeuthen8f191b22013-08-06 12:27:50 -0700425
426 InstallPlan install_plan;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700427 EXPECT_TRUE(DoTestCommon(&fake_system_state, in, "/dev/sda5", "",
David Zeuthen8f191b22013-08-06 12:27:50 -0700428 &install_plan));
429 EXPECT_EQ(in.hash, install_plan.payload_hash);
430 EXPECT_EQ(install_plan.download_url, p2p_url);
431 EXPECT_TRUE(install_plan.hash_checks_mandatory);
432}
433
adlr@google.com3defe6a2009-12-04 20:57:17 +0000434} // namespace chromeos_update_engine