// Copyright 2014 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.

// Note: This file also partly tests child_main.*.

#include "shell/child_process_host.h"

#include "base/logging.h"
#include "base/macros.h"
#include "base/message_loop/message_loop.h"
#include "build/build_config.h"
#include "mojo/message_pump/message_pump_mojo.h"
#include "mojo/public/c/system/types.h"
#include "mojo/public/cpp/system/message_pipe.h"
#include "shell/context.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace shell {
namespace {

// Subclass just so we can observe |DidStart()|.
class TestChildProcessHost : public ChildProcessHost {
 public:
  explicit TestChildProcessHost(Context* context) : ChildProcessHost(context) {}
  ~TestChildProcessHost() override {}

  void DidStart(base::Process child_process) override {
    EXPECT_TRUE(child_process.IsValid());
    ChildProcessHost::DidStart(child_process.Pass());
    base::MessageLoop::current()->QuitWhenIdle();
  }

 private:
  DISALLOW_COPY_AND_ASSIGN(TestChildProcessHost);
};

#if defined(OS_ANDROID)
// TODO(qsr): Multiprocess shell tests are not supported on android.
#define MAYBE_StartJoin DISABLED_StartJoin
#else
#define MAYBE_StartJoin StartJoin
#endif  // defined(OS_ANDROID)
// Just tests starting the child process and joining it (without starting an
// app).
TEST(ChildProcessHostTest, MAYBE_StartJoin) {
  Context context;
  base::MessageLoop message_loop(
      scoped_ptr<base::MessagePump>(new mojo::common::MessagePumpMojo()));
  context.Init();
  TestChildProcessHost child_process_host(&context);
  child_process_host.Start();
  message_loop.Run();  // This should run until |DidStart()|.
  child_process_host.ExitNow(123);
  int exit_code = child_process_host.Join();
  VLOG(2) << "Joined child: exit_code = " << exit_code;
  EXPECT_EQ(123, exit_code);

  context.Shutdown();
}

#if defined(OS_ANDROID)
// TODO(qsr): Multiprocess shell tests are not supported on android.
#define MAYBE_ConnectionError DISABLED_ConnectionError
#else
#define MAYBE_ConnectionError ConnectionError
#endif  // defined(OS_ANDROID)
// Tests that even on connection error, the callback to |StartApp()| will get
// called.
TEST(ChildProcessHostTest, MAYBE_ConnectionError) {
  Context context;
  base::MessageLoop message_loop(
      scoped_ptr<base::MessagePump>(new mojo::common::MessagePumpMojo()));
  context.Init();
  TestChildProcessHost child_process_host(&context);
  child_process_host.Start();
  message_loop.Run();  // This should run until |DidStart()|.
  // Send |ExitNow()| first, so that the |StartApp()| below won't actually be
  // processed, and we'll just get a connection error.
  child_process_host.ExitNow(123);
  mojo::MessagePipe mp;
  mojo::InterfaceRequest<mojo::Application> application_request;
  application_request.Bind(mp.handle0.Pass());
  // This won't actually be called, but the callback should be run.
  MojoResult result = MOJO_RESULT_INTERNAL;
  child_process_host.StartApp("/does_not_exist/cbvgyuio",
                              application_request.Pass(), [&result](int32_t r) {
                                result = r;
                                base::MessageLoop::current()->QuitWhenIdle();
                              });
  message_loop.Run();
  EXPECT_EQ(MOJO_RESULT_UNKNOWN, result);
  int exit_code = child_process_host.Join();
  VLOG(2) << "Joined child: exit_code = " << exit_code;
  EXPECT_EQ(123, exit_code);

  context.Shutdown();
}

}  // namespace
}  // namespace shell
