blob: 4a60315d9898a07143aaaec75132b36b16ae280a [file] [log] [blame]
Darin Petkov73058b42010-10-06 16:32:19 -07001// Copyright (c) 2010 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"
Darin Petkov73058b42010-10-06 16:32:19 -070010#include "update_engine/prefs_mock.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,
Darin Petkovabc7bc02011-02-23 14:39:43 -080026 bool test_key,
adlr@google.com3defe6a2009-12-04 20:57:17 +000027 InstallPlan* out);
28};
29
30class OmahaResponseHandlerActionProcessorDelegate
31 : public ActionProcessorDelegate {
32 public:
33 OmahaResponseHandlerActionProcessorDelegate()
Darin Petkovc1a8b422010-07-19 11:34:49 -070034 : code_(kActionCodeError),
35 code_set_(false) {}
adlr@google.com3defe6a2009-12-04 20:57:17 +000036 void ActionCompleted(ActionProcessor* processor,
37 AbstractAction* action,
Darin Petkovc1a8b422010-07-19 11:34:49 -070038 ActionExitCode code) {
adlr@google.com3defe6a2009-12-04 20:57:17 +000039 if (action->Type() == OmahaResponseHandlerAction::StaticType()) {
Darin Petkovc1a8b422010-07-19 11:34:49 -070040 code_ = code;
41 code_set_ = true;
adlr@google.com3defe6a2009-12-04 20:57:17 +000042 }
43 }
Darin Petkovc1a8b422010-07-19 11:34:49 -070044 ActionExitCode code_;
45 bool code_set_;
adlr@google.com3defe6a2009-12-04 20:57:17 +000046};
47
48namespace {
49const string kLongName =
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 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
57 "-the_update_a.b.c.d_DELTA_.tgz";
58} // namespace {}
59
Darin Petkov6a5b3222010-07-13 14:55:28 -070060bool OmahaResponseHandlerActionTest::DoTest(const OmahaResponse& in,
adlr@google.com3defe6a2009-12-04 20:57:17 +000061 const string& boot_dev,
Darin Petkovabc7bc02011-02-23 14:39:43 -080062 bool test_key,
adlr@google.com3defe6a2009-12-04 20:57:17 +000063 InstallPlan* out) {
64 ActionProcessor processor;
65 OmahaResponseHandlerActionProcessorDelegate delegate;
66 processor.set_delegate(&delegate);
67
Darin Petkov6a5b3222010-07-13 14:55:28 -070068 ObjectFeederAction<OmahaResponse> feeder_action;
adlr@google.com3defe6a2009-12-04 20:57:17 +000069 feeder_action.set_obj(in);
Darin Petkov9c096d62010-11-17 14:49:04 -080070 NiceMock<PrefsMock> prefs;
Darin Petkov73058b42010-10-06 16:32:19 -070071 if (in.update_exists) {
72 EXPECT_CALL(prefs, SetString(kPrefsUpdateCheckResponseHash, in.hash))
73 .WillOnce(Return(true));
74 }
75 OmahaResponseHandlerAction response_handler_action(&prefs);
Darin Petkovabc7bc02011-02-23 14:39:43 -080076 if (test_key) {
77 response_handler_action.set_key_path("/dev/null");
78 }
adlr@google.com3defe6a2009-12-04 20:57:17 +000079 response_handler_action.set_boot_device(boot_dev);
80 BondActions(&feeder_action, &response_handler_action);
81 ObjectCollectorAction<InstallPlan> collector_action;
82 BondActions(&response_handler_action, &collector_action);
83 processor.EnqueueAction(&feeder_action);
84 processor.EnqueueAction(&response_handler_action);
85 processor.EnqueueAction(&collector_action);
86 processor.StartProcessing();
87 EXPECT_TRUE(!processor.IsRunning())
88 << "Update test to handle non-asynch actions";
89 if (out)
90 *out = collector_action.object();
Darin Petkovc1a8b422010-07-19 11:34:49 -070091 EXPECT_TRUE(delegate.code_set_);
Darin Petkovabc7bc02011-02-23 14:39:43 -080092 ActionExitCode expected_code = test_key ?
93 kActionCodeSignedDeltaPayloadExpectedError : kActionCodeSuccess;
94 return delegate.code_ == expected_code;
adlr@google.com3defe6a2009-12-04 20:57:17 +000095}
96
97TEST_F(OmahaResponseHandlerActionTest, SimpleTest) {
Darin Petkov6c118642010-10-21 12:06:30 -070098 ScopedPathUnlinker deadline_unlinker(
99 OmahaResponseHandlerAction::kDeadlineFile);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000100 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700101 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000102 in.update_exists = true;
103 in.display_version = "a.b.c.d";
Andrew de los Reyes63b96d72010-05-10 13:08:54 -0700104 in.codebase = "http://foo/the_update_a.b.c.d.tgz";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000105 in.more_info_url = "http://more/info";
106 in.hash = "HASH+";
107 in.size = 12;
108 in.needs_admin = true;
109 in.prompt = false;
Andrew de los Reyes3270f742010-07-15 22:28:14 -0700110 in.is_delta = false;
Darin Petkov6c118642010-10-21 12:06:30 -0700111 in.deadline = "20101020";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000112 InstallPlan install_plan;
Darin Petkovabc7bc02011-02-23 14:39:43 -0800113 EXPECT_TRUE(DoTest(in, "/dev/sda3", false, &install_plan));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000114 EXPECT_TRUE(install_plan.is_full_update);
115 EXPECT_EQ(in.codebase, install_plan.download_url);
116 EXPECT_EQ(in.hash, install_plan.download_hash);
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700117 EXPECT_EQ("/dev/sda5", install_plan.install_path);
Darin Petkov6c118642010-10-21 12:06:30 -0700118 string deadline;
119 EXPECT_TRUE(utils::ReadFileToString(
120 OmahaResponseHandlerAction::kDeadlineFile,
121 &deadline));
122 EXPECT_EQ("20101020", deadline);
123 struct stat deadline_stat;
124 EXPECT_EQ(0, stat(OmahaResponseHandlerAction::kDeadlineFile,
125 &deadline_stat));
126 EXPECT_EQ(S_IFREG | S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH,
127 deadline_stat.st_mode);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000128 }
129 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700130 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000131 in.update_exists = true;
132 in.display_version = "a.b.c.d";
Andrew de los Reyes63b96d72010-05-10 13:08:54 -0700133 in.codebase = "http://foo/the_update_a.b.c.d.tgz";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000134 in.more_info_url = "http://more/info";
135 in.hash = "HASHj+";
136 in.size = 12;
137 in.needs_admin = true;
138 in.prompt = true;
Andrew de los Reyes3270f742010-07-15 22:28:14 -0700139 in.is_delta = true;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000140 InstallPlan install_plan;
Darin Petkovabc7bc02011-02-23 14:39:43 -0800141 EXPECT_TRUE(DoTest(in, "/dev/sda5", false, &install_plan));
Andrew de los Reyes3270f742010-07-15 22:28:14 -0700142 EXPECT_FALSE(install_plan.is_full_update);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000143 EXPECT_EQ(in.codebase, install_plan.download_url);
144 EXPECT_EQ(in.hash, install_plan.download_hash);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000145 EXPECT_EQ("/dev/sda3", install_plan.install_path);
Darin Petkov6c118642010-10-21 12:06:30 -0700146 string deadline;
147 EXPECT_TRUE(utils::ReadFileToString(
148 OmahaResponseHandlerAction::kDeadlineFile,
149 &deadline) && deadline.empty());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000150 }
151 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700152 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000153 in.update_exists = true;
154 in.display_version = "a.b.c.d";
155 in.codebase = kLongName;
156 in.more_info_url = "http://more/info";
157 in.hash = "HASHj+";
158 in.size = 12;
159 in.needs_admin = true;
160 in.prompt = true;
Andrew de los Reyes3270f742010-07-15 22:28:14 -0700161 in.is_delta = false;
Darin Petkov6c118642010-10-21 12:06:30 -0700162 in.deadline = "some-deadline";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000163 InstallPlan install_plan;
Darin Petkovabc7bc02011-02-23 14:39:43 -0800164 EXPECT_TRUE(DoTest(in, "/dev/sda3", false, &install_plan));
Andrew de los Reyes63b96d72010-05-10 13:08:54 -0700165 EXPECT_TRUE(install_plan.is_full_update);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000166 EXPECT_EQ(in.codebase, install_plan.download_url);
167 EXPECT_EQ(in.hash, install_plan.download_hash);
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700168 EXPECT_EQ("/dev/sda5", install_plan.install_path);
Darin Petkov6c118642010-10-21 12:06:30 -0700169 string deadline;
170 EXPECT_TRUE(utils::ReadFileToString(
171 OmahaResponseHandlerAction::kDeadlineFile,
172 &deadline));
173 EXPECT_EQ("some-deadline", deadline);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000174 }
175}
176
Darin Petkovabc7bc02011-02-23 14:39:43 -0800177TEST_F(OmahaResponseHandlerActionTest, PublicKeyOldStyleTest) {
178 OmahaResponse in;
179 in.update_exists = true;
180 in.codebase = "http://foo/the_update_a.b.c.d.tgz";
181 in.is_delta = false;
182 InstallPlan install_plan;
183 EXPECT_TRUE(DoTest(in, "/dev/sda3", true, &install_plan));
184}
185
adlr@google.com3defe6a2009-12-04 20:57:17 +0000186TEST_F(OmahaResponseHandlerActionTest, NoUpdatesTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700187 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000188 in.update_exists = false;
189 InstallPlan install_plan;
Darin Petkovabc7bc02011-02-23 14:39:43 -0800190 EXPECT_FALSE(DoTest(in, "/dev/sda1", false, &install_plan));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000191 EXPECT_FALSE(install_plan.is_full_update);
192 EXPECT_EQ("", install_plan.download_url);
193 EXPECT_EQ("", install_plan.download_hash);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000194 EXPECT_EQ("", install_plan.install_path);
195}
196
197} // namespace chromeos_update_engine