blob: 4917162d15ff63f4e2636d27519dfd616fbcc76f [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
Alex Deymo110e0302015-10-19 20:35:21 -070021#include <base/files/file_util.h>
adlr@google.com3defe6a2009-12-04 20:57:17 +000022#include <gtest/gtest.h>
Darin Petkov73058b42010-10-06 16:32:19 -070023
Alex Deymo39910dc2015-11-09 17:04:30 -080024#include "update_engine/common/constants.h"
25#include "update_engine/common/platform_constants.h"
26#include "update_engine/common/test_utils.h"
27#include "update_engine/common/utils.h"
Gilad Arnold5bb4c902014-04-10 12:32:13 -070028#include "update_engine/fake_system_state.h"
Gilad Arnold74b5f552014-10-07 08:17:16 -070029#include "update_engine/mock_payload_state.h"
Alex Deymo39910dc2015-11-09 17:04:30 -080030#include "update_engine/payload_consumer/payload_constants.h"
adlr@google.com3defe6a2009-12-04 20:57:17 +000031
Alex Deymo10875d92014-11-10 21:52:57 -080032using chromeos_update_engine::test_utils::System;
33using chromeos_update_engine::test_utils::WriteFileString;
adlr@google.com3defe6a2009-12-04 20:57:17 +000034using std::string;
Darin Petkov73058b42010-10-06 16:32:19 -070035using testing::Return;
adlr@google.com3defe6a2009-12-04 20:57:17 +000036
37namespace chromeos_update_engine {
38
39class OmahaResponseHandlerActionTest : public ::testing::Test {
Alex Deymo763e7db2015-08-27 21:08:08 -070040 protected:
41 void SetUp() override {
42 FakeBootControl* fake_boot_control = fake_system_state_.fake_boot_control();
43 fake_boot_control->SetPartitionDevice(
44 kLegacyPartitionNameKernel, 0, "/dev/sdz2");
45 fake_boot_control->SetPartitionDevice(
46 kLegacyPartitionNameRoot, 0, "/dev/sdz3");
47 fake_boot_control->SetPartitionDevice(
48 kLegacyPartitionNameKernel, 1, "/dev/sdz4");
49 fake_boot_control->SetPartitionDevice(
50 kLegacyPartitionNameRoot, 1, "/dev/sdz5");
51 }
52
adlr@google.com3defe6a2009-12-04 20:57:17 +000053 // Return true iff the OmahaResponseHandlerAction succeeded.
Alex Vakulenko88b591f2014-08-28 16:48:57 -070054 // If out is non-null, it's set w/ the response from the action.
Darin Petkov6a5b3222010-07-13 14:55:28 -070055 bool DoTest(const OmahaResponse& in,
Gilad Arnold4dbd47e2013-07-22 05:39:26 -070056 const string& deadline_file,
adlr@google.com3defe6a2009-12-04 20:57:17 +000057 InstallPlan* out);
Alex Deymo763e7db2015-08-27 21:08:08 -070058
59 FakeSystemState fake_system_state_;
adlr@google.com3defe6a2009-12-04 20:57:17 +000060};
61
62class OmahaResponseHandlerActionProcessorDelegate
63 : public ActionProcessorDelegate {
64 public:
65 OmahaResponseHandlerActionProcessorDelegate()
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -070066 : code_(ErrorCode::kError),
Darin Petkovc1a8b422010-07-19 11:34:49 -070067 code_set_(false) {}
adlr@google.com3defe6a2009-12-04 20:57:17 +000068 void ActionCompleted(ActionProcessor* processor,
69 AbstractAction* action,
David Zeuthena99981f2013-04-29 13:42:47 -070070 ErrorCode code) {
adlr@google.com3defe6a2009-12-04 20:57:17 +000071 if (action->Type() == OmahaResponseHandlerAction::StaticType()) {
Darin Petkovc1a8b422010-07-19 11:34:49 -070072 code_ = code;
73 code_set_ = true;
adlr@google.com3defe6a2009-12-04 20:57:17 +000074 }
75 }
David Zeuthena99981f2013-04-29 13:42:47 -070076 ErrorCode code_;
Darin Petkovc1a8b422010-07-19 11:34:49 -070077 bool code_set_;
adlr@google.com3defe6a2009-12-04 20:57:17 +000078};
79
80namespace {
Alex Vakulenkod2779df2014-06-16 13:19:00 -070081const char* const kLongName =
adlr@google.com3defe6a2009-12-04 20:57:17 +000082 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
83 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
84 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
85 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
86 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
87 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
88 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
89 "-the_update_a.b.c.d_DELTA_.tgz";
Alex Vakulenkod2779df2014-06-16 13:19:00 -070090const char* const kBadVersion = "don't update me";
91} // namespace
adlr@google.com3defe6a2009-12-04 20:57:17 +000092
Alex Deymo763e7db2015-08-27 21:08:08 -070093bool OmahaResponseHandlerActionTest::DoTest(
Jay Srinivasanae4697c2013-03-18 17:08:08 -070094 const OmahaResponse& in,
Gilad Arnold4dbd47e2013-07-22 05:39:26 -070095 const string& test_deadline_file,
Jay Srinivasanae4697c2013-03-18 17:08:08 -070096 InstallPlan* out) {
adlr@google.com3defe6a2009-12-04 20:57:17 +000097 ActionProcessor processor;
98 OmahaResponseHandlerActionProcessorDelegate delegate;
99 processor.set_delegate(&delegate);
100
Darin Petkov6a5b3222010-07-13 14:55:28 -0700101 ObjectFeederAction<OmahaResponse> feeder_action;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000102 feeder_action.set_obj(in);
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700103 if (in.update_exists && in.version != kBadVersion) {
Alex Deymo763e7db2015-08-27 21:08:08 -0700104 EXPECT_CALL(*(fake_system_state_.mock_prefs()),
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800105 SetString(kPrefsUpdateCheckResponseHash, in.hash))
Darin Petkov73058b42010-10-06 16:32:19 -0700106 .WillOnce(Return(true));
Alex Deymo85616652015-10-15 18:48:31 -0700107
108 int slot = 1 - fake_system_state_.fake_boot_control()->GetCurrentSlot();
109 string key = kPrefsChannelOnSlotPrefix + std::to_string(slot);
110 EXPECT_CALL(*(fake_system_state_.mock_prefs()), SetString(key, testing::_))
111 .WillOnce(Return(true));
Darin Petkov73058b42010-10-06 16:32:19 -0700112 }
Jay Srinivasan53173b92013-05-17 17:13:01 -0700113
114 string current_url = in.payload_urls.size() ? in.payload_urls[0] : "";
Alex Deymo763e7db2015-08-27 21:08:08 -0700115 EXPECT_CALL(*(fake_system_state_.mock_payload_state()), GetCurrentUrl())
Jay Srinivasan53173b92013-05-17 17:13:01 -0700116 .WillRepeatedly(Return(current_url));
117
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700118 OmahaResponseHandlerAction response_handler_action(
Alex Deymo763e7db2015-08-27 21:08:08 -0700119 &fake_system_state_,
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700120 (test_deadline_file.empty() ?
Alex Deymo6dd160a2015-10-09 18:45:14 -0700121 constants::kOmahaResponseDeadlineFile : test_deadline_file));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000122 BondActions(&feeder_action, &response_handler_action);
123 ObjectCollectorAction<InstallPlan> collector_action;
124 BondActions(&response_handler_action, &collector_action);
125 processor.EnqueueAction(&feeder_action);
126 processor.EnqueueAction(&response_handler_action);
127 processor.EnqueueAction(&collector_action);
128 processor.StartProcessing();
129 EXPECT_TRUE(!processor.IsRunning())
Alex Vakulenko072359c2014-07-18 11:41:07 -0700130 << "Update test to handle non-async actions";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000131 if (out)
132 *out = collector_action.object();
Darin Petkovc1a8b422010-07-19 11:34:49 -0700133 EXPECT_TRUE(delegate.code_set_);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700134 return delegate.code_ == ErrorCode::kSuccess;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000135}
136
137TEST_F(OmahaResponseHandlerActionTest, SimpleTest) {
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700138 string test_deadline_file;
139 CHECK(utils::MakeTempFile(
Gilad Arnolda6742b32014-01-11 00:18:34 -0800140 "omaha_response_handler_action_unittest-XXXXXX",
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700141 &test_deadline_file, nullptr));
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700142 ScopedPathUnlinker deadline_unlinker(test_deadline_file);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000143 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700144 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000145 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700146 in.version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800147 in.payload_urls.push_back("http://foo/the_update_a.b.c.d.tgz");
adlr@google.com3defe6a2009-12-04 20:57:17 +0000148 in.more_info_url = "http://more/info";
149 in.hash = "HASH+";
150 in.size = 12;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000151 in.prompt = false;
Darin Petkov6c118642010-10-21 12:06:30 -0700152 in.deadline = "20101020";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000153 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700154 EXPECT_TRUE(DoTest(in, test_deadline_file, &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800155 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700156 EXPECT_EQ(in.hash, install_plan.payload_hash);
Alex Deymo80f70ff2016-02-10 16:08:11 -0800157 EXPECT_EQ(1U, install_plan.target_slot);
Darin Petkov6c118642010-10-21 12:06:30 -0700158 string deadline;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700159 EXPECT_TRUE(utils::ReadFile(test_deadline_file, &deadline));
Darin Petkov6c118642010-10-21 12:06:30 -0700160 EXPECT_EQ("20101020", deadline);
161 struct stat deadline_stat;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700162 EXPECT_EQ(0, stat(test_deadline_file.c_str(), &deadline_stat));
Alex Deymo80f70ff2016-02-10 16:08:11 -0800163 EXPECT_EQ(
164 static_cast<mode_t>(S_IFREG | S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH),
165 deadline_stat.st_mode);
Chris Sosafb1020e2013-07-29 17:27:33 -0700166 EXPECT_EQ(in.version, install_plan.version);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000167 }
168 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700169 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000170 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700171 in.version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800172 in.payload_urls.push_back("http://foo/the_update_a.b.c.d.tgz");
adlr@google.com3defe6a2009-12-04 20:57:17 +0000173 in.more_info_url = "http://more/info";
174 in.hash = "HASHj+";
175 in.size = 12;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000176 in.prompt = true;
177 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700178 // Set the other slot as current.
179 fake_system_state_.fake_boot_control()->SetCurrentSlot(1);
180 EXPECT_TRUE(DoTest(in, 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);
Alex Deymo80f70ff2016-02-10 16:08:11 -0800183 EXPECT_EQ(0U, install_plan.target_slot);
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) &&
186 deadline.empty());
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 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700190 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000191 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700192 in.version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800193 in.payload_urls.push_back(kLongName);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000194 in.more_info_url = "http://more/info";
195 in.hash = "HASHj+";
196 in.size = 12;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000197 in.prompt = true;
Darin Petkov6c118642010-10-21 12:06:30 -0700198 in.deadline = "some-deadline";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000199 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700200 fake_system_state_.fake_boot_control()->SetCurrentSlot(0);
201 EXPECT_TRUE(DoTest(in, test_deadline_file, &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800202 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700203 EXPECT_EQ(in.hash, install_plan.payload_hash);
Alex Deymo80f70ff2016-02-10 16:08:11 -0800204 EXPECT_EQ(1U, install_plan.target_slot);
Darin Petkov6c118642010-10-21 12:06:30 -0700205 string deadline;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700206 EXPECT_TRUE(utils::ReadFile(test_deadline_file, &deadline));
Darin Petkov6c118642010-10-21 12:06:30 -0700207 EXPECT_EQ("some-deadline", deadline);
Chris Sosafb1020e2013-07-29 17:27:33 -0700208 EXPECT_EQ(in.version, install_plan.version);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000209 }
210}
211
212TEST_F(OmahaResponseHandlerActionTest, NoUpdatesTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700213 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000214 in.update_exists = false;
215 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700216 EXPECT_FALSE(DoTest(in, "", &install_plan));
Alex Deymoe5e5fe92015-10-05 09:28:19 -0700217 EXPECT_TRUE(install_plan.partitions.empty());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000218}
219
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800220TEST_F(OmahaResponseHandlerActionTest, HashChecksForHttpTest) {
221 OmahaResponse in;
222 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700223 in.version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800224 in.payload_urls.push_back("http://test.should/need/hash.checks.signed");
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800225 in.more_info_url = "http://more/info";
226 in.hash = "HASHj+";
227 in.size = 12;
David Pursell02c18642014-11-06 11:26:11 -0800228 // Hash checks are always skipped for non-official update URLs.
Alex Deymo763e7db2015-08-27 21:08:08 -0700229 EXPECT_CALL(*(fake_system_state_.mock_request_params()),
David Pursell02c18642014-11-06 11:26:11 -0800230 IsUpdateUrlOfficial())
231 .WillRepeatedly(Return(true));
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800232 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700233 EXPECT_TRUE(DoTest(in, "", &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800234 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800235 EXPECT_EQ(in.hash, install_plan.payload_hash);
236 EXPECT_TRUE(install_plan.hash_checks_mandatory);
Chris Sosafb1020e2013-07-29 17:27:33 -0700237 EXPECT_EQ(in.version, install_plan.version);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800238}
239
David Pursell02c18642014-11-06 11:26:11 -0800240TEST_F(OmahaResponseHandlerActionTest, HashChecksForUnofficialUpdateUrl) {
241 OmahaResponse in;
242 in.update_exists = true;
243 in.version = "a.b.c.d";
244 in.payload_urls.push_back("http://url.normally/needs/hash.checks.signed");
245 in.more_info_url = "http://more/info";
246 in.hash = "HASHj+";
247 in.size = 12;
Alex Deymo763e7db2015-08-27 21:08:08 -0700248 EXPECT_CALL(*(fake_system_state_.mock_request_params()),
David Pursell02c18642014-11-06 11:26:11 -0800249 IsUpdateUrlOfficial())
250 .WillRepeatedly(Return(false));
251 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700252 EXPECT_TRUE(DoTest(in, "", &install_plan));
David Pursell02c18642014-11-06 11:26:11 -0800253 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
254 EXPECT_EQ(in.hash, install_plan.payload_hash);
255 EXPECT_FALSE(install_plan.hash_checks_mandatory);
256 EXPECT_EQ(in.version, install_plan.version);
257}
258
David Pursell907b4fa2015-01-27 10:27:38 -0800259TEST_F(OmahaResponseHandlerActionTest,
260 HashChecksForOfficialUrlUnofficialBuildTest) {
261 // Official URLs for unofficial builds (dev/test images) don't require hash.
262 OmahaResponse in;
263 in.update_exists = true;
264 in.version = "a.b.c.d";
265 in.payload_urls.push_back("http://url.normally/needs/hash.checks.signed");
266 in.more_info_url = "http://more/info";
267 in.hash = "HASHj+";
268 in.size = 12;
Alex Deymo763e7db2015-08-27 21:08:08 -0700269 EXPECT_CALL(*(fake_system_state_.mock_request_params()),
David Pursell907b4fa2015-01-27 10:27:38 -0800270 IsUpdateUrlOfficial())
271 .WillRepeatedly(Return(true));
Alex Deymo763e7db2015-08-27 21:08:08 -0700272 fake_system_state_.fake_hardware()->SetIsOfficialBuild(false);
David Pursell907b4fa2015-01-27 10:27:38 -0800273 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700274 EXPECT_TRUE(DoTest(in, "", &install_plan));
David Pursell907b4fa2015-01-27 10:27:38 -0800275 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;
Alex Deymo763e7db2015-08-27 21:08:08 -0700289 EXPECT_CALL(*(fake_system_state_.mock_request_params()),
David Pursell02c18642014-11-06 11:26:11 -0800290 IsUpdateUrlOfficial())
291 .WillRepeatedly(Return(true));
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800292 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700293 EXPECT_TRUE(DoTest(in, "", &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800294 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800295 EXPECT_EQ(in.hash, install_plan.payload_hash);
296 EXPECT_FALSE(install_plan.hash_checks_mandatory);
Chris Sosafb1020e2013-07-29 17:27:33 -0700297 EXPECT_EQ(in.version, install_plan.version);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800298}
299
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800300TEST_F(OmahaResponseHandlerActionTest, HashChecksForBothHttpAndHttpsTest) {
301 OmahaResponse in;
302 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700303 in.version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800304 in.payload_urls.push_back("http://test.should.still/need/hash.checks");
305 in.payload_urls.push_back("https://test.should.still/need/hash.checks");
306 in.more_info_url = "http://more/info";
307 in.hash = "HASHj+";
308 in.size = 12;
Alex Deymo763e7db2015-08-27 21:08:08 -0700309 EXPECT_CALL(*(fake_system_state_.mock_request_params()),
David Pursell02c18642014-11-06 11:26:11 -0800310 IsUpdateUrlOfficial())
311 .WillRepeatedly(Return(true));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800312 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700313 EXPECT_TRUE(DoTest(in, "", &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800314 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
315 EXPECT_EQ(in.hash, install_plan.payload_hash);
316 EXPECT_TRUE(install_plan.hash_checks_mandatory);
Chris Sosafb1020e2013-07-29 17:27:33 -0700317 EXPECT_EQ(in.version, install_plan.version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800318}
319
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700320TEST_F(OmahaResponseHandlerActionTest, ChangeToMoreStableChannelTest) {
321 OmahaResponse in;
322 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700323 in.version = "a.b.c.d";
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700324 in.payload_urls.push_back("https://MoreStableChannelTest");
325 in.more_info_url = "http://more/info";
326 in.hash = "HASHjk";
327 in.size = 15;
328
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700329 // Create a uniquely named test directory.
330 string test_dir;
331 ASSERT_TRUE(utils::MakeTempDirectory(
332 "omaha_response_handler_action-test-XXXXXX", &test_dir));
333
334 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
335 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -0700336 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700337 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700338 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700339 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
340 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700341 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700342 "CHROMEOS_IS_POWERWASH_ALLOWED=true\n"
343 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
344
Alex Deymo763e7db2015-08-27 21:08:08 -0700345 OmahaRequestParams params(&fake_system_state_);
Alex Deymo85616652015-10-15 18:48:31 -0700346 fake_system_state_.fake_hardware()->SetIsOfficialBuild(false);
Gilad Arnoldd04f8e22014-01-09 13:13:40 -0800347 params.set_root(test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700348 params.Init("1.2.3.4", "", 0);
349 EXPECT_EQ("canary-channel", params.current_channel());
350 EXPECT_EQ("stable-channel", params.target_channel());
351 EXPECT_TRUE(params.to_more_stable_channel());
352 EXPECT_TRUE(params.is_powerwash_allowed());
353
Alex Deymo763e7db2015-08-27 21:08:08 -0700354 fake_system_state_.set_request_params(&params);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700355 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700356 EXPECT_TRUE(DoTest(in, "", &install_plan));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700357 EXPECT_TRUE(install_plan.powerwash_required);
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700358
Alex Deymo110e0302015-10-19 20:35:21 -0700359 ASSERT_TRUE(base::DeleteFile(base::FilePath(test_dir), true));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700360}
361
362TEST_F(OmahaResponseHandlerActionTest, ChangeToLessStableChannelTest) {
363 OmahaResponse in;
364 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700365 in.version = "a.b.c.d";
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700366 in.payload_urls.push_back("https://LessStableChannelTest");
367 in.more_info_url = "http://more/info";
368 in.hash = "HASHjk";
369 in.size = 15;
370
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700371 // Create a uniquely named test directory.
372 string test_dir;
373 ASSERT_TRUE(utils::MakeTempDirectory(
374 "omaha_response_handler_action-test-XXXXXX", &test_dir));
375
376 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
377 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -0700378 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700379 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700380 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700381 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
382 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700383 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700384 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
385
Alex Deymo763e7db2015-08-27 21:08:08 -0700386 OmahaRequestParams params(&fake_system_state_);
Alex Deymo85616652015-10-15 18:48:31 -0700387 fake_system_state_.fake_hardware()->SetIsOfficialBuild(false);
Gilad Arnoldd04f8e22014-01-09 13:13:40 -0800388 params.set_root(test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700389 params.Init("5.6.7.8", "", 0);
390 EXPECT_EQ("stable-channel", params.current_channel());
Alex Deymod942f9d2015-11-06 16:11:50 -0800391 params.SetTargetChannel("canary-channel", false, nullptr);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700392 EXPECT_EQ("canary-channel", params.target_channel());
393 EXPECT_FALSE(params.to_more_stable_channel());
394 EXPECT_FALSE(params.is_powerwash_allowed());
395
Alex Deymo763e7db2015-08-27 21:08:08 -0700396 fake_system_state_.set_request_params(&params);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700397 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700398 EXPECT_TRUE(DoTest(in, "", &install_plan));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700399 EXPECT_FALSE(install_plan.powerwash_required);
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700400
Alex Deymo110e0302015-10-19 20:35:21 -0700401 ASSERT_TRUE(base::DeleteFile(base::FilePath(test_dir), true));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700402}
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800403
David Zeuthen8f191b22013-08-06 12:27:50 -0700404TEST_F(OmahaResponseHandlerActionTest, P2PUrlIsUsedAndHashChecksMandatory) {
405 OmahaResponse in;
406 in.update_exists = true;
407 in.version = "a.b.c.d";
408 in.payload_urls.push_back("https://would.not/cause/hash/checks");
409 in.more_info_url = "http://more/info";
410 in.hash = "HASHj+";
411 in.size = 12;
412
Alex Deymo763e7db2015-08-27 21:08:08 -0700413 OmahaRequestParams params(&fake_system_state_);
David Pursell02c18642014-11-06 11:26:11 -0800414 // We're using a real OmahaRequestParams object here so we can't mock
415 // IsUpdateUrlOfficial(), but setting the update URL to the AutoUpdate test
416 // server will cause IsUpdateUrlOfficial() to return true.
Alex Deymoac41a822015-09-15 20:52:53 -0700417 params.set_update_url(constants::kOmahaDefaultAUTestURL);
Alex Deymo763e7db2015-08-27 21:08:08 -0700418 fake_system_state_.set_request_params(&params);
David Zeuthen8f191b22013-08-06 12:27:50 -0700419
Alex Deymo763e7db2015-08-27 21:08:08 -0700420 EXPECT_CALL(*fake_system_state_.mock_payload_state(),
David Zeuthenbb8bdc72013-09-03 13:43:48 -0700421 SetUsingP2PForDownloading(true));
422
David Zeuthen8f191b22013-08-06 12:27:50 -0700423 string p2p_url = "http://9.8.7.6/p2p";
Alex Deymo763e7db2015-08-27 21:08:08 -0700424 EXPECT_CALL(*fake_system_state_.mock_payload_state(), GetP2PUrl())
Gilad Arnold74b5f552014-10-07 08:17:16 -0700425 .WillRepeatedly(Return(p2p_url));
Alex Deymo763e7db2015-08-27 21:08:08 -0700426 EXPECT_CALL(*fake_system_state_.mock_payload_state(),
Gilad Arnold74b5f552014-10-07 08:17:16 -0700427 GetUsingP2PForDownloading()).WillRepeatedly(Return(true));
David Zeuthen8f191b22013-08-06 12:27:50 -0700428
429 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700430 EXPECT_TRUE(DoTest(in, "", &install_plan));
David Zeuthen8f191b22013-08-06 12:27:50 -0700431 EXPECT_EQ(in.hash, install_plan.payload_hash);
432 EXPECT_EQ(install_plan.download_url, p2p_url);
433 EXPECT_TRUE(install_plan.hash_checks_mandatory);
434}
435
adlr@google.com3defe6a2009-12-04 20:57:17 +0000436} // namespace chromeos_update_engine