ENH: add the ability to run tests by labels

This commit is contained in:
Bill Hoffman 2009-02-10 14:24:24 -05:00
parent 70363cbf8f
commit 4e710a9ebe
5 changed files with 146 additions and 3 deletions

View File

@ -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;
} }

View File

@ -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
}; };
}; };

View File

@ -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" )
{ {

View File

@ -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;

View File

@ -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)