Start action processing asynchronously in UpdateAttempter.

This is done so that we unblock the event loop on dbus calls.

BUG=chromium-os:12758
TEST=unit tests, tested updating the device

Change-Id: I38d9869afb392264a020fc6c653a20622fd38ada

Review URL: http://codereview.chromium.org/6624082
diff --git a/update_attempter_unittest.cc b/update_attempter_unittest.cc
index 76068fd..73addb5 100644
--- a/update_attempter_unittest.cc
+++ b/update_attempter_unittest.cc
@@ -39,7 +39,7 @@
 
 class UpdateAttempterTest : public ::testing::Test {
  protected:
-  UpdateAttempterTest() : attempter_(&dbus_) {}
+  UpdateAttempterTest() : attempter_(&dbus_), loop_(NULL) {}
   virtual void SetUp() {
     EXPECT_EQ(NULL, attempter_.dbus_service_);
     EXPECT_EQ(NULL, attempter_.prefs_);
@@ -60,10 +60,16 @@
     attempter_.prefs_ = &prefs_;
   }
 
+  void UpdateTestStart();
+  void UpdateTestVerify();
+  static gboolean StaticUpdateTestStart(gpointer data);
+  static gboolean StaticUpdateTestVerify(gpointer data);
+
   MockDbusGlib dbus_;
   UpdateAttempterUnderTest attempter_;
   ActionProcessorMock* processor_;
   NiceMock<PrefsMock> prefs_;
+  GMainLoop* loop_;
 };
 
 TEST_F(UpdateAttempterTest, ActionCompletedDownloadTest) {
@@ -227,22 +233,35 @@
                UpdateStatusToString(static_cast<UpdateStatus>(-1)));
 }
 
-TEST_F(UpdateAttempterTest, UpdateTest) {
+gboolean UpdateAttempterTest::StaticUpdateTestStart(gpointer data) {
+  reinterpret_cast<UpdateAttempterTest*>(data)->UpdateTestStart();
+  return FALSE;
+}
+
+gboolean UpdateAttempterTest::StaticUpdateTestVerify(gpointer data) {
+  reinterpret_cast<UpdateAttempterTest*>(data)->UpdateTestVerify();
+  return FALSE;
+}
+
+namespace {
+const string kActionTypes[] = {
+  OmahaRequestAction::StaticType(),
+  OmahaResponseHandlerAction::StaticType(),
+  FilesystemCopierAction::StaticType(),
+  FilesystemCopierAction::StaticType(),
+  OmahaRequestAction::StaticType(),
+  DownloadAction::StaticType(),
+  OmahaRequestAction::StaticType(),
+  FilesystemCopierAction::StaticType(),
+  FilesystemCopierAction::StaticType(),
+  PostinstallRunnerAction::StaticType(),
+  OmahaRequestAction::StaticType()
+};
+}  // namespace {}
+
+void UpdateAttempterTest::UpdateTestStart() {
   attempter_.set_http_response_code(200);
   InSequence s;
-  const string kActionTypes[] = {
-    OmahaRequestAction::StaticType(),
-    OmahaResponseHandlerAction::StaticType(),
-    FilesystemCopierAction::StaticType(),
-    FilesystemCopierAction::StaticType(),
-    OmahaRequestAction::StaticType(),
-    DownloadAction::StaticType(),
-    OmahaRequestAction::StaticType(),
-    FilesystemCopierAction::StaticType(),
-    FilesystemCopierAction::StaticType(),
-    PostinstallRunnerAction::StaticType(),
-    OmahaRequestAction::StaticType()
-  };
   for (size_t i = 0; i < arraysize(kActionTypes); ++i) {
     EXPECT_CALL(*processor_,
                 EnqueueAction(Property(&AbstractAction::Type,
@@ -251,7 +270,10 @@
   EXPECT_CALL(*processor_, StartProcessing()).Times(1);
 
   attempter_.Update("", "", false);
+  g_idle_add(&StaticUpdateTestVerify, this);
+}
 
+void UpdateAttempterTest::UpdateTestVerify() {
   EXPECT_EQ(0, attempter_.http_response_code());
   EXPECT_EQ(&attempter_, processor_->delegate());
   EXPECT_EQ(arraysize(kActionTypes), attempter_.actions_.size());
@@ -265,6 +287,15 @@
   ASSERT_TRUE(download_action != NULL);
   EXPECT_EQ(&attempter_, download_action->delegate());
   EXPECT_EQ(UPDATE_STATUS_CHECKING_FOR_UPDATE, attempter_.status());
+  g_main_loop_quit(loop_);
+}
+
+TEST_F(UpdateAttempterTest, UpdateTest) {
+  loop_ = g_main_loop_new(g_main_context_default(), FALSE);
+  g_idle_add(&StaticUpdateTestStart, this);
+  g_main_loop_run(loop_);
+  g_main_loop_unref(loop_);
+  loop_ = NULL;
 }
 
 }  // namespace chromeos_update_engine