diff options
Diffstat (limited to 'Source/cmCTest.cxx')
-rw-r--r-- | Source/cmCTest.cxx | 316 |
1 files changed, 193 insertions, 123 deletions
diff --git a/Source/cmCTest.cxx b/Source/cmCTest.cxx index 0ee953e..af03185 100644 --- a/Source/cmCTest.cxx +++ b/Source/cmCTest.cxx @@ -50,16 +50,12 @@ #define DEBUGERR std::cerr << __LINE__ << " "; std::cerr struct tm* cmCTest::GetNightlyTime(std::string str, - bool verbose, bool tomorrowtag) { struct tm* lctime; time_t tctime = time(0); - if ( verbose ) - { - std::cout << "Determine Nightly Start Time" << std::endl; - std::cout << " Specified time: " << str.c_str() << std::endl; - } + cmCTestLog(this, OUTPUT, "Determine Nightly Start Time" << std::endl + << " Specified time: " << str.c_str() << std::endl); //Convert the nightly start time to seconds. Since we are //providing only a time and a timezone, the current date of //the local machine is assumed. Consequently, nightlySeconds @@ -67,18 +63,12 @@ struct tm* cmCTest::GetNightlyTime(std::string str, //will be opened on the date of the current client machine. //As such, this time may be in the past or in the future. time_t ntime = curl_getdate(str.c_str(), &tctime); - if ( verbose ) - { - std::cout << " Get curl time: " << ntime << std::endl; - } + cmCTestLog(this, DEBUG, " Get curl time: " << ntime << std::endl); tctime = time(0); - if ( verbose ) - { - std::cout << " Get the current time: " << tctime << std::endl; - } + cmCTestLog(this, DEBUG, " Get the current time: " << tctime << std::endl); const int dayLength = 24 * 60 * 60; - //std::cout << "Seconds: " << tctime << std::endl; + cmCTestLog(this, DEBUG, "Seconds: " << tctime << std::endl); while ( ntime > tctime ) { // If nightlySeconds is in the past, this is the current @@ -87,29 +77,20 @@ struct tm* cmCTest::GetNightlyTime(std::string str, // dashboard to be opened, so subtract 24 hours to get the // time of the current open dashboard ntime -= dayLength; - //std::cout << "Pick yesterday" << std::endl; - if ( verbose ) - { - std::cout << " Future time, subtract day: " << ntime << std::endl; - } + cmCTestLog(this, DEBUG, "Pick yesterday" << std::endl); + cmCTestLog(this, DEBUG, " Future time, subtract day: " << ntime << std::endl); } while ( tctime > (ntime + dayLength) ) { ntime += dayLength; - if ( verbose ) - { - std::cout << " Past time, add day: " << ntime << std::endl; - } - } - //std::cout << "nightlySeconds: " << ntime << std::endl; - if ( verbose ) - { - std::cout << " Current time: " << tctime - << " Nightly time: " << ntime << std::endl; + cmCTestLog(this, DEBUG, " Past time, add day: " << ntime << std::endl); } + cmCTestLog(this, DEBUG, "nightlySeconds: " << ntime << std::endl); + cmCTestLog(this, DEBUG, " Current time: " << tctime + << " Nightly time: " << ntime << std::endl); if ( tomorrowtag ) { - std::cout << "Use future tag, Add a day" << std::endl; + cmCTestLog(this, OUTPUT, " Use future tag, Add a day" << std::endl); ntime += dayLength; } lctime = gmtime(&ntime); @@ -145,7 +126,7 @@ std::string cmCTest::CurrentTime() { strftime(current_time, 1000, "%a %b %d %H:%M:%S %Z %Y", t); } - //std::cout << "Current_Time: " << current_time << std::endl; + cmCTestLog(this, DEBUG, " Current_Time: " << current_time << std::endl); return cmCTest::MakeXMLSafe(cmCTest::CleanString(current_time)); } @@ -227,6 +208,8 @@ cmCTest::cmCTest() m_BuildNoClean = false; m_BuildTwoConfig = false; m_Verbose = false; + m_Debug = false; + m_Quiet = false; m_ExtraVerbose = false; m_ProduceXML = false; m_ShowOnly = false; @@ -258,6 +241,8 @@ cmCTest::cmCTest() { it->second->SetCTestInstance(this); } + m_OutputLogFile = 0; + m_OutputLogFileLastTag = -1; } cmCTest::~cmCTest() @@ -268,6 +253,7 @@ cmCTest::~cmCTest() delete it->second; it->second = 0; } + this->SetOutputLogFileName(0); } int cmCTest::Initialize(const char* binary_dir, bool new_tag) @@ -291,8 +277,8 @@ int cmCTest::Initialize(const char* binary_dir, bool new_tag) { if ( !cmSystemTools::FileIsDirectory(testingDir.c_str()) ) { - std::cerr << "File " << testingDir << " is in the place of the testing directory" - << std::endl; + cmCTestLog(this, ERROR, "File " << testingDir << " is in the place of the testing directory" + << std::endl); return 0; } } @@ -300,8 +286,8 @@ int cmCTest::Initialize(const char* binary_dir, bool new_tag) { if ( !cmSystemTools::MakeDirectory(testingDir.c_str()) ) { - std::cerr << "Cannot create directory " << testingDir - << std::endl; + cmCTestLog(this, ERROR, "Cannot create directory " << testingDir + << std::endl); return 0; } } @@ -341,13 +327,11 @@ int cmCTest::Initialize(const char* binary_dir, bool new_tag) } if ( tag.size() == 0 || new_tag || m_Tests[cmCTest::START_TEST] || m_Tests[ALL_TEST]) { - //std::cout << "TestModel: " << this->GetTestModelString() << std::endl; - //std::cout << "TestModel: " << m_TestModel << std::endl; + cmCTestLog(this, DEBUG, "TestModel: " << this->GetTestModelString() << std::endl); + cmCTestLog(this, DEBUG, "TestModel: " << m_TestModel << std::endl); if ( m_TestModel == cmCTest::NIGHTLY ) { - lctime = cmCTest::GetNightlyTime(m_CTestConfiguration["NightlyStartTime"], - m_ExtraVerbose, - m_TomorrowTag); + lctime = this->GetNightlyTime(m_CTestConfiguration["NightlyStartTime"], m_TomorrowTag); } char datestring[100]; sprintf(datestring, "%04d%02d%02d-%02d%02d", @@ -364,8 +348,8 @@ int cmCTest::Initialize(const char* binary_dir, bool new_tag) ofs << this->GetTestModelString() << std::endl; } ofs.close(); - std::cout << "Create new tag: " << tag << " - " - << this->GetTestModelString() << std::endl; + cmCTestLog(this, OUTPUT, "Create new tag: " << tag << " - " + << this->GetTestModelString() << std::endl); } m_CurrentTag = tag; } @@ -389,7 +373,7 @@ bool cmCTest::UpdateCTestConfiguration() } if ( !cmSystemTools::FileExists(fileName.c_str()) ) { - std::cerr << "Cannot find file: " << fileName.c_str() << std::endl; + cmCTestLog(this, ERROR, "Cannot find file: " << fileName.c_str() << std::endl); return false; } // parse the dart test file @@ -501,7 +485,7 @@ bool cmCTest::SetTest(const char* ttype, bool report) { if ( report ) { - std::cerr << "Don't know about test \"" << ttype << "\" yet..." << std::endl; + cmCTestLog(this, ERROR, "Don't know about test \"" << ttype << "\" yet..." << std::endl); } return false; } @@ -527,9 +511,9 @@ bool cmCTest::OpenOutputFile(const std::string& path, { if ( !cmSystemTools::FileIsDirectory(testingDir.c_str()) ) { - std::cerr << "File " << testingDir + cmCTestLog(this, ERROR, "File " << testingDir << " is in the place of the testing directory" - << std::endl; + << std::endl); return false; } } @@ -537,8 +521,8 @@ bool cmCTest::OpenOutputFile(const std::string& path, { if ( !cmSystemTools::MakeDirectory(testingDir.c_str()) ) { - std::cerr << "Cannot create directory " << testingDir - << std::endl; + cmCTestLog(this, ERROR, "Cannot create directory " << testingDir + << std::endl); return false; } } @@ -546,7 +530,7 @@ bool cmCTest::OpenOutputFile(const std::string& path, stream.Open(filename.c_str()); if( !stream ) { - std::cerr << "Problem opening file: " << filename << std::endl; + cmCTestLog(this, ERROR, "Problem opening file: " << filename << std::endl); return false; } if ( compress ) @@ -751,7 +735,7 @@ int cmCTest::GetTestModelFromString(const char* str) } int cmCTest::RunMakeCommand(const char* command, std::string* output, - int* retVal, const char* dir, bool verbose, int timeout, std::ofstream& ofs) + int* retVal, const char* dir, int timeout, std::ofstream& ofs) { std::vector<cmStdString> args = cmSystemTools::ParseArguments(command); @@ -786,11 +770,8 @@ int cmCTest::RunMakeCommand(const char* command, std::string* output, char* data; int length; - if ( !verbose ) - { - std::cout << " Each . represents " << tick_len << " bytes of output" << std::endl; - std::cout << " " << std::flush; - } + cmCTestLog(this, HANDLER_OUTPUT, " Each . represents " << tick_len << " bytes of output" << std::endl + << " " << std::flush); while(cmsysProcess_WaitForData(cp, &data, &length, 0)) { if ( output ) @@ -804,34 +785,26 @@ int cmCTest::RunMakeCommand(const char* command, std::string* output, } output->append(data, length); - if ( !verbose ) + while ( output->size() > (tick * tick_len) ) { - while ( output->size() > (tick * tick_len) ) + tick ++; + cmCTestLog(this, HANDLER_OUTPUT, "." << std::flush); + if ( tick % tick_line_len == 0 && tick > 0 ) { - tick ++; - std::cout << "." << std::flush; - if ( tick % tick_line_len == 0 && tick > 0 ) - { - std::cout << " Size: "; - std::cout << int((output->size() / 1024.0) + 1) << "K" << std::endl; - std::cout << " " << std::flush; - } + cmCTestLog(this, HANDLER_OUTPUT, " Size: " + << int((output->size() / 1024.0) + 1) << "K" << std::endl + << " " << std::flush); } } } - if(verbose) - { - std::cout.write(data, length); - std::cout.flush(); - } + cmCTestLog(this, HANDLER_VERBOSE_OUTPUT, cmCTestLogWrite(data, length)); if ( ofs ) { - ofs.write(data, length); - ofs.flush(); + ofs << cmCTestLogWrite(data, length); } } - std::cout << " Size of output: "; - std::cout << int(output->size() / 1024.0) << "K" << std::endl; + cmCTestLog(this, OUTPUT, " Size of output: " + << int(output->size() / 1024.0) << "K" << std::endl); cmsysProcess_WaitForExit(cp, 0); @@ -844,11 +817,11 @@ int cmCTest::RunMakeCommand(const char* command, std::string* output, else if(result == cmsysProcess_State_Exception) { *retVal = cmsysProcess_GetExitException(cp); - std::cout << "There was an exception: " << *retVal << std::endl; + cmCTestLog(this, WARNING, "There was an exception: " << *retVal << std::endl); } else if(result == cmsysProcess_State_Expired) { - std::cout << "There was a timeout" << std::endl; + cmCTestLog(this, WARNING, "There was a timeout" << std::endl); } else if(result == cmsysProcess_State_Error) { @@ -892,11 +865,8 @@ int cmCTest::RunTest(std::vector<const char*> argv, } cmSystemTools::ChangeDirectory(oldpath.c_str()); - if(m_ExtraVerbose) - { - std::cout << "Internal cmCTest object used to run test.\n"; - std::cout << *output << "\n"; - } + cmCTestLog(this, HANDLER_VERBOSE_OUTPUT, "Internal cmCTest object used to run test." << std::endl + << *output << std::endl); return cmsysProcess_State_Exited; } std::vector<char> tempOutput; @@ -907,7 +877,7 @@ int cmCTest::RunTest(std::vector<const char*> argv, cmsysProcess* cp = cmsysProcess_New(); cmsysProcess_SetCommand(cp, &*argv.begin()); - // std::cout << "Command is: " << argv[0] << std::endl; + cmCTestLog(this, DEBUG, "Command is: " << argv[0] << std::endl); if(cmSystemTools::GetRunCommandHideConsole()) { cmsysProcess_SetOption(cp, cmsysProcess_Option_HideWindow, 1); @@ -923,15 +893,10 @@ int cmCTest::RunTest(std::vector<const char*> argv, { tempOutput.insert(tempOutput.end(), data, data+length); } - if ( m_ExtraVerbose ) - { - std::cout.write(data, length); - std::cout.flush(); - } + cmCTestLog(this, HANDLER_VERBOSE_OUTPUT, cmCTestLogWrite(data, length)); if ( log ) { log->write(data, length); - log->flush(); } } @@ -940,10 +905,7 @@ int cmCTest::RunTest(std::vector<const char*> argv, { output->append(&*tempOutput.begin(), tempOutput.size()); } - if ( m_ExtraVerbose ) - { - std::cout << "-- Process completed" << std::endl; - } + cmCTestLog(this, HANDLER_VERBOSE_OUTPUT, "-- Process completed" << std::endl); int result = cmsysProcess_GetState(cp); @@ -957,22 +919,14 @@ int cmCTest::RunTest(std::vector<const char*> argv, std::string outerr = "\n*** Exception executing: "; outerr += cmsysProcess_GetExceptionString(cp); *output += outerr; - if ( m_ExtraVerbose ) - { - std::cout << outerr.c_str() << "\n"; - std::cout.flush(); - } + cmCTestLog(this, HANDLER_VERBOSE_OUTPUT, outerr.c_str() << std::endl << std::flush); } else if(result == cmsysProcess_State_Error) { std::string outerr = "\n*** ERROR executing: "; outerr += cmsysProcess_GetErrorString(cp); *output += outerr; - if ( m_ExtraVerbose ) - { - std::cout << outerr.c_str() << "\n"; - std::cout.flush(); - } + cmCTestLog(this, HANDLER_VERBOSE_OUTPUT, outerr.c_str() << std::endl << std::flush); } cmsysProcess_Delete(cp); @@ -1009,7 +963,7 @@ int cmCTest::GenerateCTestNotesOutput(std::ostream& os, const cmCTest::tm_Vector for ( it = files.begin(); it != files.end(); it ++ ) { - std::cout << "\tAdd file: " << it->c_str() << std::endl; + cmCTestLog(this, OUTPUT, "\tAdd file: " << it->c_str() << std::endl); std::string note_time = this->CurrentTime(); os << "<Note Name=\"" << this->MakeXMLSafe(it->c_str()) << "\">\n" << "<DateTime>" << note_time << "</DateTime>\n" @@ -1027,7 +981,7 @@ int cmCTest::GenerateCTestNotesOutput(std::ostream& os, const cmCTest::tm_Vector else { os << "Problem reading file: " << it->c_str() << std::endl; - std::cerr << "Problem reading file: " << it->c_str() << " while creating notes" << std::endl; + cmCTestLog(this, ERROR, "Problem reading file: " << it->c_str() << " while creating notes" << std::endl); } os << "</Text>\n" << "</Note>" << std::endl; @@ -1042,7 +996,7 @@ int cmCTest::GenerateNotesFile(const std::vector<cmStdString> &files) cmGeneratedFileStream ofs; if ( !this->OpenOutputFile(m_CurrentTag, "Notes.xml", ofs) ) { - std::cerr << "Cannot open notes file" << std::endl; + cmCTestLog(this, ERROR, "Cannot open notes file" << std::endl); return 1; } @@ -1059,7 +1013,7 @@ int cmCTest::GenerateNotesFile(const char* cfiles) std::vector<cmStdString> files; - std::cout << "Create notes file" << std::endl; + cmCTestLog(this, OUTPUT, "Create notes file" << std::endl); files = cmSystemTools::SplitString(cfiles, ';'); if ( files.size() == 0 ) @@ -1092,6 +1046,10 @@ int cmCTest::Run(std::vector<std::string>const& args, std::string* output) cmSystemTools::ReplaceString(this->m_ConfigType, ".\\", ""); } + if( arg.find("-Q",0) == 0 || arg.find("--quiet",0) == 0 ) + { + this->m_Quiet = true; + } if( arg.find("-V",0) == 0 || arg.find("--verbose",0) == 0 ) { this->m_Verbose = true; @@ -1115,6 +1073,12 @@ int cmCTest::Run(std::vector<std::string>const& args, std::string* output) ch->AddConfigurationScript(args[i].c_str()); } + if( ( arg.find("-O",0) == 0 || arg.find("--output-log") == 0 ) && i < args.size() - 1 ) + { + i++; + this->SetOutputLogFileName(args[i].c_str()); + } + if( arg.find("--tomorrow-tag",0) == 0 ) { m_TomorrowTag = true; @@ -1312,8 +1276,8 @@ int cmCTest::Run(std::vector<std::string>const& args, std::string* output) else { performSomeTest = false; - std::cerr << "CTest -D called with incorrect option: " << targ << std::endl; - std::cerr << "Available options are:" << std::endl + cmCTestLog(this, ERROR, "CTest -D called with incorrect option: " << targ << std::endl); + cmCTestLog(this, ERROR, "Available options are:" << std::endl << " " << ctestExec << " -D Continuous" << std::endl << " " << ctestExec << " -D Continuous(Start|Update|Configure|Build)" << std::endl << " " << ctestExec << " -D Continuous(Test|Coverage|MemCheck|Submit)" << std::endl @@ -1323,8 +1287,7 @@ int cmCTest::Run(std::vector<std::string>const& args, std::string* output) << " " << ctestExec << " -D Nightly" << std::endl << " " << ctestExec << " -D Nightly(Start|Update|Configure|Build)" << std::endl << " " << ctestExec << " -D Nightly(Test|Coverage|MemCheck|Submit)" << std::endl - << " " << ctestExec << " -D NightlyMemoryCheck" << std::endl; - ; + << " " << ctestExec << " -D NightlyMemoryCheck" << std::endl); } } @@ -1336,8 +1299,8 @@ int cmCTest::Run(std::vector<std::string>const& args, std::string* output) if ( !this->SetTest(args[i].c_str(), false) ) { performSomeTest = false; - std::cerr << "CTest -T called with incorrect option: " << args[i].c_str() << std::endl; - std::cerr << "Available options are:" << std::endl + cmCTestLog(this, ERROR, "CTest -T called with incorrect option: " << args[i].c_str() << std::endl); + cmCTestLog(this, ERROR, "Available options are:" << std::endl << " " << ctestExec << " -T all" << std::endl << " " << ctestExec << " -T start" << std::endl << " " << ctestExec << " -T update" << std::endl @@ -1347,7 +1310,7 @@ int cmCTest::Run(std::vector<std::string>const& args, std::string* output) << " " << ctestExec << " -T coverage" << std::endl << " " << ctestExec << " -T memcheck" << std::endl << " " << ctestExec << " -T notes" << std::endl - << " " << ctestExec << " -T submit" << std::endl; + << " " << ctestExec << " -T submit" << std::endl); } } @@ -1371,11 +1334,11 @@ int cmCTest::Run(std::vector<std::string>const& args, std::string* output) else { performSomeTest = false; - std::cerr << "CTest -M called with incorrect option: " << str.c_str() << std::endl; - std::cerr << "Available options are:" << std::endl + cmCTestLog(this, ERROR, "CTest -M called with incorrect option: " << str.c_str() << std::endl); + cmCTestLog(this, ERROR, "Available options are:" << std::endl << " " << ctestExec << " -M Continuous" << std::endl << " " << ctestExec << " -M Experimental" << std::endl - << " " << ctestExec << " -M Nightly" << std::endl; + << " " << ctestExec << " -M Nightly" << std::endl); } } @@ -1425,7 +1388,7 @@ int cmCTest::Run(std::vector<std::string>const& args, std::string* output) } else { - std::cerr << "--build-and-test must have source and binary dir\n"; + cmCTestLog(this, ERROR, "--build-and-test must have source and binary dir" << std::endl); } } if(arg.find("--build-target",0) == 0 && i < args.size() - 1) @@ -1530,6 +1493,7 @@ int cmCTest::Run(std::vector<std::string>const& args, std::string* output) else { m_ExtraVerbose = m_Verbose; + m_Verbose = true; cmCTest::t_TestingHandlers::iterator it; for ( it = m_TestingHandlers.begin(); it != m_TestingHandlers.end(); ++ it ) { @@ -1666,7 +1630,7 @@ int cmCTest::RunCMake(std::string* outstring, cmOStringStream &out, } else { - std::cerr << out.str() << "\n"; + cmCTestLog(this, ERROR, out.str() << std::endl); } return 1; } @@ -1685,7 +1649,7 @@ int cmCTest::RunCMake(std::string* outstring, cmOStringStream &out, } else { - std::cerr << out.str() << "\n"; + cmCTestLog(this, ERROR, out.str() << std::endl); } return 1; } @@ -1874,7 +1838,7 @@ int cmCTest::RunCMakeAndTest(std::string* outstring) } else { - std::cerr << out.str(); + cmCTestLog(this, ERROR, out.str()); } // return to the original directory cmSystemTools::ChangeDirectory(cwd.c_str()); @@ -1917,7 +1881,7 @@ int cmCTest::RunCMakeAndTest(std::string* outstring) } else { - std::cout << out.str() << "\n"; + cmCTestLog(this, OUTPUT, out.str() << std::endl); } return retval; } @@ -1952,7 +1916,7 @@ int cmCTest::ReadCustomConfigurationFileTree(const char* dir) (!lg->GetMakefile()->ReadListFile(0, fname.c_str()) || cmSystemTools::GetErrorOccuredFlag() ) ) { - std::cerr << "Problem reading custom configuration" << std::endl; + cmCTestLog(this, ERROR, "Problem reading custom configuration" << std::endl); } dirs.erase(dirs.end()-1, dirs.end()); cmSystemTools::SimpleGlob(rexpr, ndirs, -1); @@ -2117,3 +2081,109 @@ bool cmCTest::SetCTestConfigurationFromCMakeVariable(cmMakefile* mf, const char* this->SetCTestConfiguration(dconfig, ctvar); return true; } + +void cmCTest::SetOutputLogFileName(const char* name) +{ + if ( m_OutputLogFile) + { + delete m_OutputLogFile; + m_OutputLogFile= 0; + } + if ( name ) + { + m_OutputLogFile = new cmGeneratedFileStream(name); + } +} + +static const char* cmCTestStringLogType[] = +{ + "DEBUG", + "OUTPUT", + "HANDLER_OUTPUT", + "HANDLER_VERBOSE_OUTPUT", + "WARNING", + "ERROR", + 0 +}; + +#ifdef cerr +# undef cerr +#endif +#ifdef cout +# undef cout +#endif + +void cmCTest::Log(int logType, const char* msg) +{ + if ( !msg || !*msg ) + { + return; + } + if ( m_OutputLogFile ) + { + bool display = true; + if ( logType == cmCTest::DEBUG && !m_Debug ) { display = false; } + if ( logType == cmCTest::HANDLER_VERBOSE_OUTPUT && !m_Debug && !m_ExtraVerbose ) { display = false; } + if ( display ) + { + if ( logType != m_OutputLogFileLastTag ) + { + *m_OutputLogFile << "["; + if ( logType >= OTHER || logType < 0 ) + { + *m_OutputLogFile << "OTHER"; + } + else + { + *m_OutputLogFile << cmCTestStringLogType[logType]; + } + *m_OutputLogFile << "] " << std::endl << std::flush; + } + *m_OutputLogFile << msg << std::flush; + if ( logType != m_OutputLogFileLastTag ) + { + *m_OutputLogFile << std::endl << std::flush; + m_OutputLogFileLastTag = logType; + } + } + } + if ( !m_Quiet ) + { + switch ( logType ) + { + case DEBUG: + if ( m_Debug ) + { + std::cout << msg; + std::cout.flush(); + } + break; + case OUTPUT: case HANDLER_OUTPUT: + if ( m_Debug || m_Verbose ) + { + std::cout << msg; + std::cout.flush(); + } + break; + case HANDLER_VERBOSE_OUTPUT: + if ( m_Debug || m_ExtraVerbose ) + { + std::cout << msg; + std::cout.flush(); + } + break; + case WARNING: + std::cerr << msg; + std::cerr.flush(); + break; + case ERROR: + std::cerr << msg; + std::cerr.flush(); + break; + default: + std::cout << msg; + std::cout.flush(); + } + } +} + |