blob: 90cbed9108bd3bd02c5fe8baaae3c4966b7ad2ad [file] [log] [blame]
adlr@google.com3defe6a2009-12-04 20:57:17 +00001// Copyright (c) 2009 The Chromium Authors. All rights reserved.
2// 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>
6#include <gtest/gtest.h>
7#include "update_engine/omaha_response_handler_action.h"
8#include "update_engine/test_utils.h"
9#include "update_engine/utils.h"
10
11using std::string;
12
13namespace chromeos_update_engine {
14
15class OmahaResponseHandlerActionTest : public ::testing::Test {
16 public:
17 // Return true iff the OmahaResponseHandlerAction succeeded.
18 // If out is non-NULL, it's set w/ the response from the action.
Darin Petkov6a5b3222010-07-13 14:55:28 -070019 bool DoTest(const OmahaResponse& in,
adlr@google.com3defe6a2009-12-04 20:57:17 +000020 const string& boot_dev,
21 InstallPlan* out);
22};
23
24class OmahaResponseHandlerActionProcessorDelegate
25 : public ActionProcessorDelegate {
26 public:
27 OmahaResponseHandlerActionProcessorDelegate()
Darin Petkovc1a8b422010-07-19 11:34:49 -070028 : code_(kActionCodeError),
29 code_set_(false) {}
adlr@google.com3defe6a2009-12-04 20:57:17 +000030 void ActionCompleted(ActionProcessor* processor,
31 AbstractAction* action,
Darin Petkovc1a8b422010-07-19 11:34:49 -070032 ActionExitCode code) {
adlr@google.com3defe6a2009-12-04 20:57:17 +000033 if (action->Type() == OmahaResponseHandlerAction::StaticType()) {
Darin Petkovc1a8b422010-07-19 11:34:49 -070034 code_ = code;
35 code_set_ = true;
adlr@google.com3defe6a2009-12-04 20:57:17 +000036 }
37 }
Darin Petkovc1a8b422010-07-19 11:34:49 -070038 ActionExitCode code_;
39 bool code_set_;
adlr@google.com3defe6a2009-12-04 20:57:17 +000040};
41
42namespace {
43const string kLongName =
44 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
45 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
46 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
47 "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
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 "-the_update_a.b.c.d_DELTA_.tgz";
52} // namespace {}
53
Darin Petkov6a5b3222010-07-13 14:55:28 -070054bool OmahaResponseHandlerActionTest::DoTest(const OmahaResponse& in,
adlr@google.com3defe6a2009-12-04 20:57:17 +000055 const string& boot_dev,
56 InstallPlan* out) {
57 ActionProcessor processor;
58 OmahaResponseHandlerActionProcessorDelegate delegate;
59 processor.set_delegate(&delegate);
60
Darin Petkov6a5b3222010-07-13 14:55:28 -070061 ObjectFeederAction<OmahaResponse> feeder_action;
adlr@google.com3defe6a2009-12-04 20:57:17 +000062 feeder_action.set_obj(in);
63 OmahaResponseHandlerAction response_handler_action;
64 response_handler_action.set_boot_device(boot_dev);
65 BondActions(&feeder_action, &response_handler_action);
66 ObjectCollectorAction<InstallPlan> collector_action;
67 BondActions(&response_handler_action, &collector_action);
68 processor.EnqueueAction(&feeder_action);
69 processor.EnqueueAction(&response_handler_action);
70 processor.EnqueueAction(&collector_action);
71 processor.StartProcessing();
72 EXPECT_TRUE(!processor.IsRunning())
73 << "Update test to handle non-asynch actions";
74 if (out)
75 *out = collector_action.object();
Darin Petkovc1a8b422010-07-19 11:34:49 -070076 EXPECT_TRUE(delegate.code_set_);
77 return delegate.code_ == kActionCodeSuccess;
adlr@google.com3defe6a2009-12-04 20:57:17 +000078}
79
80TEST_F(OmahaResponseHandlerActionTest, SimpleTest) {
81 {
Darin Petkov6a5b3222010-07-13 14:55:28 -070082 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +000083 in.update_exists = true;
84 in.display_version = "a.b.c.d";
Andrew de los Reyes63b96d72010-05-10 13:08:54 -070085 in.codebase = "http://foo/the_update_a.b.c.d.tgz";
adlr@google.com3defe6a2009-12-04 20:57:17 +000086 in.more_info_url = "http://more/info";
87 in.hash = "HASH+";
88 in.size = 12;
89 in.needs_admin = true;
90 in.prompt = false;
Andrew de los Reyes3270f742010-07-15 22:28:14 -070091 in.is_delta = false;
adlr@google.com3defe6a2009-12-04 20:57:17 +000092 InstallPlan install_plan;
Andrew de los Reyesf98bff82010-05-06 13:33:25 -070093 EXPECT_TRUE(DoTest(in, "/dev/sda3", &install_plan));
adlr@google.com3defe6a2009-12-04 20:57:17 +000094 EXPECT_TRUE(install_plan.is_full_update);
95 EXPECT_EQ(in.codebase, install_plan.download_url);
96 EXPECT_EQ(in.hash, install_plan.download_hash);
Andrew de los Reyesf98bff82010-05-06 13:33:25 -070097 EXPECT_EQ("/dev/sda5", install_plan.install_path);
adlr@google.com3defe6a2009-12-04 20:57:17 +000098 }
99 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700100 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000101 in.update_exists = true;
102 in.display_version = "a.b.c.d";
Andrew de los Reyes63b96d72010-05-10 13:08:54 -0700103 in.codebase = "http://foo/the_update_a.b.c.d.tgz";
adlr@google.com3defe6a2009-12-04 20:57:17 +0000104 in.more_info_url = "http://more/info";
105 in.hash = "HASHj+";
106 in.size = 12;
107 in.needs_admin = true;
108 in.prompt = true;
Andrew de los Reyes3270f742010-07-15 22:28:14 -0700109 in.is_delta = true;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000110 InstallPlan install_plan;
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700111 EXPECT_TRUE(DoTest(in, "/dev/sda5", &install_plan));
Andrew de los Reyes3270f742010-07-15 22:28:14 -0700112 EXPECT_FALSE(install_plan.is_full_update);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000113 EXPECT_EQ(in.codebase, install_plan.download_url);
114 EXPECT_EQ(in.hash, install_plan.download_hash);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000115 EXPECT_EQ("/dev/sda3", install_plan.install_path);
116 }
117 {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700118 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000119 in.update_exists = true;
120 in.display_version = "a.b.c.d";
121 in.codebase = kLongName;
122 in.more_info_url = "http://more/info";
123 in.hash = "HASHj+";
124 in.size = 12;
125 in.needs_admin = true;
126 in.prompt = true;
Andrew de los Reyes3270f742010-07-15 22:28:14 -0700127 in.is_delta = false;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000128 InstallPlan install_plan;
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700129 EXPECT_TRUE(DoTest(in, "/dev/sda3", &install_plan));
Andrew de los Reyes63b96d72010-05-10 13:08:54 -0700130 EXPECT_TRUE(install_plan.is_full_update);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000131 EXPECT_EQ(in.codebase, install_plan.download_url);
132 EXPECT_EQ(in.hash, install_plan.download_hash);
Andrew de los Reyesf98bff82010-05-06 13:33:25 -0700133 EXPECT_EQ("/dev/sda5", install_plan.install_path);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000134 }
135}
136
137TEST_F(OmahaResponseHandlerActionTest, NoUpdatesTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700138 OmahaResponse in;
adlr@google.com3defe6a2009-12-04 20:57:17 +0000139 in.update_exists = false;
140 InstallPlan install_plan;
141 EXPECT_FALSE(DoTest(in, "/dev/sda1", &install_plan));
142 EXPECT_FALSE(install_plan.is_full_update);
143 EXPECT_EQ("", install_plan.download_url);
144 EXPECT_EQ("", install_plan.download_hash);
adlr@google.com3defe6a2009-12-04 20:57:17 +0000145 EXPECT_EQ("", install_plan.install_path);
146}
147
148} // namespace chromeos_update_engine