blob: 10be7d6d5ec78ad78ca6ba9637c8f1c1f6712c94 [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 Petkov73058b42010-10-06 16:32:19 -070015using testing::Return;
adlr@google.com3defe6a2009-12-04 20:57:17 +000016
17namespace chromeos_update_engine {
18
19class OmahaResponseHandlerActionTest : public ::testing::Test {
20 public:
21 // Return true iff the OmahaResponseHandlerAction succeeded.
22 // If out is non-NULL, it's set w/ the response from the action.
Darin Petkov6a5b3222010-07-13 14:55:28 -070023 bool DoTest(const OmahaResponse& in,
adlr@google.com3defe6a2009-12-04 20:57:17 +000024 const string& boot_dev,
25 InstallPlan* out);
26};
27
28class OmahaResponseHandlerActionProcessorDelegate
29 : public ActionProcessorDelegate {
30 public:
31 OmahaResponseHandlerActionProcessorDelegate()
Darin Petkovc1a8b422010-07-19 11:34:49 -070032 : code_(kActionCodeError),
33 code_set_(false) {}
adlr@google.com3defe6a2009-12-04 20:57:17 +000034 void ActionCompleted(ActionProcessor* processor,
35 AbstractAction* action,
Darin Petkovc1a8b422010-07-19 11:34:49 -070036 ActionExitCode code) {
adlr@google.com3defe6a2009-12-04 20:57:17 +000037 if (action->Type() == OmahaResponseHandlerAction::StaticType()) {
Darin Petkovc1a8b422010-07-19 11:34:49 -070038 code_ = code;
39 code_set_ = true;
adlr@google.com3defe6a2009-12-04 20:57:17 +000040 }
41 }
Darin Petkovc1a8b422010-07-19 11:34:49 -070042 ActionExitCode code_;
43 bool code_set_;
adlr@google.com3defe6a2009-12-04 20:57:17 +000044};
45
46namespace {
47const string kLongName =
48 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
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 "-the_update_a.b.c.d_DELTA_.tgz";
56} // namespace {}
57
Darin Petkov6a5b3222010-07-13 14:55:28 -070058bool OmahaResponseHandlerActionTest::DoTest(const OmahaResponse& in,
adlr@google.com3defe6a2009-12-04 20:57:17 +000059 const string& boot_dev,
60 InstallPlan* out) {
61 ActionProcessor processor;
62 OmahaResponseHandlerActionProcessorDelegate delegate;
63 processor.set_delegate(&delegate);
64
Darin Petkov6a5b3222010-07-13 14:55:28 -070065 ObjectFeederAction<OmahaResponse> feeder_action;
adlr@google.com3defe6a2009-12-04 20:57:17 +000066 feeder_action.set_obj(in);
Darin Petkov73058b42010-10-06 16:32:19 -070067 PrefsMock prefs;
68 if (in.update_exists) {
69 EXPECT_CALL(prefs, SetString(kPrefsUpdateCheckResponseHash, in.hash))
70 .WillOnce(Return(true));
71 }
72 OmahaResponseHandlerAction response_handler_action(&prefs);
adlr@google.com3defe6a2009-12-04 20:57:17 +000073 response_handler_action.set_boot_device(boot_dev);
74 BondActions(&feeder_action, &response_handler_action);
75 ObjectCollectorAction<InstallPlan> collector_action;
76 BondActions(&response_handler_action, &collector_action);
77 processor.EnqueueAction(&feeder_action);
78 processor.EnqueueAction(&response_handler_action);
79 processor.EnqueueAction(&collector_action);
80 processor.StartProcessing();
81 EXPECT_TRUE(!processor.IsRunning())
82 << "Update test to handle non-asynch actions";
83 if (out)
84 *out = collector_action.object();
Darin Petkovc1a8b422010-07-19 11:34:49 -070085 EXPECT_TRUE(delegate.code_set_);
86 return delegate.code_ == kActionCodeSuccess;
adlr@google.com3defe6a2009-12-04 20:57:17 +000087}
88
89TEST_F(OmahaResponseHandlerActionTest, SimpleTest) {
90 {
Darin Petkov6a5b3222010-07-13 14:55:28 -070091 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +000092 in.update_exists = true;
93 in.display_version = "a.b.c.d";
Andrew de los Reyes63b96d72010-05-10 13:08:54 -070094 in.codebase = "http://foo/the_update_a.b.c.d.tgz";
adlr@google.com3defe6a2009-12-04 20:57:17 +000095 in.more_info_url = "http://more/info";
96 in.hash = "HASH+";
97 in.size = 12;
98 in.needs_admin = true;
99 in.prompt = false;
Andrew de los Reyes3270f742010-07-15 22:28:14 -0700100 in.is_delta = false;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000101 InstallPlan install_plan;
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700102 EXPECT_TRUE(DoTest(in, "/dev/sda3", &install_plan));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000103 EXPECT_TRUE(install_plan.is_full_update);
104 EXPECT_EQ(in.codebase, install_plan.download_url);
105 EXPECT_EQ(in.hash, install_plan.download_hash);
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700106 EXPECT_EQ("/dev/sda5", install_plan.install_path);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000107 }
108 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700109 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000110 in.update_exists = true;
111 in.display_version = "a.b.c.d";
Andrew de los Reyes63b96d72010-05-10 13:08:54 -0700112 in.codebase = "http://foo/the_update_a.b.c.d.tgz";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000113 in.more_info_url = "http://more/info";
114 in.hash = "HASHj+";
115 in.size = 12;
116 in.needs_admin = true;
117 in.prompt = true;
Andrew de los Reyes3270f742010-07-15 22:28:14 -0700118 in.is_delta = true;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000119 InstallPlan install_plan;
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700120 EXPECT_TRUE(DoTest(in, "/dev/sda5", &install_plan));
Andrew de los Reyes3270f742010-07-15 22:28:14 -0700121 EXPECT_FALSE(install_plan.is_full_update);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000122 EXPECT_EQ(in.codebase, install_plan.download_url);
123 EXPECT_EQ(in.hash, install_plan.download_hash);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000124 EXPECT_EQ("/dev/sda3", install_plan.install_path);
125 }
126 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700127 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000128 in.update_exists = true;
129 in.display_version = "a.b.c.d";
130 in.codebase = kLongName;
131 in.more_info_url = "http://more/info";
132 in.hash = "HASHj+";
133 in.size = 12;
134 in.needs_admin = true;
135 in.prompt = true;
Andrew de los Reyes3270f742010-07-15 22:28:14 -0700136 in.is_delta = false;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000137 InstallPlan install_plan;
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700138 EXPECT_TRUE(DoTest(in, "/dev/sda3", &install_plan));
Andrew de los Reyes63b96d72010-05-10 13:08:54 -0700139 EXPECT_TRUE(install_plan.is_full_update);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000140 EXPECT_EQ(in.codebase, install_plan.download_url);
141 EXPECT_EQ(in.hash, install_plan.download_hash);
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700142 EXPECT_EQ("/dev/sda5", install_plan.install_path);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000143 }
144}
145
146TEST_F(OmahaResponseHandlerActionTest, NoUpdatesTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700147 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000148 in.update_exists = false;
149 InstallPlan install_plan;
150 EXPECT_FALSE(DoTest(in, "/dev/sda1", &install_plan));
151 EXPECT_FALSE(install_plan.is_full_update);
152 EXPECT_EQ("", install_plan.download_url);
153 EXPECT_EQ("", install_plan.download_hash);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000154 EXPECT_EQ("", install_plan.install_path);
155}
156
157} // namespace chromeos_update_engine