From 4de7cc3621c723f76938063c10a4f8fc691ad58e Mon Sep 17 00:00:00 2001 From: Zach Mullen Date: Thu, 10 Dec 2009 15:37:04 -0500 Subject: [PATCH] Unfortunately, I noticed the comment on bug 8668 too late. This changes my last implementation of the exe wrapper to something which makes much more sense: a REQUIRED_FILES property on tests. --- Source/CTest/cmCTestRunTest.cxx | 93 +++++++++++----------------- Source/CTest/cmCTestTestHandler.cxx | 33 ++-------- Source/CTest/cmCTestTestHandler.h | 5 +- Source/cmAddTestCommand.h | 6 +- Source/cmSetTestsPropertiesCommand.h | 4 +- 5 files changed, 47 insertions(+), 94 deletions(-) diff --git a/Source/CTest/cmCTestRunTest.cxx b/Source/CTest/cmCTestRunTest.cxx index 83119c7373..3bb808a85a 100644 --- a/Source/CTest/cmCTestRunTest.cxx +++ b/Source/CTest/cmCTestRunTest.cxx @@ -26,8 +26,6 @@ cmCTestRunTest::cmCTestRunTest(cmCTestTestHandler* handler) this->TestResult.Status = 0; this->TestResult.TestCount = 0; this->TestResult.Properties = 0; - this->PrefixCommand = ""; - this->UsePrefixCommand = false; } cmCTestRunTest::~cmCTestRunTest() @@ -305,27 +303,51 @@ bool cmCTestRunTest::StartTest(size_t total) << this->TestProperties->Name << std::endl); this->ComputeArguments(); std::vector& args = this->TestProperties->Args; - std::vector& pargs = this->TestProperties->PrefixArgs; this->TestResult.Properties = this->TestProperties; this->TestResult.ExecutionTime = 0; this->TestResult.ReturnValue = -1; this->TestResult.CompletionStatus = "Failed to start"; this->TestResult.Status = cmCTestTestHandler::BAD_COMMAND; - this->TestResult.TestCount = this->TestProperties->Index; + this->TestResult.TestCount = this->TestProperties->Index; this->TestResult.Name = this->TestProperties->Name; this->TestResult.Path = this->TestProperties->Directory.c_str(); - // if we are using a prefix command, make sure THAT executable exists - if (this->UsePrefixCommand && this->PrefixCommand == "") + // Check if all required files exist + for(std::vector::iterator i = + this->TestProperties->RequiredFiles.begin(); + i != this->TestProperties->RequiredFiles.end(); ++i) { - this->ExeNotFound(pargs[0]); - return false; - } + std::string file = *i; + if(!cmSystemTools::FileExists(file.c_str())) + { + //Required file was not found + this->TestProcess = new cmProcess; + *this->TestHandler->LogFile << "Unable to find required file: " + << file.c_str() << std::endl; + cmCTestLog(this->CTest, ERROR_MESSAGE, "Unable to find required file: " + << file.c_str() << std::endl); + this->TestResult.Output = "Unable to find required file: " + file; + this->TestResult.FullCommandLine = ""; + this->TestResult.CompletionStatus = "Not Run"; + this->TestResult.Status = cmCTestTestHandler::NOT_RUN; + return false; + } + } // log and return if we did not find the executable if (this->ActualCommand == "") { - this->ExeNotFound(args[1]); + // if the command was not found create a TestResult object + // that has that information + this->TestProcess = new cmProcess; + *this->TestHandler->LogFile << "Unable to find executable: " + << args[1].c_str() << std::endl; + cmCTestLog(this->CTest, ERROR_MESSAGE, "Unable to find executable: " + << args[1].c_str() << std::endl); + this->TestResult.Output = "Unable to find executable: " + args[1]; + this->TestResult.FullCommandLine = ""; + this->TestResult.CompletionStatus = "Not Run"; + this->TestResult.Status = cmCTestTestHandler::NOT_RUN; return false; } this->StartTime = this->CTest->CurrentTime(); @@ -334,36 +356,12 @@ bool cmCTestRunTest::StartTest(size_t total) &this->TestProperties->Environment); } -void cmCTestRunTest::ExeNotFound(std::string exe) -{ - this->TestProcess = new cmProcess; - *this->TestHandler->LogFile << "Unable to find executable: " - << exe.c_str() << std::endl; - cmCTestLog(this->CTest, ERROR_MESSAGE, "Unable to find executable: " - << exe.c_str() << std::endl); - this->TestResult.Output = "Unable to find executable: " + exe; - this->TestResult.FullCommandLine = ""; - this->TestResult.CompletionStatus = "Not Run"; - this->TestResult.Reason = ""; - this->TestResult.Status = cmCTestTestHandler::NOT_RUN; -} - void cmCTestRunTest::ComputeArguments() { std::vector::const_iterator j = this->TestProperties->Args.begin(); ++j; // skip test name - this->TestCommand = ""; - - //If we are using a prefix command, find the exe for it - if(this->TestProperties->PrefixArgs.size()) - { - this->UsePrefixCommand = true; - this->PrefixCommand = this->TestHandler->FindTheExecutable( - this->TestProperties->PrefixArgs[0].c_str()); - } - // find the test executable if(this->TestHandler->MemCheck) { @@ -378,6 +376,8 @@ void cmCTestRunTest::ComputeArguments() this->TestProperties->Args[1].c_str()); ++j; //skip the executable (it will be actualCommand) } + this->TestCommand + = cmSystemTools::ConvertToOutputPath(this->ActualCommand.c_str()); //Prepends memcheck args to our command string this->TestHandler->GenerateTestCommand(this->Arguments); @@ -387,27 +387,6 @@ void cmCTestRunTest::ComputeArguments() this->TestCommand += " "; this->TestCommand += cmSystemTools::EscapeSpaces(j->c_str()); } - //Add user specified prefix args - if(this->UsePrefixCommand) - { - this->TestCommand += - cmSystemTools::ConvertToOutputPath(this->PrefixCommand.c_str()); - - std::vector::iterator i = - this->TestProperties->PrefixArgs.begin(); - ++i; //skip the exe name - for(; i != this->TestProperties->PrefixArgs.end(); ++i) - { - this->TestCommand += " "; - this->TestCommand += cmSystemTools::EscapeSpaces(i->c_str()); - this->Arguments.push_back(*i); - } - this->Arguments.push_back(this->ActualCommand); - this->TestCommand += " "; - } - //Add regular test args - this->TestCommand - += cmSystemTools::ConvertToOutputPath(this->ActualCommand.c_str()); for(;j != this->TestProperties->Args.end(); ++j) { @@ -454,9 +433,7 @@ bool cmCTestRunTest::CreateProcess(double testTimeOut, this->TestProcess->SetId(this->Index); this->TestProcess->SetWorkingDirectory( this->TestProperties->Directory.c_str()); - this->TestProcess->SetCommand(this->UsePrefixCommand ? - this->PrefixCommand.c_str() : - this->ActualCommand.c_str()); + this->TestProcess->SetCommand(this->ActualCommand.c_str()); this->TestProcess->SetCommandArguments(this->Arguments); std::vector origEnv; diff --git a/Source/CTest/cmCTestTestHandler.cxx b/Source/CTest/cmCTestTestHandler.cxx index dadd39cf3b..dd992681d7 100644 --- a/Source/CTest/cmCTestTestHandler.cxx +++ b/Source/CTest/cmCTestTestHandler.cxx @@ -269,30 +269,7 @@ bool cmCTestAddTestCommand this->SetError("called with incorrect number of arguments"); return false; } - - bool prefixCmdFound = false; - std::vector actualArgs, prefix; - - //separate the regular command and the prefix command (bug 8668) - for(std::vector::const_iterator i = args.begin(); - i != args.end(); ++i) - { - if(*i == "EXEC_PREFIX_CMD") - { - prefixCmdFound = true; - continue; - } - if(prefixCmdFound) - { - prefix.push_back(*i); - } - else - { - actualArgs.push_back(*i); - } - } - - return this->TestHandler->AddTest(actualArgs, prefix); + return this->TestHandler->AddTest(args); } //---------------------------------------------------------------------- @@ -2036,6 +2013,10 @@ bool cmCTestTestHandler::SetTestsProperties( { rtit->Cost = static_cast(atof(val.c_str())); } + if ( key == "REQUIRED_FILE" ) + { + rtit->RequiredFiles.push_back(val); + } if ( key == "RUN_SERIAL" ) { rtit->RunSerial = cmSystemTools::IsOn(val.c_str()); @@ -2127,8 +2108,7 @@ bool cmCTestTestHandler::SetTestsProperties( } //---------------------------------------------------------------------- -bool cmCTestTestHandler::AddTest(const std::vector& args, - const std::vector& prefix) +bool cmCTestTestHandler::AddTest(const std::vector& args) { const std::string& testname = args[0]; cmCTestLog(this->CTest, DEBUG, "Add test: " << args[0] << std::endl); @@ -2183,7 +2163,6 @@ bool cmCTestTestHandler::AddTest(const std::vector& args, cmCTestTestProperties test; test.Name = testname; test.Args = args; - test.PrefixArgs = prefix; test.Directory = cmSystemTools::GetCurrentWorkingDirectory(); cmCTestLog(this->CTest, DEBUG, "Set test directory: " << test.Directory << std::endl); diff --git a/Source/CTest/cmCTestTestHandler.h b/Source/CTest/cmCTestTestHandler.h index eedd811588..1afa3d3ed2 100644 --- a/Source/CTest/cmCTestTestHandler.h +++ b/Source/CTest/cmCTestTestHandler.h @@ -66,8 +66,7 @@ public: /* * Add the test to the list of tests to be executed */ - bool AddTest(const std::vector& args, - const std::vector& prefix); + bool AddTest(const std::vector& args); /* * Set tests properties @@ -85,7 +84,7 @@ public: cmStdString Name; cmStdString Directory; std::vector Args; - std::vector PrefixArgs; + std::vector RequiredFiles; std::vector Depends; std::vector > ErrorRegularExpressions; diff --git a/Source/cmAddTestCommand.h b/Source/cmAddTestCommand.h index a360ac001e..79fb481506 100644 --- a/Source/cmAddTestCommand.h +++ b/Source/cmAddTestCommand.h @@ -56,8 +56,7 @@ public: virtual const char* GetFullDocumentation() { return - " add_test(testname Exename arg1 arg2 ... \n" - " [EXEC_PREFIX_CMD wrapperExe args...])\n" + " add_test(testname Exename arg1 arg2 ... )\n" "If the ENABLE_TESTING command has been run, this command adds a " "test target to the current directory. If ENABLE_TESTING has not " "been run, this command does nothing. " @@ -67,9 +66,6 @@ public: "system (like tclsh). The test will be run with the current working " "directory set to the CMakeList.txt files corresponding directory " "in the binary tree.\n" - "Use EXEC_PREFIX_CMD to wrap an executable built by this project " - "in another executable such as mpiexec. This will only run the " - "test if the wrapped executable was built." "\n" " add_test(NAME [CONFIGURATIONS [Debug|Release|...]]\n" " COMMAND [arg1 [arg2 ...]])\n" diff --git a/Source/cmSetTestsPropertiesCommand.h b/Source/cmSetTestsPropertiesCommand.h index fb143b43f9..296236c341 100644 --- a/Source/cmSetTestsPropertiesCommand.h +++ b/Source/cmSetTestsPropertiesCommand.h @@ -73,7 +73,9 @@ public: "seconds specified.\n" "RUN_SERIAL: If set to true, this test will not run in parallel with " "any other tests. This should be used in conjunction with " - "the ctest_test PARALLEL_LEVEL option.\n"; + "the ctest_test PARALLEL_LEVEL option.\n" + "REQUIRED_FILE: Set this to a file that must exist in order for the " + "test to be run.\n"; } cmTypeMacro(cmSetTestsPropertiesCommand, cmCommand);