// 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 "mojo/common/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 mojo {
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(bool success) override {
    EXPECT_TRUE(success);
    ChildProcessHost::DidStart(success);
    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 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 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);
  MessagePipe mp;
  InterfaceRequest<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", false,
                              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
}  // namespace mojo
