|
|
@@ -314,23 +314,27 @@ bool cmCTestRunTest::EndTest(size_t completed, size_t total, bool started)
|
|
|
return passed || skipped;
|
|
|
}
|
|
|
|
|
|
-bool cmCTestRunTest::StartAgain(size_t completed)
|
|
|
+bool cmCTestRunTest::StartAgain(std::unique_ptr<cmCTestRunTest> runner,
|
|
|
+ size_t completed)
|
|
|
{
|
|
|
- if (!this->RunAgain) {
|
|
|
+ auto* testRun = runner.get();
|
|
|
+
|
|
|
+ if (!testRun->RunAgain) {
|
|
|
return false;
|
|
|
}
|
|
|
- this->RunAgain = false; // reset
|
|
|
+ testRun->RunAgain = false; // reset
|
|
|
+ testRun->TestProcess = cm::make_unique<cmProcess>(std::move(runner));
|
|
|
// change to tests directory
|
|
|
- cmWorkingDirectory workdir(this->TestProperties->Directory);
|
|
|
+ cmWorkingDirectory workdir(testRun->TestProperties->Directory);
|
|
|
if (workdir.Failed()) {
|
|
|
- this->StartFailure("Failed to change working directory to " +
|
|
|
- this->TestProperties->Directory + " : " +
|
|
|
- std::strerror(workdir.GetLastResult()),
|
|
|
- "Failed to change working directory");
|
|
|
+ testRun->StartFailure("Failed to change working directory to " +
|
|
|
+ testRun->TestProperties->Directory + " : " +
|
|
|
+ std::strerror(workdir.GetLastResult()),
|
|
|
+ "Failed to change working directory");
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
- this->StartTest(completed, this->TotalNumberOfTests);
|
|
|
+ testRun->StartTest(completed, testRun->TotalNumberOfTests);
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
@@ -382,6 +386,18 @@ void cmCTestRunTest::MemCheckPostProcess()
|
|
|
handler->PostProcessTest(this->TestResult, this->Index);
|
|
|
}
|
|
|
|
|
|
+void cmCTestRunTest::StartFailure(std::unique_ptr<cmCTestRunTest> runner,
|
|
|
+ std::string const& output,
|
|
|
+ std::string const& detail)
|
|
|
+{
|
|
|
+ auto* testRun = runner.get();
|
|
|
+
|
|
|
+ testRun->TestProcess = cm::make_unique<cmProcess>(std::move(runner));
|
|
|
+ testRun->StartFailure(output, detail);
|
|
|
+
|
|
|
+ testRun->FinalizeTest(false);
|
|
|
+}
|
|
|
+
|
|
|
void cmCTestRunTest::StartFailure(std::string const& output,
|
|
|
std::string const& detail)
|
|
|
{
|
|
|
@@ -413,7 +429,6 @@ void cmCTestRunTest::StartFailure(std::string const& output,
|
|
|
this->TestResult.Path = this->TestProperties->Directory;
|
|
|
this->TestResult.Output = output;
|
|
|
this->TestResult.FullCommandLine.clear();
|
|
|
- this->TestProcess = cm::make_unique<cmProcess>(*this);
|
|
|
}
|
|
|
|
|
|
std::string cmCTestRunTest::GetTestPrefix(size_t completed, size_t total) const
|
|
|
@@ -437,6 +452,21 @@ std::string cmCTestRunTest::GetTestPrefix(size_t completed, size_t total) const
|
|
|
return outputStream.str();
|
|
|
}
|
|
|
|
|
|
+bool cmCTestRunTest::StartTest(std::unique_ptr<cmCTestRunTest> runner,
|
|
|
+ size_t completed, size_t total)
|
|
|
+{
|
|
|
+ auto* testRun = runner.get();
|
|
|
+
|
|
|
+ testRun->TestProcess = cm::make_unique<cmProcess>(std::move(runner));
|
|
|
+
|
|
|
+ if (!testRun->StartTest(completed, total)) {
|
|
|
+ testRun->FinalizeTest(false);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
// Starts the execution of a test. Returns once it has started
|
|
|
bool cmCTestRunTest::StartTest(size_t completed, size_t total)
|
|
|
{
|
|
|
@@ -468,7 +498,6 @@ bool cmCTestRunTest::StartTest(size_t completed, size_t total)
|
|
|
if (this->TestProperties->Disabled) {
|
|
|
this->TestResult.CompletionStatus = "Disabled";
|
|
|
this->TestResult.Status = cmCTestTestHandler::NOT_RUN;
|
|
|
- this->TestProcess = cm::make_unique<cmProcess>(*this);
|
|
|
this->TestResult.Output = "Disabled";
|
|
|
this->TestResult.FullCommandLine.clear();
|
|
|
return false;
|
|
|
@@ -482,7 +511,6 @@ bool cmCTestRunTest::StartTest(size_t completed, size_t total)
|
|
|
// its arguments are irrelevant. This matters for the case where a fixture
|
|
|
// dependency might be creating the executable we want to run.
|
|
|
if (!this->FailedDependencies.empty()) {
|
|
|
- this->TestProcess = cm::make_unique<cmProcess>(*this);
|
|
|
std::string msg = "Failed test dependencies:";
|
|
|
for (std::string const& failedDep : this->FailedDependencies) {
|
|
|
msg += " " + failedDep;
|
|
|
@@ -499,7 +527,6 @@ bool cmCTestRunTest::StartTest(size_t completed, size_t total)
|
|
|
this->ComputeArguments();
|
|
|
std::vector<std::string>& args = this->TestProperties->Args;
|
|
|
if (args.size() >= 2 && args[1] == "NOT_AVAILABLE") {
|
|
|
- this->TestProcess = cm::make_unique<cmProcess>(*this);
|
|
|
std::string msg;
|
|
|
if (this->CTest->GetConfigType().empty()) {
|
|
|
msg = "Test not available without configuration. (Missing \"-C "
|
|
|
@@ -521,7 +548,6 @@ bool cmCTestRunTest::StartTest(size_t completed, size_t total)
|
|
|
for (std::string const& file : this->TestProperties->RequiredFiles) {
|
|
|
if (!cmSystemTools::FileExists(file)) {
|
|
|
// Required file was not found
|
|
|
- this->TestProcess = cm::make_unique<cmProcess>(*this);
|
|
|
*this->TestHandler->LogFile << "Unable to find required file: " << file
|
|
|
<< std::endl;
|
|
|
cmCTestLog(this->CTest, ERROR_MESSAGE,
|
|
|
@@ -537,7 +563,6 @@ bool cmCTestRunTest::StartTest(size_t completed, size_t total)
|
|
|
if (this->ActualCommand.empty()) {
|
|
|
// if the command was not found create a TestResult object
|
|
|
// that has that information
|
|
|
- this->TestProcess = cm::make_unique<cmProcess>(*this);
|
|
|
*this->TestHandler->LogFile << "Unable to find executable: " << args[1]
|
|
|
<< std::endl;
|
|
|
cmCTestLog(this->CTest, ERROR_MESSAGE,
|
|
|
@@ -649,7 +674,6 @@ bool cmCTestRunTest::ForkProcess(cmDuration testTimeOut, bool explicitTimeout,
|
|
|
std::vector<std::string>* environment,
|
|
|
std::vector<size_t>* affinity)
|
|
|
{
|
|
|
- this->TestProcess = cm::make_unique<cmProcess>(*this);
|
|
|
this->TestProcess->SetId(this->Index);
|
|
|
this->TestProcess->SetWorkingDirectory(this->TestProperties->Directory);
|
|
|
this->TestProcess->SetCommand(this->ActualCommand);
|
|
|
@@ -816,7 +840,8 @@ void cmCTestRunTest::WriteLogOutputTop(size_t completed, size_t total)
|
|
|
"Testing " << this->TestProperties->Name << " ... ");
|
|
|
}
|
|
|
|
|
|
-void cmCTestRunTest::FinalizeTest()
|
|
|
+void cmCTestRunTest::FinalizeTest(bool started)
|
|
|
{
|
|
|
- this->MultiTestHandler.FinishTestProcess(this, true);
|
|
|
+ this->MultiTestHandler.FinishTestProcess(this->TestProcess->GetRunner(),
|
|
|
+ started);
|
|
|
}
|