diff options
author | Johnny Jazeix <jazeix@gmail.com> | 2020-04-20 21:05:15 (GMT) |
---|---|---|
committer | Johnny Jazeix <jazeix@gmail.com> | 2020-04-20 21:05:15 (GMT) |
commit | e89aeba5c4733964db15e0d147e063af34205d54 (patch) | |
tree | 2b5e1da00d132d9e60b8355f6de72427b44faa62 /Source | |
parent | df2d39bc512bd09ae808e8a2a6c7523737bb26c0 (diff) | |
download | CMake-e89aeba5c4733964db15e0d147e063af34205d54.zip CMake-e89aeba5c4733964db15e0d147e063af34205d54.tar.gz CMake-e89aeba5c4733964db15e0d147e063af34205d54.tar.bz2 |
ctest: add option --stop-on-failure
To stop the tests once one has failed
Fixes: #16628
Diffstat (limited to 'Source')
-rw-r--r-- | Source/CTest/cmCTestMultiProcessHandler.cxx | 11 | ||||
-rw-r--r-- | Source/CTest/cmCTestMultiProcessHandler.h | 2 | ||||
-rw-r--r-- | Source/CTest/cmCTestTestCommand.cxx | 4 | ||||
-rw-r--r-- | Source/CTest/cmCTestTestCommand.h | 1 | ||||
-rw-r--r-- | Source/CTest/cmCTestTestHandler.cxx | 4 | ||||
-rw-r--r-- | Source/cmCTest.cxx | 15 | ||||
-rw-r--r-- | Source/cmCTest.h | 3 | ||||
-rw-r--r-- | Source/ctest.cxx | 1 |
8 files changed, 40 insertions, 1 deletions
diff --git a/Source/CTest/cmCTestMultiProcessHandler.cxx b/Source/CTest/cmCTestMultiProcessHandler.cxx index 3fc417a..5c37f97 100644 --- a/Source/CTest/cmCTestMultiProcessHandler.cxx +++ b/Source/CTest/cmCTestMultiProcessHandler.cxx @@ -137,7 +137,7 @@ void cmCTestMultiProcessHandler::RunTests() uv_run(&this->Loop, UV_RUN_DEFAULT); uv_loop_close(&this->Loop); - if (!this->StopTimePassed) { + if (!this->StopTimePassed && !this->CheckStopOnFailure()) { assert(this->Completed == this->Total); assert(this->Tests.empty()); } @@ -367,6 +367,11 @@ void cmCTestMultiProcessHandler::CheckResourcesAvailable() } } +bool cmCTestMultiProcessHandler::CheckStopOnFailure() +{ + return this->CTest->GetStopOnFailure(); +} + bool cmCTestMultiProcessHandler::CheckStopTimePassed() { if (!this->StopTimePassed) { @@ -483,6 +488,10 @@ void cmCTestMultiProcessHandler::StartNextTests() return; } + if (this->CheckStopOnFailure() && !this->Failed->empty()) { + return; + } + size_t numToStart = 0; if (this->RunningCount < this->ParallelLevel) { diff --git a/Source/CTest/cmCTestMultiProcessHandler.h b/Source/CTest/cmCTestMultiProcessHandler.h index c3686bc..6e999f9 100644 --- a/Source/CTest/cmCTestMultiProcessHandler.h +++ b/Source/CTest/cmCTestMultiProcessHandler.h @@ -138,6 +138,8 @@ protected: inline size_t GetProcessorsUsed(int index); std::string GetName(int index); + bool CheckStopOnFailure(); + bool CheckStopTimePassed(); void SetStopTimePassed(); diff --git a/Source/CTest/cmCTestTestCommand.cxx b/Source/CTest/cmCTestTestCommand.cxx index c5f683d..6b317cb 100644 --- a/Source/CTest/cmCTestTestCommand.cxx +++ b/Source/CTest/cmCTestTestCommand.cxx @@ -34,6 +34,7 @@ void cmCTestTestCommand::BindArguments() this->Bind("STOP_TIME"_s, this->StopTime); this->Bind("TEST_LOAD"_s, this->TestLoad); this->Bind("RESOURCE_SPEC_FILE"_s, this->ResourceSpecFile); + this->Bind("STOP_ON_FAILURE"_s, this->StopOnFailure); } cmCTestGenericHandler* cmCTestTestCommand::InitializeHandler() @@ -90,6 +91,9 @@ cmCTestGenericHandler* cmCTestTestCommand::InitializeHandler() handler->SetOption("ExcludeFixtureCleanupRegularExpression", this->ExcludeFixtureCleanup.c_str()); } + if (this->StopOnFailure) { + handler->SetOption("StopOnFailure", "ON"); + } if (!this->ParallelLevel.empty()) { handler->SetOption("ParallelLevel", this->ParallelLevel.c_str()); } diff --git a/Source/CTest/cmCTestTestCommand.h b/Source/CTest/cmCTestTestCommand.h index 2345afb..7925586 100644 --- a/Source/CTest/cmCTestTestCommand.h +++ b/Source/CTest/cmCTestTestCommand.h @@ -60,6 +60,7 @@ protected: std::string StopTime; std::string TestLoad; std::string ResourceSpecFile; + bool StopOnFailure = false; }; #endif diff --git a/Source/CTest/cmCTestTestHandler.cxx b/Source/CTest/cmCTestTestHandler.cxx index 7f21633..2408d57 100644 --- a/Source/CTest/cmCTestTestHandler.cxx +++ b/Source/CTest/cmCTestTestHandler.cxx @@ -514,6 +514,10 @@ bool cmCTestTestHandler::ProcessOptions() this->CTest->SetParallelLevel(atoi(this->GetOption("ParallelLevel"))); } + if (this->GetOption("StopOnFailure")) { + this->CTest->SetStopOnFailure(true); + } + const char* val; val = this->GetOption("LabelRegularExpression"); if (val) { diff --git a/Source/cmCTest.cxx b/Source/cmCTest.cxx index 35a8952..c2b2a09 100644 --- a/Source/cmCTest.cxx +++ b/Source/cmCTest.cxx @@ -92,6 +92,7 @@ struct cmCTest::Private std::string ConfigType; std::string ScheduleType; std::chrono::system_clock::time_point StopTime; + bool StopOnFailure = false; bool TestProgressOutput = false; bool Verbose = false; bool ExtraVerbose = false; @@ -1932,6 +1933,10 @@ bool cmCTest::HandleCommandLineArguments(size_t& i, this->SetStopTime(args[i]); } + else if (this->CheckArgument(arg, "--stop-on-failure"_s)) { + this->Impl->StopOnFailure = true; + } + else if (this->CheckArgument(arg, "-C"_s, "--build-config") && i < args.size() - 1) { i++; @@ -2493,6 +2498,16 @@ void cmCTest::SetNotesFiles(const char* notes) this->Impl->NotesFiles = notes; } +bool cmCTest::GetStopOnFailure() const +{ + return this->Impl->StopOnFailure; +} + +void cmCTest::SetStopOnFailure(bool stop) +{ + this->Impl->StopOnFailure = stop; +} + std::chrono::system_clock::time_point cmCTest::GetStopTime() const { return this->Impl->StopTime; diff --git a/Source/cmCTest.h b/Source/cmCTest.h index 984be13..a39b8fe 100644 --- a/Source/cmCTest.h +++ b/Source/cmCTest.h @@ -204,6 +204,9 @@ public: bool ShouldCompressTestOutput(); bool CompressString(std::string& str); + bool GetStopOnFailure() const; + void SetStopOnFailure(bool stop); + std::chrono::system_clock::time_point GetStopTime() const; void SetStopTime(std::string const& time); diff --git a/Source/ctest.cxx b/Source/ctest.cxx index fbdf75a..3b5bf8c 100644 --- a/Source/ctest.cxx +++ b/Source/ctest.cxx @@ -35,6 +35,7 @@ static const char* cmDocumentationOptions[][2] = { { "--output-on-failure", "Output anything outputted by the test program " "if the test should fail." }, + { "--stop-on-failure", "Stop running the tests after one has failed." }, { "--test-output-size-passed <size>", "Limit the output for passed tests " "to <size> bytes" }, |