94 lines
2.7 KiB
C++
94 lines
2.7 KiB
C++
/*
|
|
* Copyright The async-profiler authors
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include "os.h"
|
|
#include "testRunner.hpp"
|
|
#include <fcntl.h>
|
|
#include <stdio.h>
|
|
#include <unistd.h>
|
|
|
|
int main() {
|
|
return TestRunner::instance()->runAllTests();
|
|
}
|
|
|
|
TestRunner* TestRunner::instance() {
|
|
static TestRunner instance;
|
|
return &instance;
|
|
}
|
|
|
|
bool fileReadable(const char* filename) {
|
|
int fd = open(filename, O_RDONLY);
|
|
if (fd == -1) {
|
|
return false;
|
|
}
|
|
|
|
char buf[1];
|
|
ssize_t r = read(fd, buf, sizeof(buf));
|
|
close(fd);
|
|
return r != -1;
|
|
}
|
|
|
|
int TestRunner::runAllTests() {
|
|
int passed = 0;
|
|
int failed = 0;
|
|
int skipped = 0;
|
|
int total_assertions = 0;
|
|
int i = 1;
|
|
double total_duration = 0;
|
|
const int total_tests = testCases().size();
|
|
|
|
const bool redirected = !isatty(STDOUT_FILENO);
|
|
const char* red = redirected ? "" : "\033[31m";
|
|
const char* green = redirected ? "" : "\033[32m";
|
|
const char* yellow = redirected ? "" : "\033[33m";
|
|
const char* reset = redirected ? "" : "\033[0m";
|
|
|
|
bool has_only = false;
|
|
for (auto& pair : testCases()) {
|
|
has_only |= pair.second.only;
|
|
}
|
|
if (has_only) {
|
|
printf("Only running tests marked with ONLY_TEST_CASE.\n");
|
|
}
|
|
|
|
for (auto& pair : testCases()) {
|
|
auto& test_case = pair.second;
|
|
bool force_skip = has_only && !test_case.only;
|
|
|
|
printf("Running %s @ %s:%d\n", test_case.name.c_str(), test_case.filename.c_str(), test_case.line_no);
|
|
|
|
u64 start = OS::nanotime();
|
|
if (!force_skip) {
|
|
test_case.test_function();
|
|
} else {
|
|
test_case.skipped = true;
|
|
}
|
|
double duration = (OS::nanotime() - start) / 1e6;
|
|
|
|
total_duration += duration;
|
|
total_assertions += test_case.assertion_count;
|
|
if (test_case.skipped) {
|
|
printf("%sSKIP%s [%d/%d] %s took %0.1f ms\n", yellow, reset, i, total_tests, test_case.name.c_str(), duration);
|
|
skipped++;
|
|
} else if (test_case.has_failed_assertions) {
|
|
printf("%sFAIL%s [%d/%d] %s took %0.1f ms\n", red, reset, i, total_tests, test_case.name.c_str(), duration);
|
|
failed++;
|
|
} else {
|
|
printf("%sPASS%s [%d/%d] %s took %0.1f ms\n", green, reset, i, total_tests, test_case.name.c_str(), duration);
|
|
passed++;
|
|
}
|
|
i++;
|
|
}
|
|
|
|
printf("\nTotal C++ test duration: %0.1f ms\n", total_duration);
|
|
printf("Total successful assertions: %d\n", total_assertions);
|
|
printf("PASS: %d (%0.1f%%)\n", passed, 100.0 * (passed + skipped) / total_tests);
|
|
printf("FAIL: %d\n", failed);
|
|
printf("SKIP: %d\n", skipped);
|
|
printf("TOTAL: %d\n", total_tests);
|
|
|
|
return failed > 0 ? 1 : 0;
|
|
}
|