blob: 75cd819a2a67958fc5200653e600b5a09362aabd [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>
Sen Jiang297e5832016-03-17 14:45:51 -070022#include <base/files/scoped_temp_dir.h>
adlr@google.com3defe6a2009-12-04 20:57:17 +000023#include <gtest/gtest.h>
Darin Petkov73058b42010-10-06 16:32:19 -070024
Alex Deymo39910dc2015-11-09 17:04:30 -080025#include "update_engine/common/constants.h"
26#include "update_engine/common/platform_constants.h"
27#include "update_engine/common/test_utils.h"
28#include "update_engine/common/utils.h"
Gilad Arnold5bb4c902014-04-10 12:32:13 -070029#include "update_engine/fake_system_state.h"
Gilad Arnold74b5f552014-10-07 08:17:16 -070030#include "update_engine/mock_payload_state.h"
Alex Deymo39910dc2015-11-09 17:04:30 -080031#include "update_engine/payload_consumer/payload_constants.h"
adlr@google.com3defe6a2009-12-04 20:57:17 +000032
Alex Deymo10875d92014-11-10 21:52:57 -080033using chromeos_update_engine::test_utils::System;
34using chromeos_update_engine::test_utils::WriteFileString;
adlr@google.com3defe6a2009-12-04 20:57:17 +000035using std::string;
Darin Petkov73058b42010-10-06 16:32:19 -070036using testing::Return;
Sen Jiang297e5832016-03-17 14:45:51 -070037using testing::_;
adlr@google.com3defe6a2009-12-04 20:57:17 +000038
39namespace chromeos_update_engine {
40
41class OmahaResponseHandlerActionTest : public ::testing::Test {
Alex Deymo763e7db2015-08-27 21:08:08 -070042 protected:
43 void SetUp() override {
44 FakeBootControl* fake_boot_control = fake_system_state_.fake_boot_control();
45 fake_boot_control->SetPartitionDevice(
46 kLegacyPartitionNameKernel, 0, "/dev/sdz2");
47 fake_boot_control->SetPartitionDevice(
48 kLegacyPartitionNameRoot, 0, "/dev/sdz3");
49 fake_boot_control->SetPartitionDevice(
50 kLegacyPartitionNameKernel, 1, "/dev/sdz4");
51 fake_boot_control->SetPartitionDevice(
52 kLegacyPartitionNameRoot, 1, "/dev/sdz5");
53 }
54
adlr@google.com3defe6a2009-12-04 20:57:17 +000055 // Return true iff the OmahaResponseHandlerAction succeeded.
Alex Vakulenko88b591f2014-08-28 16:48:57 -070056 // If out is non-null, it's set w/ the response from the action.
Darin Petkov6a5b3222010-07-13 14:55:28 -070057 bool DoTest(const OmahaResponse& in,
Gilad Arnold4dbd47e2013-07-22 05:39:26 -070058 const string& deadline_file,
adlr@google.com3defe6a2009-12-04 20:57:17 +000059 InstallPlan* out);
Alex Deymo763e7db2015-08-27 21:08:08 -070060
61 FakeSystemState fake_system_state_;
Sen Jiang2703ef42017-03-16 13:36:21 -070062 // "Hash+"
63 const brillo::Blob expected_hash_ = {0x48, 0x61, 0x73, 0x68, 0x2b};
adlr@google.com3defe6a2009-12-04 20:57:17 +000064};
65
66class OmahaResponseHandlerActionProcessorDelegate
67 : public ActionProcessorDelegate {
68 public:
69 OmahaResponseHandlerActionProcessorDelegate()
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -070070 : code_(ErrorCode::kError),
Darin Petkovc1a8b422010-07-19 11:34:49 -070071 code_set_(false) {}
adlr@google.com3defe6a2009-12-04 20:57:17 +000072 void ActionCompleted(ActionProcessor* processor,
73 AbstractAction* action,
David Zeuthena99981f2013-04-29 13:42:47 -070074 ErrorCode code) {
adlr@google.com3defe6a2009-12-04 20:57:17 +000075 if (action->Type() == OmahaResponseHandlerAction::StaticType()) {
Darin Petkovc1a8b422010-07-19 11:34:49 -070076 code_ = code;
77 code_set_ = true;
adlr@google.com3defe6a2009-12-04 20:57:17 +000078 }
79 }
David Zeuthena99981f2013-04-29 13:42:47 -070080 ErrorCode code_;
Darin Petkovc1a8b422010-07-19 11:34:49 -070081 bool code_set_;
adlr@google.com3defe6a2009-12-04 20:57:17 +000082};
83
84namespace {
Alex Vakulenkod2779df2014-06-16 13:19:00 -070085const char* const kLongName =
adlr@google.com3defe6a2009-12-04 20:57:17 +000086 "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 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
90 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
91 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
92 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
93 "-the_update_a.b.c.d_DELTA_.tgz";
Alex Vakulenkod2779df2014-06-16 13:19:00 -070094const char* const kBadVersion = "don't update me";
Sen Jiang2703ef42017-03-16 13:36:21 -070095const char* const kPayloadHashHex = "486173682b";
Alex Vakulenkod2779df2014-06-16 13:19:00 -070096} // namespace
adlr@google.com3defe6a2009-12-04 20:57:17 +000097
Alex Deymo763e7db2015-08-27 21:08:08 -070098bool OmahaResponseHandlerActionTest::DoTest(
Jay Srinivasanae4697c2013-03-18 17:08:08 -070099 const OmahaResponse& in,
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700100 const string& test_deadline_file,
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700101 InstallPlan* out) {
adlr@google.com3defe6a2009-12-04 20:57:17 +0000102 ActionProcessor processor;
103 OmahaResponseHandlerActionProcessorDelegate delegate;
104 processor.set_delegate(&delegate);
105
Darin Petkov6a5b3222010-07-13 14:55:28 -0700106 ObjectFeederAction<OmahaResponse> feeder_action;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000107 feeder_action.set_obj(in);
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700108 if (in.update_exists && in.version != kBadVersion) {
Sen Jiang0affc2c2017-02-10 15:55:05 -0800109 string expected_hash;
110 for (const auto& package : in.packages)
111 expected_hash += package.hash + ":";
Alex Deymo763e7db2015-08-27 21:08:08 -0700112 EXPECT_CALL(*(fake_system_state_.mock_prefs()),
Sen Jiang0affc2c2017-02-10 15:55:05 -0800113 SetString(kPrefsUpdateCheckResponseHash, expected_hash))
Darin Petkov73058b42010-10-06 16:32:19 -0700114 .WillOnce(Return(true));
Alex Deymo85616652015-10-15 18:48:31 -0700115
116 int slot = 1 - fake_system_state_.fake_boot_control()->GetCurrentSlot();
117 string key = kPrefsChannelOnSlotPrefix + std::to_string(slot);
118 EXPECT_CALL(*(fake_system_state_.mock_prefs()), SetString(key, testing::_))
119 .WillOnce(Return(true));
Darin Petkov73058b42010-10-06 16:32:19 -0700120 }
Jay Srinivasan53173b92013-05-17 17:13:01 -0700121
Sen Jiang0affc2c2017-02-10 15:55:05 -0800122 string current_url = in.packages.size() ? in.packages[0].payload_urls[0] : "";
Alex Deymo763e7db2015-08-27 21:08:08 -0700123 EXPECT_CALL(*(fake_system_state_.mock_payload_state()), GetCurrentUrl())
Jay Srinivasan53173b92013-05-17 17:13:01 -0700124 .WillRepeatedly(Return(current_url));
125
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700126 OmahaResponseHandlerAction response_handler_action(
Alex Deymo763e7db2015-08-27 21:08:08 -0700127 &fake_system_state_,
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700128 (test_deadline_file.empty() ?
Alex Deymo6dd160a2015-10-09 18:45:14 -0700129 constants::kOmahaResponseDeadlineFile : test_deadline_file));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000130 BondActions(&feeder_action, &response_handler_action);
131 ObjectCollectorAction<InstallPlan> collector_action;
132 BondActions(&response_handler_action, &collector_action);
133 processor.EnqueueAction(&feeder_action);
134 processor.EnqueueAction(&response_handler_action);
135 processor.EnqueueAction(&collector_action);
136 processor.StartProcessing();
137 EXPECT_TRUE(!processor.IsRunning())
Alex Vakulenko072359c2014-07-18 11:41:07 -0700138 << "Update test to handle non-async actions";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000139 if (out)
140 *out = collector_action.object();
Darin Petkovc1a8b422010-07-19 11:34:49 -0700141 EXPECT_TRUE(delegate.code_set_);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700142 return delegate.code_ == ErrorCode::kSuccess;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000143}
144
145TEST_F(OmahaResponseHandlerActionTest, SimpleTest) {
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700146 string test_deadline_file;
147 CHECK(utils::MakeTempFile(
Gilad Arnolda6742b32014-01-11 00:18:34 -0800148 "omaha_response_handler_action_unittest-XXXXXX",
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700149 &test_deadline_file, nullptr));
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700150 ScopedPathUnlinker deadline_unlinker(test_deadline_file);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000151 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700152 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000153 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700154 in.version = "a.b.c.d";
Sen Jiang0affc2c2017-02-10 15:55:05 -0800155 in.packages.push_back(
156 {.payload_urls = {"http://foo/the_update_a.b.c.d.tgz"},
157 .size = 12,
158 .hash = kPayloadHashHex});
adlr@google.com3defe6a2009-12-04 20:57:17 +0000159 in.more_info_url = "http://more/info";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000160 in.prompt = false;
Darin Petkov6c118642010-10-21 12:06:30 -0700161 in.deadline = "20101020";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000162 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700163 EXPECT_TRUE(DoTest(in, test_deadline_file, &install_plan));
Sen Jiang0affc2c2017-02-10 15:55:05 -0800164 EXPECT_EQ(in.packages[0].payload_urls[0], install_plan.download_url);
165 EXPECT_EQ(expected_hash_, install_plan.payloads[0].hash);
Alex Deymo80f70ff2016-02-10 16:08:11 -0800166 EXPECT_EQ(1U, install_plan.target_slot);
Darin Petkov6c118642010-10-21 12:06:30 -0700167 string deadline;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700168 EXPECT_TRUE(utils::ReadFile(test_deadline_file, &deadline));
Darin Petkov6c118642010-10-21 12:06:30 -0700169 EXPECT_EQ("20101020", deadline);
170 struct stat deadline_stat;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700171 EXPECT_EQ(0, stat(test_deadline_file.c_str(), &deadline_stat));
Alex Deymo80f70ff2016-02-10 16:08:11 -0800172 EXPECT_EQ(
173 static_cast<mode_t>(S_IFREG | S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH),
174 deadline_stat.st_mode);
Chris Sosafb1020e2013-07-29 17:27:33 -0700175 EXPECT_EQ(in.version, install_plan.version);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000176 }
177 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700178 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000179 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700180 in.version = "a.b.c.d";
Sen Jiang0affc2c2017-02-10 15:55:05 -0800181 in.packages.push_back(
182 {.payload_urls = {"http://foo/the_update_a.b.c.d.tgz"},
183 .size = 12,
184 .hash = kPayloadHashHex});
adlr@google.com3defe6a2009-12-04 20:57:17 +0000185 in.more_info_url = "http://more/info";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000186 in.prompt = true;
187 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700188 // Set the other slot as current.
189 fake_system_state_.fake_boot_control()->SetCurrentSlot(1);
190 EXPECT_TRUE(DoTest(in, test_deadline_file, &install_plan));
Sen Jiang0affc2c2017-02-10 15:55:05 -0800191 EXPECT_EQ(in.packages[0].payload_urls[0], install_plan.download_url);
192 EXPECT_EQ(expected_hash_, install_plan.payloads[0].hash);
Alex Deymo80f70ff2016-02-10 16:08:11 -0800193 EXPECT_EQ(0U, install_plan.target_slot);
Darin Petkov6c118642010-10-21 12:06:30 -0700194 string deadline;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700195 EXPECT_TRUE(utils::ReadFile(test_deadline_file, &deadline) &&
196 deadline.empty());
Chris Sosafb1020e2013-07-29 17:27:33 -0700197 EXPECT_EQ(in.version, install_plan.version);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000198 }
199 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700200 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000201 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700202 in.version = "a.b.c.d";
Sen Jiang0affc2c2017-02-10 15:55:05 -0800203 in.packages.push_back(
204 {.payload_urls = {kLongName}, .size = 12, .hash = kPayloadHashHex});
adlr@google.com3defe6a2009-12-04 20:57:17 +0000205 in.more_info_url = "http://more/info";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000206 in.prompt = true;
Darin Petkov6c118642010-10-21 12:06:30 -0700207 in.deadline = "some-deadline";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000208 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700209 fake_system_state_.fake_boot_control()->SetCurrentSlot(0);
210 EXPECT_TRUE(DoTest(in, test_deadline_file, &install_plan));
Sen Jiang0affc2c2017-02-10 15:55:05 -0800211 EXPECT_EQ(in.packages[0].payload_urls[0], install_plan.download_url);
212 EXPECT_EQ(expected_hash_, install_plan.payloads[0].hash);
Alex Deymo80f70ff2016-02-10 16:08:11 -0800213 EXPECT_EQ(1U, install_plan.target_slot);
Darin Petkov6c118642010-10-21 12:06:30 -0700214 string deadline;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700215 EXPECT_TRUE(utils::ReadFile(test_deadline_file, &deadline));
Darin Petkov6c118642010-10-21 12:06:30 -0700216 EXPECT_EQ("some-deadline", deadline);
Chris Sosafb1020e2013-07-29 17:27:33 -0700217 EXPECT_EQ(in.version, install_plan.version);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000218 }
219}
220
221TEST_F(OmahaResponseHandlerActionTest, NoUpdatesTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700222 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000223 in.update_exists = false;
224 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700225 EXPECT_FALSE(DoTest(in, "", &install_plan));
Alex Deymoe5e5fe92015-10-05 09:28:19 -0700226 EXPECT_TRUE(install_plan.partitions.empty());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000227}
228
Sen Jiang0affc2c2017-02-10 15:55:05 -0800229TEST_F(OmahaResponseHandlerActionTest, MultiPackageTest) {
230 OmahaResponse in;
231 in.update_exists = true;
232 in.version = "a.b.c.d";
233 in.packages.push_back({.payload_urls = {"http://package/1"},
234 .size = 1,
235 .hash = kPayloadHashHex});
236 in.packages.push_back({.payload_urls = {"http://package/2"},
237 .size = 2,
238 .hash = kPayloadHashHex});
239 in.more_info_url = "http://more/info";
240 InstallPlan install_plan;
241 EXPECT_TRUE(DoTest(in, "", &install_plan));
242 EXPECT_EQ(in.packages[0].payload_urls[0], install_plan.download_url);
243 EXPECT_EQ(2u, install_plan.payloads.size());
244 EXPECT_EQ(in.packages[0].size, install_plan.payloads[0].size);
245 EXPECT_EQ(in.packages[1].size, install_plan.payloads[1].size);
246 EXPECT_EQ(expected_hash_, install_plan.payloads[0].hash);
247 EXPECT_EQ(expected_hash_, install_plan.payloads[1].hash);
248 EXPECT_EQ(in.version, install_plan.version);
249}
250
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800251TEST_F(OmahaResponseHandlerActionTest, HashChecksForHttpTest) {
252 OmahaResponse in;
253 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700254 in.version = "a.b.c.d";
Sen Jiang0affc2c2017-02-10 15:55:05 -0800255 in.packages.push_back(
256 {.payload_urls = {"http://test.should/need/hash.checks.signed"},
257 .size = 12,
258 .hash = kPayloadHashHex});
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800259 in.more_info_url = "http://more/info";
David Pursell02c18642014-11-06 11:26:11 -0800260 // Hash checks are always skipped for non-official update URLs.
Alex Deymo763e7db2015-08-27 21:08:08 -0700261 EXPECT_CALL(*(fake_system_state_.mock_request_params()),
David Pursell02c18642014-11-06 11:26:11 -0800262 IsUpdateUrlOfficial())
263 .WillRepeatedly(Return(true));
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800264 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700265 EXPECT_TRUE(DoTest(in, "", &install_plan));
Sen Jiang0affc2c2017-02-10 15:55:05 -0800266 EXPECT_EQ(in.packages[0].payload_urls[0], install_plan.download_url);
267 EXPECT_EQ(expected_hash_, install_plan.payloads[0].hash);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800268 EXPECT_TRUE(install_plan.hash_checks_mandatory);
Chris Sosafb1020e2013-07-29 17:27:33 -0700269 EXPECT_EQ(in.version, install_plan.version);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800270}
271
David Pursell02c18642014-11-06 11:26:11 -0800272TEST_F(OmahaResponseHandlerActionTest, HashChecksForUnofficialUpdateUrl) {
273 OmahaResponse in;
274 in.update_exists = true;
275 in.version = "a.b.c.d";
Sen Jiang0affc2c2017-02-10 15:55:05 -0800276 in.packages.push_back(
277 {.payload_urls = {"http://url.normally/needs/hash.checks.signed"},
278 .size = 12,
279 .hash = kPayloadHashHex});
David Pursell02c18642014-11-06 11:26:11 -0800280 in.more_info_url = "http://more/info";
Alex Deymo763e7db2015-08-27 21:08:08 -0700281 EXPECT_CALL(*(fake_system_state_.mock_request_params()),
David Pursell02c18642014-11-06 11:26:11 -0800282 IsUpdateUrlOfficial())
283 .WillRepeatedly(Return(false));
284 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700285 EXPECT_TRUE(DoTest(in, "", &install_plan));
Sen Jiang0affc2c2017-02-10 15:55:05 -0800286 EXPECT_EQ(in.packages[0].payload_urls[0], install_plan.download_url);
287 EXPECT_EQ(expected_hash_, install_plan.payloads[0].hash);
David Pursell02c18642014-11-06 11:26:11 -0800288 EXPECT_FALSE(install_plan.hash_checks_mandatory);
289 EXPECT_EQ(in.version, install_plan.version);
290}
291
David Pursell907b4fa2015-01-27 10:27:38 -0800292TEST_F(OmahaResponseHandlerActionTest,
293 HashChecksForOfficialUrlUnofficialBuildTest) {
294 // Official URLs for unofficial builds (dev/test images) don't require hash.
295 OmahaResponse in;
296 in.update_exists = true;
297 in.version = "a.b.c.d";
Sen Jiang0affc2c2017-02-10 15:55:05 -0800298 in.packages.push_back(
299 {.payload_urls = {"http://url.normally/needs/hash.checks.signed"},
300 .size = 12,
301 .hash = kPayloadHashHex});
David Pursell907b4fa2015-01-27 10:27:38 -0800302 in.more_info_url = "http://more/info";
Alex Deymo763e7db2015-08-27 21:08:08 -0700303 EXPECT_CALL(*(fake_system_state_.mock_request_params()),
David Pursell907b4fa2015-01-27 10:27:38 -0800304 IsUpdateUrlOfficial())
305 .WillRepeatedly(Return(true));
Alex Deymo763e7db2015-08-27 21:08:08 -0700306 fake_system_state_.fake_hardware()->SetIsOfficialBuild(false);
David Pursell907b4fa2015-01-27 10:27:38 -0800307 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700308 EXPECT_TRUE(DoTest(in, "", &install_plan));
Sen Jiang0affc2c2017-02-10 15:55:05 -0800309 EXPECT_EQ(in.packages[0].payload_urls[0], install_plan.download_url);
310 EXPECT_EQ(expected_hash_, install_plan.payloads[0].hash);
David Pursell907b4fa2015-01-27 10:27:38 -0800311 EXPECT_FALSE(install_plan.hash_checks_mandatory);
312 EXPECT_EQ(in.version, install_plan.version);
313}
314
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800315TEST_F(OmahaResponseHandlerActionTest, HashChecksForHttpsTest) {
316 OmahaResponse in;
317 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700318 in.version = "a.b.c.d";
Sen Jiang0affc2c2017-02-10 15:55:05 -0800319 in.packages.push_back(
320 {.payload_urls = {"https://test.should/need/hash.checks.signed"},
321 .size = 12,
322 .hash = kPayloadHashHex});
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800323 in.more_info_url = "http://more/info";
Alex Deymo763e7db2015-08-27 21:08:08 -0700324 EXPECT_CALL(*(fake_system_state_.mock_request_params()),
David Pursell02c18642014-11-06 11:26:11 -0800325 IsUpdateUrlOfficial())
326 .WillRepeatedly(Return(true));
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800327 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700328 EXPECT_TRUE(DoTest(in, "", &install_plan));
Sen Jiang0affc2c2017-02-10 15:55:05 -0800329 EXPECT_EQ(in.packages[0].payload_urls[0], install_plan.download_url);
330 EXPECT_EQ(expected_hash_, install_plan.payloads[0].hash);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800331 EXPECT_FALSE(install_plan.hash_checks_mandatory);
Chris Sosafb1020e2013-07-29 17:27:33 -0700332 EXPECT_EQ(in.version, install_plan.version);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800333}
334
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800335TEST_F(OmahaResponseHandlerActionTest, HashChecksForBothHttpAndHttpsTest) {
336 OmahaResponse in;
337 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700338 in.version = "a.b.c.d";
Sen Jiang0affc2c2017-02-10 15:55:05 -0800339 in.packages.push_back(
340 {.payload_urls = {"http://test.should.still/need/hash.checks",
341 "https://test.should.still/need/hash.checks"},
342 .size = 12,
343 .hash = kPayloadHashHex});
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800344 in.more_info_url = "http://more/info";
Alex Deymo763e7db2015-08-27 21:08:08 -0700345 EXPECT_CALL(*(fake_system_state_.mock_request_params()),
David Pursell02c18642014-11-06 11:26:11 -0800346 IsUpdateUrlOfficial())
347 .WillRepeatedly(Return(true));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800348 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700349 EXPECT_TRUE(DoTest(in, "", &install_plan));
Sen Jiang0affc2c2017-02-10 15:55:05 -0800350 EXPECT_EQ(in.packages[0].payload_urls[0], install_plan.download_url);
351 EXPECT_EQ(expected_hash_, install_plan.payloads[0].hash);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800352 EXPECT_TRUE(install_plan.hash_checks_mandatory);
Chris Sosafb1020e2013-07-29 17:27:33 -0700353 EXPECT_EQ(in.version, install_plan.version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800354}
355
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700356TEST_F(OmahaResponseHandlerActionTest, ChangeToMoreStableChannelTest) {
357 OmahaResponse in;
358 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700359 in.version = "a.b.c.d";
Sen Jiang0affc2c2017-02-10 15:55:05 -0800360 in.packages.push_back({.payload_urls = {"https://MoreStableChannelTest"},
361 .size = 1,
362 .hash = kPayloadHashHex});
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700363 in.more_info_url = "http://more/info";
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700364
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700365 // Create a uniquely named test directory.
Sen Jiang297e5832016-03-17 14:45:51 -0700366 base::ScopedTempDir tempdir;
367 ASSERT_TRUE(tempdir.CreateUniqueTempDir());
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700368
Alex Deymo763e7db2015-08-27 21:08:08 -0700369 OmahaRequestParams params(&fake_system_state_);
Alex Deymo85616652015-10-15 18:48:31 -0700370 fake_system_state_.fake_hardware()->SetIsOfficialBuild(false);
Sen Jiang297e5832016-03-17 14:45:51 -0700371 params.set_root(tempdir.path().value());
372 params.set_current_channel("canary-channel");
373 // The ImageProperties in Android uses prefs to store MutableImageProperties.
374#ifdef __ANDROID__
375 EXPECT_CALL(*fake_system_state_.mock_prefs(), SetString(_, "stable-channel"))
376 .WillOnce(Return(true));
377 EXPECT_CALL(*fake_system_state_.mock_prefs(), SetBoolean(_, true))
378 .WillOnce(Return(true));
379#endif // __ANDROID__
380 EXPECT_TRUE(params.SetTargetChannel("stable-channel", true, nullptr));
381 params.UpdateDownloadChannel();
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700382 EXPECT_TRUE(params.to_more_stable_channel());
383 EXPECT_TRUE(params.is_powerwash_allowed());
384
Alex Deymo763e7db2015-08-27 21:08:08 -0700385 fake_system_state_.set_request_params(&params);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700386 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700387 EXPECT_TRUE(DoTest(in, "", &install_plan));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700388 EXPECT_TRUE(install_plan.powerwash_required);
389}
390
391TEST_F(OmahaResponseHandlerActionTest, ChangeToLessStableChannelTest) {
392 OmahaResponse in;
393 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700394 in.version = "a.b.c.d";
Sen Jiang0affc2c2017-02-10 15:55:05 -0800395 in.packages.push_back({.payload_urls = {"https://LessStableChannelTest"},
396 .size = 15,
397 .hash = kPayloadHashHex});
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700398 in.more_info_url = "http://more/info";
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700399
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700400 // Create a uniquely named test directory.
Sen Jiang297e5832016-03-17 14:45:51 -0700401 base::ScopedTempDir tempdir;
402 ASSERT_TRUE(tempdir.CreateUniqueTempDir());
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700403
Alex Deymo763e7db2015-08-27 21:08:08 -0700404 OmahaRequestParams params(&fake_system_state_);
Alex Deymo85616652015-10-15 18:48:31 -0700405 fake_system_state_.fake_hardware()->SetIsOfficialBuild(false);
Sen Jiang297e5832016-03-17 14:45:51 -0700406 params.set_root(tempdir.path().value());
407 params.set_current_channel("stable-channel");
408 // The ImageProperties in Android uses prefs to store MutableImageProperties.
409#ifdef __ANDROID__
410 EXPECT_CALL(*fake_system_state_.mock_prefs(), SetString(_, "canary-channel"))
411 .WillOnce(Return(true));
412 EXPECT_CALL(*fake_system_state_.mock_prefs(), SetBoolean(_, false))
413 .WillOnce(Return(true));
414#endif // __ANDROID__
415 EXPECT_TRUE(params.SetTargetChannel("canary-channel", false, nullptr));
416 params.UpdateDownloadChannel();
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700417 EXPECT_FALSE(params.to_more_stable_channel());
418 EXPECT_FALSE(params.is_powerwash_allowed());
419
Alex Deymo763e7db2015-08-27 21:08:08 -0700420 fake_system_state_.set_request_params(&params);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700421 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700422 EXPECT_TRUE(DoTest(in, "", &install_plan));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700423 EXPECT_FALSE(install_plan.powerwash_required);
424}
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800425
David Zeuthen8f191b22013-08-06 12:27:50 -0700426TEST_F(OmahaResponseHandlerActionTest, P2PUrlIsUsedAndHashChecksMandatory) {
427 OmahaResponse in;
428 in.update_exists = true;
429 in.version = "a.b.c.d";
Sen Jiang0affc2c2017-02-10 15:55:05 -0800430 in.packages.push_back(
431 {.payload_urls = {"https://would.not/cause/hash/checks"},
432 .size = 12,
433 .hash = kPayloadHashHex});
David Zeuthen8f191b22013-08-06 12:27:50 -0700434 in.more_info_url = "http://more/info";
David Zeuthen8f191b22013-08-06 12:27:50 -0700435
Alex Deymo763e7db2015-08-27 21:08:08 -0700436 OmahaRequestParams params(&fake_system_state_);
David Pursell02c18642014-11-06 11:26:11 -0800437 // We're using a real OmahaRequestParams object here so we can't mock
438 // IsUpdateUrlOfficial(), but setting the update URL to the AutoUpdate test
439 // server will cause IsUpdateUrlOfficial() to return true.
Alex Deymoac41a822015-09-15 20:52:53 -0700440 params.set_update_url(constants::kOmahaDefaultAUTestURL);
Alex Deymo763e7db2015-08-27 21:08:08 -0700441 fake_system_state_.set_request_params(&params);
David Zeuthen8f191b22013-08-06 12:27:50 -0700442
Alex Deymo763e7db2015-08-27 21:08:08 -0700443 EXPECT_CALL(*fake_system_state_.mock_payload_state(),
David Zeuthenbb8bdc72013-09-03 13:43:48 -0700444 SetUsingP2PForDownloading(true));
445
David Zeuthen8f191b22013-08-06 12:27:50 -0700446 string p2p_url = "http://9.8.7.6/p2p";
Alex Deymo763e7db2015-08-27 21:08:08 -0700447 EXPECT_CALL(*fake_system_state_.mock_payload_state(), GetP2PUrl())
Gilad Arnold74b5f552014-10-07 08:17:16 -0700448 .WillRepeatedly(Return(p2p_url));
Alex Deymo763e7db2015-08-27 21:08:08 -0700449 EXPECT_CALL(*fake_system_state_.mock_payload_state(),
Gilad Arnold74b5f552014-10-07 08:17:16 -0700450 GetUsingP2PForDownloading()).WillRepeatedly(Return(true));
David Zeuthen8f191b22013-08-06 12:27:50 -0700451
452 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700453 EXPECT_TRUE(DoTest(in, "", &install_plan));
Sen Jiang0affc2c2017-02-10 15:55:05 -0800454 EXPECT_EQ(expected_hash_, install_plan.payloads[0].hash);
Sen Jiang2703ef42017-03-16 13:36:21 -0700455 EXPECT_EQ(p2p_url, install_plan.download_url);
David Zeuthen8f191b22013-08-06 12:27:50 -0700456 EXPECT_TRUE(install_plan.hash_checks_mandatory);
457}
458
adlr@google.com3defe6a2009-12-04 20:57:17 +0000459} // namespace chromeos_update_engine