cmCTestTestHandler: Consolidate Output options into cmCTestTestOptions

This commit is contained in:
Daniel Pfeifer 2024-10-24 18:43:00 +02:00
parent 23c6de8808
commit 86225833f2
9 changed files with 86 additions and 84 deletions

View File

@ -1109,6 +1109,7 @@ add_library(
CTest/cmCTestTestCommand.cxx CTest/cmCTestTestCommand.cxx
CTest/cmCTestTestHandler.cxx CTest/cmCTestTestHandler.cxx
CTest/cmCTestTestMeasurementXMLParser.cxx CTest/cmCTestTestMeasurementXMLParser.cxx
CTest/cmCTestTypes.cxx
CTest/cmCTestUpdateCommand.cxx CTest/cmCTestUpdateCommand.cxx
CTest/cmCTestUpdateHandler.cxx CTest/cmCTestUpdateHandler.cxx
CTest/cmCTestUploadCommand.cxx CTest/cmCTestUploadCommand.cxx

View File

@ -121,8 +121,8 @@ public:
cmCTestMemCheckHandler::cmCTestMemCheckHandler() cmCTestMemCheckHandler::cmCTestMemCheckHandler()
{ {
this->MemCheck = true; this->MemCheck = true;
this->CustomMaximumPassedTestOutputSize = 0; this->TestOptions.OutputSizePassed = 0;
this->CustomMaximumFailedTestOutputSize = 0; this->TestOptions.OutputSizeFailed = 0;
this->LogWithPID = false; this->LogWithPID = false;
} }
@ -130,8 +130,8 @@ void cmCTestMemCheckHandler::Initialize(cmCTest* ctest)
{ {
this->Superclass::Initialize(ctest); this->Superclass::Initialize(ctest);
this->LogWithPID = false; this->LogWithPID = false;
this->CustomMaximumPassedTestOutputSize = 0; this->TestOptions.OutputSizePassed = 0;
this->CustomMaximumFailedTestOutputSize = 0; this->TestOptions.OutputSizeFailed = 0;
this->MemoryTester.clear(); this->MemoryTester.clear();
this->MemoryTesterDynamicOptions.clear(); this->MemoryTesterDynamicOptions.clear();
this->MemoryTesterOptions.clear(); this->MemoryTesterOptions.clear();
@ -371,9 +371,8 @@ void cmCTestMemCheckHandler::GenerateCTestXML(cmXMLWriter& xml)
continue; continue;
} }
this->CleanTestOutput( this->CleanTestOutput(
memcheckstr, memcheckstr, static_cast<size_t>(this->TestOptions.OutputSizeFailed),
static_cast<size_t>(this->CustomMaximumFailedTestOutputSize), this->TestOptions.OutputTruncation);
this->TestOutputTruncation);
this->WriteTestResultHeader(xml, result); this->WriteTestResultHeader(xml, result);
xml.StartElement("Results"); xml.StartElement("Results");
int memoryErrors = 0; int memoryErrors = 0;
@ -929,7 +928,7 @@ bool cmCTestMemCheckHandler::ProcessMemCheckValgrindOutput(
cmsys::SystemTools::Split(str, lines); cmsys::SystemTools::Split(str, lines);
bool unlimitedOutput = false; bool unlimitedOutput = false;
if (str.find("CTEST_FULL_OUTPUT") != std::string::npos || if (str.find("CTEST_FULL_OUTPUT") != std::string::npos ||
this->CustomMaximumFailedTestOutputSize == 0) { this->TestOptions.OutputSizeFailed == 0) {
unlimitedOutput = true; unlimitedOutput = true;
} }
@ -1029,7 +1028,7 @@ bool cmCTestMemCheckHandler::ProcessMemCheckValgrindOutput(
ostr << lines[i] << std::endl; ostr << lines[i] << std::endl;
if (!unlimitedOutput && if (!unlimitedOutput &&
totalOutputSize > totalOutputSize >
static_cast<size_t>(this->CustomMaximumFailedTestOutputSize)) { static_cast<size_t>(this->TestOptions.OutputSizeFailed)) {
ostr << "....\n"; ostr << "....\n";
ostr << "Test Output for this test has been truncated see testing" ostr << "Test Output for this test has been truncated see testing"
" machine logs for full output,\n"; " machine logs for full output,\n";
@ -1143,7 +1142,7 @@ bool cmCTestMemCheckHandler::ProcessMemCheckCudaOutput(
cmsys::SystemTools::Split(str, lines); cmsys::SystemTools::Split(str, lines);
bool unlimitedOutput = false; bool unlimitedOutput = false;
if (str.find("CTEST_FULL_OUTPUT") != std::string::npos || if (str.find("CTEST_FULL_OUTPUT") != std::string::npos ||
this->CustomMaximumFailedTestOutputSize == 0) { this->TestOptions.OutputSizeFailed == 0) {
unlimitedOutput = true; unlimitedOutput = true;
} }
@ -1243,7 +1242,7 @@ bool cmCTestMemCheckHandler::ProcessMemCheckCudaOutput(
ostr << lines[i] << std::endl; ostr << lines[i] << std::endl;
if (!unlimitedOutput && if (!unlimitedOutput &&
totalOutputSize > totalOutputSize >
static_cast<size_t>(this->CustomMaximumFailedTestOutputSize)) { static_cast<size_t>(this->TestOptions.OutputSizeFailed)) {
ostr << "....\n"; ostr << "....\n";
ostr << "Test Output for this test has been truncated see testing" ostr << "Test Output for this test has been truncated see testing"
" machine logs for full output,\n"; " machine logs for full output,\n";

View File

@ -296,11 +296,11 @@ cmCTestRunTest::EndTestResult cmCTestRunTest::EndTest(size_t completed,
if (!this->TestHandler->MemCheck && started) { if (!this->TestHandler->MemCheck && started) {
this->TestHandler->CleanTestOutput( this->TestHandler->CleanTestOutput(
this->ProcessOutput, this->ProcessOutput,
static_cast<size_t>( static_cast<size_t>(this->TestResult.Status ==
this->TestResult.Status == cmCTestTestHandler::COMPLETED cmCTestTestHandler::COMPLETED
? this->TestHandler->CustomMaximumPassedTestOutputSize ? this->TestHandler->TestOptions.OutputSizePassed
: this->TestHandler->CustomMaximumFailedTestOutputSize), : this->TestHandler->TestOptions.OutputSizeFailed),
this->TestHandler->TestOutputTruncation); this->TestHandler->TestOptions.OutputTruncation);
} }
this->TestResult.Reason = reason; this->TestResult.Reason = reason;
if (this->TestHandler->LogFile) { if (this->TestHandler->LogFile) {

View File

@ -282,10 +282,6 @@ cmCTestTestHandler::cmCTestTestHandler()
this->UseExcludeRegExpFlag = false; this->UseExcludeRegExpFlag = false;
this->UseExcludeRegExpFirst = false; this->UseExcludeRegExpFirst = false;
this->CustomMaximumPassedTestOutputSize = 1 * 1024;
this->CustomMaximumFailedTestOutputSize = 300 * 1024;
this->TestOutputTruncation = cmCTestTypes::TruncationMode::Tail;
this->MemCheck = false; this->MemCheck = false;
this->LogFile = nullptr; this->LogFile = nullptr;
@ -316,6 +312,7 @@ cmCTestTestHandler::cmCTestTestHandler()
void cmCTestTestHandler::Initialize(cmCTest* ctest) void cmCTestTestHandler::Initialize(cmCTest* ctest)
{ {
this->Superclass::Initialize(ctest); this->Superclass::Initialize(ctest);
this->TestOptions = ctest->GetTestOptions();
this->ElapsedTestingTime = cmDuration(); this->ElapsedTestingTime = cmDuration();
@ -327,9 +324,6 @@ void cmCTestTestHandler::Initialize(cmCTest* ctest)
this->CustomPreTest.clear(); this->CustomPreTest.clear();
this->CustomPostTest.clear(); this->CustomPostTest.clear();
this->CustomMaximumPassedTestOutputSize = 1 * 1024;
this->CustomMaximumFailedTestOutputSize = 300 * 1024;
this->TestOutputTruncation = cmCTestTypes::TruncationMode::Tail;
this->TestsToRun.clear(); this->TestsToRun.clear();
@ -363,14 +357,14 @@ void cmCTestTestHandler::PopulateCustomVectors(cmMakefile* mf)
this->CustomTestsIgnore); this->CustomTestsIgnore);
this->CTest->PopulateCustomInteger( this->CTest->PopulateCustomInteger(
mf, "CTEST_CUSTOM_MAXIMUM_PASSED_TEST_OUTPUT_SIZE", mf, "CTEST_CUSTOM_MAXIMUM_PASSED_TEST_OUTPUT_SIZE",
this->CustomMaximumPassedTestOutputSize); this->TestOptions.OutputSizePassed);
this->CTest->PopulateCustomInteger( this->CTest->PopulateCustomInteger(
mf, "CTEST_CUSTOM_MAXIMUM_FAILED_TEST_OUTPUT_SIZE", mf, "CTEST_CUSTOM_MAXIMUM_FAILED_TEST_OUTPUT_SIZE",
this->CustomMaximumFailedTestOutputSize); this->TestOptions.OutputSizeFailed);
cmValue dval = mf->GetDefinition("CTEST_CUSTOM_TEST_OUTPUT_TRUNCATION"); cmValue dval = mf->GetDefinition("CTEST_CUSTOM_TEST_OUTPUT_TRUNCATION");
if (dval) { if (dval) {
if (!this->SetTestOutputTruncation(*dval)) { if (!SetTruncationMode(this->TestOptions.OutputTruncation, *dval)) {
cmCTestLog(this->CTest, ERROR_MESSAGE, cmCTestLog(this->CTest, ERROR_MESSAGE,
"Invalid value for CTEST_CUSTOM_TEST_OUTPUT_TRUNCATION: " "Invalid value for CTEST_CUSTOM_TEST_OUTPUT_TRUNCATION: "
<< *dval << std::endl); << *dval << std::endl);
@ -386,23 +380,6 @@ void cmCTestTestHandler::SetCMakeVariables(cmMakefile& mf)
cmList(this->CustomPostTest).to_string()); cmList(this->CustomPostTest).to_string());
mf.AddDefinition("CTEST_CUSTOM_TESTS_IGNORE", mf.AddDefinition("CTEST_CUSTOM_TESTS_IGNORE",
cmList(this->CustomTestsIgnore).to_string()); cmList(this->CustomTestsIgnore).to_string());
mf.AddDefinition("CTEST_CUSTOM_MAXIMUM_PASSED_TEST_OUTPUT_SIZE",
std::to_string(this->CustomMaximumPassedTestOutputSize));
mf.AddDefinition("CTEST_CUSTOM_MAXIMUM_FAILED_TEST_OUTPUT_SIZE",
std::to_string(this->CustomMaximumFailedTestOutputSize));
mf.AddDefinition("CTEST_CUSTOM_TEST_OUTPUT_TRUNCATION",
[this]() -> cm::string_view {
switch (this->TestOutputTruncation) {
case cmCTestTypes::TruncationMode::Tail:
return "tail"_s;
case cmCTestTypes::TruncationMode::Middle:
return "middle"_s;
case cmCTestTypes::TruncationMode::Head:
return "head"_s;
default:
return ""_s;
}
}());
} }
int cmCTestTestHandler::PreProcessHandler() int cmCTestTestHandler::PreProcessHandler()
@ -2188,20 +2165,6 @@ void cmCTestTestHandler::SetExcludeRegExp(const std::string& arg)
this->ExcludeRegExp = arg; this->ExcludeRegExp = arg;
} }
bool cmCTestTestHandler::SetTestOutputTruncation(const std::string& mode)
{
if (mode == "tail") {
this->TestOutputTruncation = cmCTestTypes::TruncationMode::Tail;
} else if (mode == "middle") {
this->TestOutputTruncation = cmCTestTypes::TruncationMode::Middle;
} else if (mode == "head") {
this->TestOutputTruncation = cmCTestTypes::TruncationMode::Head;
} else {
return false;
}
return true;
}
void cmCTestTestHandler::SetTestsToRunInformation(cmValue in) void cmCTestTestHandler::SetTestsToRunInformation(cmValue in)
{ {
if (!in) { if (!in) {

View File

@ -29,6 +29,14 @@
class cmMakefile; class cmMakefile;
class cmXMLWriter; class cmXMLWriter;
struct cmCTestTestOptions
{
int OutputSizePassed = 1 * 1024;
int OutputSizeFailed = 300 * 1024;
cmCTestTypes::TruncationMode OutputTruncation =
cmCTestTypes::TruncationMode::Tail;
};
/** \class cmCTestTestHandler /** \class cmCTestTestHandler
* \brief A class that handles ctest -S invocations * \brief A class that handles ctest -S invocations
* *
@ -75,18 +83,6 @@ public:
void SetMaxIndex(int n) { this->MaxIndex = n; } void SetMaxIndex(int n) { this->MaxIndex = n; }
int GetMaxIndex() { return this->MaxIndex; } int GetMaxIndex() { return this->MaxIndex; }
void SetTestOutputSizePassed(int n)
{
this->CustomMaximumPassedTestOutputSize = n;
}
void SetTestOutputSizeFailed(int n)
{
this->CustomMaximumFailedTestOutputSize = n;
}
//! Set test output truncation mode. Return false if unknown mode.
bool SetTestOutputTruncation(const std::string& mode);
//! pass the -I argument down //! pass the -I argument down
void SetTestsToRunInformation(cmValue); void SetTestsToRunInformation(cmValue);
@ -265,6 +261,8 @@ protected:
void CleanTestOutput(std::string& output, size_t length, void CleanTestOutput(std::string& output, size_t length,
cmCTestTypes::TruncationMode truncate); cmCTestTypes::TruncationMode truncate);
cmCTestTestOptions TestOptions;
cmDuration ElapsedTestingTime; cmDuration ElapsedTestingTime;
using TestResultsVector = std::vector<cmCTestTestResult>; using TestResultsVector = std::vector<cmCTestTestResult>;
@ -276,9 +274,6 @@ protected:
std::chrono::system_clock::time_point StartTestTime; std::chrono::system_clock::time_point StartTestTime;
std::chrono::system_clock::time_point EndTestTime; std::chrono::system_clock::time_point EndTestTime;
bool MemCheck; bool MemCheck;
int CustomMaximumPassedTestOutputSize;
int CustomMaximumFailedTestOutputSize;
cmCTestTypes::TruncationMode TestOutputTruncation;
int MaxIndex; int MaxIndex;
public: public:
@ -395,4 +390,6 @@ private:
bool RerunFailed; bool RerunFailed;
std::string JUnitXMLFileName; std::string JUnitXMLFileName;
friend class cmCTestTestCommand;
}; };

View File

@ -0,0 +1,24 @@
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmCTestTypes.h"
#include <string>
namespace cmCTestTypes {
bool SetTruncationMode(TruncationMode& mode, cm::string_view str)
{
if (str == "tail") {
mode = cmCTestTypes::TruncationMode::Tail;
} else if (str == "middle") {
mode = cmCTestTypes::TruncationMode::Middle;
} else if (str == "head") {
mode = cmCTestTypes::TruncationMode::Head;
} else {
return false;
}
return true;
}
} // namespace cmCTestTypes

View File

@ -5,12 +5,18 @@
#include "cmConfigure.h" // IWYU pragma: keep #include "cmConfigure.h" // IWYU pragma: keep
#include <cm/string_view>
namespace cmCTestTypes { namespace cmCTestTypes {
// Test output truncation mode
enum class TruncationMode enum class TruncationMode
{ // Test output truncation mode {
Tail, Tail,
Middle, Middle,
Head Head
}; };
}
bool SetTruncationMode(TruncationMode& mode, cm::string_view str);
} // namespace cmCTestTypes

View File

@ -49,6 +49,7 @@
#include "cmCTestScriptHandler.h" #include "cmCTestScriptHandler.h"
#include "cmCTestSubmitHandler.h" #include "cmCTestSubmitHandler.h"
#include "cmCTestTestHandler.h" #include "cmCTestTestHandler.h"
#include "cmCTestTypes.h"
#include "cmCTestUpdateHandler.h" #include "cmCTestUpdateHandler.h"
#include "cmCTestUploadHandler.h" #include "cmCTestUploadHandler.h"
#include "cmCommandLineArgument.h" #include "cmCommandLineArgument.h"
@ -204,6 +205,8 @@ struct cmCTest::Private
cmCTest::NoTests NoTestsMode = cmCTest::NoTests::Legacy; cmCTest::NoTests NoTestsMode = cmCTest::NoTests::Legacy;
bool NoTestsModeSetInCli = false; bool NoTestsModeSetInCli = false;
cmCTestTestOptions TestOptions;
}; };
struct tm* cmCTest::GetNightlyTime(std::string const& str, bool tomorrowtag) struct tm* cmCTest::GetNightlyTime(std::string const& str, bool tomorrowtag)
@ -1769,17 +1772,17 @@ bool cmCTest::SetArgsFromPreset(const std::string& presetName,
expandedPreset->Output->SubprojectSummary.value_or(true); expandedPreset->Output->SubprojectSummary.value_or(true);
if (expandedPreset->Output->MaxPassedTestOutputSize) { if (expandedPreset->Output->MaxPassedTestOutputSize) {
this->Impl->TestHandler.SetTestOutputSizePassed( this->Impl->TestOptions.OutputSizePassed =
*expandedPreset->Output->MaxPassedTestOutputSize); *expandedPreset->Output->MaxPassedTestOutputSize;
} }
if (expandedPreset->Output->MaxFailedTestOutputSize) { if (expandedPreset->Output->MaxFailedTestOutputSize) {
this->Impl->TestHandler.SetTestOutputSizeFailed( this->Impl->TestOptions.OutputSizeFailed =
*expandedPreset->Output->MaxFailedTestOutputSize); *expandedPreset->Output->MaxFailedTestOutputSize;
} }
if (expandedPreset->Output->TestOutputTruncation) { if (expandedPreset->Output->TestOutputTruncation) {
this->Impl->TestHandler.TestOutputTruncation = this->Impl->TestOptions.OutputTruncation =
*expandedPreset->Output->TestOutputTruncation; *expandedPreset->Output->TestOutputTruncation;
} }
@ -2473,8 +2476,8 @@ int cmCTest::Run(std::vector<std::string> const& args)
[this](std::string const& sz) -> bool { [this](std::string const& sz) -> bool {
long outputSize; long outputSize;
if (cmStrToLong(sz, &outputSize)) { if (cmStrToLong(sz, &outputSize)) {
this->Impl->TestHandler.SetTestOutputSizePassed( this->Impl->TestOptions.OutputSizePassed =
static_cast<int>(outputSize)); static_cast<int>(outputSize);
} else { } else {
cmCTestLog( cmCTestLog(
this, WARNING, this, WARNING,
@ -2487,8 +2490,8 @@ int cmCTest::Run(std::vector<std::string> const& args)
[this](std::string const& sz) -> bool { [this](std::string const& sz) -> bool {
long outputSize; long outputSize;
if (cmStrToLong(sz, &outputSize)) { if (cmStrToLong(sz, &outputSize)) {
this->Impl->TestHandler.SetTestOutputSizeFailed( this->Impl->TestOptions.OutputSizeFailed =
static_cast<int>(outputSize)); static_cast<int>(outputSize);
} else { } else {
cmCTestLog( cmCTestLog(
this, WARNING, this, WARNING,
@ -2500,7 +2503,8 @@ int cmCTest::Run(std::vector<std::string> const& args)
CommandArgument{ CommandArgument{
"--test-output-truncation", CommandArgument::Values::One, "--test-output-truncation", CommandArgument::Values::One,
[this](std::string const& mode) -> bool { [this](std::string const& mode) -> bool {
if (!this->Impl->TestHandler.SetTestOutputTruncation(mode)) { if (!SetTruncationMode(this->Impl->TestOptions.OutputTruncation,
mode)) {
cmSystemTools::Error( cmSystemTools::Error(
cmStrCat("Invalid value for '--test-output-truncation': ", mode)); cmStrCat("Invalid value for '--test-output-truncation': ", mode));
return false; return false;
@ -3264,6 +3268,11 @@ std::string cmCTest::GetBuildID() const
return this->Impl->BuildID; return this->Impl->BuildID;
} }
cmCTestTestOptions const& cmCTest::GetTestOptions() const
{
return this->Impl->TestOptions;
}
void cmCTest::AddSubmitFile(Part part, const std::string& name) void cmCTest::AddSubmitFile(Part part, const std::string& name)
{ {
this->Impl->Parts[part].SubmitFiles.emplace_back(name); this->Impl->Parts[part].SubmitFiles.emplace_back(name);

View File

@ -32,6 +32,7 @@ class cmGeneratedFileStream;
class cmMakefile; class cmMakefile;
class cmValue; class cmValue;
class cmXMLWriter; class cmXMLWriter;
struct cmCTestTestOptions;
/** \class cmCTest /** \class cmCTest
* \brief Represents a ctest invocation. * \brief Represents a ctest invocation.
@ -444,6 +445,8 @@ public:
/** Reread the configuration file */ /** Reread the configuration file */
bool UpdateCTestConfiguration(); bool UpdateCTestConfiguration();
cmCTestTestOptions const& GetTestOptions() const;
private: private:
void SetPersistentOptionIfNotEmpty(const std::string& value, void SetPersistentOptionIfNotEmpty(const std::string& value,
const std::string& optionName); const std::string& optionName);