CTest: Report more detail about system exceptions in tests

This passes the system exception string up to CDash and to the command line
instead of just printing "other".
This commit is contained in:
Bill Hoffman
2017-07-11 11:22:45 -04:00
committed by Brad King
parent 1fda77d455
commit 0c650f3965
5 changed files with 26 additions and 14 deletions

View File

@@ -237,6 +237,8 @@ bool cmCTestRunTest::EndTest(size_t completed, size_t total, bool started)
} else if (res == cmsysProcess_State_Exception) {
outputTestErrorsToConsole = this->CTest->OutputTestOutputOnTestFailure;
cmCTestLog(this->CTest, HANDLER_OUTPUT, "***Exception: ");
this->TestResult.ExceptionStatus =
this->TestProcess->GetExitExceptionString();
switch (this->TestProcess->GetExitException()) {
case cmsysProcess_Exception_Fault:
cmCTestLog(this->CTest, HANDLER_OUTPUT, "SegFault");
@@ -255,7 +257,8 @@ bool cmCTestRunTest::EndTest(size_t completed, size_t total, bool started)
this->TestResult.Status = cmCTestTestHandler::NUMERICAL;
break;
default:
cmCTestLog(this->CTest, HANDLER_OUTPUT, "Other");
cmCTestLog(this->CTest, HANDLER_OUTPUT,
this->TestResult.ExceptionStatus);
this->TestResult.Status = cmCTestTestHandler::OTHER_FAULT;
}
} else if ("Disabled" == this->TestResult.CompletionStatus) {

View File

@@ -1,12 +1,10 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmCTestTestHandler.h"
#include "cmsys/Base64.h"
#include "cmsys/Directory.hxx"
#include "cmsys/FStream.hxx"
#include "cmsys/RegularExpression.hxx"
#include <algorithm>
#include <cmsys/Base64.h>
#include <cmsys/Directory.hxx>
#include <cmsys/RegularExpression.hxx>
#include <functional>
#include <iomanip>
#include <iterator>
@@ -33,6 +31,7 @@
#include "cm_auto_ptr.hxx"
#include "cm_utf8.h"
#include "cmake.h"
#include "cmsys/FStream.hxx"
class cmExecutionStatus;
@@ -549,10 +548,10 @@ int cmCTestTestHandler::ProcessHandler()
!cmHasLiteralPrefix(ftit->CompletionStatus, "SKIP_RETURN_CODE=") &&
ftit->CompletionStatus != "Disabled") {
ofs << ftit->TestCount << ":" << ftit->Name << std::endl;
cmCTestLog(
this->CTest, HANDLER_OUTPUT, "\t"
<< std::setw(3) << ftit->TestCount << " - " << ftit->Name << " ("
<< this->GetTestStatus(ftit->Status) << ")" << std::endl);
cmCTestLog(this->CTest, HANDLER_OUTPUT, "\t"
<< std::setw(3) << ftit->TestCount << " - "
<< ftit->Name << " (" << this->GetTestStatus(&*ftit)
<< ")" << std::endl);
}
}
}
@@ -1299,7 +1298,7 @@ void cmCTestTestHandler::GenerateDartOutput(cmXMLWriter& xml)
xml.StartElement("NamedMeasurement");
xml.Attribute("type", "text/string");
xml.Attribute("name", "Exit Code");
xml.Element("Value", this->GetTestStatus(result->Status));
xml.Element("Value", this->GetTestStatus(result));
xml.EndElement(); // NamedMeasurement
xml.StartElement("NamedMeasurement");
@@ -1693,17 +1692,20 @@ void cmCTestTestHandler::UseExcludeRegExp()
this->UseExcludeRegExpFirst = !this->UseIncludeRegExpFlag;
}
const char* cmCTestTestHandler::GetTestStatus(int status)
const char* cmCTestTestHandler::GetTestStatus(const cmCTestTestResult* result)
{
static const char* statuses[] = { "Not Run", "Timeout", "SEGFAULT",
"ILLEGAL", "INTERRUPT", "NUMERICAL",
"OTHER_FAULT", "Failed", "BAD_COMMAND",
"Completed" };
int status = result->Status;
if (status < cmCTestTestHandler::NOT_RUN ||
status > cmCTestTestHandler::COMPLETED) {
return "No Status";
}
if (status == cmCTestTestHandler::OTHER_FAULT) {
return result->ExceptionStatus.c_str();
}
return statuses[status];
}

View File

@@ -144,6 +144,7 @@ public:
double ExecutionTime;
int ReturnValue;
int Status;
std::string ExceptionStatus;
bool CompressOutput;
std::string CompletionStatus;
std::string Output;
@@ -262,7 +263,7 @@ private:
*/
std::string FindTheExecutable(const char* exe);
const char* GetTestStatus(int status);
const char* GetTestStatus(const cmCTestTestResult*);
void ExpandTestsToRunInformation(size_t numPossibleTests);
void ExpandTestsToRunInformationForRerunFailed();

View File

@@ -240,3 +240,8 @@ int cmProcess::GetExitException()
{
return cmsysProcess_GetExitException(this->Process);
}
std::string cmProcess::GetExitExceptionString()
{
return cmsysProcess_GetExceptionString(this->Process);
}

View File

@@ -38,6 +38,7 @@ public:
int GetExitValue() { return this->ExitValue; }
double GetTotalTime() { return this->TotalTime; }
int GetExitException();
std::string GetExitExceptionString();
/**
* Read one line of output but block for no more than timeout.
* Returns: