cmCTestRunTest: Remove duplicated compression logic
This commit is contained in:
parent
e7d319714d
commit
948c55857e
@ -9,8 +9,6 @@
|
|||||||
#include "cmSystemTools.h"
|
#include "cmSystemTools.h"
|
||||||
#include "cmWorkingDirectory.h"
|
#include "cmWorkingDirectory.h"
|
||||||
|
|
||||||
#include "cm_zlib.h"
|
|
||||||
#include "cmsys/Base64.h"
|
|
||||||
#include "cmsys/RegularExpression.hxx"
|
#include "cmsys/RegularExpression.hxx"
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <cmAlgorithms.h>
|
#include <cmAlgorithms.h>
|
||||||
@ -31,9 +29,6 @@ cmCTestRunTest::cmCTestRunTest(cmCTestMultiProcessHandler& multiHandler)
|
|||||||
this->TestResult.Status = cmCTestTestHandler::NOT_RUN;
|
this->TestResult.Status = cmCTestTestHandler::NOT_RUN;
|
||||||
this->TestResult.TestCount = 0;
|
this->TestResult.TestCount = 0;
|
||||||
this->TestResult.Properties = nullptr;
|
this->TestResult.Properties = nullptr;
|
||||||
this->ProcessOutput.clear();
|
|
||||||
this->CompressedOutput.clear();
|
|
||||||
this->CompressionRatio = 2;
|
|
||||||
this->NumberOfRunsLeft = 1; // default to 1 run of the test
|
this->NumberOfRunsLeft = 1; // default to 1 run of the test
|
||||||
this->RunUntilFail = false; // default to run the test once
|
this->RunUntilFail = false; // default to run the test once
|
||||||
this->RunAgain = false; // default to not having to run again
|
this->RunAgain = false; // default to not having to run again
|
||||||
@ -68,73 +63,8 @@ void cmCTestRunTest::CheckOutput(std::string const& line)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Streamed compression of test output. The compressed data
|
|
||||||
// is appended to this->CompressedOutput
|
|
||||||
void cmCTestRunTest::CompressOutput()
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
z_stream strm;
|
|
||||||
|
|
||||||
unsigned char* in = reinterpret_cast<unsigned char*>(
|
|
||||||
const_cast<char*>(this->ProcessOutput.c_str()));
|
|
||||||
// zlib makes the guarantee that this is the maximum output size
|
|
||||||
int outSize = static_cast<int>(
|
|
||||||
static_cast<double>(this->ProcessOutput.size()) * 1.001 + 13.0);
|
|
||||||
unsigned char* out = new unsigned char[outSize];
|
|
||||||
|
|
||||||
strm.zalloc = Z_NULL;
|
|
||||||
strm.zfree = Z_NULL;
|
|
||||||
strm.opaque = Z_NULL;
|
|
||||||
ret = deflateInit(&strm, -1); // default compression level
|
|
||||||
if (ret != Z_OK) {
|
|
||||||
delete[] out;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
strm.avail_in = static_cast<uInt>(this->ProcessOutput.size());
|
|
||||||
strm.next_in = in;
|
|
||||||
strm.avail_out = outSize;
|
|
||||||
strm.next_out = out;
|
|
||||||
ret = deflate(&strm, Z_FINISH);
|
|
||||||
|
|
||||||
if (ret != Z_STREAM_END) {
|
|
||||||
cmCTestLog(this->CTest, ERROR_MESSAGE,
|
|
||||||
"Error during output compression. Sending uncompressed output."
|
|
||||||
<< std::endl);
|
|
||||||
delete[] out;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
(void)deflateEnd(&strm);
|
|
||||||
|
|
||||||
unsigned char* encoded_buffer =
|
|
||||||
new unsigned char[static_cast<int>(outSize * 1.5)];
|
|
||||||
|
|
||||||
size_t rlen = cmsysBase64_Encode(out, strm.total_out, encoded_buffer, 1);
|
|
||||||
|
|
||||||
this->CompressedOutput.clear();
|
|
||||||
for (size_t i = 0; i < rlen; i++) {
|
|
||||||
this->CompressedOutput += encoded_buffer[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strm.total_in) {
|
|
||||||
this->CompressionRatio =
|
|
||||||
static_cast<double>(strm.total_out) / static_cast<double>(strm.total_in);
|
|
||||||
}
|
|
||||||
|
|
||||||
delete[] encoded_buffer;
|
|
||||||
delete[] out;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cmCTestRunTest::EndTest(size_t completed, size_t total, bool started)
|
bool cmCTestRunTest::EndTest(size_t completed, size_t total, bool started)
|
||||||
{
|
{
|
||||||
if ((!this->TestHandler->MemCheck &&
|
|
||||||
this->CTest->ShouldCompressTestOutput()) ||
|
|
||||||
(this->TestHandler->MemCheck &&
|
|
||||||
this->CTest->ShouldCompressTestOutput())) {
|
|
||||||
this->CompressOutput();
|
|
||||||
}
|
|
||||||
|
|
||||||
this->WriteLogOutputTop(completed, total);
|
this->WriteLogOutputTop(completed, total);
|
||||||
std::string reason;
|
std::string reason;
|
||||||
bool passed = true;
|
bool passed = true;
|
||||||
@ -335,10 +265,18 @@ bool cmCTestRunTest::EndTest(size_t completed, size_t total, bool started)
|
|||||||
// if the test actually started and ran
|
// if the test actually started and ran
|
||||||
// record the results in TestResult
|
// record the results in TestResult
|
||||||
if (started) {
|
if (started) {
|
||||||
bool compress = !this->TestHandler->MemCheck &&
|
std::string compressedOutput;
|
||||||
this->CompressionRatio < 1 && this->CTest->ShouldCompressTestOutput();
|
if (!this->TestHandler->MemCheck &&
|
||||||
|
this->CTest->ShouldCompressTestOutput()) {
|
||||||
|
std::string str = this->ProcessOutput;
|
||||||
|
if (this->CTest->CompressString(str)) {
|
||||||
|
compressedOutput = std::move(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bool compress = !compressedOutput.empty() &&
|
||||||
|
compressedOutput.length() < this->ProcessOutput.length();
|
||||||
this->TestResult.Output =
|
this->TestResult.Output =
|
||||||
compress ? this->CompressedOutput : this->ProcessOutput;
|
compress ? compressedOutput : this->ProcessOutput;
|
||||||
this->TestResult.CompressOutput = compress;
|
this->TestResult.CompressOutput = compress;
|
||||||
this->TestResult.ReturnValue = this->TestProcess->GetExitValue();
|
this->TestResult.ReturnValue = this->TestProcess->GetExitValue();
|
||||||
if (!skipped) {
|
if (!skipped) {
|
||||||
|
@ -58,9 +58,6 @@ public:
|
|||||||
// Read and store output. Returns true if it must be called again.
|
// Read and store output. Returns true if it must be called again.
|
||||||
void CheckOutput(std::string const& line);
|
void CheckOutput(std::string const& line);
|
||||||
|
|
||||||
// Compresses the output, writing to CompressedOutput
|
|
||||||
void CompressOutput();
|
|
||||||
|
|
||||||
// launch the test process, return whether it started correctly
|
// launch the test process, return whether it started correctly
|
||||||
bool StartTest(size_t completed, size_t total);
|
bool StartTest(size_t completed, size_t total);
|
||||||
// capture and report the test results
|
// capture and report the test results
|
||||||
@ -105,8 +102,6 @@ private:
|
|||||||
cmCTest* CTest;
|
cmCTest* CTest;
|
||||||
std::unique_ptr<cmProcess> TestProcess;
|
std::unique_ptr<cmProcess> TestProcess;
|
||||||
std::string ProcessOutput;
|
std::string ProcessOutput;
|
||||||
std::string CompressedOutput;
|
|
||||||
double CompressionRatio;
|
|
||||||
// The test results
|
// The test results
|
||||||
cmCTestTestHandler::cmCTestTestResult TestResult;
|
cmCTestTestHandler::cmCTestTestResult TestResult;
|
||||||
cmCTestMultiProcessHandler& MultiTestHandler;
|
cmCTestMultiProcessHandler& MultiTestHandler;
|
||||||
|
Loading…
Reference in New Issue
Block a user