blob: 7437f50bc0079576ee9f351ef972aecb7fa6c05f [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
Aaron Woodc73fdc12017-12-06 11:09:15 -080019#include <memory>
adlr@google.com3defe6a2009-12-04 20:57:17 +000020#include <string>
Darin Petkov73058b42010-10-06 16:32:19 -070021
Alex Deymo110e0302015-10-19 20:35:21 -070022#include <base/files/file_util.h>
Sen Jiang297e5832016-03-17 14:45:51 -070023#include <base/files/scoped_temp_dir.h>
Aaron Wood23bd3392017-10-06 14:48:25 -070024#include <brillo/message_loops/fake_message_loop.h>
adlr@google.com3defe6a2009-12-04 20:57:17 +000025#include <gtest/gtest.h>
Darin Petkov73058b42010-10-06 16:32:19 -070026
Alex Deymo39910dc2015-11-09 17:04:30 -080027#include "update_engine/common/constants.h"
28#include "update_engine/common/platform_constants.h"
29#include "update_engine/common/test_utils.h"
30#include "update_engine/common/utils.h"
Gilad Arnold5bb4c902014-04-10 12:32:13 -070031#include "update_engine/fake_system_state.h"
Gilad Arnold74b5f552014-10-07 08:17:16 -070032#include "update_engine/mock_payload_state.h"
Alex Deymo39910dc2015-11-09 17:04:30 -080033#include "update_engine/payload_consumer/payload_constants.h"
Aaron Wood23bd3392017-10-06 14:48:25 -070034#include "update_engine/update_manager/mock_policy.h"
adlr@google.com3defe6a2009-12-04 20:57:17 +000035
Alex Deymo10875d92014-11-10 21:52:57 -080036using chromeos_update_engine::test_utils::System;
37using chromeos_update_engine::test_utils::WriteFileString;
Aaron Wood23bd3392017-10-06 14:48:25 -070038using chromeos_update_manager::EvalStatus;
39using chromeos_update_manager::FakeUpdateManager;
40using chromeos_update_manager::MockPolicy;
adlr@google.com3defe6a2009-12-04 20:57:17 +000041using std::string;
Aaron Woodc73fdc12017-12-06 11:09:15 -080042using testing::_;
Aaron Wood23bd3392017-10-06 14:48:25 -070043using testing::DoAll;
Darin Petkov73058b42010-10-06 16:32:19 -070044using testing::Return;
Aaron Wood23bd3392017-10-06 14:48:25 -070045using testing::SetArgPointee;
adlr@google.com3defe6a2009-12-04 20:57:17 +000046
47namespace chromeos_update_engine {
48
49class OmahaResponseHandlerActionTest : public ::testing::Test {
Alex Deymo763e7db2015-08-27 21:08:08 -070050 protected:
51 void SetUp() override {
52 FakeBootControl* fake_boot_control = fake_system_state_.fake_boot_control();
53 fake_boot_control->SetPartitionDevice(
Tudor Brindusdda79e22018-06-28 18:03:21 -070054 kPartitionNameKernel, 0, "/dev/sdz2");
Alex Deymo763e7db2015-08-27 21:08:08 -070055 fake_boot_control->SetPartitionDevice(
Tudor Brindusdda79e22018-06-28 18:03:21 -070056 kPartitionNameRoot, 0, "/dev/sdz3");
Alex Deymo763e7db2015-08-27 21:08:08 -070057 fake_boot_control->SetPartitionDevice(
Tudor Brindusdda79e22018-06-28 18:03:21 -070058 kPartitionNameKernel, 1, "/dev/sdz4");
Alex Deymo763e7db2015-08-27 21:08:08 -070059 fake_boot_control->SetPartitionDevice(
Tudor Brindusdda79e22018-06-28 18:03:21 -070060 kPartitionNameRoot, 1, "/dev/sdz5");
Alex Deymo763e7db2015-08-27 21:08:08 -070061 }
62
adlr@google.com3defe6a2009-12-04 20:57:17 +000063 // Return true iff the OmahaResponseHandlerAction succeeded.
Alex Vakulenko88b591f2014-08-28 16:48:57 -070064 // If out is non-null, it's set w/ the response from the action.
Darin Petkov6a5b3222010-07-13 14:55:28 -070065 bool DoTest(const OmahaResponse& in,
Gilad Arnold4dbd47e2013-07-22 05:39:26 -070066 const string& deadline_file,
adlr@google.com3defe6a2009-12-04 20:57:17 +000067 InstallPlan* out);
Alex Deymo763e7db2015-08-27 21:08:08 -070068
Aaron Wood23bd3392017-10-06 14:48:25 -070069 // Pointer to the Action, valid after |DoTest|, released when the test is
70 // finished.
71 std::unique_ptr<OmahaResponseHandlerAction> action_;
72 // Captures the action's result code, for tests that need to directly verify
73 // it in non-success cases.
74 ErrorCode action_result_code_;
75
Alex Deymo763e7db2015-08-27 21:08:08 -070076 FakeSystemState fake_system_state_;
Sen Jiang2703ef42017-03-16 13:36:21 -070077 // "Hash+"
78 const brillo::Blob expected_hash_ = {0x48, 0x61, 0x73, 0x68, 0x2b};
adlr@google.com3defe6a2009-12-04 20:57:17 +000079};
80
81class OmahaResponseHandlerActionProcessorDelegate
82 : public ActionProcessorDelegate {
83 public:
84 OmahaResponseHandlerActionProcessorDelegate()
Aaron Woodc73fdc12017-12-06 11:09:15 -080085 : code_(ErrorCode::kError), code_set_(false) {}
adlr@google.com3defe6a2009-12-04 20:57:17 +000086 void ActionCompleted(ActionProcessor* processor,
87 AbstractAction* action,
David Zeuthena99981f2013-04-29 13:42:47 -070088 ErrorCode code) {
adlr@google.com3defe6a2009-12-04 20:57:17 +000089 if (action->Type() == OmahaResponseHandlerAction::StaticType()) {
Darin Petkovc1a8b422010-07-19 11:34:49 -070090 code_ = code;
91 code_set_ = true;
adlr@google.com3defe6a2009-12-04 20:57:17 +000092 }
93 }
David Zeuthena99981f2013-04-29 13:42:47 -070094 ErrorCode code_;
Darin Petkovc1a8b422010-07-19 11:34:49 -070095 bool code_set_;
adlr@google.com3defe6a2009-12-04 20:57:17 +000096};
97
98namespace {
Alex Vakulenkod2779df2014-06-16 13:19:00 -070099const char* const kLongName =
adlr@google.com3defe6a2009-12-04 20:57:17 +0000100 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
101 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
102 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
103 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
104 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
105 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
106 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
107 "-the_update_a.b.c.d_DELTA_.tgz";
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700108const char* const kBadVersion = "don't update me";
Sen Jiang2703ef42017-03-16 13:36:21 -0700109const char* const kPayloadHashHex = "486173682b";
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700110} // namespace
adlr@google.com3defe6a2009-12-04 20:57:17 +0000111
Aaron Woodc73fdc12017-12-06 11:09:15 -0800112bool OmahaResponseHandlerActionTest::DoTest(const OmahaResponse& in,
113 const string& test_deadline_file,
114 InstallPlan* out) {
Aaron Wood23bd3392017-10-06 14:48:25 -0700115 brillo::FakeMessageLoop loop(nullptr);
116 loop.SetAsCurrent();
adlr@google.com3defe6a2009-12-04 20:57:17 +0000117 ActionProcessor processor;
118 OmahaResponseHandlerActionProcessorDelegate delegate;
119 processor.set_delegate(&delegate);
120
Darin Petkov6a5b3222010-07-13 14:55:28 -0700121 ObjectFeederAction<OmahaResponse> feeder_action;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000122 feeder_action.set_obj(in);
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700123 if (in.update_exists && in.version != kBadVersion) {
Sen Jiang0affc2c2017-02-10 15:55:05 -0800124 string expected_hash;
125 for (const auto& package : in.packages)
126 expected_hash += package.hash + ":";
Alex Deymo763e7db2015-08-27 21:08:08 -0700127 EXPECT_CALL(*(fake_system_state_.mock_prefs()),
Sen Jiang0affc2c2017-02-10 15:55:05 -0800128 SetString(kPrefsUpdateCheckResponseHash, expected_hash))
Darin Petkov73058b42010-10-06 16:32:19 -0700129 .WillOnce(Return(true));
Alex Deymo85616652015-10-15 18:48:31 -0700130
131 int slot = 1 - fake_system_state_.fake_boot_control()->GetCurrentSlot();
132 string key = kPrefsChannelOnSlotPrefix + std::to_string(slot);
133 EXPECT_CALL(*(fake_system_state_.mock_prefs()), SetString(key, testing::_))
134 .WillOnce(Return(true));
Darin Petkov73058b42010-10-06 16:32:19 -0700135 }
Jay Srinivasan53173b92013-05-17 17:13:01 -0700136
Sen Jiang0affc2c2017-02-10 15:55:05 -0800137 string current_url = in.packages.size() ? in.packages[0].payload_urls[0] : "";
Alex Deymo763e7db2015-08-27 21:08:08 -0700138 EXPECT_CALL(*(fake_system_state_.mock_payload_state()), GetCurrentUrl())
Jay Srinivasan53173b92013-05-17 17:13:01 -0700139 .WillRepeatedly(Return(current_url));
140
Aaron Wood23bd3392017-10-06 14:48:25 -0700141 action_.reset(new OmahaResponseHandlerAction(
Alex Deymo763e7db2015-08-27 21:08:08 -0700142 &fake_system_state_,
Aaron Wood23bd3392017-10-06 14:48:25 -0700143 (test_deadline_file.empty() ? constants::kOmahaResponseDeadlineFile
144 : test_deadline_file)));
145 BondActions(&feeder_action, action_.get());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000146 ObjectCollectorAction<InstallPlan> collector_action;
Aaron Wood23bd3392017-10-06 14:48:25 -0700147 BondActions(action_.get(), &collector_action);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000148 processor.EnqueueAction(&feeder_action);
Aaron Wood23bd3392017-10-06 14:48:25 -0700149 processor.EnqueueAction(action_.get());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000150 processor.EnqueueAction(&collector_action);
151 processor.StartProcessing();
152 EXPECT_TRUE(!processor.IsRunning())
Alex Vakulenko072359c2014-07-18 11:41:07 -0700153 << "Update test to handle non-async actions";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000154 if (out)
155 *out = collector_action.object();
Darin Petkovc1a8b422010-07-19 11:34:49 -0700156 EXPECT_TRUE(delegate.code_set_);
Aaron Wood23bd3392017-10-06 14:48:25 -0700157 action_result_code_ = delegate.code_;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700158 return delegate.code_ == ErrorCode::kSuccess;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000159}
160
161TEST_F(OmahaResponseHandlerActionTest, SimpleTest) {
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700162 string test_deadline_file;
Aaron Woodc73fdc12017-12-06 11:09:15 -0800163 CHECK(utils::MakeTempFile("omaha_response_handler_action_unittest-XXXXXX",
164 &test_deadline_file,
165 nullptr));
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700166 ScopedPathUnlinker deadline_unlinker(test_deadline_file);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000167 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700168 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000169 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700170 in.version = "a.b.c.d";
Sen Jiang0affc2c2017-02-10 15:55:05 -0800171 in.packages.push_back(
172 {.payload_urls = {"http://foo/the_update_a.b.c.d.tgz"},
173 .size = 12,
174 .hash = kPayloadHashHex});
adlr@google.com3defe6a2009-12-04 20:57:17 +0000175 in.more_info_url = "http://more/info";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000176 in.prompt = false;
Darin Petkov6c118642010-10-21 12:06:30 -0700177 in.deadline = "20101020";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000178 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700179 EXPECT_TRUE(DoTest(in, test_deadline_file, &install_plan));
Sen Jiang0affc2c2017-02-10 15:55:05 -0800180 EXPECT_EQ(in.packages[0].payload_urls[0], install_plan.download_url);
181 EXPECT_EQ(expected_hash_, install_plan.payloads[0].hash);
Alex Deymo80f70ff2016-02-10 16:08:11 -0800182 EXPECT_EQ(1U, install_plan.target_slot);
Darin Petkov6c118642010-10-21 12:06:30 -0700183 string deadline;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700184 EXPECT_TRUE(utils::ReadFile(test_deadline_file, &deadline));
Darin Petkov6c118642010-10-21 12:06:30 -0700185 EXPECT_EQ("20101020", deadline);
186 struct stat deadline_stat;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700187 EXPECT_EQ(0, stat(test_deadline_file.c_str(), &deadline_stat));
Alex Deymo80f70ff2016-02-10 16:08:11 -0800188 EXPECT_EQ(
189 static_cast<mode_t>(S_IFREG | S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH),
190 deadline_stat.st_mode);
Chris Sosafb1020e2013-07-29 17:27:33 -0700191 EXPECT_EQ(in.version, install_plan.version);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000192 }
193 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700194 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000195 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700196 in.version = "a.b.c.d";
Sen Jiang0affc2c2017-02-10 15:55:05 -0800197 in.packages.push_back(
198 {.payload_urls = {"http://foo/the_update_a.b.c.d.tgz"},
199 .size = 12,
200 .hash = kPayloadHashHex});
adlr@google.com3defe6a2009-12-04 20:57:17 +0000201 in.more_info_url = "http://more/info";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000202 in.prompt = true;
203 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700204 // Set the other slot as current.
205 fake_system_state_.fake_boot_control()->SetCurrentSlot(1);
206 EXPECT_TRUE(DoTest(in, test_deadline_file, &install_plan));
Sen Jiang0affc2c2017-02-10 15:55:05 -0800207 EXPECT_EQ(in.packages[0].payload_urls[0], install_plan.download_url);
208 EXPECT_EQ(expected_hash_, install_plan.payloads[0].hash);
Alex Deymo80f70ff2016-02-10 16:08:11 -0800209 EXPECT_EQ(0U, install_plan.target_slot);
Darin Petkov6c118642010-10-21 12:06:30 -0700210 string deadline;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700211 EXPECT_TRUE(utils::ReadFile(test_deadline_file, &deadline) &&
212 deadline.empty());
Chris Sosafb1020e2013-07-29 17:27:33 -0700213 EXPECT_EQ(in.version, install_plan.version);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000214 }
215 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700216 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000217 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700218 in.version = "a.b.c.d";
Sen Jiang0affc2c2017-02-10 15:55:05 -0800219 in.packages.push_back(
220 {.payload_urls = {kLongName}, .size = 12, .hash = kPayloadHashHex});
adlr@google.com3defe6a2009-12-04 20:57:17 +0000221 in.more_info_url = "http://more/info";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000222 in.prompt = true;
Darin Petkov6c118642010-10-21 12:06:30 -0700223 in.deadline = "some-deadline";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000224 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700225 fake_system_state_.fake_boot_control()->SetCurrentSlot(0);
Marton Hunyadye58bddb2018-04-10 20:27:26 +0200226 // Because rollback happened, the deadline shouldn't be written into the
227 // file.
228 EXPECT_CALL(*(fake_system_state_.mock_payload_state()),
229 GetRollbackHappened())
230 .WillOnce(Return(true));
231 EXPECT_TRUE(DoTest(in, test_deadline_file, &install_plan));
232 EXPECT_EQ(in.packages[0].payload_urls[0], install_plan.download_url);
233 EXPECT_EQ(expected_hash_, install_plan.payloads[0].hash);
234 EXPECT_EQ(1U, install_plan.target_slot);
235 string deadline;
236 EXPECT_TRUE(utils::ReadFile(test_deadline_file, &deadline));
237 EXPECT_TRUE(deadline.empty());
238 EXPECT_EQ(in.version, install_plan.version);
239 }
240 {
241 OmahaResponse in;
242 in.update_exists = true;
243 in.version = "a.b.c.d";
244 in.packages.push_back(
245 {.payload_urls = {kLongName}, .size = 12, .hash = kPayloadHashHex});
246 in.more_info_url = "http://more/info";
247 in.prompt = true;
248 in.deadline = "some-deadline";
249 InstallPlan install_plan;
250 fake_system_state_.fake_boot_control()->SetCurrentSlot(0);
251 EXPECT_CALL(*(fake_system_state_.mock_payload_state()),
252 GetRollbackHappened())
253 .WillOnce(Return(false));
Alex Deymo763e7db2015-08-27 21:08:08 -0700254 EXPECT_TRUE(DoTest(in, test_deadline_file, &install_plan));
Sen Jiang0affc2c2017-02-10 15:55:05 -0800255 EXPECT_EQ(in.packages[0].payload_urls[0], install_plan.download_url);
256 EXPECT_EQ(expected_hash_, install_plan.payloads[0].hash);
Alex Deymo80f70ff2016-02-10 16:08:11 -0800257 EXPECT_EQ(1U, install_plan.target_slot);
Darin Petkov6c118642010-10-21 12:06:30 -0700258 string deadline;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700259 EXPECT_TRUE(utils::ReadFile(test_deadline_file, &deadline));
Darin Petkov6c118642010-10-21 12:06:30 -0700260 EXPECT_EQ("some-deadline", deadline);
Chris Sosafb1020e2013-07-29 17:27:33 -0700261 EXPECT_EQ(in.version, install_plan.version);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000262 }
263}
264
265TEST_F(OmahaResponseHandlerActionTest, NoUpdatesTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700266 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000267 in.update_exists = false;
268 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700269 EXPECT_FALSE(DoTest(in, "", &install_plan));
Alex Deymoe5e5fe92015-10-05 09:28:19 -0700270 EXPECT_TRUE(install_plan.partitions.empty());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000271}
272
Sen Jiang0affc2c2017-02-10 15:55:05 -0800273TEST_F(OmahaResponseHandlerActionTest, MultiPackageTest) {
274 OmahaResponse in;
275 in.update_exists = true;
276 in.version = "a.b.c.d";
277 in.packages.push_back({.payload_urls = {"http://package/1"},
278 .size = 1,
279 .hash = kPayloadHashHex});
280 in.packages.push_back({.payload_urls = {"http://package/2"},
281 .size = 2,
282 .hash = kPayloadHashHex});
283 in.more_info_url = "http://more/info";
284 InstallPlan install_plan;
285 EXPECT_TRUE(DoTest(in, "", &install_plan));
286 EXPECT_EQ(in.packages[0].payload_urls[0], install_plan.download_url);
287 EXPECT_EQ(2u, install_plan.payloads.size());
288 EXPECT_EQ(in.packages[0].size, install_plan.payloads[0].size);
289 EXPECT_EQ(in.packages[1].size, install_plan.payloads[1].size);
290 EXPECT_EQ(expected_hash_, install_plan.payloads[0].hash);
291 EXPECT_EQ(expected_hash_, install_plan.payloads[1].hash);
292 EXPECT_EQ(in.version, install_plan.version);
293}
294
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800295TEST_F(OmahaResponseHandlerActionTest, HashChecksForHttpTest) {
296 OmahaResponse in;
297 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700298 in.version = "a.b.c.d";
Sen Jiang0affc2c2017-02-10 15:55:05 -0800299 in.packages.push_back(
300 {.payload_urls = {"http://test.should/need/hash.checks.signed"},
301 .size = 12,
302 .hash = kPayloadHashHex});
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800303 in.more_info_url = "http://more/info";
David Pursell02c18642014-11-06 11:26:11 -0800304 // Hash checks are always skipped for non-official update URLs.
Alex Deymo763e7db2015-08-27 21:08:08 -0700305 EXPECT_CALL(*(fake_system_state_.mock_request_params()),
David Pursell02c18642014-11-06 11:26:11 -0800306 IsUpdateUrlOfficial())
307 .WillRepeatedly(Return(true));
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800308 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700309 EXPECT_TRUE(DoTest(in, "", &install_plan));
Sen Jiang0affc2c2017-02-10 15:55:05 -0800310 EXPECT_EQ(in.packages[0].payload_urls[0], install_plan.download_url);
311 EXPECT_EQ(expected_hash_, install_plan.payloads[0].hash);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800312 EXPECT_TRUE(install_plan.hash_checks_mandatory);
Chris Sosafb1020e2013-07-29 17:27:33 -0700313 EXPECT_EQ(in.version, install_plan.version);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800314}
315
David Pursell02c18642014-11-06 11:26:11 -0800316TEST_F(OmahaResponseHandlerActionTest, HashChecksForUnofficialUpdateUrl) {
317 OmahaResponse in;
318 in.update_exists = true;
319 in.version = "a.b.c.d";
Sen Jiang0affc2c2017-02-10 15:55:05 -0800320 in.packages.push_back(
321 {.payload_urls = {"http://url.normally/needs/hash.checks.signed"},
322 .size = 12,
323 .hash = kPayloadHashHex});
David Pursell02c18642014-11-06 11:26:11 -0800324 in.more_info_url = "http://more/info";
Alex Deymo763e7db2015-08-27 21:08:08 -0700325 EXPECT_CALL(*(fake_system_state_.mock_request_params()),
David Pursell02c18642014-11-06 11:26:11 -0800326 IsUpdateUrlOfficial())
327 .WillRepeatedly(Return(false));
328 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700329 EXPECT_TRUE(DoTest(in, "", &install_plan));
Sen Jiang0affc2c2017-02-10 15:55:05 -0800330 EXPECT_EQ(in.packages[0].payload_urls[0], install_plan.download_url);
331 EXPECT_EQ(expected_hash_, install_plan.payloads[0].hash);
David Pursell02c18642014-11-06 11:26:11 -0800332 EXPECT_FALSE(install_plan.hash_checks_mandatory);
333 EXPECT_EQ(in.version, install_plan.version);
334}
335
David Pursell907b4fa2015-01-27 10:27:38 -0800336TEST_F(OmahaResponseHandlerActionTest,
337 HashChecksForOfficialUrlUnofficialBuildTest) {
338 // Official URLs for unofficial builds (dev/test images) don't require hash.
339 OmahaResponse in;
340 in.update_exists = true;
341 in.version = "a.b.c.d";
Sen Jiang0affc2c2017-02-10 15:55:05 -0800342 in.packages.push_back(
343 {.payload_urls = {"http://url.normally/needs/hash.checks.signed"},
344 .size = 12,
345 .hash = kPayloadHashHex});
David Pursell907b4fa2015-01-27 10:27:38 -0800346 in.more_info_url = "http://more/info";
Alex Deymo763e7db2015-08-27 21:08:08 -0700347 EXPECT_CALL(*(fake_system_state_.mock_request_params()),
David Pursell907b4fa2015-01-27 10:27:38 -0800348 IsUpdateUrlOfficial())
349 .WillRepeatedly(Return(true));
Alex Deymo763e7db2015-08-27 21:08:08 -0700350 fake_system_state_.fake_hardware()->SetIsOfficialBuild(false);
David Pursell907b4fa2015-01-27 10:27:38 -0800351 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700352 EXPECT_TRUE(DoTest(in, "", &install_plan));
Sen Jiang0affc2c2017-02-10 15:55:05 -0800353 EXPECT_EQ(in.packages[0].payload_urls[0], install_plan.download_url);
354 EXPECT_EQ(expected_hash_, install_plan.payloads[0].hash);
David Pursell907b4fa2015-01-27 10:27:38 -0800355 EXPECT_FALSE(install_plan.hash_checks_mandatory);
356 EXPECT_EQ(in.version, install_plan.version);
357}
358
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800359TEST_F(OmahaResponseHandlerActionTest, HashChecksForHttpsTest) {
360 OmahaResponse in;
361 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700362 in.version = "a.b.c.d";
Sen Jiang0affc2c2017-02-10 15:55:05 -0800363 in.packages.push_back(
364 {.payload_urls = {"https://test.should/need/hash.checks.signed"},
365 .size = 12,
366 .hash = kPayloadHashHex});
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800367 in.more_info_url = "http://more/info";
Alex Deymo763e7db2015-08-27 21:08:08 -0700368 EXPECT_CALL(*(fake_system_state_.mock_request_params()),
David Pursell02c18642014-11-06 11:26:11 -0800369 IsUpdateUrlOfficial())
370 .WillRepeatedly(Return(true));
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800371 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700372 EXPECT_TRUE(DoTest(in, "", &install_plan));
Sen Jiang0affc2c2017-02-10 15:55:05 -0800373 EXPECT_EQ(in.packages[0].payload_urls[0], install_plan.download_url);
374 EXPECT_EQ(expected_hash_, install_plan.payloads[0].hash);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800375 EXPECT_FALSE(install_plan.hash_checks_mandatory);
Chris Sosafb1020e2013-07-29 17:27:33 -0700376 EXPECT_EQ(in.version, install_plan.version);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800377}
378
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800379TEST_F(OmahaResponseHandlerActionTest, HashChecksForBothHttpAndHttpsTest) {
380 OmahaResponse in;
381 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700382 in.version = "a.b.c.d";
Sen Jiang0affc2c2017-02-10 15:55:05 -0800383 in.packages.push_back(
384 {.payload_urls = {"http://test.should.still/need/hash.checks",
385 "https://test.should.still/need/hash.checks"},
386 .size = 12,
387 .hash = kPayloadHashHex});
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800388 in.more_info_url = "http://more/info";
Alex Deymo763e7db2015-08-27 21:08:08 -0700389 EXPECT_CALL(*(fake_system_state_.mock_request_params()),
David Pursell02c18642014-11-06 11:26:11 -0800390 IsUpdateUrlOfficial())
391 .WillRepeatedly(Return(true));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800392 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700393 EXPECT_TRUE(DoTest(in, "", &install_plan));
Sen Jiang0affc2c2017-02-10 15:55:05 -0800394 EXPECT_EQ(in.packages[0].payload_urls[0], install_plan.download_url);
395 EXPECT_EQ(expected_hash_, install_plan.payloads[0].hash);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800396 EXPECT_TRUE(install_plan.hash_checks_mandatory);
Chris Sosafb1020e2013-07-29 17:27:33 -0700397 EXPECT_EQ(in.version, install_plan.version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800398}
399
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700400TEST_F(OmahaResponseHandlerActionTest, ChangeToMoreStableChannelTest) {
401 OmahaResponse in;
402 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700403 in.version = "a.b.c.d";
Sen Jiang0affc2c2017-02-10 15:55:05 -0800404 in.packages.push_back({.payload_urls = {"https://MoreStableChannelTest"},
405 .size = 1,
406 .hash = kPayloadHashHex});
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700407 in.more_info_url = "http://more/info";
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700408
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700409 // Create a uniquely named test directory.
Sen Jiang297e5832016-03-17 14:45:51 -0700410 base::ScopedTempDir tempdir;
411 ASSERT_TRUE(tempdir.CreateUniqueTempDir());
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700412
Alex Deymo763e7db2015-08-27 21:08:08 -0700413 OmahaRequestParams params(&fake_system_state_);
Alex Deymo85616652015-10-15 18:48:31 -0700414 fake_system_state_.fake_hardware()->SetIsOfficialBuild(false);
Hidehiko Abe2b9d2412017-12-13 18:56:18 +0900415 params.set_root(tempdir.GetPath().value());
Sen Jiang297e5832016-03-17 14:45:51 -0700416 params.set_current_channel("canary-channel");
417 // The ImageProperties in Android uses prefs to store MutableImageProperties.
418#ifdef __ANDROID__
Sen Jiang297e5832016-03-17 14:45:51 -0700419 EXPECT_CALL(*fake_system_state_.mock_prefs(), SetBoolean(_, true))
420 .WillOnce(Return(true));
421#endif // __ANDROID__
422 EXPECT_TRUE(params.SetTargetChannel("stable-channel", true, nullptr));
423 params.UpdateDownloadChannel();
Sen Jiang8500d3a2018-02-08 12:04:05 -0800424 EXPECT_TRUE(params.ShouldPowerwash());
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700425
Alex Deymo763e7db2015-08-27 21:08:08 -0700426 fake_system_state_.set_request_params(&params);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700427 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700428 EXPECT_TRUE(DoTest(in, "", &install_plan));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700429 EXPECT_TRUE(install_plan.powerwash_required);
430}
431
432TEST_F(OmahaResponseHandlerActionTest, ChangeToLessStableChannelTest) {
433 OmahaResponse in;
434 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700435 in.version = "a.b.c.d";
Sen Jiang0affc2c2017-02-10 15:55:05 -0800436 in.packages.push_back({.payload_urls = {"https://LessStableChannelTest"},
437 .size = 15,
438 .hash = kPayloadHashHex});
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700439 in.more_info_url = "http://more/info";
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700440
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700441 // Create a uniquely named test directory.
Sen Jiang297e5832016-03-17 14:45:51 -0700442 base::ScopedTempDir tempdir;
443 ASSERT_TRUE(tempdir.CreateUniqueTempDir());
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700444
Alex Deymo763e7db2015-08-27 21:08:08 -0700445 OmahaRequestParams params(&fake_system_state_);
Alex Deymo85616652015-10-15 18:48:31 -0700446 fake_system_state_.fake_hardware()->SetIsOfficialBuild(false);
Hidehiko Abe2b9d2412017-12-13 18:56:18 +0900447 params.set_root(tempdir.GetPath().value());
Sen Jiang297e5832016-03-17 14:45:51 -0700448 params.set_current_channel("stable-channel");
449 // The ImageProperties in Android uses prefs to store MutableImageProperties.
450#ifdef __ANDROID__
Sen Jiang297e5832016-03-17 14:45:51 -0700451 EXPECT_CALL(*fake_system_state_.mock_prefs(), SetBoolean(_, false))
452 .WillOnce(Return(true));
453#endif // __ANDROID__
454 EXPECT_TRUE(params.SetTargetChannel("canary-channel", false, nullptr));
455 params.UpdateDownloadChannel();
Sen Jiang8500d3a2018-02-08 12:04:05 -0800456 EXPECT_FALSE(params.ShouldPowerwash());
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700457
Alex Deymo763e7db2015-08-27 21:08:08 -0700458 fake_system_state_.set_request_params(&params);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700459 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700460 EXPECT_TRUE(DoTest(in, "", &install_plan));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700461 EXPECT_FALSE(install_plan.powerwash_required);
462}
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800463
David Zeuthen8f191b22013-08-06 12:27:50 -0700464TEST_F(OmahaResponseHandlerActionTest, P2PUrlIsUsedAndHashChecksMandatory) {
465 OmahaResponse in;
466 in.update_exists = true;
467 in.version = "a.b.c.d";
Sen Jiang0affc2c2017-02-10 15:55:05 -0800468 in.packages.push_back(
469 {.payload_urls = {"https://would.not/cause/hash/checks"},
470 .size = 12,
471 .hash = kPayloadHashHex});
David Zeuthen8f191b22013-08-06 12:27:50 -0700472 in.more_info_url = "http://more/info";
David Zeuthen8f191b22013-08-06 12:27:50 -0700473
Alex Deymo763e7db2015-08-27 21:08:08 -0700474 OmahaRequestParams params(&fake_system_state_);
David Pursell02c18642014-11-06 11:26:11 -0800475 // We're using a real OmahaRequestParams object here so we can't mock
476 // IsUpdateUrlOfficial(), but setting the update URL to the AutoUpdate test
477 // server will cause IsUpdateUrlOfficial() to return true.
Alex Deymoac41a822015-09-15 20:52:53 -0700478 params.set_update_url(constants::kOmahaDefaultAUTestURL);
Alex Deymo763e7db2015-08-27 21:08:08 -0700479 fake_system_state_.set_request_params(&params);
David Zeuthen8f191b22013-08-06 12:27:50 -0700480
Alex Deymo763e7db2015-08-27 21:08:08 -0700481 EXPECT_CALL(*fake_system_state_.mock_payload_state(),
David Zeuthenbb8bdc72013-09-03 13:43:48 -0700482 SetUsingP2PForDownloading(true));
483
David Zeuthen8f191b22013-08-06 12:27:50 -0700484 string p2p_url = "http://9.8.7.6/p2p";
Alex Deymo763e7db2015-08-27 21:08:08 -0700485 EXPECT_CALL(*fake_system_state_.mock_payload_state(), GetP2PUrl())
Gilad Arnold74b5f552014-10-07 08:17:16 -0700486 .WillRepeatedly(Return(p2p_url));
Alex Deymo763e7db2015-08-27 21:08:08 -0700487 EXPECT_CALL(*fake_system_state_.mock_payload_state(),
Aaron Woodc73fdc12017-12-06 11:09:15 -0800488 GetUsingP2PForDownloading())
489 .WillRepeatedly(Return(true));
David Zeuthen8f191b22013-08-06 12:27:50 -0700490
491 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700492 EXPECT_TRUE(DoTest(in, "", &install_plan));
Sen Jiang0affc2c2017-02-10 15:55:05 -0800493 EXPECT_EQ(expected_hash_, install_plan.payloads[0].hash);
Sen Jiang2703ef42017-03-16 13:36:21 -0700494 EXPECT_EQ(p2p_url, install_plan.download_url);
David Zeuthen8f191b22013-08-06 12:27:50 -0700495 EXPECT_TRUE(install_plan.hash_checks_mandatory);
496}
497
Marton Hunyady199152d2018-05-07 19:08:48 +0200498TEST_F(OmahaResponseHandlerActionTest, RollbackTest) {
499 OmahaResponse in;
500 in.update_exists = true;
501 in.packages.push_back({.payload_urls = {"https://RollbackTest"},
502 .size = 1,
503 .hash = kPayloadHashHex});
504 in.is_rollback = true;
505 in.kernel_version = 0x00010002;
506 in.firmware_version = 0x00030004;
507
508 fake_system_state_.fake_hardware()->SetMinKernelKeyVersion(0x00010002);
509 fake_system_state_.fake_hardware()->SetMinFirmwareKeyVersion(0x00030004);
510
511 OmahaRequestParams params(&fake_system_state_);
512 params.set_rollback_allowed(true);
513
514 fake_system_state_.set_request_params(&params);
515 InstallPlan install_plan;
516 EXPECT_TRUE(DoTest(in, "", &install_plan));
517 EXPECT_TRUE(install_plan.is_rollback);
518}
519
520TEST_F(OmahaResponseHandlerActionTest, RollbackKernelVersionErrorTest) {
521 OmahaResponse in;
522 in.update_exists = true;
523 in.packages.push_back({.payload_urls = {"https://RollbackTest"},
524 .size = 1,
525 .hash = kPayloadHashHex});
526 in.is_rollback = true;
527 in.kernel_version = 0x00010001; // This is lower than the minimum.
528 in.firmware_version = 0x00030004;
529
530 fake_system_state_.fake_hardware()->SetMinKernelKeyVersion(0x00010002);
531 fake_system_state_.fake_hardware()->SetMinFirmwareKeyVersion(0x00030004);
532
533 OmahaRequestParams params(&fake_system_state_);
534 params.set_rollback_allowed(true);
535
536 fake_system_state_.set_request_params(&params);
537 InstallPlan install_plan;
538 EXPECT_FALSE(DoTest(in, "", &install_plan));
539}
540
541TEST_F(OmahaResponseHandlerActionTest, RollbackFirmwareVersionErrorTest) {
542 OmahaResponse in;
543 in.update_exists = true;
544 in.packages.push_back({.payload_urls = {"https://RollbackTest"},
545 .size = 1,
546 .hash = kPayloadHashHex});
547 in.is_rollback = true;
548 in.kernel_version = 0x00010002;
549 in.firmware_version = 0x00030003; // This is lower than the minimum.
550
551 fake_system_state_.fake_hardware()->SetMinKernelKeyVersion(0x00010002);
552 fake_system_state_.fake_hardware()->SetMinFirmwareKeyVersion(0x00030004);
553
554 OmahaRequestParams params(&fake_system_state_);
555 params.set_rollback_allowed(true);
556
557 fake_system_state_.set_request_params(&params);
558 InstallPlan install_plan;
559 EXPECT_FALSE(DoTest(in, "", &install_plan));
560}
561
562TEST_F(OmahaResponseHandlerActionTest, RollbackNotRollbackTest) {
563 OmahaResponse in;
564 in.update_exists = true;
565 in.packages.push_back({.payload_urls = {"https://RollbackTest"},
566 .size = 1,
567 .hash = kPayloadHashHex});
568 in.is_rollback = false;
569
570 OmahaRequestParams params(&fake_system_state_);
571 params.set_rollback_allowed(true);
572
573 fake_system_state_.set_request_params(&params);
574 InstallPlan install_plan;
575 EXPECT_TRUE(DoTest(in, "", &install_plan));
576 EXPECT_FALSE(install_plan.is_rollback);
577}
578
579TEST_F(OmahaResponseHandlerActionTest, RollbackNotAllowedTest) {
580 OmahaResponse in;
581 in.update_exists = true;
582 in.packages.push_back({.payload_urls = {"https://RollbackTest"},
583 .size = 1,
584 .hash = kPayloadHashHex});
585 in.is_rollback = true;
586
587 OmahaRequestParams params(&fake_system_state_);
588 params.set_rollback_allowed(false);
589
590 fake_system_state_.set_request_params(&params);
591 InstallPlan install_plan;
592 EXPECT_FALSE(DoTest(in, "", &install_plan));
593}
594
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700595TEST_F(OmahaResponseHandlerActionTest, SystemVersionTest) {
596 OmahaResponse in;
597 in.update_exists = true;
598 in.version = "a.b.c.d";
599 in.system_version = "b.c.d.e";
600 in.packages.push_back({.payload_urls = {"http://package/1"},
601 .size = 1,
602 .hash = kPayloadHashHex});
603 in.packages.push_back({.payload_urls = {"http://package/2"},
604 .size = 2,
605 .hash = kPayloadHashHex});
606 in.more_info_url = "http://more/info";
607 InstallPlan install_plan;
608 EXPECT_TRUE(DoTest(in, "", &install_plan));
609 EXPECT_EQ(in.packages[0].payload_urls[0], install_plan.download_url);
610 EXPECT_EQ(2u, install_plan.payloads.size());
611 EXPECT_EQ(in.packages[0].size, install_plan.payloads[0].size);
612 EXPECT_EQ(in.packages[1].size, install_plan.payloads[1].size);
613 EXPECT_EQ(expected_hash_, install_plan.payloads[0].hash);
614 EXPECT_EQ(expected_hash_, install_plan.payloads[1].hash);
615 EXPECT_EQ(in.version, install_plan.version);
616 EXPECT_EQ(in.system_version, install_plan.system_version);
617}
618
Aaron Wood23bd3392017-10-06 14:48:25 -0700619TEST_F(OmahaResponseHandlerActionTest, TestDeferredByPolicy) {
620 OmahaResponse in;
621 in.update_exists = true;
622 in.version = "a.b.c.d";
623 in.packages.push_back({.payload_urls = {"http://foo/the_update_a.b.c.d.tgz"},
624 .size = 12,
625 .hash = kPayloadHashHex});
626 // Setup the UpdateManager to disallow the update.
627 FakeClock fake_clock;
628 MockPolicy* mock_policy = new MockPolicy(&fake_clock);
629 FakeUpdateManager* fake_update_manager =
630 fake_system_state_.fake_update_manager();
631 fake_update_manager->set_policy(mock_policy);
632 EXPECT_CALL(*mock_policy, UpdateCanBeApplied(_, _, _, _, _))
633 .WillOnce(
634 DoAll(SetArgPointee<3>(ErrorCode::kOmahaUpdateDeferredPerPolicy),
635 Return(EvalStatus::kSucceeded)));
636 // Perform the Action. It should "fail" with kOmahaUpdateDeferredPerPolicy.
637 InstallPlan install_plan;
638 EXPECT_FALSE(DoTest(in, "", &install_plan));
639 EXPECT_EQ(ErrorCode::kOmahaUpdateDeferredPerPolicy, action_result_code_);
640 // Verify that DoTest() didn't set the output install plan.
641 EXPECT_EQ("", install_plan.version);
642 // Copy the underlying InstallPlan from the Action (like a real Delegate).
643 install_plan = action_->install_plan();
644 // Now verify the InstallPlan that was generated.
645 EXPECT_EQ(in.packages[0].payload_urls[0], install_plan.download_url);
646 EXPECT_EQ(expected_hash_, install_plan.payloads[0].hash);
647 EXPECT_EQ(1U, install_plan.target_slot);
648 EXPECT_EQ(in.version, install_plan.version);
649}
650
adlr@google.com3defe6a2009-12-04 20:57:17 +0000651} // namespace chromeos_update_engine