Quellcode durchsuchen

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".
Bill Hoffman vor 8 Jahren
Ursprung
Commit
0c650f3965

+ 4 - 1
Source/CTest/cmCTestRunTest.cxx

@@ -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) {

+ 14 - 12
Source/CTest/cmCTestTestHandler.cxx

@@ -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];
 }
 

+ 2 - 1
Source/CTest/cmCTestTestHandler.h

@@ -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();
 

+ 5 - 0
Source/CTest/cmProcess.cxx

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

+ 1 - 0
Source/CTest/cmProcess.h

@@ -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: