Missed new files in last commit

Review URL: http://codereview.chromium.org/465067


git-svn-id: svn://chrome-svn/chromeos/trunk@336 06c00378-0e64-4dae-be16-12b19f9950a1
diff --git a/omaha_response_handler_action_unittest.cc b/omaha_response_handler_action_unittest.cc
new file mode 100644
index 0000000..0248daf
--- /dev/null
+++ b/omaha_response_handler_action_unittest.cc
@@ -0,0 +1,152 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <string>
+#include <gtest/gtest.h>
+#include "update_engine/omaha_response_handler_action.h"
+#include "update_engine/test_utils.h"
+#include "update_engine/utils.h"
+
+using std::string;
+
+namespace chromeos_update_engine {
+
+class OmahaResponseHandlerActionTest : public ::testing::Test {
+ public:
+  // Return true iff the OmahaResponseHandlerAction succeeded.
+  // If out is non-NULL, it's set w/ the response from the action.
+  bool DoTest(const UpdateCheckResponse& in,
+              const string& boot_dev,
+              InstallPlan* out);
+};
+
+class OmahaResponseHandlerActionProcessorDelegate
+    : public ActionProcessorDelegate {
+ public:
+  OmahaResponseHandlerActionProcessorDelegate()
+      : success_(false),
+        success_set_(false) {}
+  void ActionCompleted(ActionProcessor* processor,
+                       AbstractAction* action,
+                       bool success) {
+    if (action->Type() == OmahaResponseHandlerAction::StaticType()) {
+      success_ = success;
+      success_set_ = true;
+    }
+  }
+  bool success_;
+  bool success_set_;
+};
+
+namespace {
+const string kLongName =
+    "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
+    "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
+    "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
+    "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
+    "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
+    "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
+    "very_long_name_and_no_slashes-very_long_name_and_no_slashes"
+    "-the_update_a.b.c.d_DELTA_.tgz";
+}  // namespace {}
+
+bool OmahaResponseHandlerActionTest::DoTest(const UpdateCheckResponse& in,
+                                            const string& boot_dev,
+                                            InstallPlan* out) {
+  ActionProcessor processor;
+  OmahaResponseHandlerActionProcessorDelegate delegate;
+  processor.set_delegate(&delegate);
+
+  ObjectFeederAction<UpdateCheckResponse> feeder_action;
+  feeder_action.set_obj(in);
+  OmahaResponseHandlerAction response_handler_action;
+  response_handler_action.set_boot_device(boot_dev);
+  BondActions(&feeder_action, &response_handler_action);
+  ObjectCollectorAction<InstallPlan> collector_action;
+  BondActions(&response_handler_action, &collector_action);
+  processor.EnqueueAction(&feeder_action);
+  processor.EnqueueAction(&response_handler_action);
+  processor.EnqueueAction(&collector_action);
+  processor.StartProcessing();
+  EXPECT_TRUE(!processor.IsRunning())
+      << "Update test to handle non-asynch actions";
+  if (out)
+    *out = collector_action.object();
+  EXPECT_TRUE(delegate.success_set_);
+  return delegate.success_;
+}
+
+TEST_F(OmahaResponseHandlerActionTest, SimpleTest) {
+  {
+    UpdateCheckResponse in;
+    in.update_exists = true;
+    in.display_version = "a.b.c.d";
+    in.codebase = "http://foo/the_update_a.b.c.d_FULL_.tgz";
+    in.more_info_url = "http://more/info";
+    in.hash = "HASH+";
+    in.size = 12;
+    in.needs_admin = true;
+    in.prompt = false;
+    InstallPlan install_plan;
+    EXPECT_TRUE(DoTest(in, "/dev/sda1", &install_plan));
+    EXPECT_TRUE(install_plan.is_full_update);
+    EXPECT_EQ(in.codebase, install_plan.download_url);
+    EXPECT_EQ(in.hash, install_plan.download_hash);
+    EXPECT_EQ(utils::kStatefulPartition + "/the_update_a.b.c.d_FULL_.tgz",
+              install_plan.download_path);
+    EXPECT_EQ("/dev/sda2", install_plan.install_path);
+  }
+  {
+    UpdateCheckResponse in;
+    in.update_exists = true;
+    in.display_version = "a.b.c.d";
+    in.codebase = "http://foo/the_update_a.b.c.d_DELTA_.tgz";
+    in.more_info_url = "http://more/info";
+    in.hash = "HASHj+";
+    in.size = 12;
+    in.needs_admin = true;
+    in.prompt = true;
+    InstallPlan install_plan;
+    EXPECT_TRUE(DoTest(in, "/dev/sda4", &install_plan));
+    EXPECT_FALSE(install_plan.is_full_update);
+    EXPECT_EQ(in.codebase, install_plan.download_url);
+    EXPECT_EQ(in.hash, install_plan.download_hash);
+    EXPECT_EQ(utils::kStatefulPartition + "/the_update_a.b.c.d_DELTA_.tgz",
+              install_plan.download_path);
+    EXPECT_EQ("/dev/sda3", install_plan.install_path);
+  }
+  {
+    UpdateCheckResponse in;
+    in.update_exists = true;
+    in.display_version = "a.b.c.d";
+    in.codebase = kLongName;
+    in.more_info_url = "http://more/info";
+    in.hash = "HASHj+";
+    in.size = 12;
+    in.needs_admin = true;
+    in.prompt = true;
+    InstallPlan install_plan;
+    EXPECT_TRUE(DoTest(in, "/dev/sda4", &install_plan));
+    EXPECT_FALSE(install_plan.is_full_update);
+    EXPECT_EQ(in.codebase, install_plan.download_url);
+    EXPECT_EQ(in.hash, install_plan.download_hash);
+    EXPECT_EQ(utils::kStatefulPartition + "/" + kLongName.substr(0, 255),
+              install_plan.download_path);
+    EXPECT_EQ("/dev/sda3", install_plan.install_path);
+  }
+}
+
+TEST_F(OmahaResponseHandlerActionTest, NoUpdatesTest) {
+  UpdateCheckResponse in;
+  in.update_exists = false;
+  InstallPlan install_plan;
+  EXPECT_FALSE(DoTest(in, "/dev/sda1", &install_plan));
+  EXPECT_FALSE(install_plan.is_full_update);
+  EXPECT_EQ("", install_plan.download_url);
+  EXPECT_EQ("", install_plan.download_hash);
+  EXPECT_EQ("", install_plan.download_path);
+  EXPECT_EQ("", install_plan.install_path);
+}
+
+}  // namespace chromeos_update_engine