CTest: Add support for outputJUnitFile in presets

Fixes: #22400
This commit is contained in:
Kyle Edwards
2022-10-18 14:16:10 -04:00
parent 9270a02003
commit bea4ed5430
11 changed files with 131 additions and 8 deletions

View File

@@ -657,6 +657,12 @@ that may contain the following fields:
passing :option:`--output-log <ctest --output-log>` on the command line.
This field supports macro expansion.
``outputJUnitFile``
An optional string specifying a path to a JUnit file. Equivalent to
passing :option:`--output-junit <ctest --output-junit>` on the command line.
This field supports macro expansion. This is allowed in preset files
specifying version ``6`` or above.
``labelSummary``
An optional bool. If false, equivalent to passing
:option:`--no-label-summary <ctest --no-label-summary>` on the command

View File

@@ -83,7 +83,7 @@
"vendor": { "$ref": "#/definitions/vendor" },
"configurePresets": { "$ref": "#/definitions/configurePresetsV3"},
"buildPresets": { "$ref": "#/definitions/buildPresetsV4"},
"testPresets": { "$ref": "#/definitions/testPresetsV5"},
"testPresets": { "$ref": "#/definitions/testPresetsV6"},
"packagePresets": { "$ref": "#/definitions/packagePresetsV6"},
"workflowPresets": { "$ref": "#/definitions/workflowPresetsV6" },
"include": { "$ref": "#/definitions/include"}
@@ -705,6 +705,25 @@
"additionalProperties": false
}
},
"testPresetsItemsV6": {
"type": "array",
"description": "An optional array of test preset objects. Used to specify arguments to ctest. Available in version 6 and higher.",
"items": {
"type": "object",
"properties": {
"output": {
"type": "object",
"description": "An optional object specifying output options.",
"properties": {
"outputJUnitFile": {
"type": "string",
"description": "An optional string specifying a path to a JUnit file. Equivalent to passing --output-junit on the command line."
}
}
}
}
}
},
"testPresetsItemsV5": {
"type": "array",
"description": "An optional array of test preset objects. Used to specify arguments to ctest. Available in version 5 and higher.",
@@ -1051,6 +1070,58 @@
]
}
},
"testPresetsV6": {
"type": "array",
"description": "An optional array of test preset objects. Used to specify arguments to ctest. Available in version 6 and higher.",
"allOf": [
{ "$ref": "#/definitions/testPresetsItemsV2" },
{ "$ref": "#/definitions/testPresetsItemsV3" },
{ "$ref": "#/definitions/testPresetsItemsV5" },
{ "$ref": "#/definitions/testPresetsItemsV6" }
],
"items": {
"type": "object",
"properties": {
"name": {},
"hidden": {},
"inherits": {},
"configurePreset": {},
"vendor": {},
"displayName": {},
"description": {},
"inheritConfigureEnvironment": {},
"environment": {},
"configuration": {},
"overwriteConfigurationFile": {},
"output": {
"type": "object",
"properties": {
"shortProgress": {},
"verbosity": {},
"debug": {},
"outputOnFailure": {},
"quiet": {},
"outputLogFile": {},
"outputJUnitFile": {},
"labelSummary": {},
"subprojectSummary": {},
"maxPassedTestOutputSize": {},
"maxFailedTestOutputSize": {},
"maxTestNameWidth": {},
"testOutputTruncation": {}
},
"additionalProperties": false
},
"filter": {},
"execution": {},
"condition": {}
},
"required": [
"name"
],
"additionalProperties": false
}
},
"testPresetsV5": {
"type": "array",
"description": "An optional array of test preset objects. Used to specify arguments to ctest. Available in version 5 and higher.",

View File

@@ -21,6 +21,9 @@ Presets
* The :manual:`cmake-presets(7)` format now supports a
``workflowPresets`` field to specify presets for :option:`cmake --workflow`.
* The :manual:`cmake-presets(7)` format now supports a
``outputJUnitFile`` field to specify JUnit output in test presets.
Languages
---------

View File

@@ -2116,11 +2116,7 @@ bool cmCTest::HandleCommandLineArguments(size_t& i,
return false;
}
i++;
this->Impl->TestHandler.SetJUnitXMLFileName(std::string(args[i]));
// Turn test output compression off.
// This makes it easier to include test output in the resulting
// JUnit XML report.
this->Impl->CompressTestOutput = false;
this->SetOutputJUnitFileName(std::string(args[i]));
}
cm::string_view noTestsPrefix = "--no-tests=";
@@ -2458,6 +2454,9 @@ bool cmCTest::SetArgsFromPreset(const std::string& presetName,
if (!expandedPreset->Output->OutputLogFile.empty()) {
this->SetOutputLogFileName(expandedPreset->Output->OutputLogFile);
}
if (!expandedPreset->Output->OutputJUnitFile.empty()) {
this->SetOutputJUnitFileName(expandedPreset->Output->OutputJUnitFile);
}
this->Impl->LabelSummary =
expandedPreset->Output->LabelSummary.value_or(true);
@@ -3541,6 +3540,15 @@ void cmCTest::SetOutputLogFileName(const std::string& name)
}
}
void cmCTest::SetOutputJUnitFileName(const std::string& name)
{
this->Impl->TestHandler.SetJUnitXMLFileName(name);
// Turn test output compression off.
// This makes it easier to include test output in the resulting
// JUnit XML report.
this->Impl->CompressTestOutput = false;
}
static const char* cmCTestStringLogType[] = { "DEBUG",
"OUTPUT",
"HANDLER_OUTPUT",

View File

@@ -359,6 +359,9 @@ public:
/** Set the output log file name */
void SetOutputLogFileName(const std::string& name);
/** Set the output JUnit file name */
void SetOutputJUnitFileName(const std::string& name);
/** Set the visual studio or Xcode config type */
void SetConfigType(const std::string& ct);

View File

@@ -0,0 +1,4 @@
include("${CMAKE_CURRENT_LIST_DIR}/check.cmake")
if(NOT EXISTS "${RunCMake_TEST_BINARY_DIR}/default/output.xml")
string(APPEND RunCMake_TEST_FAILED "Expected ${RunCMake_TEST_BINARY_DIR}/default/output.xml to exist but it does not\n")
endif()

View File

@@ -1,5 +1,5 @@
{
"version": 5,
"version": 6,
"configurePresets": [
{
"name": "default",
@@ -178,6 +178,13 @@
"output": {
"outputLogFile": "${sourceDir}/build/default/output.log"
}
},
{
"name": "outputJUnit",
"inherits": "minimal",
"output": {
"outputJUnitFile": "${sourceDir}/build/default/output.xml"
}
}
]
}

View File

@@ -0,0 +1,2 @@
^CMake Error: Could not read presets from [^
]*/Tests/RunCMake/CMakePresetsTest/OutputJUnitUnsupported: File version must be 6 or higher for CTest JUnit output support$

View File

@@ -0,0 +1,17 @@
{
"version": 5,
"configurePresets": [
{
"name": "default"
}
],
"testPresets": [
{
"name": "unsupported",
"configurePreset": "default",
"output": {
"outputJUnitFile": "junit.xml"
}
}
]
}

View File

@@ -78,7 +78,7 @@ set(CMakePresetsTest_ASSETS "Good-indexFile.txt")
set(GoodTestPresets
"minimal;defaults;noEnvironment;withEnvironment"
"config-debug;config-release"
"exclude;index;indexFile;showOnly;outputLog")
"exclude;index;indexFile;showOnly;outputLog;outputJUnit")
run_cmake_test_presets(Good
"default"
""
@@ -106,6 +106,7 @@ set(CMakePresets_SCHEMA_EXPECTED_RESULT 1)
run_cmake_test_presets(PresetsUnsupported "" "" "x")
run_cmake_test_presets(ConditionFuture "" "" "x")
run_cmake_test_presets(TestOutputTruncationUnsupported "" "" "x")
run_cmake_test_presets(OutputJUnitUnsupported "" "" "x")
set(CMakePresets_SCHEMA_EXPECTED_RESULT 0)
run_cmake_test_presets(ConfigurePresetUnreachable "" "" "x")
set(CMakePresetsTest_NO_CONFIGURE 0)