Index: src/platform/update_engine/subprocess_unittest.cc |
diff --git a/src/platform/update_engine/subprocess_unittest.cc b/src/platform/update_engine/subprocess_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..430f39b60408d41fcd117f197c18b50870b64d22 |
--- /dev/null |
+++ b/src/platform/update_engine/subprocess_unittest.cc |
@@ -0,0 +1,115 @@ |
+// 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 <sys/stat.h> |
+#include <sys/types.h> |
+#include <unistd.h> |
+#include <string> |
+#include <vector> |
+#include "base/string_util.h" |
+#include <glib.h> |
+#include <gtest/gtest.h> |
+#include "update_engine/subprocess.h" |
+#include "update_engine/test_utils.h" |
+#include "update_engine/utils.h" |
+ |
+using std::string; |
+using std::vector; |
+ |
+namespace chromeos_update_engine { |
+ |
+class SubprocessTest : public ::testing::Test { |
+ protected: |
+ bool callback_done; |
+}; |
+ |
+namespace { |
+const int kLocalHttpPort = 8080; |
+ |
+void Callback(int return_code, void *p) { |
+ EXPECT_EQ(256, return_code); |
+ GMainLoop* loop = reinterpret_cast<GMainLoop*>(p); |
+ g_main_loop_quit(loop); |
+} |
+ |
+gboolean LaunchFalseInMainLoop(gpointer data) { |
+ vector<string> cmd; |
+ cmd.push_back("/bin/false"); |
+ Subprocess::Get().Exec(cmd, Callback, data); |
+ return FALSE; |
+} |
+} // namespace {} |
+ |
+TEST(SubprocessTest, SimpleTest) { |
+ GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE); |
+ g_timeout_add(0, &LaunchFalseInMainLoop, loop); |
+ g_main_loop_run(loop); |
+ g_main_loop_unref(loop); |
+} |
+ |
+namespace { |
+void CallbackBad(int return_code, void *p) { |
+ CHECK(false) << "should never be called."; |
+} |
+ |
+struct CancelTestData { |
+ bool spawned; |
+ GMainLoop *loop; |
+}; |
+ |
+gboolean StartAndCancelInRunLoop(gpointer data) { |
+ CancelTestData* cancel_test_data = reinterpret_cast<CancelTestData*>(data); |
+ vector<string> cmd; |
+ cmd.push_back("./test_http_server"); |
+ uint32 tag = Subprocess::Get().Exec(cmd, CallbackBad, NULL); |
+ EXPECT_NE(0, tag); |
+ cancel_test_data->spawned = true; |
+ printf("spawned\n"); |
+ // Wait for server to be up and running |
+ for (;;) { |
+ int status = |
+ System(StringPrintf("wget -O /dev/null http://127.0.0.1:%d/foo", |
+ kLocalHttpPort)); |
+ EXPECT_NE(-1, status) << "system() failed"; |
+ EXPECT_TRUE(WIFEXITED(status)) |
+ << "command failed to run or died abnormally"; |
+ if (0 == WEXITSTATUS(status)) |
+ break; |
+ usleep(100 * 1000); // 100 ms |
+ } |
+ Subprocess::Get().CancelExec(tag); |
+ return FALSE; |
+} |
+} // namespace {} |
+ |
+gboolean ExitWhenDone(gpointer data) { |
+ CancelTestData* cancel_test_data = reinterpret_cast<CancelTestData*>(data); |
+ if (cancel_test_data->spawned && !Subprocess::Get().SubprocessInFlight()) { |
+ // tear down the sub process |
+ printf("tear down time\n"); |
+ int status = |
+ System(StringPrintf("wget http://127.0.0.1:%d/quitquitquit", |
+ kLocalHttpPort)); |
+ EXPECT_NE(-1, status) << "system() failed"; |
+ EXPECT_TRUE(WIFEXITED(status)) |
+ << "command failed to run or died abnormally"; |
+ g_main_loop_quit(cancel_test_data->loop); |
+ return FALSE; |
+ } |
+ return TRUE; |
+} |
+ |
+TEST(SubprocessTest, CancelTest) { |
+ GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE); |
+ CancelTestData cancel_test_data; |
+ cancel_test_data.spawned = false; |
+ cancel_test_data.loop = loop; |
+ g_timeout_add(100, &StartAndCancelInRunLoop, &cancel_test_data); |
+ g_timeout_add(10, &ExitWhenDone, &cancel_test_data); |
+ g_main_loop_run(loop); |
+ g_main_loop_unref(loop); |
+ printf("here\n"); |
+} |
+ |
+} // namespace chromeos_update_engine |