elna/tests/runner.cpp

99 lines
2.6 KiB
C++
Executable File

#include <boost/process.hpp>
#include <filesystem>
#include <iostream>
#include "elna/tester.hpp"
namespace elna
{
std::uint32_t test_results::total() const noexcept
{
return m_total;
}
std::uint32_t test_results::passed() const noexcept
{
return m_passed;
}
std::uint32_t test_results::failed() const noexcept
{
return m_total - m_passed;
}
int test_results::exit_code() const noexcept
{
return m_total == m_passed ? EXIT_SUCCESS : EXIT_FAILURE;
}
void test_results::add_exit_code(const int exit_code) noexcept
{
++m_total;
if (exit_code == 0)
{
++m_passed;
}
}
static int run_test(const std::filesystem::directory_entry& test_entry)
{
const std::filesystem::path test_filename = test_entry.path().filename();
std::filesystem::path test_binary = "build/riscv" / test_filename;
test_binary.replace_extension();
std::filesystem::path expectation_path = test_entry.path().parent_path() / "expectations" / test_filename;
expectation_path.replace_extension(".txt");
std::cout << "Running " << test_binary << std::endl;
boost::process::pipe pipe_stream;
boost::process::child vm(
"/opt/riscv/bin/spike", "--isa=RV32IMAC",
"/opt/riscv/riscv32-unknown-elf/bin/pk",
test_binary.string(),
boost::process::std_out > pipe_stream
);
boost::process::child diff(
"/usr/bin/diff", "-Nur", "--color",
expectation_path.string(), "-",
boost::process::std_in < pipe_stream
);
vm.wait();
diff.wait();
return diff.exit_code();
}
static test_results run_in_path(const std::filesystem::path test_directory)
{
test_results results;
for (const auto& test_entry : std::filesystem::directory_iterator(test_directory))
{
if (test_entry.path().extension() != ".eln" || !test_entry.is_regular_file())
{
continue;
}
results.add_exit_code(run_test(test_entry));
}
return results;
}
};
int main()
{
boost::process::system("rake");
std::cout << "Run all tests and check the results" << std::endl;
std::filesystem::path test_directory{ "tests" };
const auto results = elna::run_in_path(test_directory);
std::cout << std::endl;
std::cout << results.total() << " tests run, "
<< results.passed() << " passed, "
<< results.failed() << " failed." << std::endl;
return results.exit_code();
}