blob: 20d016685e5ce4023607ce45546672bf200ced81 [file] [log] [blame]
Alex Deymoaea4c1c2015-08-19 20:24:43 -07001//
2// Copyright (C) 2011 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
adlr@google.com3defe6a2009-12-04 20:57:17 +000016
Alex Deymoaab50e32014-11-10 19:55:35 -080017#include "update_engine/omaha_response_handler_action.h"
18
adlr@google.com3defe6a2009-12-04 20:57:17 +000019#include <string>
Darin Petkov73058b42010-10-06 16:32:19 -070020
adlr@google.com3defe6a2009-12-04 20:57:17 +000021#include <gtest/gtest.h>
Darin Petkov73058b42010-10-06 16:32:19 -070022
Jay Srinivasand29695d2013-04-08 15:08:05 -070023#include "update_engine/constants.h"
Gilad Arnold5bb4c902014-04-10 12:32:13 -070024#include "update_engine/fake_system_state.h"
Gilad Arnold74b5f552014-10-07 08:17:16 -070025#include "update_engine/mock_payload_state.h"
adlr@google.com3defe6a2009-12-04 20:57:17 +000026#include "update_engine/test_utils.h"
27#include "update_engine/utils.h"
28
Alex Deymo10875d92014-11-10 21:52:57 -080029using chromeos_update_engine::test_utils::System;
30using chromeos_update_engine::test_utils::WriteFileString;
adlr@google.com3defe6a2009-12-04 20:57:17 +000031using std::string;
Darin Petkov73058b42010-10-06 16:32:19 -070032using testing::Return;
adlr@google.com3defe6a2009-12-04 20:57:17 +000033
34namespace chromeos_update_engine {
35
36class OmahaResponseHandlerActionTest : public ::testing::Test {
Alex Deymo763e7db2015-08-27 21:08:08 -070037 protected:
38 void SetUp() override {
39 FakeBootControl* fake_boot_control = fake_system_state_.fake_boot_control();
40 fake_boot_control->SetPartitionDevice(
41 kLegacyPartitionNameKernel, 0, "/dev/sdz2");
42 fake_boot_control->SetPartitionDevice(
43 kLegacyPartitionNameRoot, 0, "/dev/sdz3");
44 fake_boot_control->SetPartitionDevice(
45 kLegacyPartitionNameKernel, 1, "/dev/sdz4");
46 fake_boot_control->SetPartitionDevice(
47 kLegacyPartitionNameRoot, 1, "/dev/sdz5");
48 }
49
adlr@google.com3defe6a2009-12-04 20:57:17 +000050 // Return true iff the OmahaResponseHandlerAction succeeded.
Alex Vakulenko88b591f2014-08-28 16:48:57 -070051 // If out is non-null, it's set w/ the response from the action.
Darin Petkov6a5b3222010-07-13 14:55:28 -070052 bool DoTest(const OmahaResponse& in,
Gilad Arnold4dbd47e2013-07-22 05:39:26 -070053 const string& deadline_file,
adlr@google.com3defe6a2009-12-04 20:57:17 +000054 InstallPlan* out);
Alex Deymo763e7db2015-08-27 21:08:08 -070055
56 FakeSystemState fake_system_state_;
adlr@google.com3defe6a2009-12-04 20:57:17 +000057};
58
59class OmahaResponseHandlerActionProcessorDelegate
60 : public ActionProcessorDelegate {
61 public:
62 OmahaResponseHandlerActionProcessorDelegate()
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -070063 : code_(ErrorCode::kError),
Darin Petkovc1a8b422010-07-19 11:34:49 -070064 code_set_(false) {}
adlr@google.com3defe6a2009-12-04 20:57:17 +000065 void ActionCompleted(ActionProcessor* processor,
66 AbstractAction* action,
David Zeuthena99981f2013-04-29 13:42:47 -070067 ErrorCode code) {
adlr@google.com3defe6a2009-12-04 20:57:17 +000068 if (action->Type() == OmahaResponseHandlerAction::StaticType()) {
Darin Petkovc1a8b422010-07-19 11:34:49 -070069 code_ = code;
70 code_set_ = true;
adlr@google.com3defe6a2009-12-04 20:57:17 +000071 }
72 }
David Zeuthena99981f2013-04-29 13:42:47 -070073 ErrorCode code_;
Darin Petkovc1a8b422010-07-19 11:34:49 -070074 bool code_set_;
adlr@google.com3defe6a2009-12-04 20:57:17 +000075};
76
77namespace {
Alex Vakulenkod2779df2014-06-16 13:19:00 -070078const char* const kLongName =
adlr@google.com3defe6a2009-12-04 20:57:17 +000079 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
80 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
81 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
82 "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 "-the_update_a.b.c.d_DELTA_.tgz";
Alex Vakulenkod2779df2014-06-16 13:19:00 -070087const char* const kBadVersion = "don't update me";
88} // namespace
adlr@google.com3defe6a2009-12-04 20:57:17 +000089
Alex Deymo763e7db2015-08-27 21:08:08 -070090bool OmahaResponseHandlerActionTest::DoTest(
Jay Srinivasanae4697c2013-03-18 17:08:08 -070091 const OmahaResponse& in,
Gilad Arnold4dbd47e2013-07-22 05:39:26 -070092 const string& test_deadline_file,
Jay Srinivasanae4697c2013-03-18 17:08:08 -070093 InstallPlan* out) {
adlr@google.com3defe6a2009-12-04 20:57:17 +000094 ActionProcessor processor;
95 OmahaResponseHandlerActionProcessorDelegate delegate;
96 processor.set_delegate(&delegate);
97
Darin Petkov6a5b3222010-07-13 14:55:28 -070098 ObjectFeederAction<OmahaResponse> feeder_action;
adlr@google.com3defe6a2009-12-04 20:57:17 +000099 feeder_action.set_obj(in);
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700100 if (in.update_exists && in.version != kBadVersion) {
Alex Deymo763e7db2015-08-27 21:08:08 -0700101 EXPECT_CALL(*(fake_system_state_.mock_prefs()),
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800102 SetString(kPrefsUpdateCheckResponseHash, in.hash))
Darin Petkov73058b42010-10-06 16:32:19 -0700103 .WillOnce(Return(true));
104 }
Jay Srinivasan53173b92013-05-17 17:13:01 -0700105
106 string current_url = in.payload_urls.size() ? in.payload_urls[0] : "";
Alex Deymo763e7db2015-08-27 21:08:08 -0700107 EXPECT_CALL(*(fake_system_state_.mock_payload_state()), GetCurrentUrl())
Jay Srinivasan53173b92013-05-17 17:13:01 -0700108 .WillRepeatedly(Return(current_url));
109
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700110 OmahaResponseHandlerAction response_handler_action(
Alex Deymo763e7db2015-08-27 21:08:08 -0700111 &fake_system_state_,
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700112 (test_deadline_file.empty() ?
113 OmahaResponseHandlerAction::kDeadlineFile : test_deadline_file));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000114 BondActions(&feeder_action, &response_handler_action);
115 ObjectCollectorAction<InstallPlan> collector_action;
116 BondActions(&response_handler_action, &collector_action);
117 processor.EnqueueAction(&feeder_action);
118 processor.EnqueueAction(&response_handler_action);
119 processor.EnqueueAction(&collector_action);
120 processor.StartProcessing();
121 EXPECT_TRUE(!processor.IsRunning())
Alex Vakulenko072359c2014-07-18 11:41:07 -0700122 << "Update test to handle non-async actions";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000123 if (out)
124 *out = collector_action.object();
Darin Petkovc1a8b422010-07-19 11:34:49 -0700125 EXPECT_TRUE(delegate.code_set_);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700126 return delegate.code_ == ErrorCode::kSuccess;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000127}
128
129TEST_F(OmahaResponseHandlerActionTest, SimpleTest) {
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700130 string test_deadline_file;
131 CHECK(utils::MakeTempFile(
Gilad Arnolda6742b32014-01-11 00:18:34 -0800132 "omaha_response_handler_action_unittest-XXXXXX",
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700133 &test_deadline_file, nullptr));
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700134 ScopedPathUnlinker deadline_unlinker(test_deadline_file);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000135 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700136 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000137 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700138 in.version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800139 in.payload_urls.push_back("http://foo/the_update_a.b.c.d.tgz");
adlr@google.com3defe6a2009-12-04 20:57:17 +0000140 in.more_info_url = "http://more/info";
141 in.hash = "HASH+";
142 in.size = 12;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000143 in.prompt = false;
Darin Petkov6c118642010-10-21 12:06:30 -0700144 in.deadline = "20101020";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000145 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700146 EXPECT_TRUE(DoTest(in, test_deadline_file, &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800147 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700148 EXPECT_EQ(in.hash, install_plan.payload_hash);
Alex Deymo763e7db2015-08-27 21:08:08 -0700149 EXPECT_EQ(1, install_plan.target_slot);
Darin Petkov6c118642010-10-21 12:06:30 -0700150 string deadline;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700151 EXPECT_TRUE(utils::ReadFile(test_deadline_file, &deadline));
Darin Petkov6c118642010-10-21 12:06:30 -0700152 EXPECT_EQ("20101020", deadline);
153 struct stat deadline_stat;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700154 EXPECT_EQ(0, stat(test_deadline_file.c_str(), &deadline_stat));
Darin Petkov6c118642010-10-21 12:06:30 -0700155 EXPECT_EQ(S_IFREG | S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH,
156 deadline_stat.st_mode);
Chris Sosafb1020e2013-07-29 17:27:33 -0700157 EXPECT_EQ(in.version, install_plan.version);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000158 }
159 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700160 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000161 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700162 in.version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800163 in.payload_urls.push_back("http://foo/the_update_a.b.c.d.tgz");
adlr@google.com3defe6a2009-12-04 20:57:17 +0000164 in.more_info_url = "http://more/info";
165 in.hash = "HASHj+";
166 in.size = 12;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000167 in.prompt = true;
168 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700169 // Set the other slot as current.
170 fake_system_state_.fake_boot_control()->SetCurrentSlot(1);
171 EXPECT_TRUE(DoTest(in, test_deadline_file, &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800172 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700173 EXPECT_EQ(in.hash, install_plan.payload_hash);
Alex Deymo763e7db2015-08-27 21:08:08 -0700174 EXPECT_EQ(0, install_plan.target_slot);
Darin Petkov6c118642010-10-21 12:06:30 -0700175 string deadline;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700176 EXPECT_TRUE(utils::ReadFile(test_deadline_file, &deadline) &&
177 deadline.empty());
Chris Sosafb1020e2013-07-29 17:27:33 -0700178 EXPECT_EQ(in.version, install_plan.version);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000179 }
180 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700181 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000182 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700183 in.version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800184 in.payload_urls.push_back(kLongName);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000185 in.more_info_url = "http://more/info";
186 in.hash = "HASHj+";
187 in.size = 12;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000188 in.prompt = true;
Darin Petkov6c118642010-10-21 12:06:30 -0700189 in.deadline = "some-deadline";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000190 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700191 fake_system_state_.fake_boot_control()->SetCurrentSlot(0);
192 EXPECT_TRUE(DoTest(in, test_deadline_file, &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800193 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700194 EXPECT_EQ(in.hash, install_plan.payload_hash);
Alex Deymo763e7db2015-08-27 21:08:08 -0700195 EXPECT_EQ(1, install_plan.target_slot);
Darin Petkov6c118642010-10-21 12:06:30 -0700196 string deadline;
Gilad Arnold4dbd47e2013-07-22 05:39:26 -0700197 EXPECT_TRUE(utils::ReadFile(test_deadline_file, &deadline));
Darin Petkov6c118642010-10-21 12:06:30 -0700198 EXPECT_EQ("some-deadline", deadline);
Chris Sosafb1020e2013-07-29 17:27:33 -0700199 EXPECT_EQ(in.version, install_plan.version);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000200 }
201}
202
203TEST_F(OmahaResponseHandlerActionTest, NoUpdatesTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700204 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000205 in.update_exists = false;
206 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700207 EXPECT_FALSE(DoTest(in, "", &install_plan));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000208 EXPECT_EQ("", install_plan.download_url);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700209 EXPECT_EQ("", install_plan.payload_hash);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000210 EXPECT_EQ("", install_plan.install_path);
Chris Sosafb1020e2013-07-29 17:27:33 -0700211 EXPECT_EQ("", install_plan.version);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000212}
213
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800214TEST_F(OmahaResponseHandlerActionTest, HashChecksForHttpTest) {
215 OmahaResponse in;
216 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700217 in.version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800218 in.payload_urls.push_back("http://test.should/need/hash.checks.signed");
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800219 in.more_info_url = "http://more/info";
220 in.hash = "HASHj+";
221 in.size = 12;
David Pursell02c18642014-11-06 11:26:11 -0800222 // Hash checks are always skipped for non-official update URLs.
Alex Deymo763e7db2015-08-27 21:08:08 -0700223 EXPECT_CALL(*(fake_system_state_.mock_request_params()),
David Pursell02c18642014-11-06 11:26:11 -0800224 IsUpdateUrlOfficial())
225 .WillRepeatedly(Return(true));
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800226 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700227 EXPECT_TRUE(DoTest(in, "", &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800228 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800229 EXPECT_EQ(in.hash, install_plan.payload_hash);
230 EXPECT_TRUE(install_plan.hash_checks_mandatory);
Chris Sosafb1020e2013-07-29 17:27:33 -0700231 EXPECT_EQ(in.version, install_plan.version);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800232}
233
David Pursell02c18642014-11-06 11:26:11 -0800234TEST_F(OmahaResponseHandlerActionTest, HashChecksForUnofficialUpdateUrl) {
235 OmahaResponse in;
236 in.update_exists = true;
237 in.version = "a.b.c.d";
238 in.payload_urls.push_back("http://url.normally/needs/hash.checks.signed");
239 in.more_info_url = "http://more/info";
240 in.hash = "HASHj+";
241 in.size = 12;
Alex Deymo763e7db2015-08-27 21:08:08 -0700242 EXPECT_CALL(*(fake_system_state_.mock_request_params()),
David Pursell02c18642014-11-06 11:26:11 -0800243 IsUpdateUrlOfficial())
244 .WillRepeatedly(Return(false));
245 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700246 EXPECT_TRUE(DoTest(in, "", &install_plan));
David Pursell02c18642014-11-06 11:26:11 -0800247 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
248 EXPECT_EQ(in.hash, install_plan.payload_hash);
249 EXPECT_FALSE(install_plan.hash_checks_mandatory);
250 EXPECT_EQ(in.version, install_plan.version);
251}
252
David Pursell907b4fa2015-01-27 10:27:38 -0800253TEST_F(OmahaResponseHandlerActionTest,
254 HashChecksForOfficialUrlUnofficialBuildTest) {
255 // Official URLs for unofficial builds (dev/test images) don't require hash.
256 OmahaResponse in;
257 in.update_exists = true;
258 in.version = "a.b.c.d";
259 in.payload_urls.push_back("http://url.normally/needs/hash.checks.signed");
260 in.more_info_url = "http://more/info";
261 in.hash = "HASHj+";
262 in.size = 12;
Alex Deymo763e7db2015-08-27 21:08:08 -0700263 EXPECT_CALL(*(fake_system_state_.mock_request_params()),
David Pursell907b4fa2015-01-27 10:27:38 -0800264 IsUpdateUrlOfficial())
265 .WillRepeatedly(Return(true));
Alex Deymo763e7db2015-08-27 21:08:08 -0700266 fake_system_state_.fake_hardware()->SetIsOfficialBuild(false);
David Pursell907b4fa2015-01-27 10:27:38 -0800267 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700268 EXPECT_TRUE(DoTest(in, "", &install_plan));
David Pursell907b4fa2015-01-27 10:27:38 -0800269 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
270 EXPECT_EQ(in.hash, install_plan.payload_hash);
271 EXPECT_FALSE(install_plan.hash_checks_mandatory);
272 EXPECT_EQ(in.version, install_plan.version);
273}
274
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800275TEST_F(OmahaResponseHandlerActionTest, HashChecksForHttpsTest) {
276 OmahaResponse in;
277 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700278 in.version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800279 in.payload_urls.push_back("https://test.should.not/need/hash.checks.signed");
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800280 in.more_info_url = "http://more/info";
281 in.hash = "HASHj+";
282 in.size = 12;
Alex Deymo763e7db2015-08-27 21:08:08 -0700283 EXPECT_CALL(*(fake_system_state_.mock_request_params()),
David Pursell02c18642014-11-06 11:26:11 -0800284 IsUpdateUrlOfficial())
285 .WillRepeatedly(Return(true));
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800286 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700287 EXPECT_TRUE(DoTest(in, "", &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800288 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800289 EXPECT_EQ(in.hash, install_plan.payload_hash);
290 EXPECT_FALSE(install_plan.hash_checks_mandatory);
Chris Sosafb1020e2013-07-29 17:27:33 -0700291 EXPECT_EQ(in.version, install_plan.version);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800292}
293
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800294TEST_F(OmahaResponseHandlerActionTest, HashChecksForBothHttpAndHttpsTest) {
295 OmahaResponse in;
296 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700297 in.version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800298 in.payload_urls.push_back("http://test.should.still/need/hash.checks");
299 in.payload_urls.push_back("https://test.should.still/need/hash.checks");
300 in.more_info_url = "http://more/info";
301 in.hash = "HASHj+";
302 in.size = 12;
Alex Deymo763e7db2015-08-27 21:08:08 -0700303 EXPECT_CALL(*(fake_system_state_.mock_request_params()),
David Pursell02c18642014-11-06 11:26:11 -0800304 IsUpdateUrlOfficial())
305 .WillRepeatedly(Return(true));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800306 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700307 EXPECT_TRUE(DoTest(in, "", &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800308 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
309 EXPECT_EQ(in.hash, install_plan.payload_hash);
310 EXPECT_TRUE(install_plan.hash_checks_mandatory);
Chris Sosafb1020e2013-07-29 17:27:33 -0700311 EXPECT_EQ(in.version, install_plan.version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800312}
313
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700314TEST_F(OmahaResponseHandlerActionTest, ChangeToMoreStableChannelTest) {
315 OmahaResponse in;
316 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700317 in.version = "a.b.c.d";
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700318 in.payload_urls.push_back("https://MoreStableChannelTest");
319 in.more_info_url = "http://more/info";
320 in.hash = "HASHjk";
321 in.size = 15;
322
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700323 // Create a uniquely named test directory.
324 string test_dir;
325 ASSERT_TRUE(utils::MakeTempDirectory(
326 "omaha_response_handler_action-test-XXXXXX", &test_dir));
327
328 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
329 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -0700330 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700331 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700332 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700333 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
334 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700335 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700336 "CHROMEOS_IS_POWERWASH_ALLOWED=true\n"
337 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
338
Alex Deymo763e7db2015-08-27 21:08:08 -0700339 OmahaRequestParams params(&fake_system_state_);
Gilad Arnoldd04f8e22014-01-09 13:13:40 -0800340 params.set_root(test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700341 params.SetLockDown(false);
342 params.Init("1.2.3.4", "", 0);
343 EXPECT_EQ("canary-channel", params.current_channel());
344 EXPECT_EQ("stable-channel", params.target_channel());
345 EXPECT_TRUE(params.to_more_stable_channel());
346 EXPECT_TRUE(params.is_powerwash_allowed());
347
Alex Deymo763e7db2015-08-27 21:08:08 -0700348 fake_system_state_.set_request_params(&params);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700349 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700350 EXPECT_TRUE(DoTest(in, "", &install_plan));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700351 EXPECT_TRUE(install_plan.powerwash_required);
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700352
Alex Deymo10875d92014-11-10 21:52:57 -0800353 ASSERT_TRUE(test_utils::RecursiveUnlinkDir(test_dir));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700354}
355
356TEST_F(OmahaResponseHandlerActionTest, ChangeToLessStableChannelTest) {
357 OmahaResponse in;
358 in.update_exists = true;
Chris Sosa3b748432013-06-20 16:42:59 -0700359 in.version = "a.b.c.d";
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700360 in.payload_urls.push_back("https://LessStableChannelTest");
361 in.more_info_url = "http://more/info";
362 in.hash = "HASHjk";
363 in.size = 15;
364
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700365 // Create a uniquely named test directory.
366 string test_dir;
367 ASSERT_TRUE(utils::MakeTempDirectory(
368 "omaha_response_handler_action-test-XXXXXX", &test_dir));
369
370 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
371 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -0700372 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700373 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700374 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700375 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
376 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700377 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700378 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
379
Alex Deymo763e7db2015-08-27 21:08:08 -0700380 OmahaRequestParams params(&fake_system_state_);
Gilad Arnoldd04f8e22014-01-09 13:13:40 -0800381 params.set_root(test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700382 params.SetLockDown(false);
383 params.Init("5.6.7.8", "", 0);
384 EXPECT_EQ("stable-channel", params.current_channel());
385 params.SetTargetChannel("canary-channel", false);
386 EXPECT_EQ("canary-channel", params.target_channel());
387 EXPECT_FALSE(params.to_more_stable_channel());
388 EXPECT_FALSE(params.is_powerwash_allowed());
389
Alex Deymo763e7db2015-08-27 21:08:08 -0700390 fake_system_state_.set_request_params(&params);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700391 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700392 EXPECT_TRUE(DoTest(in, "", &install_plan));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700393 EXPECT_FALSE(install_plan.powerwash_required);
Gilad Arnoldeff87cc2013-07-22 18:32:09 -0700394
Alex Deymo10875d92014-11-10 21:52:57 -0800395 ASSERT_TRUE(test_utils::RecursiveUnlinkDir(test_dir));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700396}
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800397
David Zeuthen8f191b22013-08-06 12:27:50 -0700398TEST_F(OmahaResponseHandlerActionTest, P2PUrlIsUsedAndHashChecksMandatory) {
399 OmahaResponse in;
400 in.update_exists = true;
401 in.version = "a.b.c.d";
402 in.payload_urls.push_back("https://would.not/cause/hash/checks");
403 in.more_info_url = "http://more/info";
404 in.hash = "HASHj+";
405 in.size = 12;
406
Alex Deymo763e7db2015-08-27 21:08:08 -0700407 OmahaRequestParams params(&fake_system_state_);
David Pursell02c18642014-11-06 11:26:11 -0800408 // We're using a real OmahaRequestParams object here so we can't mock
409 // IsUpdateUrlOfficial(), but setting the update URL to the AutoUpdate test
410 // server will cause IsUpdateUrlOfficial() to return true.
411 params.set_update_url(kAUTestOmahaUrl);
Alex Deymo763e7db2015-08-27 21:08:08 -0700412 fake_system_state_.set_request_params(&params);
David Zeuthen8f191b22013-08-06 12:27:50 -0700413
Alex Deymo763e7db2015-08-27 21:08:08 -0700414 EXPECT_CALL(*fake_system_state_.mock_payload_state(),
David Zeuthenbb8bdc72013-09-03 13:43:48 -0700415 SetUsingP2PForDownloading(true));
416
David Zeuthen8f191b22013-08-06 12:27:50 -0700417 string p2p_url = "http://9.8.7.6/p2p";
Alex Deymo763e7db2015-08-27 21:08:08 -0700418 EXPECT_CALL(*fake_system_state_.mock_payload_state(), GetP2PUrl())
Gilad Arnold74b5f552014-10-07 08:17:16 -0700419 .WillRepeatedly(Return(p2p_url));
Alex Deymo763e7db2015-08-27 21:08:08 -0700420 EXPECT_CALL(*fake_system_state_.mock_payload_state(),
Gilad Arnold74b5f552014-10-07 08:17:16 -0700421 GetUsingP2PForDownloading()).WillRepeatedly(Return(true));
David Zeuthen8f191b22013-08-06 12:27:50 -0700422
423 InstallPlan install_plan;
Alex Deymo763e7db2015-08-27 21:08:08 -0700424 EXPECT_TRUE(DoTest(in, "", &install_plan));
David Zeuthen8f191b22013-08-06 12:27:50 -0700425 EXPECT_EQ(in.hash, install_plan.payload_hash);
426 EXPECT_EQ(install_plan.download_url, p2p_url);
427 EXPECT_TRUE(install_plan.hash_checks_mandatory);
428}
429
adlr@google.com3defe6a2009-12-04 20:57:17 +0000430} // namespace chromeos_update_engine