ENH: Add a way for test to intentionally fail
This commit is contained in:
parent
52b808257d
commit
fcce3ac0a1
|
@ -27,6 +27,7 @@
|
||||||
#include "cmGlobalGenerator.h"
|
#include "cmGlobalGenerator.h"
|
||||||
#include "cmLocalGenerator.h"
|
#include "cmLocalGenerator.h"
|
||||||
#include "cmCommand.h"
|
#include "cmCommand.h"
|
||||||
|
#include "cmSystemTools.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
@ -168,6 +169,46 @@ bool cmCTestAddTestCommand::InitialPass(std::vector<std::string> const& args)
|
||||||
return m_TestHandler->AddTest(args);
|
return m_TestHandler->AddTest(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
class cmCTestSetTestsPropertiesCommand : public cmCommand
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* This is a virtual constructor for the command.
|
||||||
|
*/
|
||||||
|
virtual cmCommand* Clone()
|
||||||
|
{
|
||||||
|
cmCTestSetTestsPropertiesCommand* c = new cmCTestSetTestsPropertiesCommand;
|
||||||
|
c->m_TestHandler = m_TestHandler;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is called when the command is first encountered in
|
||||||
|
* the CMakeLists.txt file.
|
||||||
|
*/
|
||||||
|
virtual bool InitialPass(std::vector<std::string> const&);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the command as specified in CMakeList.txt.
|
||||||
|
*/
|
||||||
|
virtual const char* GetName() { return "SET_TESTS_PROPERTIES";}
|
||||||
|
|
||||||
|
// Unused methods
|
||||||
|
virtual const char* GetTerseDocumentation() { return ""; }
|
||||||
|
virtual const char* GetFullDocumentation() { return ""; }
|
||||||
|
|
||||||
|
cmTypeMacro(cmCTestSetTestsPropertiesCommand, cmCommand);
|
||||||
|
|
||||||
|
cmCTestTestHandler* m_TestHandler;
|
||||||
|
};
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
bool cmCTestSetTestsPropertiesCommand::InitialPass(std::vector<std::string> const& args)
|
||||||
|
{
|
||||||
|
return m_TestHandler->SetTestsProperties(args);
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
// Try to find an executable, if found fullPath will be set to the full path
|
// Try to find an executable, if found fullPath will be set to the full path
|
||||||
// of where it was found. The directory and filename to search for are passed
|
// of where it was found. The directory and filename to search for are passed
|
||||||
|
@ -700,9 +741,18 @@ void cmCTestTestHandler::ProcessDirectory(std::vector<cmStdString> &passed,
|
||||||
{
|
{
|
||||||
if (res == cmsysProcess_State_Exited && retVal == 0)
|
if (res == cmsysProcess_State_Exited && retVal == 0)
|
||||||
{
|
{
|
||||||
cmCTestLog(m_CTest, HANDLER_OUTPUT, " Passed" << std::endl);
|
cmCTestLog(m_CTest, HANDLER_OUTPUT, " Passed");
|
||||||
passed.push_back(testname);
|
passed.push_back(testname);
|
||||||
cres.m_Status = cmCTestTestHandler::COMPLETED;
|
if ( it->m_WillFail )
|
||||||
|
{
|
||||||
|
cmCTestLog(m_CTest, HANDLER_OUTPUT, " - But it should fail!");
|
||||||
|
cres.m_Status = cmCTestTestHandler::FAILED;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cres.m_Status = cmCTestTestHandler::COMPLETED;
|
||||||
|
}
|
||||||
|
cmCTestLog(m_CTest, HANDLER_OUTPUT, std::endl);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -746,7 +796,13 @@ void cmCTestTestHandler::ProcessDirectory(std::vector<cmStdString> &passed,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
cmCTestLog(m_CTest, HANDLER_OUTPUT, "***Failed" << std::endl);
|
cmCTestLog(m_CTest, HANDLER_OUTPUT, "***Failed");
|
||||||
|
if ( it->m_WillFail )
|
||||||
|
{
|
||||||
|
cres.m_Status = cmCTestTestHandler::COMPLETED;
|
||||||
|
cmCTestLog(m_CTest, HANDLER_OUTPUT, " - supposed to fail");
|
||||||
|
}
|
||||||
|
cmCTestLog(m_CTest, HANDLER_OUTPUT, std::endl);
|
||||||
}
|
}
|
||||||
failed.push_back(testname);
|
failed.push_back(testname);
|
||||||
}
|
}
|
||||||
|
@ -1013,6 +1069,11 @@ void cmCTestTestHandler::GetListOfTests()
|
||||||
newCom2->m_TestHandler = this;
|
newCom2->m_TestHandler = this;
|
||||||
cm.AddCommand(newCom2);
|
cm.AddCommand(newCom2);
|
||||||
|
|
||||||
|
// Add handler for SET_SOURCE_FILES_PROPERTIES
|
||||||
|
cmCTestSetTestsPropertiesCommand* newCom3 = new cmCTestSetTestsPropertiesCommand;
|
||||||
|
newCom3->m_TestHandler = this;
|
||||||
|
cm.AddCommand(newCom3);
|
||||||
|
|
||||||
const char* testFilename;
|
const char* testFilename;
|
||||||
if( cmSystemTools::FileExists("CTestTestfile.cmake") )
|
if( cmSystemTools::FileExists("CTestTestfile.cmake") )
|
||||||
{
|
{
|
||||||
|
@ -1401,6 +1462,54 @@ bool cmCTestTestHandler::CleanTestOutput(std::string& output, size_t remove_thre
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
bool cmCTestTestHandler::SetTestsProperties(const std::vector<std::string>& args)
|
||||||
|
{
|
||||||
|
std::vector<std::string>::const_iterator it;
|
||||||
|
std::vector<cmStdString> tests;
|
||||||
|
bool found = false;
|
||||||
|
for ( it = args.begin(); it != args.end(); ++ it )
|
||||||
|
{
|
||||||
|
if ( *it == "PROPERTIES" )
|
||||||
|
{
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
tests.push_back(*it);
|
||||||
|
}
|
||||||
|
if ( !found )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
++ it; // skip PROPERTIES
|
||||||
|
for ( ; it != args.end(); ++ it )
|
||||||
|
{
|
||||||
|
std::string key = *it;
|
||||||
|
++ it;
|
||||||
|
if ( it == args.end() )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
std::string val = *it;
|
||||||
|
std::vector<cmStdString>::const_iterator tit;
|
||||||
|
for ( tit = tests.begin(); tit != tests.end(); ++ tit )
|
||||||
|
{
|
||||||
|
tm_ListOfTests::iterator rtit;
|
||||||
|
for ( rtit = m_TestList.begin(); rtit != m_TestList.end(); ++ rtit )
|
||||||
|
{
|
||||||
|
if ( *tit == rtit->m_Name )
|
||||||
|
{
|
||||||
|
if ( key == "WILL_FAIL" )
|
||||||
|
{
|
||||||
|
rtit->m_WillFail = cmSystemTools::IsOn(val.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
bool cmCTestTestHandler::AddTest(const std::vector<std::string>& args)
|
bool cmCTestTestHandler::AddTest(const std::vector<std::string>& args)
|
||||||
{
|
{
|
||||||
|
@ -1455,6 +1564,7 @@ bool cmCTestTestHandler::AddTest(const std::vector<std::string>& args)
|
||||||
test.m_Args = args;
|
test.m_Args = args;
|
||||||
test.m_Directory = cmSystemTools::GetCurrentWorkingDirectory();
|
test.m_Directory = cmSystemTools::GetCurrentWorkingDirectory();
|
||||||
test.m_IsInBasedOnREOptions = true;
|
test.m_IsInBasedOnREOptions = true;
|
||||||
|
test.m_WillFail = false;
|
||||||
if (this->m_UseIncludeRegExp && !m_IncludeTestsRegularExpression.find(testname.c_str()))
|
if (this->m_UseIncludeRegExp && !m_IncludeTestsRegularExpression.find(testname.c_str()))
|
||||||
{
|
{
|
||||||
test.m_IsInBasedOnREOptions = false;
|
test.m_IsInBasedOnREOptions = false;
|
||||||
|
|
|
@ -68,6 +68,11 @@ public:
|
||||||
*/
|
*/
|
||||||
bool AddTest(const std::vector<std::string>& args);
|
bool AddTest(const std::vector<std::string>& args);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set tests properties
|
||||||
|
*/
|
||||||
|
bool SetTestsProperties(const std::vector<std::string>& args);
|
||||||
|
|
||||||
struct cmCTestTestResult
|
struct cmCTestTestResult
|
||||||
{
|
{
|
||||||
std::string m_Name;
|
std::string m_Name;
|
||||||
|
@ -91,6 +96,7 @@ protected:
|
||||||
cmStdString m_Directory;
|
cmStdString m_Directory;
|
||||||
std::vector<std::string> m_Args;
|
std::vector<std::string> m_Args;
|
||||||
bool m_IsInBasedOnREOptions;
|
bool m_IsInBasedOnREOptions;
|
||||||
|
bool m_WillFail;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -177,7 +177,17 @@ void cmLocalGenerator::GenerateTestFiles()
|
||||||
fout << "\"";
|
fout << "\"";
|
||||||
}
|
}
|
||||||
fout << ")" << std::endl;
|
fout << ")" << std::endl;
|
||||||
|
std::map<cmStdString,cmStdString>::const_iterator pit;
|
||||||
|
const std::map<cmStdString,cmStdString>* mpit = &test->GetProperties();
|
||||||
|
if ( mpit->size() )
|
||||||
|
{
|
||||||
|
fout << "SET_TESTS_PROPERTIES(" << test->GetName() << " PROPERTIES ";
|
||||||
|
for ( pit = mpit->begin(); pit != mpit->end(); ++ pit )
|
||||||
|
{
|
||||||
|
fout << " " << pit->first.c_str() << " \"" << pit->second.c_str() << "\"";
|
||||||
|
}
|
||||||
|
fout << ")" << std::endl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if ( this->Children.size())
|
if ( this->Children.size())
|
||||||
{
|
{
|
||||||
|
|
|
@ -52,6 +52,10 @@ public:
|
||||||
void SetProperty(const char *prop, const char *value);
|
void SetProperty(const char *prop, const char *value);
|
||||||
const char *GetProperty(const char *prop) const;
|
const char *GetProperty(const char *prop) const;
|
||||||
bool GetPropertyAsBool(const char *prop) const;
|
bool GetPropertyAsBool(const char *prop) const;
|
||||||
|
const std::map<cmStdString,cmStdString>& GetProperties() const
|
||||||
|
{
|
||||||
|
return m_Properties;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::map<cmStdString,cmStdString> m_Properties;
|
std::map<cmStdString,cmStdString> m_Properties;
|
||||||
|
|
Loading…
Reference in New Issue