// Copyright 2020 The Fuchsia 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 <fuchsia/sys/cpp/fidl.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include <lib/sys/cpp/service_directory.h>

#include <gtest/gtest.h>

#include "launcher.h"

namespace {

void TestSingleComponent(std::string url) {
  async::Loop loop(&kAsyncLoopConfigAttachToCurrentThread);
  auto svc = sys::ServiceDirectory::CreateFromNamespace();

  fuchsia::sys::LauncherPtr launcher;
  zx_status_t status = svc->Connect(launcher.NewRequest());
  ASSERT_EQ(ZX_OK, status);

  fuchsia::sys::LaunchInfo info{
      .url = std::move(url),
  };
  fuchsia::sys::ComponentControllerPtr controller;
  launcher->CreateComponent(std::move(info), controller.NewRequest());

  controller.events().OnTerminated = [&loop](int64_t code, fuchsia::sys::TerminationReason reason) {
    loop.Quit();
    ASSERT_EQ(0, code);
    ASSERT_EQ(fuchsia::sys::TerminationReason::EXITED, reason);
  };
  loop.Run();
}

}  // namespace

TEST(IntegrationTest, HlcppSync) {
  ASSERT_EQ(
      LaunchComponents("fuchsia-pkg://fuchsia.com/echo-hlcpp-client-sync#meta/echo-client.cmx",
                       "fuchsia-pkg://fuchsia.com/echo-hlcpp-server#meta/echo-server.cmx",
                       {"fuchsia.examples.Echo"}),
      0);
}

TEST(IntegrationTest, HlcppAsync) {
  ASSERT_EQ(LaunchComponents("fuchsia-pkg://fuchsia.com/echo-hlcpp-client#meta/echo-client.cmx",
                             "fuchsia-pkg://fuchsia.com/echo-hlcpp-server#meta/echo-server.cmx",
                             {"fuchsia.examples.Echo"}),
            0);
}

TEST(IntegrationTest, HlcppService) {
  TestSingleComponent("fuchsia-pkg://fuchsia.com/echo-hlcpp-service-client#meta/echo-client.cmx");
}

TEST(IntegrationTest, HlcppMultipleClients) {
  ASSERT_EQ(
      LaunchComponents("fuchsia-pkg://fuchsia.com/echo-hlcpp-multi-client#meta/echo-client.cmx",
                       "fuchsia-pkg://fuchsia.com/echo-hlcpp-multi-server#meta/echo-server.cmx",
                       {"fuchsia.examples.Echo"}),
      0);
}

TEST(IntegrationTest, HlcppPipelining) {
  ASSERT_EQ(
      LaunchComponents("fuchsia-pkg://fuchsia.com/echo-launcher-hlcpp-client#meta/echo-client.cmx",
                       "fuchsia-pkg://fuchsia.com/echo-launcher-hlcpp-server#meta/echo-server.cmx",
                       {"fuchsia.examples.EchoLauncher"}),
      0);
}

TEST(IntegrationTest, LlcppAsync) {
  ASSERT_EQ(LaunchComponents("fuchsia-pkg://fuchsia.com/echo-llcpp-client#meta/echo-client.cmx",
                             "fuchsia-pkg://fuchsia.com/echo-llcpp-server#meta/echo-server.cmx",
                             {"fuchsia.examples.Echo"}),
            0);
}

TEST(IntegrationTest, LlcppSync) {
  ASSERT_EQ(
      LaunchComponents("fuchsia-pkg://fuchsia.com/echo-llcpp-client-sync#meta/echo-client.cmx",
                       "fuchsia-pkg://fuchsia.com/echo-llcpp-server#meta/echo-server.cmx",
                       {"fuchsia.examples.Echo"}),
      0);
}

TEST(IntegrationTest, LlcppService) {
  TestSingleComponent("fuchsia-pkg://fuchsia.com/echo-llcpp-service-client#meta/echo-client.cmx");
}

TEST(IntegrationTest, LlcppPipelining) {
  ASSERT_EQ(
      LaunchComponents("fuchsia-pkg://fuchsia.com/echo-launcher-llcpp-client#meta/echo-client.cmx",
                       "fuchsia-pkg://fuchsia.com/echo-launcher-llcpp-server#meta/echo-server.cmx",
                       {"fuchsia.examples.EchoLauncher"}),
      0);
}

TEST(IntegrationTest, LlcppAsyncCompleter) {
  ASSERT_EQ(
      LaunchComponents("fuchsia-pkg://fuchsia.com/echo-llcpp-client-async#meta/echo-client.cmx",
                       "fuchsia-pkg://fuchsia.com/echo-llcpp-server-async#meta/echo-server.cmx",
                       {"fuchsia.examples.Echo"}),
      0);
}

TEST(IntegrationTest, RustAsync) {
  ASSERT_EQ(LaunchComponents("fuchsia-pkg://fuchsia.com/echo-rust-client#meta/echo-client.cmx",
                             "fuchsia-pkg://fuchsia.com/echo-rust-server#meta/echo-server.cmx",
                             {"fuchsia.examples.Echo"}),
            0);
}

TEST(IntegrationTest, RustSync) {
  ASSERT_EQ(LaunchComponents("fuchsia-pkg://fuchsia.com/echo-rust-client-sync#meta/echo-client.cmx",
                             "fuchsia-pkg://fuchsia.com/echo-rust-server#meta/echo-server.cmx",
                             {"fuchsia.examples.Echo"}),
            0);
}

TEST(IntegrationTest, RustService) {
  TestSingleComponent("fuchsia-pkg://fuchsia.com/echo-rust-service-client#meta/echo-client.cmx");
}

TEST(IntegrationTest, RustPipelining) {
  ASSERT_EQ(
      LaunchComponents("fuchsia-pkg://fuchsia.com/echo-launcher-rust-client#meta/echo-client.cmx",
                       "fuchsia-pkg://fuchsia.com/echo-launcher-rust-server#meta/echo-server.cmx",
                       {"fuchsia.examples.EchoLauncher"}),
      0);
}

TEST(IntegrationTest, GoSync) {
  ASSERT_EQ(LaunchComponents("fuchsia-pkg://fuchsia.com/echo-go-client#meta/echo-client.cmx",
                             "fuchsia-pkg://fuchsia.com/echo-go-server#meta/echo-server.cmx",
                             {"fuchsia.examples.Echo"}),
            0);
}

TEST(IntegrationTest, GoPipelining) {
  ASSERT_EQ(
      LaunchComponents("fuchsia-pkg://fuchsia.com/echo-launcher-go-client#meta/echo-client.cmx",
                       "fuchsia-pkg://fuchsia.com/echo-launcher-go-server#meta/echo-server.cmx",
                       {"fuchsia.examples.EchoLauncher"}),
      0);
}

TEST(IntegrationTest, DartAsync) {
  ASSERT_EQ(LaunchComponents("fuchsia-pkg://fuchsia.com/echo-dart-client#meta/echo-dart-client.cmx",
                             "fuchsia-pkg://fuchsia.com/echo-dart-server#meta/echo-dart-server.cmx",
                             {"fuchsia.examples.Echo"}),
            0);
}

TEST(IntegrationTest, DartPipelining) {
  ASSERT_EQ(
      LaunchComponents(
          "fuchsia-pkg://fuchsia.com/echo-launcher-dart-client#meta/echo-launcher-dart-client.cmx",
          "fuchsia-pkg://fuchsia.com/echo-launcher-dart-server#meta/echo-launcher-dart-server.cmx",
          {"fuchsia.examples.EchoLauncher"}),
      0);
}
