diff options
Diffstat (limited to 'Source/ctest.cxx')
-rw-r--r-- | Source/ctest.cxx | 344 |
1 files changed, 344 insertions, 0 deletions
diff --git a/Source/ctest.cxx b/Source/ctest.cxx new file mode 100644 index 0000000..e767a16 --- /dev/null +++ b/Source/ctest.cxx @@ -0,0 +1,344 @@ +/*============================================================================ + CMake - Cross Platform Makefile Generator + Copyright 2000-2009 Kitware, Inc., Insight Software Consortium + + Distributed under the OSI-approved BSD License (the "License"); + see accompanying file Copyright.txt for details. + + This software is distributed WITHOUT ANY WARRANTY; without even the + implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the License for more information. +============================================================================*/ +#include "cmCTest.h" +#include "cmSystemTools.h" + +// Need these for documentation support. +#include "cmake.h" +#include "cmDocumentation.h" + +#include "CTest/cmCTestScriptHandler.h" +#include "CTest/cmCTestLaunch.h" + +//---------------------------------------------------------------------------- +static const char * cmDocumentationName[][3] = +{ + {0, + " ctest - Testing driver provided by CMake.", 0}, + {0,0,0} +}; + +//---------------------------------------------------------------------------- +static const char * cmDocumentationUsage[][3] = +{ + {0, + " ctest [options]", 0}, + {0,0,0} +}; + +//---------------------------------------------------------------------------- +static const char * cmDocumentationDescription[][3] = +{ + {0, + "The \"ctest\" executable is the CMake test driver program. " + "CMake-generated build trees created for projects that use " + "the ENABLE_TESTING and ADD_TEST commands have testing support. " + "This program will run the tests and report results.", 0}, + {0,0,0} +}; + +//---------------------------------------------------------------------------- +static const char * cmDocumentationOptions[][3] = +{ + {"-C <cfg>, --build-config <cfg>", "Choose configuration to test.", + "Some CMake-generated build trees can have multiple build configurations " + "in the same tree. This option can be used to specify which one should " + "be tested. Example configurations are \"Debug\" and \"Release\"."}, + {"-V,--verbose", "Enable verbose output from tests.", + "Test output is normally suppressed and only summary information is " + "displayed. This option will show all test output."}, + {"-VV,--extra-verbose", "Enable more verbose output from tests.", + "Test output is normally suppressed and only summary information is " + "displayed. This option will show even more test output."}, + {"--debug", "Displaying more verbose internals of CTest.", + "This feature will result in a large number of output that is mostly " + "useful for debugging dashboard problems."}, + {"--output-on-failure", "Output anything outputted by the test program " + "if the test should fail. This option can also be enabled by setting " + "the environment variable CTEST_OUTPUT_ON_FAILURE"}, + {"-F", "Enable failover.", "This option allows ctest to resume a test " + "set execution that was previously interrupted. If no interruption " + "occurred, the -F option will have no effect."}, + {"-j <jobs>, --parallel <jobs>", "Run the tests in parallel using the" + "given number of jobs.", + "This option tells ctest to run the tests in parallel using given " + "number of jobs. This option can also be set by setting " + "the environment variable CTEST_PARALLEL_LEVEL."}, + {"-Q,--quiet", "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."}, + {"-O <file>, --output-log <file>", "Output to log file", + "This option tells ctest to write all its output to a log file."}, + {"-N,--show-only", "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 options."}, + {"-L <regex>, --label-regex <regex>", "Run tests with labels matching " + "regular expression.", + "This option tells ctest to run only the tests whose labels match the " + "given regular expression."}, + {"-R <regex>, --tests-regex <regex>", "Run tests matching regular " + "expression.", + "This option tells ctest to run only the tests whose names match the " + "given regular expression."}, + {"-E <regex>, --exclude-regex <regex>", "Exclude tests matching regular " + "expression.", + "This option tells ctest to NOT run the tests whose names match the " + "given regular expression."}, + {"-LE <regex>, --label-exclude <regex>", "Exclude tests with labels " + "matching regular expression.", + "This option tells ctest to NOT run the tests whose labels match the " + "given regular expression."}, + {"-D <dashboard>, --dashboard <dashboard>", "Execute dashboard test", + "This option tells ctest to act as a Dart client and perform " + "a dashboard test. All tests are <Mode><Test>, where Mode can be " + "Experimental, Nightly, and Continuous, and Test can be Start, Update, " + "Configure, Build, Test, Coverage, and Submit."}, + {"-D <var>:<type>=<value>", "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 arguments as variable values is only attempted if " + "the value following -D does not match any of the known dashboard " + "types."}, + {"-M <model>, --test-model <model>", "Sets the model for a dashboard", + "This option tells ctest to act as a Dart client " + "where the TestModel 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", + "This option tells ctest to act as a Dart client " + "and perform some action such as start, build, test etc. " + "Combining -M and -T is similar to -D"}, + {"--track <track>", "Specify the track to submit dashboard to", + "Submit dashboard to specified track instead of default one. By " + "default, the dashboard is submitted to Nightly, Experimental, or " + "Continuous track, but by specifying this option, the track can be " + "arbitrary."}, + {"-S <script>, --script <script>", "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 with the " + "appropriate options."}, + {"-SP <script>, --script-new-process <script>", "Execute a dashboard for a " + "configuration", + "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."}, + {"-A <file>, --add-notes <file>", "Add a notes file with submission", + "This option tells ctest to include a notes file when submitting " + "dashboard. "}, + {"-I [Start,End,Stride,test#,test#|Test file], --tests-information", + "Run a specific number of tests by number.", + "This option causes ctest to run tests starting at number Start, ending " + "at number End, and incrementing by Stride. Any additional numbers after " + "Stride are considered individual test numbers. Start, End,or stride " + "can be empty. Optionally a file can be given that contains the same " + "syntax as the command line."}, + {"-U, --union", "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."}, + {"--max-width <width>", "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 name which " + "can be very annoying."}, + {"--interactive-debug-mode [0|1]", "Set the interactive mode to 0 or 1.", + "This option causes ctest to run tests in either an interactive mode or " + "a non-interactive mode. On Windows this means that in non-interactive " + "mode, all system debug pop up windows are blocked. In dashboard mode " + "(Experimental, Nightly, Continuous), the default is non-interactive. " + "When just running tests not for a dashboard the default is to allow " + "popups and interactive " + "debugging."}, + {"--no-label-summary", "Disable timing summary information for labels.", + "This option tells ctest not to print summary information for each label " + "associated with the tests run. If there are no labels on the " + "tests, nothing extra is printed."}, + {"--build-and-test", "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. Both --build-makeprogram and " + "--build-generator 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"}, + {"--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." }, + {"--build-nocmake", "Run the build without running cmake first.", + "Skip the cmake step." }, + {"--build-run-dir", "Specify directory to run programs from.", + "Directory where programs will be after it has been compiled." }, + {"--build-two-config", "Run CMake twice", "" }, + {"--build-exe-dir", "Specify the directory for the executable.", "" }, + {"--build-generator", "Specify the generator to use.", "" }, + {"--build-generator-toolset", "Specify the generator-specific toolset.",""}, + {"--build-project", "Specify the name of the project to build.", "" }, + {"--build-makeprogram", "Specify the make program to use.", "" }, + {"--build-noclean", "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" }, + {"--build-options", "Add extra options to the build step.", + "This option must be the last option with the exception of --test-command" + }, + + {"--test-command", "The test to run with the --build-and-test option.", "" + }, + {"--test-timeout", "The time limit in seconds, internal use only.", "" + }, + {"--tomorrow-tag", "Nightly or experimental starts with next day tag.", + "This is useful if the build will not finish in one day." }, + {"--ctest-config", "The configuration file used to initialize CTest state " + "when submitting dashboards.", + "This option tells CTest to use different initialization file instead of " + "CTestConfiguration.tcl. This way multiple initialization files can be " + "used for example to submit to multiple dashboards." }, + {"--overwrite", "Overwrite CTest configuration option.", + "By default ctest uses configuration options from configuration file. " + "This option will overwrite the configuration option." }, + {"--extra-submit <file>[;<file>]", "Submit extra files to the dashboard.", + "This option will submit extra files to the dashboard." }, + {"--force-new-ctest-process", "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", + "This option will run the tests in a random order. It is commonly used to " + "detect implicit dependencies in a test suite." }, + {"--submit-index", "Submit individual dashboard tests with specific index", + "This option allows performing the same CTest action (such as test) " + "multiple times and submit all stages to the same dashboard (Dart2 " + "required). Each execution requires different index." }, + {"--timeout <seconds>", "Set a global timeout on all tests.", + "This option will set a global timeout on all tests that do not already " + "have a timeout set on them."}, + {"--stop-time <time>", "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 is " + "accepted. Local time is assumed if no timezone is specified."}, + {"--http1.0", "Submit using HTTP 1.0.", + "This option will force CTest to use HTTP 1.0 to submit files to the " + "dashboard, instead of HTTP 1.1."}, + {"--no-compress-output", "Do not compress test output when submitting.", + "This flag will turn off automatic compression of test output. Use this " + "to maintain compatibility with an older version of CDash which doesn't " + "support compressed test output."}, + {"--print-labels", "Print all available test labels.", + "This option will not run any tests, it will simply print the list of " + "all labels associated with the test set."}, + {"--help-command <cmd> [<file>]", "Show help for a single command and exit.", + "Prints the help for the command to stdout or to the specified file." }, + {"--help-command-list [<file>]", "List available commands and exit.", + "Prints the list of all available listfile commands to stdout or the " + "specified file." }, + {"--help-commands [<file>]", "Print help for all commands and exit.", + "Prints the help for all commands to stdout or to the specified file." }, + {0,0,0} +}; + +//---------------------------------------------------------------------------- +static const char * cmDocumentationSeeAlso[][3] = +{ + {0, "cmake", 0}, + {0, "ccmake", 0}, + {0, 0, 0} +}; + +// this is a test driver program for cmCTest. +int main (int argc, char *argv[]) +{ + cmSystemTools::DoNotInheritStdPipes(); + cmSystemTools::EnableMSVCDebugHook(); + cmSystemTools::FindExecutableDirectory(argv[0]); + + // Dispatch 'ctest --launch' mode directly. + if(argc >= 2 && strcmp(argv[1], "--launch") == 0) + { + return cmCTestLaunch::Main(argc, argv); + } + + cmCTest inst; + + if ( cmSystemTools::GetCurrentWorkingDirectory().size() == 0 ) + { + cmCTestLog(&inst, ERROR_MESSAGE, + "Current working directory cannot be established." << std::endl); + return 1; + } + + // If there is a testing input file, check for documentation options + // only if there are actually arguments. We want running without + // arguments to run tests. + if(argc > 1 || !(cmSystemTools::FileExists("CTestTestfile.cmake") || + cmSystemTools::FileExists("DartTestfile.txt"))) + { + if(argc == 1) + { + cmCTestLog(&inst, ERROR_MESSAGE, "*********************************" + << std::endl + << "No test configuration file found!" << std::endl + << "*********************************" << std::endl); + } + cmDocumentation doc; + doc.addCTestStandardDocSections(); + if(doc.CheckOptions(argc, argv)) + { + // Construct and print requested documentation. + std::vector<cmDocumentationEntry> commands; + cmCTestScriptHandler* ch = + static_cast<cmCTestScriptHandler*>(inst.GetHandler("script")); + ch->CreateCMake(); + ch->GetCommandDocumentation(commands); + + doc.SetShowGenerators(false); + doc.SetName("ctest"); + doc.SetSection("Name",cmDocumentationName); + doc.SetSection("Usage",cmDocumentationUsage); + doc.SetSection("Description",cmDocumentationDescription); + doc.PrependSection("Options",cmDocumentationOptions); + doc.SetSection("Commands",commands); + doc.SetSeeAlsoList(cmDocumentationSeeAlso); +#ifdef cout +# undef cout +#endif + return doc.PrintRequestedDocumentation(std::cout)? 0:1; +#define cout no_cout_use_cmCTestLog + } + } + +#ifdef _WIN32 + std::string comspec = "cmw9xcom.exe"; + cmSystemTools::SetWindows9xComspecSubstitute(comspec.c_str()); +#endif + // copy the args to a vector + std::vector<std::string> args; + for(int i =0; i < argc; ++i) + { + args.push_back(argv[i]); + } + // run ctest + std::string output; + int res = inst.Run(args,&output); + cmCTestLog(&inst, OUTPUT, output); + + return res; +} + |