2001-08-23 15:12:19 +00:00
|
|
|
/*=========================================================================
|
|
|
|
|
2002-10-23 22:03:27 +00:00
|
|
|
Program: CMake - Cross-Platform Makefile Generator
|
2001-08-23 15:12:19 +00:00
|
|
|
Module: $RCSfile$
|
|
|
|
Language: C++
|
|
|
|
Date: $Date$
|
|
|
|
Version: $Revision$
|
|
|
|
|
2002-10-23 22:03:27 +00:00
|
|
|
Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
|
|
|
|
See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
|
2001-08-23 15:12:19 +00:00
|
|
|
|
2002-01-21 20:30:43 +00:00
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
|
|
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
|
|
PURPOSE. See the above copyright notices for more information.
|
2001-08-23 15:12:19 +00:00
|
|
|
|
|
|
|
=========================================================================*/
|
|
|
|
|
2003-02-11 02:52:01 +00:00
|
|
|
#ifndef cmCTest_h
|
|
|
|
#define cmCTest_h
|
|
|
|
|
2001-08-23 15:12:19 +00:00
|
|
|
|
|
|
|
#include "cmStandardIncludes.h"
|
2004-03-14 16:23:57 +00:00
|
|
|
#include "cmListFileCache.h"
|
2002-05-22 13:47:41 +00:00
|
|
|
|
2004-01-26 18:57:26 +00:00
|
|
|
class cmMakefile;
|
|
|
|
|
2002-12-17 02:19:21 +00:00
|
|
|
class cmCTest
|
2001-08-23 15:12:19 +00:00
|
|
|
{
|
|
|
|
public:
|
2003-12-15 22:26:00 +00:00
|
|
|
typedef std::vector<cmStdString> tm_VectorOfStrings;
|
|
|
|
|
2004-01-07 16:24:22 +00:00
|
|
|
///! Process Command line arguments
|
|
|
|
int Run(std::vector<std::string>const&, std::string* output = 0);
|
|
|
|
|
2003-12-02 00:25:51 +00:00
|
|
|
/**
|
|
|
|
* Run a dashboard using a specified confiuration script
|
|
|
|
*/
|
|
|
|
int RunConfigurationScript();
|
2004-02-24 15:05:12 +00:00
|
|
|
int RunConfigurationScript(const std::string& script);
|
2003-12-02 00:25:51 +00:00
|
|
|
|
2002-10-07 00:36:52 +00:00
|
|
|
/**
|
|
|
|
* Initialize and finalize testing
|
|
|
|
*/
|
2004-01-26 18:57:26 +00:00
|
|
|
int Initialize();
|
2002-10-07 00:36:52 +00:00
|
|
|
void Finalize();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Process the tests. This is the main routine. The execution of the
|
|
|
|
* tests should look like this:
|
|
|
|
*
|
|
|
|
* ctest foo;
|
|
|
|
* foo.Initialize();
|
|
|
|
* // Set some things on foo
|
|
|
|
* foo.ProcessTests();
|
|
|
|
* foo.Finalize();
|
|
|
|
*/
|
|
|
|
int ProcessTests();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Try to build the project
|
|
|
|
*/
|
2002-10-09 02:54:24 +00:00
|
|
|
int BuildDirectory();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Try to run tests of the project
|
|
|
|
*/
|
2003-12-15 22:26:00 +00:00
|
|
|
int TestDirectory(bool memcheck);
|
2002-10-07 00:36:52 +00:00
|
|
|
|
2002-12-09 03:36:54 +00:00
|
|
|
/**
|
|
|
|
* Try to get coverage of the project
|
|
|
|
*/
|
|
|
|
int CoverageDirectory();
|
|
|
|
|
2002-10-07 00:36:52 +00:00
|
|
|
/**
|
|
|
|
* Do revision control update of directory
|
|
|
|
*/
|
2002-10-09 02:54:24 +00:00
|
|
|
int UpdateDirectory();
|
2001-08-23 15:12:19 +00:00
|
|
|
|
2002-10-09 00:02:01 +00:00
|
|
|
/**
|
|
|
|
* Do configure the project
|
|
|
|
*/
|
2002-10-09 02:54:24 +00:00
|
|
|
int ConfigureDirectory();
|
2002-10-09 00:02:01 +00:00
|
|
|
|
2003-01-07 04:13:15 +00:00
|
|
|
/**
|
|
|
|
* Do submit testing results
|
|
|
|
*/
|
|
|
|
int SubmitResults();
|
|
|
|
std::string GetSubmitResultsPrefix();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Check if CTest file exists
|
|
|
|
*/
|
|
|
|
bool CTestFileExists(const std::string& filename);
|
|
|
|
|
2001-08-23 15:12:19 +00:00
|
|
|
/**
|
|
|
|
* Run the test for a directory and any subdirectories
|
|
|
|
*/
|
2003-12-15 22:26:00 +00:00
|
|
|
void ProcessDirectory(tm_VectorOfStrings &passed,
|
|
|
|
tm_VectorOfStrings &failed,
|
2004-03-14 16:23:57 +00:00
|
|
|
bool memcheck);
|
2001-08-23 15:12:19 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Find the executable for a test
|
|
|
|
*/
|
2003-03-19 21:11:19 +00:00
|
|
|
std::string FindTheExecutable(const char *exe);
|
2001-08-23 15:12:19 +00:00
|
|
|
|
2002-10-07 00:36:52 +00:00
|
|
|
/**
|
|
|
|
* Set the cmake test
|
|
|
|
*/
|
|
|
|
bool SetTest(const char*);
|
|
|
|
|
2003-02-11 02:52:01 +00:00
|
|
|
/**
|
|
|
|
* Set the cmake test mode (experimental, nightly, continuous).
|
|
|
|
*/
|
|
|
|
void SetTestModel(int mode)
|
|
|
|
{
|
|
|
|
m_TestModel = mode;
|
|
|
|
}
|
2004-01-07 00:13:55 +00:00
|
|
|
|
2003-02-11 02:52:01 +00:00
|
|
|
std::string GetTestModelString();
|
2004-01-07 00:13:55 +00:00
|
|
|
static int GetTestModelFromString(const char* str);
|
2003-02-11 02:52:01 +00:00
|
|
|
|
2001-08-23 15:12:19 +00:00
|
|
|
/**
|
|
|
|
* constructor
|
|
|
|
*/
|
2002-12-17 02:19:21 +00:00
|
|
|
cmCTest();
|
2002-03-06 22:58:44 +00:00
|
|
|
|
2004-01-07 00:13:55 +00:00
|
|
|
//! Set the notes files to be created.
|
|
|
|
void SetNotesFiles(const char* notes);
|
|
|
|
|
2002-03-06 22:58:44 +00:00
|
|
|
bool m_UseIncludeRegExp;
|
|
|
|
std::string m_IncludeRegExp;
|
|
|
|
|
|
|
|
bool m_UseExcludeRegExp;
|
|
|
|
bool m_UseExcludeRegExpFirst;
|
|
|
|
std::string m_ExcludeRegExp;
|
2001-08-29 20:42:03 +00:00
|
|
|
|
2002-02-26 20:15:16 +00:00
|
|
|
std::string m_ConfigType;
|
2002-09-24 22:34:16 +00:00
|
|
|
bool m_Verbose;
|
2002-10-07 00:36:52 +00:00
|
|
|
bool m_DartMode;
|
2002-12-15 18:45:43 +00:00
|
|
|
bool m_ShowOnly;
|
2002-10-07 00:36:52 +00:00
|
|
|
|
2003-12-02 00:25:51 +00:00
|
|
|
bool m_RunConfigurationScript;
|
2004-02-24 15:05:12 +00:00
|
|
|
tm_VectorOfStrings m_ConfigurationScripts;
|
2003-12-02 00:25:51 +00:00
|
|
|
|
2003-02-11 02:52:01 +00:00
|
|
|
enum {
|
|
|
|
EXPERIMENTAL,
|
|
|
|
NIGHTLY,
|
|
|
|
CONTINUOUS
|
|
|
|
};
|
|
|
|
|
2003-12-26 20:02:26 +00:00
|
|
|
int GenerateNotesFile(const char* files);
|
|
|
|
|
2004-01-23 14:44:47 +00:00
|
|
|
void RestoreBackupDirectories(bool backup,
|
|
|
|
const char *srcDir, const char *binDir,
|
|
|
|
const char *backupSrc, const char *backupBin);
|
|
|
|
|
2001-08-23 15:12:19 +00:00
|
|
|
private:
|
2002-10-07 00:36:52 +00:00
|
|
|
enum {
|
2003-02-11 04:19:01 +00:00
|
|
|
FIRST_TEST = 0,
|
|
|
|
UPDATE_TEST = 1,
|
2003-03-19 21:35:02 +00:00
|
|
|
START_TEST = 2,
|
|
|
|
CONFIGURE_TEST = 3,
|
|
|
|
BUILD_TEST = 4,
|
|
|
|
TEST_TEST = 5,
|
|
|
|
COVERAGE_TEST = 6,
|
2003-12-15 22:26:00 +00:00
|
|
|
MEMCHECK_TEST = 7,
|
2003-03-19 21:35:02 +00:00
|
|
|
SUBMIT_TEST = 8,
|
2003-12-26 20:02:26 +00:00
|
|
|
NOTES_TEST = 9,
|
|
|
|
ALL_TEST = 10,
|
|
|
|
LAST_TEST = 11
|
2002-10-07 00:36:52 +00:00
|
|
|
};
|
2003-08-18 15:30:53 +00:00
|
|
|
|
2003-08-13 22:17:11 +00:00
|
|
|
enum { // Program statuses
|
|
|
|
NOT_RUN = 0,
|
|
|
|
TIMEOUT,
|
|
|
|
SEGFAULT,
|
|
|
|
ILLEGAL,
|
|
|
|
INTERRUPT,
|
|
|
|
NUMERICAL,
|
|
|
|
OTHER_FAULT,
|
2003-08-18 18:31:09 +00:00
|
|
|
FAILED,
|
2003-08-13 22:17:11 +00:00
|
|
|
BAD_COMMAND,
|
|
|
|
COMPLETED
|
|
|
|
};
|
|
|
|
|
2003-12-15 22:26:00 +00:00
|
|
|
enum { // Memory checkers
|
|
|
|
UNKNOWN = 0,
|
|
|
|
VALGRIND,
|
|
|
|
PURIFY,
|
|
|
|
BOUNDS_CHECKER
|
|
|
|
};
|
|
|
|
|
|
|
|
enum { // Memory faults
|
|
|
|
ABR = 0,
|
|
|
|
ABW,
|
|
|
|
ABWL,
|
|
|
|
COR,
|
|
|
|
EXU,
|
|
|
|
FFM,
|
|
|
|
FIM,
|
|
|
|
FMM,
|
|
|
|
FMR,
|
|
|
|
FMW,
|
|
|
|
FUM,
|
|
|
|
IPR,
|
|
|
|
IPW,
|
|
|
|
MAF,
|
|
|
|
MLK,
|
|
|
|
MPK,
|
|
|
|
NPR,
|
|
|
|
ODS,
|
|
|
|
PAR,
|
|
|
|
PLK,
|
|
|
|
UMC,
|
|
|
|
UMR,
|
|
|
|
NO_MEMORY_FAULT
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2002-10-07 00:36:52 +00:00
|
|
|
struct cmCTestTestResult
|
|
|
|
{
|
|
|
|
std::string m_Name;
|
|
|
|
std::string m_Path;
|
|
|
|
std::string m_FullCommandLine;
|
|
|
|
double m_ExecutionTime;
|
|
|
|
int m_ReturnValue;
|
2003-08-13 22:17:11 +00:00
|
|
|
int m_Status;
|
2002-10-07 00:36:52 +00:00
|
|
|
std::string m_CompletionStatus;
|
|
|
|
std::string m_Output;
|
2003-08-08 22:28:03 +00:00
|
|
|
std::string m_RegressionImages;
|
2002-10-07 00:36:52 +00:00
|
|
|
};
|
|
|
|
|
2002-10-09 02:00:11 +00:00
|
|
|
struct cmCTestBuildErrorWarning
|
|
|
|
{
|
|
|
|
bool m_Error;
|
|
|
|
int m_LogLine;
|
|
|
|
std::string m_Text;
|
|
|
|
std::string m_SourceFile;
|
|
|
|
std::string m_SourceFileTail;
|
|
|
|
int m_LineNumber;
|
|
|
|
std::string m_PreContext;
|
|
|
|
std::string m_PostContext;
|
|
|
|
};
|
|
|
|
|
2004-03-14 16:23:57 +00:00
|
|
|
typedef std::vector<cmListFileArgument> tm_VectorOfListFileArgs;
|
|
|
|
struct cmCTestTestProperties
|
|
|
|
{
|
|
|
|
cmStdString Name;
|
|
|
|
cmStdString Directory;
|
|
|
|
tm_VectorOfListFileArgs Args;
|
|
|
|
};
|
|
|
|
typedef std::vector<cmCTestTestProperties> tm_ListOfTests;
|
|
|
|
|
2003-02-07 05:09:24 +00:00
|
|
|
// Some structures needed for cvs update
|
|
|
|
struct StringPair :
|
|
|
|
public std::pair<std::string, std::string>{};
|
|
|
|
struct UpdateFiles : public std::vector<StringPair>{};
|
|
|
|
struct AuthorsToUpdatesMap :
|
|
|
|
public std::map<std::string, UpdateFiles>{};
|
|
|
|
|
2002-12-09 03:36:54 +00:00
|
|
|
struct cmCTestCoverage
|
|
|
|
{
|
|
|
|
cmCTestCoverage()
|
|
|
|
{
|
2003-04-07 22:21:04 +00:00
|
|
|
m_AbsolutePath = "";
|
2002-12-09 03:36:54 +00:00
|
|
|
m_FullPath = "";
|
|
|
|
m_Covered = false;
|
|
|
|
m_Tested = 0;
|
|
|
|
m_UnTested = 0;
|
|
|
|
m_Lines.clear();
|
2003-04-08 14:57:30 +00:00
|
|
|
m_Show = false;
|
2002-12-09 03:36:54 +00:00
|
|
|
}
|
2003-04-07 22:21:04 +00:00
|
|
|
std::string m_AbsolutePath;
|
2002-12-09 03:36:54 +00:00
|
|
|
std::string m_FullPath;
|
|
|
|
bool m_Covered;
|
|
|
|
int m_Tested;
|
|
|
|
int m_UnTested;
|
|
|
|
std::vector<int> m_Lines;
|
2003-04-08 14:57:30 +00:00
|
|
|
bool m_Show;
|
2002-12-09 03:36:54 +00:00
|
|
|
};
|
|
|
|
|
2002-10-07 00:36:52 +00:00
|
|
|
typedef std::vector<cmCTestTestResult> tm_TestResultsVector;
|
|
|
|
typedef std::map<std::string, std::string> tm_DartConfigurationMap;
|
2002-12-09 03:36:54 +00:00
|
|
|
typedef std::map<std::string, cmCTestCoverage> tm_CoverageMap;
|
2002-10-07 00:36:52 +00:00
|
|
|
|
|
|
|
tm_TestResultsVector m_TestResults;
|
|
|
|
std::string m_ToplevelPath;
|
|
|
|
tm_DartConfigurationMap m_DartConfiguration;
|
|
|
|
int m_Tests[LAST_TEST];
|
2002-10-09 02:54:24 +00:00
|
|
|
|
|
|
|
std::string m_CurrentTag;
|
2004-03-14 17:28:37 +00:00
|
|
|
bool m_TomorrowTag;
|
2002-10-09 02:00:11 +00:00
|
|
|
|
2002-10-09 02:54:24 +00:00
|
|
|
std::string m_StartBuild;
|
|
|
|
std::string m_EndBuild;
|
|
|
|
std::string m_StartTest;
|
|
|
|
std::string m_EndTest;
|
2002-10-09 02:00:11 +00:00
|
|
|
|
2003-02-11 14:19:36 +00:00
|
|
|
int m_TestModel;
|
2003-02-11 02:52:01 +00:00
|
|
|
|
2003-08-04 02:36:17 +00:00
|
|
|
int m_TimeOut;
|
|
|
|
|
2003-12-15 22:26:00 +00:00
|
|
|
std::string m_MemoryTester;
|
|
|
|
std::string m_MemoryTesterOptions;
|
|
|
|
int m_MemoryTesterStyle;
|
|
|
|
std::string m_MemoryTesterOutputFile;
|
|
|
|
tm_VectorOfStrings m_MemoryTesterOptionsParsed;
|
|
|
|
int m_MemoryTesterGlobalResults[NO_MEMORY_FAULT];
|
|
|
|
|
|
|
|
int m_CompatibilityMode;
|
|
|
|
|
2004-01-07 16:24:22 +00:00
|
|
|
// information for the --build-and-test options
|
|
|
|
std::string m_ExecutableDirectory;
|
|
|
|
std::string m_CMakeSelf;
|
|
|
|
std::string m_CTestSelf;
|
|
|
|
std::string m_SourceDir;
|
|
|
|
std::string m_BinaryDir;
|
2004-01-09 18:35:18 +00:00
|
|
|
std::string m_BuildRunDir;
|
2004-01-07 16:24:22 +00:00
|
|
|
std::string m_BuildGenerator;
|
|
|
|
std::string m_BuildMakeProgram;
|
|
|
|
std::string m_BuildProject;
|
|
|
|
std::string m_BuildTarget;
|
|
|
|
std::vector<std::string> m_BuildOptions;
|
|
|
|
std::string m_TestCommand;
|
|
|
|
std::vector<std::string> m_TestCommandArgs;
|
|
|
|
bool m_BuildTwoConfig;
|
|
|
|
bool m_BuildNoClean;
|
2004-01-13 16:22:47 +00:00
|
|
|
bool m_BuildNoCMake;
|
|
|
|
std::string m_NotesFiles;
|
2004-01-07 00:13:55 +00:00
|
|
|
|
2004-01-26 18:57:26 +00:00
|
|
|
int ReadCustomConfigurationFileTree(const char* dir);
|
|
|
|
void PopulateCustomVector(cmMakefile* mf, const char* definition, tm_VectorOfStrings& vec);
|
|
|
|
|
|
|
|
tm_VectorOfStrings m_CustomErrorMatches;
|
|
|
|
tm_VectorOfStrings m_CustomErrorExceptions;
|
|
|
|
tm_VectorOfStrings m_CustomWarningMatches;
|
|
|
|
tm_VectorOfStrings m_CustomWarningExceptions;
|
|
|
|
|
|
|
|
tm_VectorOfStrings m_CustomTestsIgnore;
|
|
|
|
tm_VectorOfStrings m_CustomMemCheckIgnore;
|
|
|
|
|
|
|
|
tm_VectorOfStrings m_CustomPreTest;
|
|
|
|
tm_VectorOfStrings m_CustomPostTest;
|
|
|
|
tm_VectorOfStrings m_CustomPreMemCheck;
|
|
|
|
tm_VectorOfStrings m_CustomPostMemCheck;
|
|
|
|
|
|
|
|
int ExecuteCommands(tm_VectorOfStrings& vec);
|
|
|
|
|
2004-03-14 16:23:57 +00:00
|
|
|
/**
|
|
|
|
* Get the list of tests in directory and subdirectories.
|
|
|
|
*/
|
|
|
|
void cmCTest::GetListOfTests(tm_ListOfTests* testlist, bool memcheck);
|
|
|
|
|
2004-01-07 00:13:55 +00:00
|
|
|
//! Reread the configuration file
|
|
|
|
void UpdateCTestConfiguration();
|
|
|
|
|
2002-10-09 02:00:11 +00:00
|
|
|
/**
|
|
|
|
* Generate the Dart compatible output
|
|
|
|
*/
|
2003-08-08 22:28:03 +00:00
|
|
|
void GenerateDartTestOutput(std::ostream& os);
|
2003-12-15 22:26:00 +00:00
|
|
|
void GenerateDartMemCheckOutput(std::ostream& os);
|
2002-10-09 02:00:11 +00:00
|
|
|
void GenerateDartBuildOutput(std::ostream& os,
|
|
|
|
std::vector<cmCTestBuildErrorWarning>);
|
2002-10-14 03:07:54 +00:00
|
|
|
|
2002-12-09 03:36:54 +00:00
|
|
|
bool OpenOutputFile(const std::string& path,
|
|
|
|
const std::string& name, std::ofstream& stream);
|
2002-10-14 19:11:21 +00:00
|
|
|
std::string MakeXMLSafe(const std::string&);
|
2003-04-02 14:19:45 +00:00
|
|
|
std::string MakeURLSafe(const std::string&);
|
2003-08-07 23:23:49 +00:00
|
|
|
|
2003-08-18 15:30:53 +00:00
|
|
|
//! Run command specialized for make and configure. Returns process status
|
|
|
|
// and retVal is return value or exception.
|
|
|
|
int RunMakeCommand(const char* command, std::string* output,
|
|
|
|
int* retVal, const char* dir, bool verbose, int timeout,
|
|
|
|
std::ofstream& ofs);
|
|
|
|
|
|
|
|
//! Run command specialized for tests. Returns process status and retVal is
|
|
|
|
// return value or exception.
|
2004-02-10 20:51:29 +00:00
|
|
|
int RunTest(std::vector<const char*> args, std::string* output, int *retVal,
|
|
|
|
std::ostream* logfile);
|
2003-08-08 22:28:03 +00:00
|
|
|
|
|
|
|
std::string GenerateRegressionImages(const std::string& xml);
|
2003-08-13 22:17:11 +00:00
|
|
|
const char* GetTestStatus(int status);
|
2003-12-15 22:26:00 +00:00
|
|
|
|
|
|
|
//! Start CTest XML output file
|
2003-12-15 22:28:46 +00:00
|
|
|
void StartXML(std::ostream& ostr);
|
2003-12-15 22:26:00 +00:00
|
|
|
|
|
|
|
//! End CTest XML output file
|
2003-12-15 22:28:46 +00:00
|
|
|
void EndXML(std::ostream& ostr);
|
2003-12-15 22:26:00 +00:00
|
|
|
|
2003-12-26 20:02:26 +00:00
|
|
|
//! Create not from files.
|
|
|
|
int GenerateDartNotesOutput(std::ostream& os, const tm_VectorOfStrings& files);
|
|
|
|
|
2003-12-15 22:26:00 +00:00
|
|
|
//! Parse Valgrind/Purify/Bounds Checker result out of the output string. After running,
|
|
|
|
// log holds the output and results hold the different memmory errors.
|
|
|
|
bool ProcessMemCheckOutput(const std::string& str, std::string& log, int* results);
|
|
|
|
bool ProcessMemCheckValgrindOutput(const std::string& str, std::string& log, int* results);
|
2003-12-16 19:43:13 +00:00
|
|
|
bool ProcessMemCheckPurifyOutput(const std::string& str, std::string& log, int* results);
|
2003-12-15 22:26:00 +00:00
|
|
|
|
2004-01-07 16:24:22 +00:00
|
|
|
///! Run CMake and build a test and then run it as a single test.
|
|
|
|
int RunCMakeAndTest(std::string* output);
|
|
|
|
///! Initialize memory checking subsystem.
|
2003-12-15 22:26:00 +00:00
|
|
|
bool InitializeMemoryChecking();
|
2004-01-07 16:24:22 +00:00
|
|
|
///! Find the running cmake
|
|
|
|
void FindRunningCMake(const char* arg0);
|
2001-08-23 15:12:19 +00:00
|
|
|
};
|
|
|
|
|
2003-02-11 02:52:01 +00:00
|
|
|
#endif
|