瀏覽代碼

Merge topic 'ctest-merge-test-output'

721b7e3e CTest: Capture test stdout/stderr through one pipe (#15600)
Brad King 10 年之前
父節點
當前提交
94070b8dfa

+ 1 - 2
Source/CTest/cmCTestRunTest.cxx

@@ -57,8 +57,7 @@ bool cmCTestRunTest::CheckOutput()
       // Process has terminated and all output read.
       return false;
       }
-    else if(p == cmsysProcess_Pipe_STDOUT ||
-            p == cmsysProcess_Pipe_STDERR)
+    else if(p == cmsysProcess_Pipe_STDOUT)
       {
       // Store this line of output.
       cmCTestLog(this->CTest, HANDLER_VERBOSE_OUTPUT,

+ 4 - 15
Source/CTest/cmProcess.cxx

@@ -62,6 +62,7 @@ bool cmProcess::StartProcess()
                                      this->WorkingDirectory.c_str());
     }
   cmsysProcess_SetTimeout(this->Process, this->Timeout);
+  cmsysProcess_SetOption(this->Process, cmsysProcess_Option_MergeOutput, 1);
   cmsysProcess_Execute(this->Process);
   return (cmsysProcess_GetState(this->Process)
           == cmsysProcess_State_Executing);
@@ -124,14 +125,10 @@ int cmProcess::GetNextOutputLine(std::string& line, double timeout)
   for(;;)
     {
     // Look for lines already buffered.
-    if(this->StdOut.GetLine(line))
+    if(this->Output.GetLine(line))
       {
       return cmsysProcess_Pipe_STDOUT;
       }
-    else if(this->StdErr.GetLine(line))
-      {
-      return cmsysProcess_Pipe_STDERR;
-      }
 
     // Check for more data from the process.
     char* data;
@@ -143,11 +140,7 @@ int cmProcess::GetNextOutputLine(std::string& line, double timeout)
       }
     else if(p == cmsysProcess_Pipe_STDOUT)
       {
-      this->StdOut.insert(this->StdOut.end(), data, data+length);
-      }
-    else if(p == cmsysProcess_Pipe_STDERR)
-      {
-      this->StdErr.insert(this->StdErr.end(), data, data+length);
+      this->Output.insert(this->Output.end(), data, data+length);
       }
     else // p == cmsysProcess_Pipe_None
       {
@@ -157,14 +150,10 @@ int cmProcess::GetNextOutputLine(std::string& line, double timeout)
     }
 
   // Look for partial last lines.
-  if(this->StdOut.GetLast(line))
+  if(this->Output.GetLast(line))
     {
     return cmsysProcess_Pipe_STDOUT;
     }
-  else if(this->StdErr.GetLast(line))
-    {
-    return cmsysProcess_Pipe_STDERR;
-    }
 
   // No more data.  Wait for process exit.
   if(!cmsysProcess_WaitForExit(this->Process, &timeout))

+ 2 - 5
Source/CTest/cmProcess.h

@@ -48,8 +48,7 @@ public:
    * Read one line of output but block for no more than timeout.
    * Returns:
    *   cmsysProcess_Pipe_None    = Process terminated and all output read
-   *   cmsysProcess_Pipe_STDOUT  = Line came from stdout
-   *   cmsysProcess_Pipe_STDOUT  = Line came from stderr
+   *   cmsysProcess_Pipe_STDOUT  = Line came from stdout or stderr
    *   cmsysProcess_Pipe_Timeout = Timeout expired while waiting
    */
   int GetNextOutputLine(std::string& line, double timeout);
@@ -68,13 +67,11 @@ private:
     bool GetLine(std::string& line);
     bool GetLast(std::string& line);
   };
-  Buffer StdErr;
-  Buffer StdOut;
+  Buffer Output;
   std::string Command;
   std::string WorkingDirectory;
   std::vector<std::string> Arguments;
   std::vector<const char*> ProcessArgs;
-  std::string Output;
   int Id;
   int ExitValue;
 };

+ 13 - 0
Tests/RunCMake/CTestCommandLine/MergeOutput-stdout.txt

@@ -0,0 +1,13 @@
+Test timeout computed to be: [^
+]+
+1: -- Output on stdout
+1: Output on stderr
+1: -- Output on stdout
+1: Output on stderr
+1: -- Output on stdout
+1: Output on stderr
+1: -- Output on stdout
+1: Output on stderr
+1: -- Output on stdout
+1: Output on stderr
+1/1 Test #1: MergeOutput

+ 4 - 0
Tests/RunCMake/CTestCommandLine/MergeOutput.cmake

@@ -0,0 +1,4 @@
+foreach(i RANGE 1 5)
+  message(STATUS "Output on stdout")
+  message("Output on stderr")
+endforeach()

+ 13 - 0
Tests/RunCMake/CTestCommandLine/RunCMakeTest.cmake

@@ -39,3 +39,16 @@ subdirs()
   run_cmake_command(BadCTestTestfile ${CMAKE_CTEST_COMMAND})
 endfunction()
 run_BadCTestTestfile()
+
+function(run_MergeOutput)
+  set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/MergeOutput)
+  set(RunCMake_TEST_NO_CLEAN 1)
+  file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
+  file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
+  file(WRITE "${RunCMake_TEST_BINARY_DIR}/CTestTestfile.cmake" "
+add_test(MergeOutput \"${CMAKE_COMMAND}\" -P \"${RunCMake_SOURCE_DIR}/MergeOutput.cmake\")
+")
+
+  run_cmake_command(MergeOutput ${CMAKE_CTEST_COMMAND} -V)
+endfunction()
+run_MergeOutput()