Commit 47d97726 authored by Brad King's avatar Brad King Committed by Kitware Robot

Merge topic 'better-exception-reporting'

0c650f39 CTest: Report more detail about system exceptions in tests
Acked-by: Kitware Robot's avatarKitware Robot <kwrobot@kitware.com>
Merge-request: !1046
parents 0f158272 0c650f39
......@@ -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) {
......
/* 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;
......@@ -584,10 +583,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);
}
}
}
......@@ -1413,7 +1412,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");
......@@ -1813,17 +1812,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];
}
......
......@@ -149,6 +149,7 @@ public:
double ExecutionTime;
int ReturnValue;
int Status;
std::string ExceptionStatus;
bool CompressOutput;
std::string CompletionStatus;
std::string Output;
......@@ -269,7 +270,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();
......
......@@ -240,3 +240,8 @@ int cmProcess::GetExitException()
{
return cmsysProcess_GetExitException(this->Process);
}
std::string cmProcess::GetExitExceptionString()
{
return cmsysProcess_GetExceptionString(this->Process);
}
......@@ -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:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment