Merge topic 'ctest-merge-test-output'
721b7e3e
CTest: Capture test stdout/stderr through one pipe (#15600)
This commit is contained in:
commit
94070b8dfa
|
@ -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,
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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
|
|
@ -0,0 +1,4 @@
|
|||
foreach(i RANGE 1 5)
|
||||
message(STATUS "Output on stdout")
|
||||
message("Output on stderr")
|
||||
endforeach()
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue