blob: 7ac22f1586c9579bf70d2fb399721d53e12f6959 [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 <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#include <regex>
#include <fbl/auto_call.h>
#include <fbl/string_buffer.h>
#include <fbl/unique_fd.h>
#include <fbl/unique_ptr.h>
#include <fbl/vector.h>
#include <runtests-utils/fuchsia-run-test.h>
#include <runtests-utils/runtests-utils.h>
#include <unittest/unittest.h>
#include "runtests-utils-test-utils.h"
namespace runtests {
namespace {
bool TestFileComponentInfoTest() {
BEGIN_TEST;
ComponentInfo v1_info, v2_info;
v1_info.component_url = "";
v1_info.manifest_path = "";
v2_info.component_url = "";
v2_info.manifest_path = "";
TestFileComponentInfo("", &v1_info, &v2_info);
EXPECT_STR_EQ("", v1_info.component_url.c_str());
EXPECT_STR_EQ("", v1_info.manifest_path.c_str());
EXPECT_STR_EQ("", v2_info.component_url.c_str());
EXPECT_STR_EQ("", v2_info.manifest_path.c_str());
v1_info.component_url = "";
v1_info.manifest_path = "";
v2_info.component_url = "";
v2_info.manifest_path = "";
TestFileComponentInfo("/", &v1_info, &v2_info);
EXPECT_STR_EQ("", v1_info.component_url.c_str());
EXPECT_STR_EQ("", v1_info.manifest_path.c_str());
EXPECT_STR_EQ("", v2_info.component_url.c_str());
EXPECT_STR_EQ("", v2_info.manifest_path.c_str());
v1_info.component_url = "";
v1_info.manifest_path = "";
v2_info.component_url = "";
v2_info.manifest_path = "";
TestFileComponentInfo("/system/test", &v1_info, &v2_info);
EXPECT_STR_EQ("", v1_info.component_url.c_str());
EXPECT_STR_EQ("", v1_info.manifest_path.c_str());
EXPECT_STR_EQ("", v2_info.component_url.c_str());
EXPECT_STR_EQ("", v2_info.manifest_path.c_str());
v1_info.component_url = "";
v1_info.manifest_path = "";
v2_info.component_url = "";
v2_info.manifest_path = "";
TestFileComponentInfo("/pkgfs", &v1_info, &v2_info);
EXPECT_STR_EQ("", v1_info.component_url.c_str());
EXPECT_STR_EQ("", v1_info.manifest_path.c_str());
EXPECT_STR_EQ("", v2_info.component_url.c_str());
EXPECT_STR_EQ("", v2_info.manifest_path.c_str());
v1_info.component_url = "";
v1_info.manifest_path = "";
v2_info.component_url = "";
v2_info.manifest_path = "";
TestFileComponentInfo("/pkgfs/packages", &v1_info, &v2_info);
EXPECT_STR_EQ("", v1_info.component_url.c_str());
EXPECT_STR_EQ("", v1_info.manifest_path.c_str());
EXPECT_STR_EQ("", v2_info.component_url.c_str());
EXPECT_STR_EQ("", v2_info.manifest_path.c_str());
v1_info.component_url = "";
v1_info.manifest_path = "";
v2_info.component_url = "";
v2_info.manifest_path = "";
TestFileComponentInfo("/pkgfs/packages/", &v1_info, &v2_info);
EXPECT_STR_EQ("", v1_info.component_url.c_str());
EXPECT_STR_EQ("", v1_info.manifest_path.c_str());
EXPECT_STR_EQ("", v2_info.component_url.c_str());
EXPECT_STR_EQ("", v2_info.manifest_path.c_str());
v1_info.component_url = "";
v1_info.manifest_path = "";
v2_info.component_url = "";
v2_info.manifest_path = "";
TestFileComponentInfo("/pkgfs/packages/foo", &v1_info, &v2_info);
EXPECT_STR_EQ("", v1_info.component_url.c_str());
EXPECT_STR_EQ("", v1_info.manifest_path.c_str());
EXPECT_STR_EQ("", v2_info.component_url.c_str());
EXPECT_STR_EQ("", v2_info.manifest_path.c_str());
v1_info.component_url = "";
v1_info.manifest_path = "";
v2_info.component_url = "";
v2_info.manifest_path = "";
TestFileComponentInfo("/pkgfs/packages/foo/", &v1_info, &v2_info);
EXPECT_STR_EQ("", v1_info.component_url.c_str());
EXPECT_STR_EQ("", v1_info.manifest_path.c_str());
EXPECT_STR_EQ("", v2_info.component_url.c_str());
EXPECT_STR_EQ("", v2_info.manifest_path.c_str());
v1_info.component_url = "";
v1_info.manifest_path = "";
v2_info.component_url = "";
v2_info.manifest_path = "";
TestFileComponentInfo("/pkgfs/packages/foo/bar", &v1_info, &v2_info);
EXPECT_STR_EQ("", v1_info.component_url.c_str());
EXPECT_STR_EQ("", v1_info.manifest_path.c_str());
EXPECT_STR_EQ("", v2_info.component_url.c_str());
EXPECT_STR_EQ("", v2_info.manifest_path.c_str());
v1_info.component_url = "";
v1_info.manifest_path = "";
v2_info.component_url = "";
v2_info.manifest_path = "";
TestFileComponentInfo("/pkgfs/packages/foo/bar/", &v1_info, &v2_info);
EXPECT_STR_EQ("", v1_info.component_url.c_str());
EXPECT_STR_EQ("", v1_info.manifest_path.c_str());
EXPECT_STR_EQ("", v2_info.component_url.c_str());
EXPECT_STR_EQ("", v2_info.manifest_path.c_str());
v1_info.component_url = "";
v1_info.manifest_path = "";
v2_info.component_url = "";
v2_info.manifest_path = "";
TestFileComponentInfo("/pkgfs/packages/pname/foo/bar/", &v1_info, &v2_info);
EXPECT_STR_EQ("fuchsia-pkg://fuchsia.com/pname#meta/bar.cmx", v1_info.component_url.c_str());
EXPECT_STR_EQ("/pkgfs/packages/pname/meta/bar.cmx", v1_info.manifest_path.c_str());
EXPECT_STR_EQ("fuchsia-pkg://fuchsia.com/pname#meta/bar.cm", v2_info.component_url.c_str());
EXPECT_STR_EQ("/pkgfs/packages/pname/meta/bar.cm", v2_info.manifest_path.c_str());
v1_info.component_url = "";
v1_info.manifest_path = "";
v2_info.component_url = "";
v2_info.manifest_path = "";
TestFileComponentInfo("/pkgfs/packages/pname/foo/bar/test_file", &v1_info, &v2_info);
EXPECT_STR_EQ("fuchsia-pkg://fuchsia.com/pname#meta/test_file.cmx",
v1_info.component_url.c_str());
EXPECT_STR_EQ("/pkgfs/packages/pname/foo/meta/test_file.cmx", v1_info.manifest_path.c_str());
EXPECT_STR_EQ("fuchsia-pkg://fuchsia.com/pname#meta/test_file.cm", v2_info.component_url.c_str());
EXPECT_STR_EQ("/pkgfs/packages/pname/foo/meta/test_file.cm", v2_info.manifest_path.c_str());
v1_info.component_url = "";
v1_info.manifest_path = "";
v2_info.component_url = "";
v2_info.manifest_path = "";
TestFileComponentInfo("/pkgfs/packages/pname/foo/bar/test/file", &v1_info, &v2_info);
EXPECT_STR_EQ("fuchsia-pkg://fuchsia.com/pname#meta/file.cmx", v1_info.component_url.c_str());
EXPECT_STR_EQ("/pkgfs/packages/pname/foo/bar/meta/file.cmx", v1_info.manifest_path.c_str());
EXPECT_STR_EQ("fuchsia-pkg://fuchsia.com/pname#meta/file.cm", v2_info.component_url.c_str());
EXPECT_STR_EQ("/pkgfs/packages/pname/foo/bar/meta/file.cm", v2_info.manifest_path.c_str());
v1_info.component_url = "";
v1_info.manifest_path = "";
v2_info.component_url = "";
v2_info.manifest_path = "";
TestFileComponentInfo("/pkgfs/packages/pname/foo/bar/test/file/", &v1_info, &v2_info);
EXPECT_STR_EQ("fuchsia-pkg://fuchsia.com/pname#meta/file.cmx", v1_info.component_url.c_str());
EXPECT_STR_EQ("/pkgfs/packages/pname/foo/bar/meta/file.cmx", v1_info.manifest_path.c_str());
EXPECT_STR_EQ("fuchsia-pkg://fuchsia.com/pname#meta/file.cm", v2_info.component_url.c_str());
EXPECT_STR_EQ("/pkgfs/packages/pname/foo/bar/meta/file.cm", v2_info.manifest_path.c_str());
v1_info.component_url = "";
v1_info.manifest_path = "";
v2_info.component_url = "";
v2_info.manifest_path = "";
TestFileComponentInfo("/pkgfs/packages/pname/0/test/disabled/test_name", &v1_info, &v2_info);
EXPECT_STR_EQ("fuchsia-pkg://fuchsia.com/pname#meta/test_name.cmx",
v1_info.component_url.c_str());
EXPECT_STR_EQ("/pkgfs/packages/pname/0/meta/test_name.cmx", v1_info.manifest_path.c_str());
EXPECT_STR_EQ("fuchsia-pkg://fuchsia.com/pname#meta/test_name.cm", v2_info.component_url.c_str());
EXPECT_STR_EQ("/pkgfs/packages/pname/0/meta/test_name.cm", v2_info.manifest_path.c_str());
END_TEST;
}
static ScopedTestFile NewPublishFile(const fbl::String& test_name) {
const char* root_dir = getenv("TEST_ROOT_DIR");
if (root_dir == nullptr) {
root_dir = "";
}
const fbl::String path = fbl::String::Concat({root_dir, "/bin/publish-data-helper"});
return ScopedTestFile(test_name.c_str(), path.c_str());
}
bool RunTestDontPublishData() {
BEGIN_TEST;
ScopedTestDir test_dir;
fbl::String test_name = JoinPath(test_dir.path(), "publish-data-helper");
auto file = NewPublishFile(test_name);
const char* argv[] = {test_name.c_str(), nullptr};
std::unique_ptr<Result> result = RunTest(argv, nullptr, nullptr, test_name.c_str(), 0);
EXPECT_STR_EQ(argv[0], result->name.c_str());
EXPECT_EQ(SUCCESS, result->launch_status);
EXPECT_EQ(0, result->return_code);
EXPECT_EQ(0, result->data_sinks.size());
END_TEST;
}
bool RunTestsPublishData() {
BEGIN_TEST;
ScopedTestDir test_dir;
fbl::String test_name = JoinPath(test_dir.path(), "publish-data-helper");
auto file = NewPublishFile(test_name);
int num_failed = 0;
fbl::Vector<std::unique_ptr<Result>> results;
const signed char verbosity = 77;
const fbl::String output_dir = JoinPath(test_dir.path(), "output");
const char output_file_base_name[] = "output.txt";
ASSERT_EQ(0, MkDirAll(output_dir));
EXPECT_TRUE(RunTests({test_name}, {}, 1, 0, output_dir.c_str(), output_file_base_name, verbosity,
&num_failed, &results));
EXPECT_EQ(0, num_failed);
EXPECT_EQ(1, results.size());
EXPECT_LE(1, results[0]->data_sinks.size());
END_TEST;
}
bool RunDuplicateTestsPublishData() {
BEGIN_TEST;
ScopedTestDir test_dir;
fbl::String test_name = JoinPath(test_dir.path(), "publish-data-helper");
auto file = NewPublishFile(test_name);
int num_failed = 0;
fbl::Vector<std::unique_ptr<Result>> results;
const signed char verbosity = 77;
const fbl::String output_dir = JoinPath(test_dir.path(), "output");
const char output_file_base_name[] = "output.txt";
ASSERT_EQ(0, MkDirAll(output_dir));
EXPECT_TRUE(RunTests({test_name, test_name, test_name}, {}, 1, 0, output_dir.c_str(),
output_file_base_name, verbosity, &num_failed, &results));
EXPECT_EQ(0, num_failed);
EXPECT_EQ(3, results.size());
EXPECT_STR_EQ(test_name.c_str(), results[0]->name.c_str());
EXPECT_STR_EQ(fbl::String::Concat({test_name, " (2)"}).c_str(), results[1]->name.c_str());
EXPECT_STR_EQ(fbl::String::Concat({test_name, " (3)"}).c_str(), results[2]->name.c_str());
END_TEST;
}
bool RunAllTestsPublishData() {
BEGIN_TEST;
ScopedTestDir test_dir;
fbl::String test_name = JoinPath(test_dir.path(), "publish-data-helper");
auto file = NewPublishFile(test_name);
const fbl::String output_dir = JoinPath(test_dir.path(), "run-all-tests-output-1");
EXPECT_EQ(0, MkDirAll(output_dir));
const char* const argv[] = {"./runtests", "-o", output_dir.c_str(), test_dir.path()};
TestStopwatch stopwatch;
EXPECT_EQ(EXIT_SUCCESS, DiscoverAndRunTests(4, argv, {}, &stopwatch, ""));
// Prepare the expected output.
fbl::String test_output_rel_path;
ASSERT_TRUE(GetOutputFileRelPath(output_dir, test_name, &test_output_rel_path));
fbl::StringBuffer<1024> expected_output_buf;
expected_output_buf.AppendPrintf(
R"(
"name": "%s",
"output_file": "%s",
"result": "PASS",
"duration_milliseconds": \d+)",
test_name.c_str(),
test_output_rel_path.c_str() + 1); // +1 to discard the leading slash.
std::regex expected_output_regex(expected_output_buf.c_str());
fbl::String test_data_sink_rel_path;
ASSERT_TRUE(
GetOutputFileRelPath(output_dir, JoinPath(test_name, "test"), &test_data_sink_rel_path));
fbl::StringBuffer<1024> expected_data_sink_buf;
expected_data_sink_buf.AppendPrintf(
" \"test\": [\n"
" {\n"
" \"name\": \"test\",\n"
" \"file\": \"%s\"\n"
" }\n"
" ]",
test_data_sink_rel_path.c_str() + 1); // +1 to discard the leading slash.
// Extract the actual output.
const fbl::String output_path = JoinPath(output_dir, "summary.json");
FILE* output_file = fopen(output_path.c_str(), "r");
ASSERT_TRUE(output_file);
char buf[1024];
memset(buf, 0, sizeof(buf));
EXPECT_LT(0, fread(buf, sizeof(buf[0]), sizeof(buf), output_file));
fclose(output_file);
EXPECT_TRUE(std::regex_search(buf, expected_output_regex));
EXPECT_NONNULL(strstr(buf, expected_data_sink_buf.c_str()));
END_TEST;
}
bool RunTestRootDir() {
BEGIN_TEST;
ScopedTestDir test_dir;
fbl::String test_name = JoinPath(test_dir.path(), "succeed.sh");
const char* argv[] = {test_name.c_str(), nullptr};
// This test should have gotten TEST_ROOT_DIR. Confirm that we can find our
// artifact in the "testdata/" directory under TEST_ROOT_DIR.
const char* root_dir = getenv("TEST_ROOT_DIR");
if (!root_dir) {
root_dir = "";
}
// Run a test and confirm TEST_ROOT_DIR gets passed along.
{
const char script_contents[] =
"read line < $TEST_ROOT_DIR/testdata/runtests-utils/test-data\n"
"echo \"$line\"\n";
ScopedScriptFile script(argv[0], script_contents);
fbl::String output_filename = JoinPath(test_dir.path(), "test.out");
std::unique_ptr<Result> result =
RunTest(argv, nullptr, output_filename.c_str(), test_name.c_str(), 0);
FILE* output_file = fopen(output_filename.c_str(), "r");
ASSERT_TRUE(output_file);
char* line = nullptr;
size_t n = 0;
ASSERT_LE(0, getline(&line, &n, output_file));
EXPECT_STR_EQ("Hello world!\n", line);
fclose(output_file);
free(line);
EXPECT_STR_EQ(argv[0], result->name.c_str());
EXPECT_EQ(SUCCESS, result->launch_status);
EXPECT_EQ(0, result->return_code);
}
END_TEST;
}
BEGIN_TEST_CASE(FuchsiaComponentInfo)
RUN_TEST_SMALL(TestFileComponentInfoTest)
END_TEST_CASE(FuchsiaComponentInfo)
BEGIN_TEST_CASE(RunTests)
RUN_TEST(RunTestDontPublishData)
RUN_TEST_MEDIUM(RunTestsPublishData)
RUN_TEST_MEDIUM(RunDuplicateTestsPublishData)
RUN_TEST_MEDIUM(RunAllTestsPublishData)
RUN_TEST_MEDIUM(RunTestRootDir)
END_TEST_CASE(RunTests)
} // namespace
} // namespace runtests