// 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 <stdint.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_(nullptr),
        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_t 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_ = nullptr;

    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
