// framework.cpp /** * Copyright (C) 2008 10gen Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ #include "mongo/pch.h" #include "mongo/dbtests/framework.h" #ifndef _WIN32 #include #include #endif #include "mongo/base/initializer.h" #include "mongo/base/status.h" #include "mongo/db/client.h" #include "mongo/db/dur.h" #include "mongo/db/ops/update.h" #include "mongo/dbtests/dbtests.h" #include "mongo/dbtests/framework_options.h" #include "mongo/util/background.h" #include "mongo/util/concurrency/mutex.h" #include "mongo/util/file_allocator.h" #include "mongo/util/version.h" namespace moe = mongo::optionenvironment; namespace mongo { namespace dbtests { mutex globalCurrentTestNameMutex("globalCurrentTestNameMutex"); std::string globalCurrentTestName; class TestWatchDog : public BackgroundJob { public: virtual string name() const { return "TestWatchDog"; } virtual void run(){ int minutesRunning = 0; std::string lastRunningTestName, currentTestName; { scoped_lock lk( globalCurrentTestNameMutex ); lastRunningTestName = globalCurrentTestName; } while (true) { sleepsecs(60); minutesRunning++; { scoped_lock lk( globalCurrentTestNameMutex ); currentTestName = globalCurrentTestName; } if (currentTestName != lastRunningTestName) { minutesRunning = 0; lastRunningTestName = currentTestName; } if (minutesRunning > 30){ log() << currentTestName << " has been running for more than 30 minutes. aborting." << endl; ::abort(); } else if (minutesRunning > 1){ warning() << currentTestName << " has been running for more than " << minutesRunning-1 << " minutes." << endl; } } } }; int runDbTests(int argc, char** argv) { frameworkGlobalParams.perfHist = 1; frameworkGlobalParams.seed = time( 0 ); frameworkGlobalParams.runsPerTest = 1; Client::initThread("testsuite"); acquirePathLock(); srand( (unsigned) frameworkGlobalParams.seed ); printGitVersion(); printOpenSSLVersion(); printSysInfo(); FileAllocator::get()->start(); dur::startup(); TestWatchDog twd; twd.go(); // set tlogLevel to -1 to suppress MONGO_TLOG(0) output in a test program tlogLevel = -1; int ret = ::mongo::unittest::Suite::run(frameworkGlobalParams.suites, frameworkGlobalParams.filter, frameworkGlobalParams.runsPerTest); #if !defined(_WIN32) && !defined(__sunos__) flock( lockFile, LOCK_UN ); #endif cc().shutdown(); dbexit( (ExitCode)ret ); // so everything shuts down cleanly return ret; } } // namespace dbtests } // namespace mongo void mongo::unittest::onCurrentTestNameChange( const std::string &testName ) { scoped_lock lk( mongo::dbtests::globalCurrentTestNameMutex ); mongo::dbtests::globalCurrentTestName = testName; }