blob: 6d9651e238d7b2ab0b9846d2c2ef25f58c3aeb14 [file] [log] [blame]
// 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