Merge topic 'reorganize-cmCTest'
61fcd08a
Help: Fix documentation of ctest --build-and-test7c67d401
Help: Consistently use quotes and fix punctuation in ctest(1) manual0076fb10
cmCTest: Update doxygen to be consistent30c5f94c
cmCTest: Rename "ProcessTests()" to "ProcessSteps()" and improve doxygen7c87ab75
cmCTest: Facilitate code reading adding consistent comments in Run()6d8b9aa6
cmCTest: Improve readability adding "HandleTest(Action|Model)Argument()"280d0a69
cmCTest: Improve readability adding "RunCMakeAndTest()" and "ExecuteTests()"898cb987
cmCTest: Fix typo
This commit is contained in:
commit
50adbfcacb
|
@ -56,7 +56,7 @@ Options
|
|||
Enable failover.
|
||||
|
||||
This option allows ctest to resume a test set execution that was
|
||||
previously interrupted. If no interruption occurred, the -F option
|
||||
previously interrupted. If no interruption occurred, the ``-F`` option
|
||||
will have no effect.
|
||||
|
||||
``-j <jobs>, --parallel <jobs>``
|
||||
|
@ -77,12 +77,12 @@ Options
|
|||
Make ctest quiet.
|
||||
|
||||
This option will suppress all the output. The output log file will
|
||||
still be generated if the --output-log is specified. Options such
|
||||
as --verbose, --extra-verbose, and --debug are ignored if --quiet is
|
||||
specified.
|
||||
still be generated if the ``--output-log`` is specified. Options such
|
||||
as ``--verbose``, ``--extra-verbose``, and ``--debug`` are ignored
|
||||
if ``--quiet`` is specified.
|
||||
|
||||
``-O <file>, --output-log <file>``
|
||||
Output to log file
|
||||
Output to log file.
|
||||
|
||||
This option tells ctest to write all its output to a log file.
|
||||
|
||||
|
@ -90,7 +90,7 @@ Options
|
|||
Disable actual execution of tests.
|
||||
|
||||
This option tells ctest to list the tests that would be run but not
|
||||
actually run them. Useful in conjunction with the -R and -E
|
||||
actually run them. Useful in conjunction with the ``-R`` and ``-E``
|
||||
options.
|
||||
|
||||
``-L <regex>, --label-regex <regex>``
|
||||
|
@ -118,7 +118,7 @@ Options
|
|||
given regular expression.
|
||||
|
||||
``-D <dashboard>, --dashboard <dashboard>``
|
||||
Execute dashboard test
|
||||
Execute dashboard test.
|
||||
|
||||
This option tells ctest to act as a CDash client and perform a
|
||||
dashboard test. All tests are <Mode><Test>, where Mode can be
|
||||
|
@ -126,26 +126,27 @@ Options
|
|||
Update, Configure, Build, Test, Coverage, and Submit.
|
||||
|
||||
``-D <var>:<type>=<value>``
|
||||
Define a variable for script mode
|
||||
Define a variable for script mode.
|
||||
|
||||
Pass in variable values on the command line. Use in conjunction
|
||||
with -S to pass variable values to a dashboard script. Parsing -D
|
||||
with ``-S`` to pass variable values to a dashboard script. Parsing ``-D``
|
||||
arguments as variable values is only attempted if the value
|
||||
following -D does not match any of the known dashboard types.
|
||||
following ``-D`` does not match any of the known dashboard types.
|
||||
|
||||
``-M <model>, --test-model <model>``
|
||||
Sets the model for a dashboard
|
||||
Sets the model for a dashboard.
|
||||
|
||||
This option tells ctest to act as a CDash client where the TestModel
|
||||
can be Experimental, Nightly, and Continuous. Combining -M and -T
|
||||
is similar to -D
|
||||
This option tells ctest to act as a CDash client where the ``<model>``
|
||||
can be ``Experimental``, ``Nightly``, and ``Continuous``.
|
||||
Combining ``-M`` and ``-T`` is similar to ``-D``.
|
||||
|
||||
``-T <action>, --test-action <action>``
|
||||
Sets the dashboard action to perform
|
||||
Sets the dashboard action to perform.
|
||||
|
||||
This option tells ctest to act as a CDash client and perform some
|
||||
action such as start, build, test etc. Combining -M and -T is
|
||||
similar to -D
|
||||
action such as ``start``, ``build``, ``test`` etc. See
|
||||
`Dashboard Client Steps`_ for the full list of actions.
|
||||
Combining ``-M`` and ``-T`` is similar to ``-D``.
|
||||
|
||||
``--track <track>``
|
||||
Specify the track to submit dashboard to
|
||||
|
@ -156,24 +157,24 @@ Options
|
|||
arbitrary.
|
||||
|
||||
``-S <script>, --script <script>``
|
||||
Execute a dashboard for a configuration
|
||||
Execute a dashboard for a configuration.
|
||||
|
||||
This option tells ctest to load in a configuration script which sets
|
||||
a number of parameters such as the binary and source directories.
|
||||
Then ctest will do what is required to create and run a dashboard.
|
||||
This option basically sets up a dashboard and then runs ctest -D
|
||||
This option basically sets up a dashboard and then runs ``ctest -D``
|
||||
with the appropriate options.
|
||||
|
||||
``-SP <script>, --script-new-process <script>``
|
||||
Execute a dashboard for a configuration
|
||||
Execute a dashboard for a configuration.
|
||||
|
||||
This option does the same operations as -S but it will do them in a
|
||||
This option does the same operations as ``-S`` but it will do them in a
|
||||
separate process. This is primarily useful in cases where the
|
||||
script may modify the environment and you do not want the modified
|
||||
environment to impact other -S scripts.
|
||||
environment to impact other ``-S`` scripts.
|
||||
|
||||
``-A <file>, --add-notes <file>``
|
||||
Add a notes file with submission
|
||||
Add a notes file with submission.
|
||||
|
||||
This option tells ctest to include a notes file when submitting
|
||||
dashboard.
|
||||
|
@ -188,19 +189,19 @@ Options
|
|||
contains the same syntax as the command line.
|
||||
|
||||
``-U, --union``
|
||||
Take the Union of -I and -R
|
||||
Take the Union of ``-I`` and ``-R``.
|
||||
|
||||
When both -R and -I are specified by default the intersection of
|
||||
tests are run. By specifying -U the union of tests is run instead.
|
||||
When both ``-R`` and ``-I`` are specified by default the intersection of
|
||||
tests are run. By specifying ``-U`` the union of tests is run instead.
|
||||
|
||||
``--rerun-failed``
|
||||
Run only the tests that failed previously
|
||||
Run only the tests that failed previously.
|
||||
|
||||
This option tells ctest to perform only the tests that failed during
|
||||
its previous run. When this option is specified, ctest ignores all
|
||||
other options intended to modify the list of tests to run (-L, -R,
|
||||
-E, -LE, -I, etc). In the event that CTest runs and no tests fail,
|
||||
subsequent calls to ctest with the --rerun-failed option will run
|
||||
other options intended to modify the list of tests to run (``-L``, ``-R``,
|
||||
``-E``, ``-LE``, ``-I``, etc). In the event that CTest runs and no tests
|
||||
fail, subsequent calls to ctest with the ``--rerun-failed`` option will run
|
||||
the set of tests that most recently failed (if any).
|
||||
|
||||
``--repeat-until-fail <n>``
|
||||
|
@ -209,7 +210,7 @@ Options
|
|||
This is useful in finding sporadic failures in test cases.
|
||||
|
||||
``--max-width <width>``
|
||||
Set the max width for a test name to output
|
||||
Set the max width for a test name to output.
|
||||
|
||||
Set the maximum width for each test name to show in the output.
|
||||
This allows the user to widen the output to avoid clipping the test
|
||||
|
@ -232,26 +233,25 @@ Options
|
|||
label associated with the tests run. If there are no labels on the
|
||||
tests, nothing extra is printed.
|
||||
|
||||
``--build-and-test``
|
||||
``--build-and-test <path-to-source> <path-to-build>``
|
||||
Configure, build and run a test.
|
||||
|
||||
This option tells ctest to configure (i.e. run cmake on), build,
|
||||
and or execute a test. The configure and test steps are optional.
|
||||
The arguments to this command line are the source and binary
|
||||
directories. By default this will run CMake on the Source/Bin
|
||||
directories specified unless --build-nocmake is specified.
|
||||
The --build-generator option *must* be provided to use
|
||||
--build-and-test. If --test-command is specified then that will be
|
||||
directories.
|
||||
The ``--build-generator`` option *must* be provided to use
|
||||
``--build-and-test``. If ``--test-command`` is specified then that will be
|
||||
run after the build is complete. Other options that affect this
|
||||
mode are --build-target --build-nocmake, --build-run-dir,
|
||||
--build-two-config, --build-exe-dir,
|
||||
--build-project,--build-noclean, --build-options
|
||||
mode are ``--build-target``, ``--build-nocmake``, ``--build-run-dir``,
|
||||
``--build-two-config``, ``--build-exe-dir``,
|
||||
``--build-project``, ``--build-noclean`` and ``--build-options``.
|
||||
|
||||
``--build-target``
|
||||
Specify a specific target to build.
|
||||
|
||||
This option goes with the --build-and-test option, if left out the
|
||||
all target is built.
|
||||
This option goes with the ``--build-and-test`` option, if left out the
|
||||
``all`` target is built.
|
||||
|
||||
``--build-nocmake``
|
||||
Run the build without running cmake first.
|
||||
|
@ -264,13 +264,13 @@ Options
|
|||
Directory where programs will be after it has been compiled.
|
||||
|
||||
``--build-two-config``
|
||||
Run CMake twice
|
||||
Run CMake twice.
|
||||
|
||||
``--build-exe-dir``
|
||||
Specify the directory for the executable.
|
||||
|
||||
``--build-generator``
|
||||
Specify the generator to use.
|
||||
Specify the generator to use. See the :manual:`cmake-generators(7)` manual.
|
||||
|
||||
``--build-generator-platform``
|
||||
Specify the generator-specific platform.
|
||||
|
@ -288,25 +288,23 @@ Options
|
|||
Skip the make clean step.
|
||||
|
||||
``--build-config-sample``
|
||||
A sample executable to use to determine the configuration
|
||||
|
||||
A sample executable to use to determine the configuration that
|
||||
should be used. e.g. Debug/Release/etc
|
||||
should be used. e.g. Debug/Release/etc.
|
||||
|
||||
``--build-options``
|
||||
Add extra options to the build step.
|
||||
|
||||
This option must be the last option with the exception of
|
||||
--test-command
|
||||
``--test-command``
|
||||
|
||||
``--test-command``
|
||||
The test to run with the --build-and-test option.
|
||||
The test to run with the ``--build-and-test`` option.
|
||||
|
||||
``--test-output-size-passed <size>``
|
||||
Limit the output for passed tests to <size> bytes.
|
||||
Limit the output for passed tests to ``<size>`` bytes.
|
||||
|
||||
``--test-output-size-failed <size>``
|
||||
Limit the output for failed tests to <size> bytes.
|
||||
Limit the output for failed tests to ``<size>`` bytes.
|
||||
|
||||
``--test-timeout``
|
||||
The time limit in seconds, internal use only.
|
||||
|
@ -335,14 +333,14 @@ Options
|
|||
This option will submit extra files to the dashboard.
|
||||
|
||||
``--force-new-ctest-process``
|
||||
Run child CTest instances as new processes
|
||||
Run child CTest instances as new processes.
|
||||
|
||||
By default CTest will run child CTest instances within the same
|
||||
process. If this behavior is not desired, this argument will
|
||||
enforce new processes for child CTest processes.
|
||||
|
||||
``--schedule-random``
|
||||
Use a random order for scheduling tests
|
||||
Use a random order for scheduling tests.
|
||||
|
||||
This option will run the tests in a random order. It is commonly
|
||||
used to detect implicit dependencies in a test suite.
|
||||
|
@ -361,7 +359,7 @@ Options
|
|||
Set a time at which all tests should stop running.
|
||||
|
||||
Set a real time of day at which all tests should timeout. Example:
|
||||
7:00:00 -0400. Any time format understood by the curl date parser
|
||||
``7:00:00 -0400``. Any time format understood by the curl date parser
|
||||
is accepted. Local time is assumed if no timezone is specified.
|
||||
|
||||
``--http1.0``
|
||||
|
|
|
@ -886,7 +886,7 @@ int cmCTest::ExecuteHandler(const char* shandler)
|
|||
return handler->ProcessHandler();
|
||||
}
|
||||
|
||||
int cmCTest::ProcessTests()
|
||||
int cmCTest::ProcessSteps()
|
||||
{
|
||||
int res = 0;
|
||||
bool notest = true;
|
||||
|
@ -2018,7 +2018,7 @@ int cmCTest::Run(std::vector<std::string>& args, std::string* output)
|
|||
// handle the script arguments -S -SR -SP
|
||||
this->HandleScriptArguments(i, args, SRArgumentSpecified);
|
||||
|
||||
// handle a request for a dashboard
|
||||
// --dashboard: handle a request for a dashboard
|
||||
std::string arg = args[i];
|
||||
if (this->CheckArgument(arg, "-D", "--dashboard") && i < args.size() - 1) {
|
||||
this->ProduceXML = true;
|
||||
|
@ -2044,54 +2044,18 @@ int cmCTest::Run(std::vector<std::string>& args, std::string* output)
|
|||
this->AddVariableDefinition(input);
|
||||
}
|
||||
|
||||
if (this->CheckArgument(arg, "-T", "--test-action") &&
|
||||
(i < args.size() - 1)) {
|
||||
this->ProduceXML = true;
|
||||
i++;
|
||||
if (!this->SetTest(args[i].c_str(), false)) {
|
||||
executeTests = false;
|
||||
cmCTestLog(this, ERROR_MESSAGE,
|
||||
"CTest -T called with incorrect option: " << args[i]
|
||||
<< std::endl);
|
||||
cmCTestLog(this, ERROR_MESSAGE, "Available options are:"
|
||||
<< std::endl
|
||||
<< " " << ctestExec << " -T all" << std::endl
|
||||
<< " " << ctestExec << " -T start" << std::endl
|
||||
<< " " << ctestExec << " -T update" << std::endl
|
||||
<< " " << ctestExec << " -T configure" << std::endl
|
||||
<< " " << ctestExec << " -T build" << std::endl
|
||||
<< " " << ctestExec << " -T test" << std::endl
|
||||
<< " " << ctestExec << " -T coverage" << std::endl
|
||||
<< " " << ctestExec << " -T memcheck" << std::endl
|
||||
<< " " << ctestExec << " -T notes" << std::endl
|
||||
<< " " << ctestExec << " -T submit" << std::endl);
|
||||
}
|
||||
// --test-action: calls SetTest(<stage>, /*report=*/ false) to enable
|
||||
// the corresponding stage
|
||||
if (!this->HandleTestActionArgument(ctestExec, i, args)) {
|
||||
executeTests = false;
|
||||
}
|
||||
|
||||
// what type of test model
|
||||
if (this->CheckArgument(arg, "-M", "--test-model") &&
|
||||
(i < args.size() - 1)) {
|
||||
i++;
|
||||
std::string const& str = args[i];
|
||||
if (cmSystemTools::LowerCase(str) == "nightly") {
|
||||
this->SetTestModel(cmCTest::NIGHTLY);
|
||||
} else if (cmSystemTools::LowerCase(str) == "continuous") {
|
||||
this->SetTestModel(cmCTest::CONTINUOUS);
|
||||
} else if (cmSystemTools::LowerCase(str) == "experimental") {
|
||||
this->SetTestModel(cmCTest::EXPERIMENTAL);
|
||||
} else {
|
||||
executeTests = false;
|
||||
cmCTestLog(this, ERROR_MESSAGE,
|
||||
"CTest -M called with incorrect option: " << str
|
||||
<< std::endl);
|
||||
cmCTestLog(this, ERROR_MESSAGE, "Available options are:"
|
||||
<< std::endl
|
||||
<< " " << ctestExec << " -M Continuous" << std::endl
|
||||
<< " " << ctestExec << " -M Experimental" << std::endl
|
||||
<< " " << ctestExec << " -M Nightly" << std::endl);
|
||||
}
|
||||
// --test-model: what type of test model
|
||||
if (!this->HandleTestModelArgument(ctestExec, i, args)) {
|
||||
executeTests = false;
|
||||
}
|
||||
|
||||
// --extra-submit
|
||||
if (this->CheckArgument(arg, "--extra-submit") && i < args.size() - 1) {
|
||||
this->ProduceXML = true;
|
||||
this->SetTest("Submit");
|
||||
|
@ -2106,6 +2070,7 @@ int cmCTest::Run(std::vector<std::string>& args, std::string* output)
|
|||
cmakeAndTest = true;
|
||||
}
|
||||
|
||||
// --schedule-random
|
||||
if (this->CheckArgument(arg, "--schedule-random")) {
|
||||
this->ScheduleType = "Random";
|
||||
}
|
||||
|
@ -2124,6 +2089,7 @@ int cmCTest::Run(std::vector<std::string>& args, std::string* output)
|
|||
}
|
||||
} // the close of the for argument loop
|
||||
|
||||
// handle CTEST_PARALLEL_LEVEL environment variable
|
||||
if (!this->ParallelLevelSetInCli) {
|
||||
if (const char* parallel = cmSystemTools::GetEnv("CTEST_PARALLEL_LEVEL")) {
|
||||
int plevel = atoi(parallel);
|
||||
|
@ -2131,75 +2097,144 @@ int cmCTest::Run(std::vector<std::string>& args, std::string* output)
|
|||
}
|
||||
}
|
||||
|
||||
// now what sould cmake do? if --build-and-test was specified then
|
||||
// now what should cmake do? if --build-and-test was specified then
|
||||
// we run the build and test handler and return
|
||||
if (cmakeAndTest) {
|
||||
this->Verbose = true;
|
||||
cmCTestBuildAndTestHandler* handler =
|
||||
static_cast<cmCTestBuildAndTestHandler*>(this->GetHandler("buildtest"));
|
||||
int retv = handler->ProcessHandler();
|
||||
*output = handler->GetOutput();
|
||||
#ifdef CMAKE_BUILD_WITH_CMAKE
|
||||
cmDynamicLoader::FlushCache();
|
||||
#endif
|
||||
if (retv != 0) {
|
||||
cmCTestLog(this, DEBUG,
|
||||
"build and test failing returning: " << retv << std::endl);
|
||||
}
|
||||
return retv;
|
||||
return this->RunCMakeAndTest(output);
|
||||
}
|
||||
|
||||
if (executeTests) {
|
||||
int res;
|
||||
// call process directory
|
||||
if (this->RunConfigurationScript) {
|
||||
if (this->ExtraVerbose) {
|
||||
cmCTestLog(this, OUTPUT, "* Extra verbosity turned on" << std::endl);
|
||||
}
|
||||
cmCTest::t_TestingHandlers::iterator it;
|
||||
for (it = this->TestingHandlers.begin();
|
||||
it != this->TestingHandlers.end(); ++it) {
|
||||
it->second->SetVerbose(this->ExtraVerbose);
|
||||
it->second->SetSubmitIndex(this->SubmitIndex);
|
||||
}
|
||||
this->GetHandler("script")->SetVerbose(this->Verbose);
|
||||
res = this->GetHandler("script")->ProcessHandler();
|
||||
if (res != 0) {
|
||||
cmCTestLog(this, DEBUG,
|
||||
"running script failing returning: " << res << std::endl);
|
||||
}
|
||||
|
||||
} else {
|
||||
// What is this? -V seems to be the same as -VV,
|
||||
// and Verbose is always on in this case
|
||||
this->ExtraVerbose = this->Verbose;
|
||||
this->Verbose = true;
|
||||
cmCTest::t_TestingHandlers::iterator it;
|
||||
for (it = this->TestingHandlers.begin();
|
||||
it != this->TestingHandlers.end(); ++it) {
|
||||
it->second->SetVerbose(this->Verbose);
|
||||
it->second->SetSubmitIndex(this->SubmitIndex);
|
||||
}
|
||||
std::string cwd = cmSystemTools::GetCurrentWorkingDirectory();
|
||||
if (!this->Initialize(cwd.c_str(), CM_NULLPTR)) {
|
||||
res = 12;
|
||||
cmCTestLog(this, ERROR_MESSAGE, "Problem initializing the dashboard."
|
||||
<< std::endl);
|
||||
} else {
|
||||
res = this->ProcessTests();
|
||||
}
|
||||
this->Finalize();
|
||||
}
|
||||
if (res != 0) {
|
||||
cmCTestLog(this, DEBUG,
|
||||
"Running a test(s) failed returning : " << res << std::endl);
|
||||
}
|
||||
return res;
|
||||
return this->ExecuteTests();
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
bool cmCTest::HandleTestActionArgument(const char* ctestExec, size_t& i,
|
||||
const std::vector<std::string>& args)
|
||||
{
|
||||
bool success = true;
|
||||
std::string arg = args[i];
|
||||
if (this->CheckArgument(arg, "-T", "--test-action") &&
|
||||
(i < args.size() - 1)) {
|
||||
this->ProduceXML = true;
|
||||
i++;
|
||||
if (!this->SetTest(args[i].c_str(), false)) {
|
||||
success = false;
|
||||
cmCTestLog(this, ERROR_MESSAGE, "CTest -T called with incorrect option: "
|
||||
<< args[i] << std::endl);
|
||||
cmCTestLog(this, ERROR_MESSAGE, "Available options are:"
|
||||
<< std::endl
|
||||
<< " " << ctestExec << " -T all" << std::endl
|
||||
<< " " << ctestExec << " -T start" << std::endl
|
||||
<< " " << ctestExec << " -T update" << std::endl
|
||||
<< " " << ctestExec << " -T configure" << std::endl
|
||||
<< " " << ctestExec << " -T build" << std::endl
|
||||
<< " " << ctestExec << " -T test" << std::endl
|
||||
<< " " << ctestExec << " -T coverage" << std::endl
|
||||
<< " " << ctestExec << " -T memcheck" << std::endl
|
||||
<< " " << ctestExec << " -T notes" << std::endl
|
||||
<< " " << ctestExec << " -T submit" << std::endl);
|
||||
}
|
||||
}
|
||||
return success;
|
||||
}
|
||||
|
||||
bool cmCTest::HandleTestModelArgument(const char* ctestExec, size_t& i,
|
||||
const std::vector<std::string>& args)
|
||||
{
|
||||
bool success = true;
|
||||
std::string arg = args[i];
|
||||
if (this->CheckArgument(arg, "-M", "--test-model") &&
|
||||
(i < args.size() - 1)) {
|
||||
i++;
|
||||
std::string const& str = args[i];
|
||||
if (cmSystemTools::LowerCase(str) == "nightly") {
|
||||
this->SetTestModel(cmCTest::NIGHTLY);
|
||||
} else if (cmSystemTools::LowerCase(str) == "continuous") {
|
||||
this->SetTestModel(cmCTest::CONTINUOUS);
|
||||
} else if (cmSystemTools::LowerCase(str) == "experimental") {
|
||||
this->SetTestModel(cmCTest::EXPERIMENTAL);
|
||||
} else {
|
||||
success = false;
|
||||
cmCTestLog(this, ERROR_MESSAGE, "CTest -M called with incorrect option: "
|
||||
<< str << std::endl);
|
||||
cmCTestLog(this, ERROR_MESSAGE, "Available options are:"
|
||||
<< std::endl
|
||||
<< " " << ctestExec << " -M Continuous" << std::endl
|
||||
<< " " << ctestExec << " -M Experimental" << std::endl
|
||||
<< " " << ctestExec << " -M Nightly" << std::endl);
|
||||
}
|
||||
}
|
||||
return success;
|
||||
}
|
||||
|
||||
int cmCTest::ExecuteTests()
|
||||
{
|
||||
int res;
|
||||
// call process directory
|
||||
if (this->RunConfigurationScript) {
|
||||
if (this->ExtraVerbose) {
|
||||
cmCTestLog(this, OUTPUT, "* Extra verbosity turned on" << std::endl);
|
||||
}
|
||||
cmCTest::t_TestingHandlers::iterator it;
|
||||
for (it = this->TestingHandlers.begin(); it != this->TestingHandlers.end();
|
||||
++it) {
|
||||
it->second->SetVerbose(this->ExtraVerbose);
|
||||
it->second->SetSubmitIndex(this->SubmitIndex);
|
||||
}
|
||||
this->GetHandler("script")->SetVerbose(this->Verbose);
|
||||
res = this->GetHandler("script")->ProcessHandler();
|
||||
if (res != 0) {
|
||||
cmCTestLog(this, DEBUG,
|
||||
"running script failing returning: " << res << std::endl);
|
||||
}
|
||||
|
||||
} else {
|
||||
// What is this? -V seems to be the same as -VV,
|
||||
// and Verbose is always on in this case
|
||||
this->ExtraVerbose = this->Verbose;
|
||||
this->Verbose = true;
|
||||
cmCTest::t_TestingHandlers::iterator it;
|
||||
for (it = this->TestingHandlers.begin(); it != this->TestingHandlers.end();
|
||||
++it) {
|
||||
it->second->SetVerbose(this->Verbose);
|
||||
it->second->SetSubmitIndex(this->SubmitIndex);
|
||||
}
|
||||
std::string cwd = cmSystemTools::GetCurrentWorkingDirectory();
|
||||
if (!this->Initialize(cwd.c_str(), CM_NULLPTR)) {
|
||||
res = 12;
|
||||
cmCTestLog(this, ERROR_MESSAGE, "Problem initializing the dashboard."
|
||||
<< std::endl);
|
||||
} else {
|
||||
res = this->ProcessSteps();
|
||||
}
|
||||
this->Finalize();
|
||||
}
|
||||
if (res != 0) {
|
||||
cmCTestLog(this, DEBUG,
|
||||
"Running a test(s) failed returning : " << res << std::endl);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
int cmCTest::RunCMakeAndTest(std::string* output)
|
||||
{
|
||||
this->Verbose = true;
|
||||
cmCTestBuildAndTestHandler* handler =
|
||||
static_cast<cmCTestBuildAndTestHandler*>(this->GetHandler("buildtest"));
|
||||
int retv = handler->ProcessHandler();
|
||||
*output = handler->GetOutput();
|
||||
#ifdef CMAKE_BUILD_WITH_CMAKE
|
||||
cmDynamicLoader::FlushCache();
|
||||
#endif
|
||||
if (retv != 0) {
|
||||
cmCTestLog(this, DEBUG, "build and test failing returning: " << retv
|
||||
<< std::endl);
|
||||
}
|
||||
return retv;
|
||||
}
|
||||
|
||||
void cmCTest::SetNotesFiles(const char* notes)
|
||||
{
|
||||
if (!notes) {
|
||||
|
|
173
Source/cmCTest.h
173
Source/cmCTest.h
|
@ -53,6 +53,13 @@ class cmXMLWriter;
|
|||
#endif
|
||||
#define cout no_cout_use_cmCTestLog
|
||||
|
||||
/** \class cmCTest
|
||||
* \brief Represents a ctest invocation.
|
||||
*
|
||||
* This class represents a ctest invocation. It is the top level class when
|
||||
* running ctest.
|
||||
*
|
||||
*/
|
||||
class cmCTest
|
||||
{
|
||||
friend class cmCTestRunTest;
|
||||
|
@ -119,7 +126,7 @@ public:
|
|||
typedef std::vector<cmsys::String> VectorOfStrings;
|
||||
typedef std::set<std::string> SetOfStrings;
|
||||
|
||||
///! Process Command line arguments
|
||||
/** Process Command line arguments */
|
||||
int Run(std::vector<std::string>&, std::string* output = CM_NULLPTR);
|
||||
|
||||
/**
|
||||
|
@ -129,23 +136,30 @@ public:
|
|||
void Finalize();
|
||||
|
||||
/**
|
||||
* Process the tests. This is the main routine. The execution of the
|
||||
* tests should look like this:
|
||||
* Process the dashboard client steps.
|
||||
*
|
||||
* Steps are enabled using SetTest()
|
||||
*
|
||||
* The execution of the steps (or #Part) should look like this:
|
||||
*
|
||||
* /code
|
||||
* ctest foo;
|
||||
* foo.Initialize();
|
||||
* // Set some things on foo
|
||||
* foo.ProcessTests();
|
||||
* foo.ProcessSteps();
|
||||
* foo.Finalize();
|
||||
* /endcode
|
||||
*
|
||||
* \sa Initialize(), Finalize(), Part, PartInfo, SetTest()
|
||||
*/
|
||||
int ProcessTests();
|
||||
int ProcessSteps();
|
||||
|
||||
/*
|
||||
/**
|
||||
* A utility function that returns the nightly time
|
||||
*/
|
||||
struct tm* GetNightlyTime(std::string const& str, bool tomorrowtag);
|
||||
|
||||
/*
|
||||
/**
|
||||
* Is the tomorrow tag set?
|
||||
*/
|
||||
bool GetTomorrowTag() { return this->TomorrowTag; }
|
||||
|
@ -155,14 +169,14 @@ public:
|
|||
*/
|
||||
int TestDirectory(bool memcheck);
|
||||
|
||||
///! what is the configuraiton type, e.g. Debug, Release etc.
|
||||
/** what is the configuraiton type, e.g. Debug, Release etc. */
|
||||
std::string const& GetConfigType();
|
||||
double GetTimeOut() { return this->TimeOut; }
|
||||
void SetTimeOut(double t) { this->TimeOut = t; }
|
||||
|
||||
double GetGlobalTimeout() { return this->GlobalTimeout; }
|
||||
|
||||
// how many test to run at the same time
|
||||
/** how many test to run at the same time */
|
||||
int GetParallelLevel() { return this->ParallelLevel; }
|
||||
void SetParallelLevel(int);
|
||||
|
||||
|
@ -200,19 +214,19 @@ public:
|
|||
cmCTest();
|
||||
~cmCTest();
|
||||
|
||||
//! Set the notes files to be created.
|
||||
/** Set the notes files to be created. */
|
||||
void SetNotesFiles(const char* notes);
|
||||
|
||||
void PopulateCustomVector(cmMakefile* mf, const std::string& definition,
|
||||
std::vector<std::string>& vec);
|
||||
void PopulateCustomInteger(cmMakefile* mf, const std::string& def, int& val);
|
||||
|
||||
///! Get the current time as string
|
||||
/** Get the current time as string */
|
||||
std::string CurrentTime();
|
||||
|
||||
//! tar/gzip and then base 64 encode a file
|
||||
/** tar/gzip and then base 64 encode a file */
|
||||
std::string Base64GzipEncodeFile(std::string const& file);
|
||||
//! base64 encode a file
|
||||
/** base64 encode a file */
|
||||
std::string Base64EncodeFile(std::string const& file);
|
||||
|
||||
/**
|
||||
|
@ -222,11 +236,13 @@ public:
|
|||
*/
|
||||
double GetRemainingTimeAllowed();
|
||||
|
||||
///! Open file in the output directory and set the stream
|
||||
/**
|
||||
* Open file in the output directory and set the stream
|
||||
*/
|
||||
bool OpenOutputFile(const std::string& path, const std::string& name,
|
||||
cmGeneratedFileStream& stream, bool compress = false);
|
||||
|
||||
///! Should we only show what we would do?
|
||||
/** Should we only show what we would do? */
|
||||
bool GetShowOnly();
|
||||
|
||||
bool ShouldUseHTTP10() { return this->UseHTTP10; }
|
||||
|
@ -242,11 +258,11 @@ public:
|
|||
std::string GetStopTime() { return this->StopTime; }
|
||||
void SetStopTime(std::string const& time);
|
||||
|
||||
// Used for parallel ctest job scheduling
|
||||
/** Used for parallel ctest job scheduling */
|
||||
std::string GetScheduleType() { return this->ScheduleType; }
|
||||
void SetScheduleType(std::string type) { this->ScheduleType = type; }
|
||||
|
||||
///! The max output width
|
||||
/** The max output width */
|
||||
int GetMaxTestNameWidth() const;
|
||||
void SetMaxTestNameWidth(int w) { this->MaxTestNameWidth = w; }
|
||||
|
||||
|
@ -274,31 +290,37 @@ public:
|
|||
std::string* stdErr, int* retVal = CM_NULLPTR,
|
||||
const char* dir = CM_NULLPTR, double timeout = 0.0);
|
||||
|
||||
//! Clean/make safe for xml the given value such that it may be used as
|
||||
// one of the key fields by CDash when computing the buildid.
|
||||
/**
|
||||
* Clean/make safe for xml the given value such that it may be used as
|
||||
* one of the key fields by CDash when computing the buildid.
|
||||
*/
|
||||
static std::string SafeBuildIdField(const std::string& value);
|
||||
|
||||
//! Start CTest XML output file
|
||||
/** Start CTest XML output file */
|
||||
void StartXML(cmXMLWriter& xml, bool append);
|
||||
|
||||
//! End CTest XML output file
|
||||
/** End CTest XML output file */
|
||||
void EndXML(cmXMLWriter& xml);
|
||||
|
||||
//! Run command specialized for make and configure. Returns process status
|
||||
// and retVal is return value or exception.
|
||||
/**
|
||||
* 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, int timeout, std::ostream& ofs);
|
||||
|
||||
/*
|
||||
* return the current tag
|
||||
*/
|
||||
/** Return the current tag */
|
||||
std::string GetCurrentTag();
|
||||
|
||||
//! Get the path to the build tree
|
||||
/** Get the path to the build tree */
|
||||
std::string GetBinaryDir();
|
||||
|
||||
//! Get the short path to the file. This means if the file is in binary or
|
||||
// source directory, it will become /.../relative/path/to/file
|
||||
/**
|
||||
* Get the short path to the file.
|
||||
*
|
||||
* This means if the file is in binary or
|
||||
* source directory, it will become /.../relative/path/to/file
|
||||
*/
|
||||
std::string GetShortPathToFile(const char* fname);
|
||||
|
||||
enum
|
||||
|
@ -308,7 +330,7 @@ public:
|
|||
CONTINUOUS
|
||||
};
|
||||
|
||||
// provide some more detailed info on the return code for ctest
|
||||
/** provide some more detailed info on the return code for ctest */
|
||||
enum
|
||||
{
|
||||
UPDATE_ERRORS = 0x01,
|
||||
|
@ -320,14 +342,16 @@ public:
|
|||
SUBMIT_ERRORS = 0x40
|
||||
};
|
||||
|
||||
///! Are we producing XML
|
||||
/** Are we producing XML */
|
||||
bool GetProduceXML();
|
||||
void SetProduceXML(bool v);
|
||||
|
||||
//! Run command specialized for tests. Returns process status and retVal is
|
||||
// return value or exception. If environment is non-null, it is used to set
|
||||
// environment variables prior to running the test. After running the test,
|
||||
// environment variables are restored to their previous values.
|
||||
/**
|
||||
* Run command specialized for tests. Returns process status and retVal is
|
||||
* return value or exception. If environment is non-null, it is used to set
|
||||
* environment variables prior to running the test. After running the test,
|
||||
* environment variables are restored to their previous values.
|
||||
*/
|
||||
int RunTest(std::vector<const char*> args, std::string* output, int* retVal,
|
||||
std::ostream* logfile, double testTimeOut,
|
||||
std::vector<std::string>* environment);
|
||||
|
@ -338,13 +362,13 @@ public:
|
|||
*/
|
||||
int ExecuteHandler(const char* handler);
|
||||
|
||||
/*
|
||||
/**
|
||||
* Get the handler object
|
||||
*/
|
||||
cmCTestGenericHandler* GetHandler(const char* handler);
|
||||
cmCTestGenericHandler* GetInitializedHandler(const char* handler);
|
||||
|
||||
/*
|
||||
/**
|
||||
* Set the CTest variable from CMake variable
|
||||
*/
|
||||
bool SetCTestConfigurationFromCMakeVariable(cmMakefile* mf,
|
||||
|
@ -352,37 +376,42 @@ public:
|
|||
const std::string& cmake_var,
|
||||
bool suppress = false);
|
||||
|
||||
//! Make string safe to be send as an URL
|
||||
/** Make string safe to be send as an URL */
|
||||
static std::string MakeURLSafe(const std::string&);
|
||||
|
||||
/** Decode a URL to the original string. */
|
||||
static std::string DecodeURL(const std::string&);
|
||||
|
||||
//! Should ctect configuration be updated. When using new style ctest
|
||||
// script, this should be true.
|
||||
/**
|
||||
* Should ctect configuration be updated. When using new style ctest
|
||||
* script, this should be true.
|
||||
*/
|
||||
void SetSuppressUpdatingCTestConfiguration(bool val)
|
||||
{
|
||||
this->SuppressUpdatingCTestConfiguration = val;
|
||||
}
|
||||
|
||||
//! Add overwrite to ctest configuration.
|
||||
// The format is key=value
|
||||
/**
|
||||
* Add overwrite to ctest configuration.
|
||||
*
|
||||
* The format is key=value
|
||||
*/
|
||||
void AddCTestConfigurationOverwrite(const std::string& encstr);
|
||||
|
||||
//! Create XML file that contains all the notes specified
|
||||
/** Create XML file that contains all the notes specified */
|
||||
int GenerateNotesFile(const VectorOfStrings& files);
|
||||
|
||||
//! Submit extra files to the server
|
||||
/** Submit extra files to the server */
|
||||
bool SubmitExtraFiles(const char* files);
|
||||
bool SubmitExtraFiles(const VectorOfStrings& files);
|
||||
|
||||
//! Set the output log file name
|
||||
/** Set the output log file name */
|
||||
void SetOutputLogFileName(const char* name);
|
||||
|
||||
//! Set the visual studio or Xcode config type
|
||||
/** Set the visual studio or Xcode config type */
|
||||
void SetConfigType(const char* ct);
|
||||
|
||||
//! Various log types
|
||||
/** Various log types */
|
||||
enum
|
||||
{
|
||||
DEBUG = 0,
|
||||
|
@ -395,15 +424,15 @@ public:
|
|||
OTHER
|
||||
};
|
||||
|
||||
//! Add log to the output
|
||||
/** Add log to the output */
|
||||
void Log(int logType, const char* file, int line, const char* msg,
|
||||
bool suppress = false);
|
||||
|
||||
//! Get the version of dart server
|
||||
/** Get the version of dart server */
|
||||
int GetDartVersion() { return this->DartVersion; }
|
||||
int GetDropSiteCDash() { return this->DropSiteCDash; }
|
||||
|
||||
//! Add file to be submitted
|
||||
/** Add file to be submitted */
|
||||
void AddSubmitFile(Part part, const char* name);
|
||||
std::vector<std::string> const& GetSubmitFiles(Part part)
|
||||
{
|
||||
|
@ -411,7 +440,9 @@ public:
|
|||
}
|
||||
void ClearSubmitFiles(Part part) { this->Parts[part].SubmitFiles.clear(); }
|
||||
|
||||
//! Read the custom configuration files and apply them to the current ctest
|
||||
/**
|
||||
* Read the custom configuration files and apply them to the current ctest
|
||||
*/
|
||||
int ReadCustomConfigurationFileTree(const char* dir, cmMakefile* mf);
|
||||
|
||||
std::vector<std::string>& GetInitialCommandLineArguments()
|
||||
|
@ -419,7 +450,7 @@ public:
|
|||
return this->InitialCommandLineArguments;
|
||||
}
|
||||
|
||||
//! Set the track to submit to
|
||||
/** Set the track to submit to */
|
||||
void SetSpecificTrack(const char* track);
|
||||
const char* GetSpecificTrack();
|
||||
|
||||
|
@ -447,10 +478,13 @@ public:
|
|||
{
|
||||
return this->Definitions;
|
||||
}
|
||||
// return the number of times a test should be run
|
||||
|
||||
/** Return the number of times a test should be run */
|
||||
int GetTestRepeat() { return this->RepeatTests; }
|
||||
// return true if test should run until fail
|
||||
|
||||
/** Return true if test should run until fail */
|
||||
bool GetRepeatUntilFail() { return this->RepeatUntilFail; }
|
||||
|
||||
private:
|
||||
int RepeatTests;
|
||||
bool RepeatUntilFail;
|
||||
|
@ -485,7 +519,7 @@ private:
|
|||
|
||||
bool ShowOnly;
|
||||
|
||||
//! Map of configuration properties
|
||||
/** Map of configuration properties */
|
||||
typedef std::map<std::string, std::string> CTestConfigurationMap;
|
||||
|
||||
std::string CTestConfigFile;
|
||||
|
@ -549,36 +583,47 @@ private:
|
|||
*/
|
||||
int Initialize(const char* binary_dir, cmCTestStartCommand* command);
|
||||
|
||||
//! parse the option after -D and convert it into the appropriate steps
|
||||
/** parse the option after -D and convert it into the appropriate steps */
|
||||
bool AddTestsForDashboardType(std::string& targ);
|
||||
|
||||
//! read as "emit an error message for an unknown -D value"
|
||||
/** read as "emit an error message for an unknown -D value" */
|
||||
void ErrorMessageUnknownDashDValue(std::string& val);
|
||||
|
||||
//! add a variable definition from a command line -D value
|
||||
/** add a variable definition from a command line -D value */
|
||||
bool AddVariableDefinition(const std::string& arg);
|
||||
|
||||
//! parse and process most common command line arguments
|
||||
/** parse and process most common command line arguments */
|
||||
bool HandleCommandLineArguments(size_t& i, std::vector<std::string>& args,
|
||||
std::string& errormsg);
|
||||
|
||||
//! hande the -S -SP and -SR arguments
|
||||
/** hande the -S -SP and -SR arguments */
|
||||
void HandleScriptArguments(size_t& i, std::vector<std::string>& args,
|
||||
bool& SRArgumentSpecified);
|
||||
|
||||
//! Reread the configuration file
|
||||
/** Reread the configuration file */
|
||||
bool UpdateCTestConfiguration();
|
||||
|
||||
//! Create note from files.
|
||||
/** Create note from files. */
|
||||
int GenerateCTestNotesOutput(cmXMLWriter& xml, const VectorOfStrings& files);
|
||||
|
||||
//! Check if the argument is the one specified
|
||||
/** Check if the argument is the one specified */
|
||||
bool CheckArgument(const std::string& arg, const char* varg1,
|
||||
const char* varg2 = CM_NULLPTR);
|
||||
|
||||
//! Output errors from a test
|
||||
/** Output errors from a test */
|
||||
void OutputTestErrors(std::vector<char> const& process_output);
|
||||
|
||||
/** Handle the --test-action command line argument */
|
||||
bool HandleTestActionArgument(const char* ctestExec, size_t& i,
|
||||
const std::vector<std::string>& args);
|
||||
|
||||
/** Handle the --test-model command line argument */
|
||||
bool HandleTestModelArgument(const char* ctestExec, size_t& i,
|
||||
const std::vector<std::string>& args);
|
||||
|
||||
int RunCMakeAndTest(std::string* output);
|
||||
int ExecuteTests();
|
||||
|
||||
bool SuppressUpdatingCTestConfiguration;
|
||||
|
||||
bool Debug;
|
||||
|
|
Loading…
Reference in New Issue