// Copyright 2018 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 "src/sys/run_test_component/run_test_component.h"

#include <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include <lib/syslog/logger.h>

#include <string>

#include <gmock/gmock.h>
#include <gtest/gtest.h>

#include "src/lib/fxl/strings/string_printf.h"
#include "src/lib/fxl/strings/substitute.h"

namespace run {
namespace {

TEST(RunTest, ParseArgs) {
  async::Loop loop(&kAsyncLoopConfigAttachToCurrentThread);
  auto env_services = sys::ServiceDirectory::CreateFromNamespace();
  constexpr char kBinName[] = "bin_name";

  constexpr char component_url[] = "fuchsia-pkg://fuchsia.com/component_hello_world#meta/hello.cmx";
  {
    std::vector<const char*> argv = {kBinName, component_url};
    int argc = static_cast<int>(argv.size());
    auto result = ParseArgs(env_services, argc, argv.data());
    EXPECT_FALSE(result.error) << result.error_msg;
    EXPECT_EQ(component_url, result.launch_info.url);
    EXPECT_EQ(0u, result.launch_info.arguments->size());
    EXPECT_EQ(0u, result.matching_urls.size());
    EXPECT_EQ("", result.realm_label);
    EXPECT_EQ(-1, result.timeout);
    EXPECT_EQ(FX_LOG_TRACE, result.min_log_severity);
  }

  {
    std::vector<const char*> argv = {kBinName, component_url, "--", "myarg1", "myarg2"};
    int argc = static_cast<int>(argv.size());
    auto result = ParseArgs(env_services, argc, argv.data());
    EXPECT_FALSE(result.error) << result.error_msg;
    EXPECT_EQ(component_url, result.launch_info.url);
    ASSERT_TRUE(result.launch_info.arguments.has_value());
    EXPECT_EQ(2u, result.launch_info.arguments->size());
    EXPECT_EQ(argv[argc - 2], result.launch_info.arguments->at(0));
    EXPECT_EQ(argv[argc - 1], result.launch_info.arguments->at(1));
    EXPECT_EQ("", result.realm_label);
    EXPECT_EQ(-1, result.timeout);
    EXPECT_EQ(FX_LOG_TRACE, result.min_log_severity);
  }

  {
    std::vector<const char*> argv = {
        kBinName, "--realm-label=kittens", component_url, "--", "myarg1", "myarg2"};
    int argc = static_cast<int>(argv.size());
    auto result = ParseArgs(env_services, argc, argv.data());
    EXPECT_FALSE(result.error) << result.error_msg;
    EXPECT_EQ(component_url, result.launch_info.url);
    ASSERT_TRUE(result.launch_info.arguments.has_value());
    EXPECT_EQ(2u, result.launch_info.arguments->size());
    EXPECT_EQ(argv[argc - 2], result.launch_info.arguments->at(0));
    EXPECT_EQ(argv[argc - 1], result.launch_info.arguments->at(1));
    EXPECT_EQ("kittens", result.realm_label);
    EXPECT_EQ(-1, result.timeout);
    EXPECT_EQ(FX_LOG_TRACE, result.min_log_severity);
  }

  {
    std::vector<const char*> argv = {
        kBinName, "--realm-label=kittens", "--timeout=30", component_url, "--", "myarg1", "myarg2"};
    int argc = static_cast<int>(argv.size());
    auto result = ParseArgs(env_services, argc, argv.data());
    EXPECT_FALSE(result.error) << result.error_msg;
    EXPECT_EQ(component_url, result.launch_info.url);
    ASSERT_TRUE(result.launch_info.arguments.has_value());
    EXPECT_EQ(2u, result.launch_info.arguments->size());
    EXPECT_EQ(argv[argc - 2], result.launch_info.arguments->at(0));
    EXPECT_EQ(argv[argc - 1], result.launch_info.arguments->at(1));
    EXPECT_EQ("kittens", result.realm_label);
    EXPECT_EQ(30, result.timeout);
    EXPECT_EQ(FX_LOG_TRACE, result.min_log_severity);
  }

  {
    std::vector<const char*> argv = {kBinName, "--timeout=-1", component_url,
                                     "--",     "myarg1",       "myarg2"};
    int argc = static_cast<int>(argv.size());
    auto result = ParseArgs(env_services, argc, argv.data());
    EXPECT_TRUE(result.error);
  }

  {
    std::vector<const char*> argv = {kBinName, "--timeout=invalid", component_url, "--", "myarg1",
                                     "myarg2"};
    int argc = static_cast<int>(argv.size());
    auto result = ParseArgs(env_services, argc, argv.data());
    EXPECT_TRUE(result.error);
  }

  {
    std::vector<const char*> argv = {kBinName, "--timeout=100", component_url,
                                     "--",     "myarg1",        "myarg2"};
    int argc = static_cast<int>(argv.size());
    auto result = ParseArgs(env_services, argc, argv.data());
    EXPECT_FALSE(result.error) << result.error_msg;
    EXPECT_EQ(component_url, result.launch_info.url);
    ASSERT_TRUE(result.launch_info.arguments.has_value());
    EXPECT_EQ(2u, result.launch_info.arguments->size());
    EXPECT_EQ(argv[argc - 2], result.launch_info.arguments->at(0));
    EXPECT_EQ(argv[argc - 1], result.launch_info.arguments->at(1));
    EXPECT_EQ("", result.realm_label);
    EXPECT_EQ(100, result.timeout);
  }

  // timeout out of range
  {
    std::vector<const char*> argv = {
        kBinName, "--timeout=3000000000", component_url, "--", "myarg1", "myarg2"};
    int argc = static_cast<int>(argv.size());
    auto result = ParseArgs(env_services, argc, argv.data());
    EXPECT_TRUE(result.error);
  }

  {
    std::vector<const char*> argv = {kBinName,
                                     "--realm-label=kittens",
                                     "--min-severity-logs=WARN",
                                     component_url,
                                     "--",
                                     "myarg1",
                                     "myarg2"};
    int argc = static_cast<int>(argv.size());
    auto result = ParseArgs(env_services, argc, argv.data());
    EXPECT_FALSE(result.error) << result.error_msg;
    EXPECT_EQ(component_url, result.launch_info.url);
    ASSERT_TRUE(result.launch_info.arguments.has_value());
    EXPECT_EQ(2u, result.launch_info.arguments->size());
    EXPECT_EQ(argv[argc - 2], result.launch_info.arguments->at(0));
    EXPECT_EQ(argv[argc - 1], result.launch_info.arguments->at(1));
    EXPECT_EQ("kittens", result.realm_label);
    EXPECT_EQ(FX_LOG_WARNING, result.min_log_severity);
  }

  {
    std::vector<const char*> argv = {kBinName,
                                     "--min-severity-logs=INFO",
                                     "--realm-label=kittens",
                                     component_url,
                                     "--",
                                     "myarg1",
                                     "myarg2"};
    int argc = static_cast<int>(argv.size());
    auto result = ParseArgs(env_services, argc, argv.data());
    EXPECT_FALSE(result.error) << result.error_msg;
    EXPECT_EQ(component_url, result.launch_info.url);
    ASSERT_TRUE(result.launch_info.arguments.has_value());
    EXPECT_EQ(2u, result.launch_info.arguments->size());
    EXPECT_EQ(argv[argc - 2], result.launch_info.arguments->at(0));
    EXPECT_EQ(argv[argc - 1], result.launch_info.arguments->at(1));
    EXPECT_EQ("kittens", result.realm_label);
    EXPECT_EQ(FX_LOG_INFO, result.min_log_severity);
  }

  {
    std::vector<const char*> argv = {
        kBinName, "--min-severity-logs=TRACE", component_url, "--", "myarg1", "myarg2"};
    int argc = static_cast<int>(argv.size());
    auto result = ParseArgs(env_services, argc, argv.data());
    EXPECT_FALSE(result.error) << result.error_msg;
    EXPECT_EQ(component_url, result.launch_info.url);
    ASSERT_TRUE(result.launch_info.arguments.has_value());
    EXPECT_EQ(2u, result.launch_info.arguments->size());
    EXPECT_EQ(argv[argc - 2], result.launch_info.arguments->at(0));
    EXPECT_EQ(argv[argc - 1], result.launch_info.arguments->at(1));
    EXPECT_EQ("", result.realm_label);
    EXPECT_EQ(FX_LOG_TRACE, result.min_log_severity);
  }

  {
    std::vector<const char*> argv = {
        kBinName, "--min-severity-logs=invalid", component_url, "--", "myarg1", "myarg2"};
    int argc = static_cast<int>(argv.size());
    auto result = ParseArgs(env_services, argc, argv.data());
    EXPECT_TRUE(result.error);
  }

  {
    std::vector<const char*> argv = {
        kBinName, "--max-log-severity=invalid", component_url, "--", "myarg1", "myarg2"};
    int argc = static_cast<int>(argv.size());
    auto result = ParseArgs(env_services, argc, argv.data());
    EXPECT_TRUE(result.error);
  }

  {
    std::vector<const char*> argv = {
        kBinName, "--max-log-severity=ERROR", component_url, "--", "myarg1", "myarg2"};
    int argc = static_cast<int>(argv.size());
    auto result = ParseArgs(env_services, argc, argv.data());
    EXPECT_FALSE(result.error) << result.error_msg;
    EXPECT_EQ(component_url, result.launch_info.url);
    ASSERT_TRUE(result.launch_info.arguments.has_value());
    EXPECT_EQ(2u, result.launch_info.arguments->size());
    EXPECT_EQ(argv[argc - 2], result.launch_info.arguments->at(0));
    EXPECT_EQ(argv[argc - 1], result.launch_info.arguments->at(1));
    EXPECT_EQ("", result.realm_label);
    EXPECT_EQ(FX_LOG_TRACE, result.min_log_severity);
    EXPECT_EQ(FX_LOG_ERROR, result.max_log_severity);
  }

  // check that for time being we can pass tets args without using option delimiter(--).
  {
    std::vector<const char*> argv = {kBinName, component_url, "myarg1", "myarg2"};
    int argc = static_cast<int>(argv.size());
    auto result = ParseArgs(env_services, argc, argv.data());
    EXPECT_FALSE(result.error) << result.error_msg;
    EXPECT_EQ(component_url, result.launch_info.url);
    ASSERT_TRUE(result.launch_info.arguments.has_value());
    EXPECT_EQ(2u, result.launch_info.arguments->size());
    EXPECT_EQ(argv[argc - 2], result.launch_info.arguments->at(0));
    EXPECT_EQ(argv[argc - 1], result.launch_info.arguments->at(1));
    EXPECT_EQ("", result.realm_label);
    EXPECT_EQ(-1, result.timeout);
    EXPECT_EQ(FX_LOG_TRACE, result.min_log_severity);
  }
}

TEST(UrlTest, SimplifiedUrl) {
  EXPECT_EQ("fuchsia-pkg://fuchsia.com/my-pkg#meta/my-component.cmx",
            run::GetSimplifiedUrl(
                "fuchsia-pkg://fuchsia.com/"
                "my-pkg?hash=3204f2f24920e55bfbcb9c3a058ec2869f229b18d00ef1049ec3f47e5b7e4351#"
                "meta/my-component.cmx"));

  EXPECT_EQ("fuchsia-pkg://fuchsia.com/my-pkg#meta/my-component.cmx",
            run::GetSimplifiedUrl("fuchsia-pkg://fuchsia.com/my-pkg#meta/my-component.cmx"));
}

}  // namespace
}  // namespace run
