[libc] Add option to run specific tests

This addition reads command line input to run specific single tests
within a larger call to run all the tests for a particular function.
When the user adds a second argument to the command line, the code skips
all the tests that don't match the user's specified binary. If the user
doesn't specify a test correctly and/or no tests are run, a failure
message prints.

Reviewed By: sivachandra, aeubanks

Differential Revision: https://reviews.llvm.org/D105843
This commit is contained in:
Caitlyn Cano 2021-07-12 20:32:51 +00:00
parent cc6d302c91
commit fa7a9ef178
8 changed files with 104 additions and 11 deletions

View File

@ -74,6 +74,7 @@ function(add_libc_unittest target_name)
"" # No optional arguments
"SUITE" # Single value arguments
"SRCS;HDRS;DEPENDS;COMPILE_OPTIONS" # Multi-value arguments
"NO_LIBC_UNITTEST_TEST_MAIN"
${ARGN}
)
if(NOT LIBC_UNITTEST_SRCS)
@ -148,7 +149,11 @@ function(add_libc_unittest target_name)
${fq_deps_list}
)
target_link_libraries(${fq_target_name} PRIVATE LibcUnitTest libc_test_utils)
if(NO_LIBC_UNITTEST_TEST_MAIN)
target_link_libraries(${fq_target_name} PRIVATE LibcUnitTest libc_test_utils)
else()
target_link_libraries(${fq_target_name} PRIVATE LibcUnitTest LibcUnitTestMain libc_test_utils)
endif()
add_custom_command(
TARGET ${fq_target_name}

View File

@ -1,5 +1,6 @@
add_subdirectory(FPUtil)
add_subdirectory(CPP)
add_subdirectory(UnitTest)
if(NOT LLVM_LIBC_FULL_BUILD)
return()

View File

@ -0,0 +1,11 @@
add_libc_testsuite(libc_unittest_tests)
add_libc_unittest(
testfilter_test
SUITE
libc_unittest_tests
SRCS
testfilter_test.cpp
DEPENDS
libc.utils.CPP.standalone_cpp
)

View File

@ -0,0 +1,38 @@
//===-- Tests for Test Filter functionality -------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "utils/UnitTest/LibcTest.h"
TEST(LlvmLibcTestFilterTest, CorrectFilter) {}
TEST(LlvmLibcTestFilterTest, CorrectFilter2) {}
TEST(LlvmLibcTestFilterTest, IncorrectFilter) {}
TEST(LlvmLibcTestFilterTest, NoFilter) {}
TEST(LlvmLibcTestFilterTest, CheckCorrectFilter) {
ASSERT_EQ(
__llvm_libc::testing::Test::runTests("LlvmLibcTestFilterTest.NoFilter"),
0);
ASSERT_EQ(__llvm_libc::testing::Test::runTests(
"LlvmLibcTestFilterTest.IncorrFilter"),
1);
ASSERT_EQ(__llvm_libc::testing::Test::runTests(
"LlvmLibcTestFilterTest.CorrectFilter"),
0);
ASSERT_EQ(__llvm_libc::testing::Test::runTests(
"LlvmLibcTestFilterTest.CorrectFilter2"),
0);
}
int main() {
__llvm_libc::testing::Test::runTests(
"LlvmLibcTestFilterTest.CheckCorrectFilter");
return 0;
}

View File

@ -7,3 +7,13 @@ add_library(
target_include_directories(LibcUnitTest PUBLIC ${LIBC_SOURCE_DIR})
add_dependencies(LibcUnitTest libc.utils.CPP.standalone_cpp)
target_link_libraries(LibcUnitTest PUBLIC libc_test_utils)
add_library(
LibcUnitTestMain
LibcTestMain.cpp
)
target_include_directories(LibcUnitTestMain PUBLIC ${LIBC_SOURCE_DIR})
add_dependencies(LibcUnitTestMain LibcUnitTest libc.utils.CPP.standalone_cpp)
target_link_libraries(LibcUnitTestMain PUBLIC libc_test_utils)

View File

@ -1,4 +1,4 @@
//===-- Implementation of the base class for libc unittests ---------------===//
//===-- Implementation of the base class for libc unittests----------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@ -143,14 +143,18 @@ void Test::addTest(Test *T) {
End = T;
}
int Test::runTests() {
int Test::runTests(const char *TestFilter) {
int TestCount = 0;
int FailCount = 0;
for (Test *T = Start; T != nullptr; T = T->Next, ++TestCount) {
for (Test *T = Start; T != nullptr; T = T->Next) {
const char *TestName = T->getName();
std::string StrTestName(TestName);
constexpr auto GREEN = "\033[32m";
constexpr auto RED = "\033[31m";
constexpr auto RESET = "\033[0m";
if ((TestFilter != nullptr) && (StrTestName != TestFilter)) {
continue;
}
std::cout << GREEN << "[ RUN ] " << RESET << TestName << '\n';
RunContext Ctx;
T->SetUp();
@ -167,13 +171,21 @@ int Test::runTests() {
std::cout << GREEN << "[ OK ] " << RESET << TestName << '\n';
break;
}
++TestCount;
}
std::cout << "Ran " << TestCount << " tests. "
<< " PASS: " << TestCount - FailCount << ' '
<< " FAIL: " << FailCount << '\n';
if (TestCount > 0) {
std::cout << "Ran " << TestCount << " tests. "
<< " PASS: " << TestCount - FailCount << ' '
<< " FAIL: " << FailCount << '\n';
} else {
std::cout << "No tests run.\n";
if (TestFilter) {
std::cout << "No matching test for " << TestFilter << '\n';
}
}
return FailCount > 0 ? 1 : 0;
return FailCount > 0 || TestCount == 0 ? 1 : 0;
}
template bool Test::test<char, 0>(TestCondition Cond, char LHS, char RHS,
@ -349,5 +361,3 @@ bool Test::testProcessExits(testutils::FunctionCaller *Func, int ExitCode,
#endif // ENABLE_SUBPROCESS_TESTS
} // namespace testing
} // namespace __llvm_libc
int main() { return __llvm_libc::testing::Test::runTests(); }

View File

@ -70,7 +70,7 @@ public:
virtual void SetUp() {}
virtual void TearDown() {}
static int runTests();
static int runTests(const char *);
protected:
static void addTest(Test *T);

View File

@ -0,0 +1,18 @@
//===-- Main function for implementation of base class for libc unittests -===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "LibcTest.h"
static const char *getTestFilter(int argc, char *argv[]) {
return argc > 1 ? argv[1] : nullptr;
}
int main(int argc, char *argv[]) {
const char *TestFilter = getTestFilter(argc, argv);
return __llvm_libc::testing::Test::runTests(TestFilter);
}