فهرست منبع

ENH: Add logging of tests while running. This way you can actually see the output as it goes

Andy Cedilnik 22 سال پیش
والد
کامیت
d278cde9e7
2فایلهای تغییر یافته به همراه52 افزوده شده و 8 حذف شده
  1. 48 6
      Source/cmCTest.cxx
  2. 4 2
      Source/cmCTest.h

+ 48 - 6
Source/cmCTest.cxx

@@ -1791,7 +1791,7 @@ void cmCTest::GenerateDartBuildOutput(std::ostream& os,
   
 void cmCTest::ProcessDirectory(cmCTest::tm_VectorOfStrings &passed, 
                              cmCTest::tm_VectorOfStrings &failed,
-                             bool memcheck)
+                             bool memcheck, std::ostream* logfile)
 {
   // does the DartTestfile.txt exist ?
   if(!cmSystemTools::FileExists("DartTestfile.txt"))
@@ -1831,7 +1831,7 @@ void cmCTest::ProcessDirectory(cmCTest::tm_VectorOfStrings &passed,
         if (cmSystemTools::FileIsDirectory(nwd.c_str()))
           {
           cmSystemTools::ChangeDirectory(nwd.c_str());
-          this->ProcessDirectory(passed, failed, memcheck);
+          this->ProcessDirectory(passed, failed, memcheck, logfile);
           }
         }
       // return to the original directory
@@ -1984,11 +1984,33 @@ void cmCTest::ProcessDirectory(cmCTest::tm_VectorOfStrings &passed,
           std::cout << "Memory check command: " << memcheckcommand << std::endl;
           }
         }
+      if ( logfile )
+        {
+        *logfile << "Command: ";
+        tm_VectorOfStrings::size_type ll;
+        for ( ll = 0; ll < arguments.size()-1; ll ++ )
+          {
+          *logfile << "\"" << arguments[ll] << "\" ";
+          }
+        *logfile 
+          << std::endl 
+          << "Directory: " << cmSystemTools::GetCurrentWorkingDirectory() << std::endl 
+          << "Output:" << std::endl 
+          << "----------------------------------------------------------"
+          << std::endl;
+        }
       int res = 0;
       if ( !m_ShowOnly )
         {
-        res = this->RunTest(arguments, &output, &retVal);
+        res = this->RunTest(arguments, &output, &retVal, logfile);
+        }
+      if ( logfile )
+        {
+        *logfile 
+          << "----------------------------------------------------------"
+          << std::endl << std::endl;
         }
+      
       clock_finish = cmSystemTools::GetTime();
 
       cres.m_ExecutionTime = (double)(clock_finish - clock_start);
@@ -2196,8 +2218,14 @@ int cmCTest::TestDirectory(bool memcheck)
   cmCTest::tm_VectorOfStrings failed;
   int total;
 
+  std::ofstream ofs;
+  std::ofstream *olog = 0;
+  if ( this->OpenOutputFile("Temporary", (memcheck?"LastMemCheck.xml":"LastTest.log"), ofs) )
+    {
+    olog = &ofs;
+    }
   m_StartTest = ::CurrentTime();
-  this->ProcessDirectory(passed, failed, memcheck);
+  this->ProcessDirectory(passed, failed, memcheck, olog);
   m_EndTest = ::CurrentTime();
 
   total = int(passed.size()) + int(failed.size());
@@ -2933,7 +2961,8 @@ int cmCTest::RunMakeCommand(const char* command, std::string* output,
   return result;
 }
 
-int cmCTest::RunTest(std::vector<const char*> argv, std::string* output, int *retVal)
+int cmCTest::RunTest(std::vector<const char*> argv, std::string* output, int *retVal,
+  std::ostream* log)
 {
   if(cmSystemTools::SameFile(argv[0], m_CTestSelf.c_str()))
     {
@@ -2946,9 +2975,17 @@ int cmCTest::RunTest(std::vector<const char*> argv, std::string* output, int *re
         args.push_back(argv[i]);
         }
       }
+    if ( *log )
+      {
+      *log << "* Run internal CTest" << std::endl;
+      }
     std::string oldpath = cmSystemTools::GetCurrentWorkingDirectory();
     
     *retVal = inst.Run(args, output);
+    if ( *log )
+      {
+      *log << output->c_str();
+      }
     cmSystemTools::ChangeDirectory(oldpath.c_str());
     
     if(m_Verbose)
@@ -2987,6 +3024,11 @@ int cmCTest::RunTest(std::vector<const char*> argv, std::string* output, int *re
       std::cout.write(data, length);
       std::cout.flush();
       }
+    if ( log )
+      {
+      log->write(data, length);
+      log->flush();
+      }
     }
 
   cmsysProcess_WaitForExit(cp, 0);
@@ -4405,7 +4447,7 @@ int cmCTest::RunCMakeAndTest(std::string* outstring)
     out << m_TestCommandArgs[k] << " ";
     }
   out << "\n";
-  int runTestRes = this->RunTest(testCommand, &outs, &retval);
+  int runTestRes = this->RunTest(testCommand, &outs, &retval, 0);
   if(runTestRes != cmsysProcess_State_Exited || retval != 0)
     {
     out << "Test failed to run.\n";

+ 4 - 2
Source/cmCTest.h

@@ -95,7 +95,8 @@ public:
    */
   void ProcessDirectory(tm_VectorOfStrings &passed, 
                         tm_VectorOfStrings &failed,
-                        bool memcheck);
+                        bool memcheck,
+                        std::ostream* logfile);
 
   /**
    * Find the executable for a test
@@ -359,7 +360,8 @@ private:
 
   //! Run command specialized for tests. Returns process status and retVal is
   // return value or exception.
-  int RunTest(std::vector<const char*> args, std::string* output, int *retVal);
+  int RunTest(std::vector<const char*> args, std::string* output, int *retVal, 
+    std::ostream* logfile);
 
   std::string GenerateRegressionImages(const std::string& xml);
   const char* GetTestStatus(int status);