blob: cdbc401d92b13d5e43c6b814424a3d9d3cce5cc4 [file] [log] [blame]
// Copyright (c) 2012 The Chromium OS 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 "cros-disks/glib_process.h"
#include <glib.h>
#include <base/bind.h>
#include <gtest/gtest.h>
namespace cros_disks {
class GlibProcessTest : public ::testing::Test {
public:
void OnProcessTerminated(GlibProcess* process) {
EXPECT_EQ(&process_, process);
callback_invoked_ = true;
g_main_loop_quit(main_loop_);
}
protected:
GlibProcessTest()
: callback_invoked_(false),
main_loop_(NULL),
timeout_id_(0) {
}
static gboolean OnTimeout(gpointer data) {
GMainLoop* main_loop = static_cast<GMainLoop*>(data);
g_main_loop_quit(main_loop);
return TRUE;
}
// Runs the Glib main loop and waits for the termination of the process
// under test. Returns true if the process termination callback is invoked.
bool WaitForProcessTermination(int64 timeout_in_seconds) {
callback_invoked_ = false;
main_loop_ = g_main_loop_new(g_main_context_default(), FALSE);
timeout_id_ = g_timeout_add_seconds(timeout_in_seconds,
&GlibProcessTest::OnTimeout,
main_loop_);
g_main_loop_run(main_loop_);
g_source_remove(timeout_id_);
timeout_id_ = 0;
g_main_loop_unref(main_loop_);
main_loop_ = NULL;
return callback_invoked_;
}
// Set to true once OnProcessTerminated() is invoked.
bool callback_invoked_;
GlibProcess process_;
GMainLoop* main_loop_;
guint timeout_id_;
};
TEST_F(GlibProcessTest, Start) {
process_.AddArgument("/bin/ls");
process_.set_callback(base::Bind(&GlibProcessTest::OnProcessTerminated,
base::Unretained(this)));
EXPECT_EQ(Process::kInvalidProcessId, process_.pid());
EXPECT_TRUE(process_.Start());
EXPECT_NE(Process::kInvalidProcessId, process_.pid());
EXPECT_TRUE(WaitForProcessTermination(10));
// Process ID should remain unchanged after process termination.
EXPECT_NE(Process::kInvalidProcessId, process_.pid());
}
} // namespace cros_disks