Browse Source

ENH: Add support for shrinking the output of the test

Andy Cedilnik 21 years ago
parent
commit
f6cd83d6f3
2 changed files with 83 additions and 0 deletions
  1. 77 0
      Source/CTest/cmCTestTestHandler.cxx
  2. 6 0
      Source/CTest/cmCTestTestHandler.h

+ 77 - 0
Source/CTest/cmCTestTestHandler.cxx

@@ -198,6 +198,9 @@ cmCTestTestHandler::cmCTestTestHandler()
   m_UseIncludeRegExp       = false;
   m_UseExcludeRegExp       = false;
   m_UseExcludeRegExpFirst  = false;
+
+  m_CustomMaximumPassedTestOutputSize = 1 * 1024;
+  m_CustomMaximumFailedTestOutputSize = 300 * 1024;
 }
 
 //----------------------------------------------------------------------
@@ -218,6 +221,12 @@ void cmCTestTestHandler::PopulateCustomVectors(cmMakefile *mf)
   cmCTest::PopulateCustomVector(mf, 
                              "CTEST_CUSTOM_MEMCHECK_IGNORE", 
                              m_CustomMemCheckIgnore);
+  cmCTest::PopulateCustomInteger(mf, 
+                             "CTEST_CUSTOM_MAXIMUM_PASSED_TEST_OUTPUT_SIZE", 
+                             m_CustomMaximumPassedTestOutputSize);
+  cmCTest::PopulateCustomInteger(mf, 
+                             "CTEST_CUSTOM_MAXIMUM_FAILED_TEST_OUTPUT_SIZE", 
+                             m_CustomMaximumFailedTestOutputSize);
 }
 
 
@@ -647,6 +656,15 @@ void cmCTestTestHandler::ProcessDirectory(std::vector<cmStdString> &passed,
         }
       }
 
+    if ( cres.m_Status == cmCTestTestHandler::COMPLETED )
+      {
+      this->CleanTestOutput(output, static_cast<size_t>(m_CustomMaximumPassedTestOutputSize));
+      }
+    else
+      {
+      this->CleanTestOutput(output, static_cast<size_t>(m_CustomMaximumFailedTestOutputSize));
+      }
+
     cres.m_Output = output;
     cres.m_ReturnValue = retVal;
     cres.m_CompletionStatus = "Completed";
@@ -1640,3 +1658,62 @@ void cmCTestTestHandler::SetTestsToRunInformation(const char* in)
     }
 }
 
+bool cmCTestTestHandler::CleanTestOutput(std::string& output, size_t remove_threshold)
+{
+  if ( remove_threshold == 0 )
+    {
+    return true;
+    }
+  if ( output.find("CTEST_FULL_OUTPUT") != output.npos )
+    {
+    return true;
+    }
+  cmOStringStream ostr;
+  std::string::size_type cc;
+  std::string::size_type skipsize;
+  int inTag = 0;
+  int skipped = 0;
+  for ( cc = 0; cc < output.size(); cc ++ )
+    {
+    int ch = output[cc];
+    if ( ch < 0 || ch > 255 )
+      {
+      break;
+      }
+    if ( ch == '<' )
+      {
+      inTag = 1;
+      }
+    if ( !inTag )
+      {
+      int notskip = 0;
+      // Skip
+      if ( skipsize < remove_threshold )
+        {
+        ostr << static_cast<char>(ch);
+        notskip = 1;
+        }
+      skipsize ++;
+      if ( notskip && skipsize >= remove_threshold )
+        {
+        skipped = 1;
+        }
+      }
+    else
+      {
+      ostr << static_cast<char>(ch);
+      }
+    if ( ch == '>' )
+      {
+      inTag = 0;
+      }
+    }
+  if ( skipped )
+    {
+    ostr << "..." << std::endl << "The rest of the test output was removed since it exceeds the threshold of "
+      << remove_threshold << " characters." << std::endl;
+    }
+  output = ostr.str();
+  return true;
+}
+

+ 6 - 0
Source/CTest/cmCTestTestHandler.h

@@ -189,6 +189,9 @@ private:
   std::vector<cmStdString> m_CustomTestsIgnore;
   std::vector<cmStdString> m_CustomMemCheckIgnore;
 
+  int m_CustomMaximumPassedTestOutputSize;
+  int m_CustomMaximumFailedTestOutputSize;
+
   std::string             m_StartTest;
   std::string             m_EndTest;
   double                  m_ElapsedTestingTime;
@@ -212,6 +215,9 @@ private:
   bool ProcessMemCheckPurifyOutput(const std::string& str, 
                                    std::string& log, int* results);
 
+  //! Clean test output to specified length
+  bool CleanTestOutput(std::string& output, size_t length);
+
   std::string TestsToRunString;
   bool m_UseUnion;
 };