1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-14 19:08:07 +08:00

CTest: exit nonzero after message(SEND_ERROR|FATAL_ERROR)

Fixes: #21004
This commit is contained in:
Kevin Puetz
2020-04-03 15:07:01 -05:00
committed by Brad King
parent 6cbaa8eb93
commit 6a6f1d1edd
18 changed files with 57 additions and 15 deletions

View File

@@ -819,14 +819,16 @@ void cmCTestTestHandler::CheckLabelFilter(cmCTestTestProperties& it)
this->CheckLabelFilterExclude(it); this->CheckLabelFilterExclude(it);
} }
void cmCTestTestHandler::ComputeTestList() bool cmCTestTestHandler::ComputeTestList()
{ {
this->TestList.clear(); // clear list of test this->TestList.clear(); // clear list of test
this->GetListOfTests(); if (!this->GetListOfTests()) {
return false;
}
if (this->RerunFailed) { if (this->RerunFailed) {
this->ComputeTestListForRerunFailed(); this->ComputeTestListForRerunFailed();
return; return true;
} }
cmCTestTestHandler::ListOfTests::size_type tmsize = this->TestList.size(); cmCTestTestHandler::ListOfTests::size_type tmsize = this->TestList.size();
@@ -882,6 +884,7 @@ void cmCTestTestHandler::ComputeTestList()
this->TestList = finalList; this->TestList = finalList;
this->UpdateMaxTestNameWidth(); this->UpdateMaxTestNameWidth();
return true;
} }
void cmCTestTestHandler::ComputeTestListForRerunFailed() void cmCTestTestHandler::ComputeTestListForRerunFailed()
@@ -1260,7 +1263,10 @@ bool cmCTestTestHandler::GetValue(const char* tag, std::string& value,
bool cmCTestTestHandler::ProcessDirectory(std::vector<std::string>& passed, bool cmCTestTestHandler::ProcessDirectory(std::vector<std::string>& passed,
std::vector<std::string>& failed) std::vector<std::string>& failed)
{ {
this->ComputeTestList(); if (!this->ComputeTestList()) {
return false;
}
this->StartTest = this->CTest->CurrentTime(); this->StartTest = this->CTest->CurrentTime();
this->StartTestTime = std::chrono::system_clock::now(); this->StartTestTime = std::chrono::system_clock::now();
auto elapsed_time_start = std::chrono::steady_clock::now(); auto elapsed_time_start = std::chrono::steady_clock::now();
@@ -1695,7 +1701,7 @@ bool cmCTestTestHandler::ParseResourceGroupsProperty(
return lexer.ParseString(val); return lexer.ParseString(val);
} }
void cmCTestTestHandler::GetListOfTests() bool cmCTestTestHandler::GetListOfTests()
{ {
if (!this->IncludeLabelRegExp.empty()) { if (!this->IncludeLabelRegExp.empty()) {
this->IncludeLabelRegularExpression.compile( this->IncludeLabelRegularExpression.compile(
@@ -1748,14 +1754,15 @@ void cmCTestTestHandler::GetListOfTests()
// does the DartTestfile.txt exist ? // does the DartTestfile.txt exist ?
testFilename = "DartTestfile.txt"; testFilename = "DartTestfile.txt";
} else { } else {
return; return true;
} }
if (!mf.ReadListFile(testFilename)) { if (!mf.ReadListFile(testFilename)) {
return; return false;
} }
if (cmSystemTools::GetErrorOccuredFlag()) { if (cmSystemTools::GetErrorOccuredFlag()) {
return; // SEND_ERROR or FATAL_ERROR in CTestTestfile or TEST_INCLUDE_FILES
return false;
} }
const char* specFile = mf.GetDefinition("CTEST_RESOURCE_SPEC_FILE"); const char* specFile = mf.GetDefinition("CTEST_RESOURCE_SPEC_FILE");
if (this->ResourceSpecFile.empty() && specFile) { if (this->ResourceSpecFile.empty() && specFile) {
@@ -1764,6 +1771,7 @@ void cmCTestTestHandler::GetListOfTests()
cmCTestOptionalLog(this->CTest, HANDLER_VERBOSE_OUTPUT, cmCTestOptionalLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
"Done constructing a list of tests" << std::endl, "Done constructing a list of tests" << std::endl,
this->Quiet); this->Quiet);
return true;
} }
void cmCTestTestHandler::UseIncludeRegExp() void cmCTestTestHandler::UseIncludeRegExp()

View File

@@ -286,10 +286,10 @@ private:
/** /**
* Get the list of tests in directory and subdirectories. * Get the list of tests in directory and subdirectories.
*/ */
void GetListOfTests(); bool GetListOfTests();
// compute the lists of tests that will actually run // compute the lists of tests that will actually run
// based on union regex and -I stuff // based on union regex and -I stuff
void ComputeTestList(); bool ComputeTestList();
// compute the lists of tests that will actually run // compute the lists of tests that will actually run
// based on LastTestFailed.log // based on LastTestFailed.log

View File

@@ -704,8 +704,7 @@ bool cmCTest::UpdateCTestConfiguration()
if (!cmSystemTools::FileExists(fileName)) { if (!cmSystemTools::FileExists(fileName)) {
// No need to exit if we are not producing XML // No need to exit if we are not producing XML
if (this->Impl->ProduceXML) { if (this->Impl->ProduceXML) {
cmCTestLog(this, ERROR_MESSAGE, cmCTestLog(this, WARNING, "Cannot find file: " << fileName << std::endl);
"Cannot find file: " << fileName << std::endl);
return false; return false;
} }
} else { } else {

View File

@@ -18,3 +18,12 @@ function(run_CMakeCTestArguments)
run_cmake_command(CMakeCTestArguments-test ${CMAKE_COMMAND} --build . --config Debug --target "${test}") run_cmake_command(CMakeCTestArguments-test ${CMAKE_COMMAND} --build . --config Debug --target "${test}")
endfunction() endfunction()
run_CMakeCTestArguments() run_CMakeCTestArguments()
function(run_TestfileErrors)
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/TestfileErrors-build)
run_cmake(TestfileErrors)
set(RunCMake_TEST_NO_CLEAN 1)
run_cmake_command(TestfileErrors-build ${CMAKE_COMMAND} --build . --config Debug)
run_cmake_command(TestfileErrors-test ${CMAKE_CTEST_COMMAND} -C Debug)
endfunction()
run_TestfileErrors()

View File

@@ -0,0 +1,4 @@
message(SEND_ERROR "SEND_ERROR")
message(FATAL_ERROR "FATAL_ERROR")
# This shouldn't get printed because the script aborts on FATAL_ERROR
message(SEND_ERROR "reaching the unreachable")

View File

@@ -0,0 +1 @@
[^0]

View File

@@ -0,0 +1,11 @@
CMake Error at [^
]*/Tests/RunCMake/CTest/TestfileErrors-Script.cmake:1 \(message\):
SEND_ERROR
Call Stack \(most recent call first\):
CTestTestfile.cmake:[0-9]+ \(include\)
+
CMake Error at [^
]*/Tests/RunCMake/CTest/TestfileErrors-Script.cmake:2 \(message\):
FATAL_ERROR
Call Stack \(most recent call first\):
CTestTestfile.cmake:[0-9]+ \(include\)

View File

@@ -0,0 +1,3 @@
include(CTest)
add_test(NAME "unreachable" COMMAND ${CMAKE_COMMAND} -E true)
set_property(DIRECTORY PROPERTY TEST_INCLUDE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/TestfileErrors-Script.cmake)

View File

@@ -0,0 +1 @@
[^0]

View File

@@ -1,4 +1,4 @@
^CMake Error at CTestTestfile.cmake:[0-9]+ \(subdirs\): ^CMake Error at CTestTestfile.cmake:[0-9]+ \(subdirs\):
subdirs called with incorrect number of arguments subdirs called with incorrect number of arguments
+ +
No tests were found!!!$ Errors while running CTest$

View File

@@ -1 +1,2 @@
^Cannot find file: .*/Tests/RunCMake/CTestCommandLine/TestOutputSize/DartConfiguration.tcl
Errors while running CTest Errors while running CTest

View File

@@ -2,4 +2,4 @@ CMake Error at CTestTestfile.cmake:[0-9]+:
Parse error\. Function missing ending "\)"\. End of file reached\. Parse error\. Function missing ending "\)"\. End of file reached\.
No tests were found!!! Errors while running CTest

View File

@@ -2,4 +2,4 @@ CMake Error at CTestTestfile.cmake:[0-9]+:
Parse error\. Function missing ending "\)"\. End of file reached\. Parse error\. Function missing ending "\)"\. End of file reached\.
No tests were found!!! Errors while running CTest