Merge topic 'dont-compress-memcheck-output'

0e591ed Fix type conversion warning
9c3a0b9 We will actually compress memcheck output if the server supports it.
8024c53 Dynamic analysis test output should not be compressed.
This commit is contained in:
Brad King 2011-06-02 11:29:09 -04:00 committed by CMake Topic Stage
commit 3232136fc8
5 changed files with 107 additions and 14 deletions

View File

@ -344,9 +344,21 @@ void cmCTestMemCheckHandler::GenerateDartOutput(std::ostream& os)
}
this->MemoryTesterGlobalResults[kk] += memcheckresults[kk];
}
std::string logTag;
if(this->CTest->ShouldCompressMemCheckOutput())
{
this->CTest->CompressString(memcheckstr);
logTag = "\t<Log compression=\"gzip\" encoding=\"base64\">\n";
}
else
{
logTag = "\t<Log>\n";
}
os
<< "\t\t</Results>\n"
<< "\t<Log>\n" << memcheckstr << std::endl
<< logTag << memcheckstr << std::endl
<< "\t</Log>\n";
this->WriteTestResultFooter(os, result);
if ( current < cc )

View File

@ -135,7 +135,10 @@ void cmCTestRunTest::CompressOutput()
//---------------------------------------------------------
bool cmCTestRunTest::EndTest(size_t completed, size_t total, bool started)
{
if (this->CTest->ShouldCompressTestOutput())
if ((!this->TestHandler->MemCheck &&
this->CTest->ShouldCompressTestOutput()) ||
(this->TestHandler->MemCheck &&
this->CTest->ShouldCompressMemCheckOutput()))
{
this->CompressOutput();
}
@ -332,7 +335,8 @@ bool cmCTestRunTest::EndTest(size_t completed, size_t total, bool started)
// record the results in TestResult
if(started)
{
bool compress = this->CompressionRatio < 1 &&
bool compress = !this->TestHandler->MemCheck &&
this->CompressionRatio < 1 &&
this->CTest->ShouldCompressTestOutput();
this->TestResult.Output = compress ? this->CompressedOutput
: this->ProcessOutput;

View File

@ -50,6 +50,9 @@
#include <memory> // auto_ptr
#include <cm_zlib.h>
#include <cmsys/Base64.h>
#if defined(__BEOS__) && !defined(__HAIKU__)
#include <be/kernel/OS.h> /* disable_debugger() API. */
#endif
@ -308,7 +311,7 @@ cmCTest::cmCTest()
this->UseHTTP10 = false;
this->PrintLabels = false;
this->CompressTestOutput = true;
this->ComputedCompressOutput = false;
this->CompressMemCheckOutput = true;
this->TestModel = cmCTest::EXPERIMENTAL;
this->MaxTestNameWidth = 30;
this->InteractiveDebugMode = true;
@ -325,6 +328,8 @@ cmCTest::cmCTest()
this->SuppressUpdatingCTestConfiguration = false;
this->DartVersion = 1;
this->OutputTestOutputOnTestFailure = false;
this->ComputedCompressTestOutput = false;
this->ComputedCompressMemCheckOutput = false;
if(cmSystemTools::GetEnv("CTEST_OUTPUT_ON_FAILURE"))
{
this->OutputTestOutputOnTestFailure = true;
@ -394,7 +399,7 @@ void cmCTest::SetParallelLevel(int level)
//----------------------------------------------------------------------------
bool cmCTest::ShouldCompressTestOutput()
{
if(!this->ComputedCompressOutput)
if(!this->ComputedCompressTestOutput)
{
std::string cdashVersion = this->GetCDashVersion();
//version >= 1.6?
@ -403,11 +408,26 @@ bool cmCTest::ShouldCompressTestOutput()
cmSystemTools::VersionCompare(cmSystemTools::OP_EQUAL,
cdashVersion.c_str(), "1.6");
this->CompressTestOutput &= cdashSupportsGzip;
this->ComputedCompressOutput = true;
this->ComputedCompressTestOutput = true;
}
return this->CompressTestOutput;
}
//----------------------------------------------------------------------------
bool cmCTest::ShouldCompressMemCheckOutput()
{
if(!this->ComputedCompressMemCheckOutput)
{
std::string cdashVersion = this->GetCDashVersion();
bool compressionSupported = cmSystemTools::VersionCompare(
cmSystemTools::OP_GREATER, cdashVersion.c_str(), "1.9.0");
this->CompressMemCheckOutput &= compressionSupported;
this->ComputedCompressMemCheckOutput = true;
}
return this->CompressMemCheckOutput;
}
//----------------------------------------------------------------------------
std::string cmCTest::GetCDashVersion()
{
@ -1926,6 +1946,7 @@ void cmCTest::HandleCommandLineArguments(size_t &i,
if(this->CheckArgument(arg, "--no-compress-output"))
{
this->CompressTestOutput = false;
this->CompressMemCheckOutput = false;
}
if(this->CheckArgument(arg, "--print-labels"))
@ -3055,3 +3076,56 @@ void cmCTest::OutputTestErrors(std::vector<char> const &process_output)
}
cmCTestLog(this, HANDLER_OUTPUT, test_outputs << std::endl << std::flush);
}
//----------------------------------------------------------------------
bool cmCTest::CompressString(std::string& str)
{
int ret;
z_stream strm;
unsigned char* in = reinterpret_cast<unsigned char*>(
const_cast<char*>(str.c_str()));
//zlib makes the guarantee that this is the maximum output size
int outSize = static_cast<int>(
static_cast<double>(str.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)
{
return false;
}
strm.avail_in = static_cast<uInt>(str.size());
strm.next_in = in;
strm.avail_out = outSize;
strm.next_out = out;
ret = deflate(&strm, Z_FINISH);
if(ret == Z_STREAM_ERROR || ret != Z_STREAM_END)
{
cmCTestLog(this, ERROR_MESSAGE, "Error during gzip compression."
<< std::endl);
return false;
}
(void)deflateEnd(&strm);
// Now base64 encode the resulting binary string
unsigned char* base64EncodedBuffer
= new unsigned char[static_cast<int>(outSize * 1.5)];
unsigned long rlen
= cmsysBase64_Encode(out, strm.total_out, base64EncodedBuffer, 1);
str = "";
str.append(reinterpret_cast<char*>(base64EncodedBuffer), rlen);
delete [] base64EncodedBuffer;
delete [] out;
return true;
}

View File

@ -219,6 +219,8 @@ public:
bool ShouldPrintLabels() { return this->PrintLabels; }
bool ShouldCompressTestOutput();
bool ShouldCompressMemCheckOutput();
bool CompressString(std::string& str);
std::string GetCDashVersion();
@ -430,7 +432,8 @@ private:
bool RunConfigurationScript;
//flag for lazy getter (optimization)
bool ComputedCompressOutput;
bool ComputedCompressTestOutput;
bool ComputedCompressMemCheckOutput;
int GenerateNotesFile(const char* files);
@ -487,8 +490,8 @@ private:
bool ShortDateFormat;
bool CompressXMLFiles;
bool CompressTestOutput;
bool CompressMemCheckOutput;
void InitStreams();
std::ostream* StreamOut;