ENH: add the ability to run tests by labels
This commit is contained in:
parent
70363cbf8f
commit
4e710a9ebe
|
@ -26,6 +26,8 @@ cmCTestTestCommand::cmCTestTestCommand()
|
||||||
this->Arguments[ctt_STRIDE] = "STRIDE";
|
this->Arguments[ctt_STRIDE] = "STRIDE";
|
||||||
this->Arguments[ctt_EXCLUDE] = "EXCLUDE";
|
this->Arguments[ctt_EXCLUDE] = "EXCLUDE";
|
||||||
this->Arguments[ctt_INCLUDE] = "INCLUDE";
|
this->Arguments[ctt_INCLUDE] = "INCLUDE";
|
||||||
|
this->Arguments[ctt_EXCLUDE_LABEL] = "EXCLUDE_LABEL";
|
||||||
|
this->Arguments[ctt_INCLUDE_LABEL] = "INCLUDE_LABEL";
|
||||||
this->Arguments[ctt_LAST] = 0;
|
this->Arguments[ctt_LAST] = 0;
|
||||||
this->Last = ctt_LAST;
|
this->Last = ctt_LAST;
|
||||||
}
|
}
|
||||||
|
@ -78,6 +80,16 @@ cmCTestGenericHandler* cmCTestTestCommand::InitializeHandler()
|
||||||
{
|
{
|
||||||
handler->SetOption("IncludeRegularExpression", this->Values[ctt_INCLUDE]);
|
handler->SetOption("IncludeRegularExpression", this->Values[ctt_INCLUDE]);
|
||||||
}
|
}
|
||||||
|
if(this->Values[ctt_EXCLUDE_LABEL])
|
||||||
|
{
|
||||||
|
handler->SetOption("ExcludeLabelRegularExpression",
|
||||||
|
this->Values[ctt_EXCLUDE_LABEL]);
|
||||||
|
}
|
||||||
|
if(this->Values[ctt_INCLUDE_LABEL])
|
||||||
|
{
|
||||||
|
handler->SetOption("LabelRegularExpression",
|
||||||
|
this->Values[ctt_INCLUDE_LABEL]);
|
||||||
|
}
|
||||||
return handler;
|
return handler;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -63,13 +63,17 @@ public:
|
||||||
" ctest_test([BUILD build_dir]\n"
|
" ctest_test([BUILD build_dir]\n"
|
||||||
" [START start number] [END end number]\n"
|
" [START start number] [END end number]\n"
|
||||||
" [STRIDE stride number] [EXCLUDE exclude regex ]\n"
|
" [STRIDE stride number] [EXCLUDE exclude regex ]\n"
|
||||||
" [INCLUDE include regex] [RETURN_VALUE res] )\n"
|
" [INCLUDE include regex] [RETURN_VALUE res] \n"
|
||||||
|
" [EXCLUDE_LABEL exclude regex] \n"
|
||||||
|
" [INCLUDE_LABEL label regex] )\n"
|
||||||
"Tests the given build directory and stores results in Test.xml. The "
|
"Tests the given build directory and stores results in Test.xml. The "
|
||||||
"second argument is a variable that will hold value. Optionally, "
|
"second argument is a variable that will hold value. Optionally, "
|
||||||
"you can specify the starting test number START, the ending test number "
|
"you can specify the starting test number START, the ending test number "
|
||||||
"END, the number of tests to skip between each test STRIDE, a regular "
|
"END, the number of tests to skip between each test STRIDE, a regular "
|
||||||
"expression for tests to run INCLUDE, or a regular expression for tests "
|
"expression for tests to run INCLUDE, or a regular expression for tests "
|
||||||
"to not run EXCLUDE.";
|
"to not run EXCLUDE. EXCLUDE_LABEL and INCLUDE_LABEL are regular "
|
||||||
|
"expression for test to be included or excluded by the test "
|
||||||
|
"property LABEL.";
|
||||||
}
|
}
|
||||||
|
|
||||||
cmTypeMacro(cmCTestTestCommand, cmCTestHandlerCommand);
|
cmTypeMacro(cmCTestTestCommand, cmCTestHandlerCommand);
|
||||||
|
@ -86,6 +90,8 @@ protected:
|
||||||
ctt_STRIDE,
|
ctt_STRIDE,
|
||||||
ctt_EXCLUDE,
|
ctt_EXCLUDE,
|
||||||
ctt_INCLUDE,
|
ctt_INCLUDE,
|
||||||
|
ctt_EXCLUDE_LABEL,
|
||||||
|
ctt_INCLUDE_LABEL,
|
||||||
ctt_LAST
|
ctt_LAST
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -391,6 +391,8 @@ cmCTestTestHandler::cmCTestTestHandler()
|
||||||
{
|
{
|
||||||
this->UseUnion = false;
|
this->UseUnion = false;
|
||||||
|
|
||||||
|
this->UseIncludeLabelRegExpFlag = false;
|
||||||
|
this->UseExcludeLabelRegExpFlag = false;
|
||||||
this->UseIncludeRegExpFlag = false;
|
this->UseIncludeRegExpFlag = false;
|
||||||
this->UseExcludeRegExpFlag = false;
|
this->UseExcludeRegExpFlag = false;
|
||||||
this->UseExcludeRegExpFirst = false;
|
this->UseExcludeRegExpFirst = false;
|
||||||
|
@ -433,6 +435,8 @@ void cmCTestTestHandler::Initialize()
|
||||||
this->UseIncludeRegExpFlag = false;
|
this->UseIncludeRegExpFlag = false;
|
||||||
this->UseExcludeRegExpFlag = false;
|
this->UseExcludeRegExpFlag = false;
|
||||||
this->UseExcludeRegExpFirst = false;
|
this->UseExcludeRegExpFirst = false;
|
||||||
|
this->IncludeLabelRegularExpression = "";
|
||||||
|
this->ExcludeLabelRegularExpression = "";
|
||||||
this->IncludeRegExp = "";
|
this->IncludeRegExp = "";
|
||||||
this->ExcludeRegExp = "";
|
this->ExcludeRegExp = "";
|
||||||
|
|
||||||
|
@ -492,6 +496,18 @@ int cmCTestTestHandler::ProcessHandler()
|
||||||
this->SetTestsToRunInformation(this->GetOption("TestsToRunInformation"));
|
this->SetTestsToRunInformation(this->GetOption("TestsToRunInformation"));
|
||||||
this->SetUseUnion(cmSystemTools::IsOn(this->GetOption("UseUnion")));
|
this->SetUseUnion(cmSystemTools::IsOn(this->GetOption("UseUnion")));
|
||||||
const char* val;
|
const char* val;
|
||||||
|
val = this->GetOption("LabelRegularExpression");
|
||||||
|
if ( val )
|
||||||
|
{
|
||||||
|
this->UseIncludeLabelRegExpFlag = true;
|
||||||
|
this->IncludeLabelRegExp = val;
|
||||||
|
}
|
||||||
|
val = this->GetOption("ExcludeLabelRegularExpression");
|
||||||
|
if ( val )
|
||||||
|
{
|
||||||
|
this->UseExcludeLabelRegExpFlag = true;
|
||||||
|
this->ExcludeLabelRegularExpression = val;
|
||||||
|
}
|
||||||
val = this->GetOption("IncludeRegularExpression");
|
val = this->GetOption("IncludeRegularExpression");
|
||||||
if ( val )
|
if ( val )
|
||||||
{
|
{
|
||||||
|
@ -938,6 +954,79 @@ void cmCTestTestHandler::ProcessOneTest(cmCTestTestProperties *it,
|
||||||
this->TestResults.push_back( cres );
|
this->TestResults.push_back( cres );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
void cmCTestTestHandler::CheckLabelFilterInclude(cmCTestTestProperties& it)
|
||||||
|
{
|
||||||
|
// if not using Labels to filter then return
|
||||||
|
if (!this->UseIncludeLabelRegExpFlag )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// if there are no labels and we are filtering by labels
|
||||||
|
// then exclude the test as it does not have the label
|
||||||
|
if(it.Labels.size() == 0 )
|
||||||
|
{
|
||||||
|
it.IsInBasedOnREOptions = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// check to see if the label regular expression matches
|
||||||
|
bool found = false; // assume it does not match
|
||||||
|
// loop over all labels and look for match
|
||||||
|
for(std::vector<std::string>::iterator l = it.Labels.begin();
|
||||||
|
l != it.Labels.end(); ++l)
|
||||||
|
{
|
||||||
|
if(this->IncludeLabelRegularExpression.find(*l))
|
||||||
|
{
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// if no match was found, exclude the test
|
||||||
|
if(!found)
|
||||||
|
{
|
||||||
|
it.IsInBasedOnREOptions = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
void cmCTestTestHandler::CheckLabelFilterExclude(cmCTestTestProperties& it)
|
||||||
|
{
|
||||||
|
// if not using Labels to filter then return
|
||||||
|
if (!this->UseExcludeLabelRegExpFlag )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// if there are no labels and we are excluding by labels
|
||||||
|
// then do nothing as a no label can not be a match
|
||||||
|
if(it.Labels.size() == 0 )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// check to see if the label regular expression matches
|
||||||
|
bool found = false; // assume it does not match
|
||||||
|
// loop over all labels and look for match
|
||||||
|
for(std::vector<std::string>::iterator l = it.Labels.begin();
|
||||||
|
l != it.Labels.end(); ++l)
|
||||||
|
{
|
||||||
|
if(this->ExcludeLabelRegularExpression.find(*l))
|
||||||
|
{
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// if match was found, exclude the test
|
||||||
|
if(found)
|
||||||
|
{
|
||||||
|
it.IsInBasedOnREOptions = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
void cmCTestTestHandler::CheckLabelFilter(cmCTestTestProperties& it)
|
||||||
|
{
|
||||||
|
this->CheckLabelFilterInclude(it);
|
||||||
|
this->CheckLabelFilterExclude(it);
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
void cmCTestTestHandler::ComputeTestList()
|
void cmCTestTestHandler::ComputeTestList()
|
||||||
{
|
{
|
||||||
|
@ -952,12 +1041,12 @@ void cmCTestTestHandler::ComputeTestList()
|
||||||
this->GetListOfTests();
|
this->GetListOfTests();
|
||||||
}
|
}
|
||||||
cmCTestTestHandler::ListOfTests::size_type tmsize = this->TestList.size();
|
cmCTestTestHandler::ListOfTests::size_type tmsize = this->TestList.size();
|
||||||
|
|
||||||
// how many tests are in based on RegExp?
|
// how many tests are in based on RegExp?
|
||||||
int inREcnt = 0;
|
int inREcnt = 0;
|
||||||
cmCTestTestHandler::ListOfTests::iterator it;
|
cmCTestTestHandler::ListOfTests::iterator it;
|
||||||
for ( it = this->TestList.begin(); it != this->TestList.end(); it ++ )
|
for ( it = this->TestList.begin(); it != this->TestList.end(); it ++ )
|
||||||
{
|
{
|
||||||
|
this->CheckLabelFilter(*it);
|
||||||
if (it->IsInBasedOnREOptions)
|
if (it->IsInBasedOnREOptions)
|
||||||
{
|
{
|
||||||
inREcnt ++;
|
inREcnt ++;
|
||||||
|
@ -1808,6 +1897,16 @@ std::string cmCTestTestHandler
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
void cmCTestTestHandler::GetListOfTests()
|
void cmCTestTestHandler::GetListOfTests()
|
||||||
{
|
{
|
||||||
|
if ( !this->IncludeLabelRegExp.empty() )
|
||||||
|
{
|
||||||
|
this->IncludeLabelRegularExpression.
|
||||||
|
compile(this->IncludeLabelRegExp.c_str());
|
||||||
|
}
|
||||||
|
if ( !this->IncludeLabelRegExp.empty() )
|
||||||
|
{
|
||||||
|
this->ExcludeLabelRegularExpression.
|
||||||
|
compile(this->ExcludeLabelRegExp.c_str());
|
||||||
|
}
|
||||||
if ( !this->IncludeRegExp.empty() )
|
if ( !this->IncludeRegExp.empty() )
|
||||||
{
|
{
|
||||||
this->IncludeTestsRegularExpression.compile(this->IncludeRegExp.c_str());
|
this->IncludeTestsRegularExpression.compile(this->IncludeRegExp.c_str());
|
||||||
|
@ -2376,6 +2475,7 @@ bool cmCTestTestHandler::SetTestsProperties(
|
||||||
{
|
{
|
||||||
rtit->Labels.push_back(*crit);
|
rtit->Labels.push_back(*crit);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
if ( key == "MEASUREMENT" )
|
if ( key == "MEASUREMENT" )
|
||||||
{
|
{
|
||||||
|
|
|
@ -234,16 +234,25 @@ private:
|
||||||
|
|
||||||
std::vector<int> TestsToRun;
|
std::vector<int> TestsToRun;
|
||||||
|
|
||||||
|
bool UseIncludeLabelRegExpFlag;
|
||||||
|
bool UseExcludeLabelRegExpFlag;
|
||||||
bool UseIncludeRegExpFlag;
|
bool UseIncludeRegExpFlag;
|
||||||
bool UseExcludeRegExpFlag;
|
bool UseExcludeRegExpFlag;
|
||||||
bool UseExcludeRegExpFirst;
|
bool UseExcludeRegExpFirst;
|
||||||
|
std::string IncludeLabelRegExp;
|
||||||
|
std::string ExcludeLabelRegExp;
|
||||||
std::string IncludeRegExp;
|
std::string IncludeRegExp;
|
||||||
std::string ExcludeRegExp;
|
std::string ExcludeRegExp;
|
||||||
|
cmsys::RegularExpression IncludeLabelRegularExpression;
|
||||||
|
cmsys::RegularExpression ExcludeLabelRegularExpression;
|
||||||
cmsys::RegularExpression IncludeTestsRegularExpression;
|
cmsys::RegularExpression IncludeTestsRegularExpression;
|
||||||
cmsys::RegularExpression ExcludeTestsRegularExpression;
|
cmsys::RegularExpression ExcludeTestsRegularExpression;
|
||||||
|
|
||||||
std::string GenerateRegressionImages(const std::string& xml);
|
std::string GenerateRegressionImages(const std::string& xml);
|
||||||
cmsys::RegularExpression DartStuff1;
|
cmsys::RegularExpression DartStuff1;
|
||||||
|
void CheckLabelFilter(cmCTestTestProperties& it);
|
||||||
|
void CheckLabelFilterExclude(cmCTestTestProperties& it);
|
||||||
|
void CheckLabelFilterInclude(cmCTestTestProperties& it);
|
||||||
|
|
||||||
std::string TestsToRunString;
|
std::string TestsToRunString;
|
||||||
bool UseUnion;
|
bool UseUnion;
|
||||||
|
|
|
@ -1813,6 +1813,22 @@ void cmCTest::HandleCommandLineArguments(size_t &i,
|
||||||
this->GetHandler("memcheck")->
|
this->GetHandler("memcheck")->
|
||||||
SetPersistentOption("IncludeRegularExpression", args[i].c_str());
|
SetPersistentOption("IncludeRegularExpression", args[i].c_str());
|
||||||
}
|
}
|
||||||
|
if(this->CheckArgument(arg, "-L", "--label-regex") && i < args.size() - 1)
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
this->GetHandler("test")->
|
||||||
|
SetPersistentOption("LabelRegularExpression", args[i].c_str());
|
||||||
|
this->GetHandler("memcheck")->
|
||||||
|
SetPersistentOption("LabelRegularExpression", args[i].c_str());
|
||||||
|
}
|
||||||
|
if(this->CheckArgument(arg, "-LE", "--label-exclude") && i < args.size() - 1)
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
this->GetHandler("test")->
|
||||||
|
SetPersistentOption("ExcludeLabelRegularExpression", args[i].c_str());
|
||||||
|
this->GetHandler("memcheck")->
|
||||||
|
SetPersistentOption("ExcludeLabelRegularExpression", args[i].c_str());
|
||||||
|
}
|
||||||
|
|
||||||
if(this->CheckArgument(arg, "-E", "--exclude-regex") &&
|
if(this->CheckArgument(arg, "-E", "--exclude-regex") &&
|
||||||
i < args.size() - 1)
|
i < args.size() - 1)
|
||||||
|
|
Loading…
Reference in New Issue