blob: c1c7e534232e03b519977fd14edfca6fcf9e4e4b [file] [log] [blame]
Darin Petkov7ed561b2011-10-04 02:59:03 -07001// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
adlr@google.com3defe6a2009-12-04 20:57:17 +00002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <string>
Darin Petkov73058b42010-10-06 16:32:19 -07006
adlr@google.com3defe6a2009-12-04 20:57:17 +00007#include <gtest/gtest.h>
Darin Petkov73058b42010-10-06 16:32:19 -07008
adlr@google.com3defe6a2009-12-04 20:57:17 +00009#include "update_engine/omaha_response_handler_action.h"
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080010#include "update_engine/mock_system_state.h"
adlr@google.com3defe6a2009-12-04 20:57:17 +000011#include "update_engine/test_utils.h"
12#include "update_engine/utils.h"
13
14using std::string;
Darin Petkov9c096d62010-11-17 14:49:04 -080015using testing::NiceMock;
Darin Petkov73058b42010-10-06 16:32:19 -070016using testing::Return;
adlr@google.com3defe6a2009-12-04 20:57:17 +000017
18namespace chromeos_update_engine {
19
20class OmahaResponseHandlerActionTest : public ::testing::Test {
21 public:
22 // Return true iff the OmahaResponseHandlerAction succeeded.
23 // If out is non-NULL, it's set w/ the response from the action.
Darin Petkov6a5b3222010-07-13 14:55:28 -070024 bool DoTest(const OmahaResponse& in,
adlr@google.com3defe6a2009-12-04 20:57:17 +000025 const string& boot_dev,
26 InstallPlan* out);
27};
28
29class OmahaResponseHandlerActionProcessorDelegate
30 : public ActionProcessorDelegate {
31 public:
32 OmahaResponseHandlerActionProcessorDelegate()
Darin Petkovc1a8b422010-07-19 11:34:49 -070033 : code_(kActionCodeError),
34 code_set_(false) {}
adlr@google.com3defe6a2009-12-04 20:57:17 +000035 void ActionCompleted(ActionProcessor* processor,
36 AbstractAction* action,
Darin Petkovc1a8b422010-07-19 11:34:49 -070037 ActionExitCode code) {
adlr@google.com3defe6a2009-12-04 20:57:17 +000038 if (action->Type() == OmahaResponseHandlerAction::StaticType()) {
Darin Petkovc1a8b422010-07-19 11:34:49 -070039 code_ = code;
40 code_set_ = true;
adlr@google.com3defe6a2009-12-04 20:57:17 +000041 }
42 }
Darin Petkovc1a8b422010-07-19 11:34:49 -070043 ActionExitCode code_;
44 bool code_set_;
adlr@google.com3defe6a2009-12-04 20:57:17 +000045};
46
47namespace {
48const string kLongName =
49 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
50 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
51 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
52 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
53 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
54 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
55 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
56 "-the_update_a.b.c.d_DELTA_.tgz";
57} // namespace {}
58
Darin Petkov6a5b3222010-07-13 14:55:28 -070059bool OmahaResponseHandlerActionTest::DoTest(const OmahaResponse& in,
adlr@google.com3defe6a2009-12-04 20:57:17 +000060 const string& boot_dev,
61 InstallPlan* out) {
62 ActionProcessor processor;
63 OmahaResponseHandlerActionProcessorDelegate delegate;
64 processor.set_delegate(&delegate);
65
Darin Petkov6a5b3222010-07-13 14:55:28 -070066 ObjectFeederAction<OmahaResponse> feeder_action;
adlr@google.com3defe6a2009-12-04 20:57:17 +000067 feeder_action.set_obj(in);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080068 MockSystemState mock_system_state;
Darin Petkov73058b42010-10-06 16:32:19 -070069 if (in.update_exists) {
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080070 EXPECT_CALL(*mock_system_state.mock_prefs(),
71 SetString(kPrefsUpdateCheckResponseHash, in.hash))
Darin Petkov73058b42010-10-06 16:32:19 -070072 .WillOnce(Return(true));
73 }
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080074 OmahaResponseHandlerAction response_handler_action(&mock_system_state);
adlr@google.com3defe6a2009-12-04 20:57:17 +000075 response_handler_action.set_boot_device(boot_dev);
76 BondActions(&feeder_action, &response_handler_action);
77 ObjectCollectorAction<InstallPlan> collector_action;
78 BondActions(&response_handler_action, &collector_action);
79 processor.EnqueueAction(&feeder_action);
80 processor.EnqueueAction(&response_handler_action);
81 processor.EnqueueAction(&collector_action);
82 processor.StartProcessing();
83 EXPECT_TRUE(!processor.IsRunning())
84 << "Update test to handle non-asynch actions";
85 if (out)
86 *out = collector_action.object();
Darin Petkovc1a8b422010-07-19 11:34:49 -070087 EXPECT_TRUE(delegate.code_set_);
Darin Petkov7ed561b2011-10-04 02:59:03 -070088 return delegate.code_ == kActionCodeSuccess;
adlr@google.com3defe6a2009-12-04 20:57:17 +000089}
90
91TEST_F(OmahaResponseHandlerActionTest, SimpleTest) {
Darin Petkov6c118642010-10-21 12:06:30 -070092 ScopedPathUnlinker deadline_unlinker(
93 OmahaResponseHandlerAction::kDeadlineFile);
adlr@google.com3defe6a2009-12-04 20:57:17 +000094 {
Darin Petkov6a5b3222010-07-13 14:55:28 -070095 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +000096 in.update_exists = true;
97 in.display_version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080098 in.payload_urls.push_back("http://foo/the_update_a.b.c.d.tgz");
adlr@google.com3defe6a2009-12-04 20:57:17 +000099 in.more_info_url = "http://more/info";
100 in.hash = "HASH+";
101 in.size = 12;
102 in.needs_admin = true;
103 in.prompt = false;
Darin Petkov6c118642010-10-21 12:06:30 -0700104 in.deadline = "20101020";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000105 InstallPlan install_plan;
Darin Petkov7ed561b2011-10-04 02:59:03 -0700106 EXPECT_TRUE(DoTest(in, "/dev/sda3", &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800107 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700108 EXPECT_EQ(in.hash, install_plan.payload_hash);
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700109 EXPECT_EQ("/dev/sda5", install_plan.install_path);
Darin Petkov6c118642010-10-21 12:06:30 -0700110 string deadline;
Gilad Arnold19a45f02012-07-19 12:36:10 -0700111 EXPECT_TRUE(utils::ReadFile(
Darin Petkov6c118642010-10-21 12:06:30 -0700112 OmahaResponseHandlerAction::kDeadlineFile,
113 &deadline));
114 EXPECT_EQ("20101020", deadline);
115 struct stat deadline_stat;
116 EXPECT_EQ(0, stat(OmahaResponseHandlerAction::kDeadlineFile,
117 &deadline_stat));
118 EXPECT_EQ(S_IFREG | S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH,
119 deadline_stat.st_mode);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000120 }
121 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700122 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000123 in.update_exists = true;
124 in.display_version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800125 in.payload_urls.push_back("http://foo/the_update_a.b.c.d.tgz");
adlr@google.com3defe6a2009-12-04 20:57:17 +0000126 in.more_info_url = "http://more/info";
127 in.hash = "HASHj+";
128 in.size = 12;
129 in.needs_admin = true;
130 in.prompt = true;
131 InstallPlan install_plan;
Darin Petkov7ed561b2011-10-04 02:59:03 -0700132 EXPECT_TRUE(DoTest(in, "/dev/sda5", &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800133 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700134 EXPECT_EQ(in.hash, install_plan.payload_hash);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000135 EXPECT_EQ("/dev/sda3", install_plan.install_path);
Darin Petkov6c118642010-10-21 12:06:30 -0700136 string deadline;
Gilad Arnold19a45f02012-07-19 12:36:10 -0700137 EXPECT_TRUE(utils::ReadFile(
Darin Petkov6c118642010-10-21 12:06:30 -0700138 OmahaResponseHandlerAction::kDeadlineFile,
139 &deadline) && deadline.empty());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000140 }
141 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700142 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000143 in.update_exists = true;
144 in.display_version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800145 in.payload_urls.push_back(kLongName);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000146 in.more_info_url = "http://more/info";
147 in.hash = "HASHj+";
148 in.size = 12;
149 in.needs_admin = true;
150 in.prompt = true;
Darin Petkov6c118642010-10-21 12:06:30 -0700151 in.deadline = "some-deadline";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000152 InstallPlan install_plan;
Darin Petkov7ed561b2011-10-04 02:59:03 -0700153 EXPECT_TRUE(DoTest(in, "/dev/sda3", &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800154 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700155 EXPECT_EQ(in.hash, install_plan.payload_hash);
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700156 EXPECT_EQ("/dev/sda5", install_plan.install_path);
Darin Petkov6c118642010-10-21 12:06:30 -0700157 string deadline;
Gilad Arnold19a45f02012-07-19 12:36:10 -0700158 EXPECT_TRUE(utils::ReadFile(
Darin Petkov6c118642010-10-21 12:06:30 -0700159 OmahaResponseHandlerAction::kDeadlineFile,
160 &deadline));
161 EXPECT_EQ("some-deadline", deadline);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000162 }
163}
164
165TEST_F(OmahaResponseHandlerActionTest, NoUpdatesTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700166 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000167 in.update_exists = false;
168 InstallPlan install_plan;
Darin Petkov7ed561b2011-10-04 02:59:03 -0700169 EXPECT_FALSE(DoTest(in, "/dev/sda1", &install_plan));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000170 EXPECT_EQ("", install_plan.download_url);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700171 EXPECT_EQ("", install_plan.payload_hash);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000172 EXPECT_EQ("", install_plan.install_path);
173}
174
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800175TEST_F(OmahaResponseHandlerActionTest, HashChecksForHttpTest) {
176 OmahaResponse in;
177 in.update_exists = true;
178 in.display_version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800179 in.payload_urls.push_back("http://test.should/need/hash.checks.signed");
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800180 in.more_info_url = "http://more/info";
181 in.hash = "HASHj+";
182 in.size = 12;
183 InstallPlan install_plan;
184 EXPECT_TRUE(DoTest(in, "/dev/sda5", &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800185 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800186 EXPECT_EQ(in.hash, install_plan.payload_hash);
187 EXPECT_TRUE(install_plan.hash_checks_mandatory);
188}
189
190TEST_F(OmahaResponseHandlerActionTest, HashChecksForHttpsTest) {
191 OmahaResponse in;
192 in.update_exists = true;
193 in.display_version = "a.b.c.d";
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800194 in.payload_urls.push_back("https://test.should.not/need/hash.checks.signed");
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800195 in.more_info_url = "http://more/info";
196 in.hash = "HASHj+";
197 in.size = 12;
198 InstallPlan install_plan;
199 EXPECT_TRUE(DoTest(in, "/dev/sda5", &install_plan));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800200 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800201 EXPECT_EQ(in.hash, install_plan.payload_hash);
202 EXPECT_FALSE(install_plan.hash_checks_mandatory);
203}
204
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800205TEST_F(OmahaResponseHandlerActionTest, HashChecksForBothHttpAndHttpsTest) {
206 OmahaResponse in;
207 in.update_exists = true;
208 in.display_version = "a.b.c.d";
209 in.payload_urls.push_back("http://test.should.still/need/hash.checks");
210 in.payload_urls.push_back("https://test.should.still/need/hash.checks");
211 in.more_info_url = "http://more/info";
212 in.hash = "HASHj+";
213 in.size = 12;
214 InstallPlan install_plan;
215 EXPECT_TRUE(DoTest(in, "/dev/sda5", &install_plan));
216 EXPECT_EQ(in.payload_urls[0], install_plan.download_url);
217 EXPECT_EQ(in.hash, install_plan.payload_hash);
218 EXPECT_TRUE(install_plan.hash_checks_mandatory);
219}
220
221
adlr@google.com3defe6a2009-12-04 20:57:17 +0000222} // namespace chromeos_update_engine