diff options
Diffstat (limited to 'src/mongo/util/background_job_test.cpp')
-rw-r--r-- | src/mongo/util/background_job_test.cpp | 189 |
1 files changed, 98 insertions, 91 deletions
diff --git a/src/mongo/util/background_job_test.cpp b/src/mongo/util/background_job_test.cpp index c13ff444625..9c11cb5b9c2 100644 --- a/src/mongo/util/background_job_test.cpp +++ b/src/mongo/util/background_job_test.cpp @@ -37,115 +37,122 @@ namespace { - using mongo::BackgroundJob; - using mongo::MsgAssertionException; - using mongo::stdx::mutex; - using mongo::Notification; - - namespace stdx = mongo::stdx; - - // a global variable that can be accessed independent of the IncTester object below - // IncTester keeps it up-to-date - int GLOBAL_val; - - class IncTester : public mongo::BackgroundJob { - public: - explicit IncTester( long long millis , bool selfDelete = false ) - : mongo::BackgroundJob(selfDelete), _val(0), _millis(millis) { GLOBAL_val = 0; } - - void waitAndInc( long long millis ) { - if ( millis ) - mongo::sleepmillis( millis ); - ++_val; - ++GLOBAL_val; - } - - int getVal() { return _val; } - - /* --- BackgroundJob virtuals --- */ - - std::string name() const { return "IncTester"; } - - void run() { waitAndInc( _millis ); } +using mongo::BackgroundJob; +using mongo::MsgAssertionException; +using mongo::stdx::mutex; +using mongo::Notification; + +namespace stdx = mongo::stdx; + +// a global variable that can be accessed independent of the IncTester object below +// IncTester keeps it up-to-date +int GLOBAL_val; + +class IncTester : public mongo::BackgroundJob { +public: + explicit IncTester(long long millis, bool selfDelete = false) + : mongo::BackgroundJob(selfDelete), _val(0), _millis(millis) { + GLOBAL_val = 0; + } - private: - int _val; - long long _millis; - }; + void waitAndInc(long long millis) { + if (millis) + mongo::sleepmillis(millis); + ++_val; + ++GLOBAL_val; + } - TEST(BackgroundJobBasic, NormalCase) { - IncTester tester( 0 /* inc without wait */ ); - tester.go(); - ASSERT( tester.wait() ); - ASSERT_EQUALS( tester.getVal() , 1 ); + int getVal() { + return _val; } - TEST(BackgroundJobBasic, TimeOutCase) { - IncTester tester( 2000 /* wait 2 sec before inc-ing */ ); - tester.go(); - ASSERT( ! tester.wait( 100 /* ms */ ) ); // should time out - ASSERT_EQUALS( tester.getVal() , 0 ); + /* --- BackgroundJob virtuals --- */ - // if we wait longer than the IncTester, we should see the increment - ASSERT( tester.wait( 4000 /* ms */ ) ); // should not time out - ASSERT_EQUALS( tester.getVal() , 1 ); + std::string name() const { + return "IncTester"; } - TEST(BackgroundJobBasic, SelfDeletingCase) { - mongo::BackgroundJob* j = new IncTester( 0 /* inc without wait */ , true /* self delete */); - j->go(); - - // the background thread should have continued running and this test should pass the - // heap-checker as well - mongo::sleepmillis( 1000 ); - ASSERT_EQUALS( GLOBAL_val, 1 ); + void run() { + waitAndInc(_millis); } - TEST(BackgroundJobLifeCycle, Go) { +private: + int _val; + long long _millis; +}; + +TEST(BackgroundJobBasic, NormalCase) { + IncTester tester(0 /* inc without wait */); + tester.go(); + ASSERT(tester.wait()); + ASSERT_EQUALS(tester.getVal(), 1); +} + +TEST(BackgroundJobBasic, TimeOutCase) { + IncTester tester(2000 /* wait 2 sec before inc-ing */); + tester.go(); + ASSERT(!tester.wait(100 /* ms */)); // should time out + ASSERT_EQUALS(tester.getVal(), 0); + + // if we wait longer than the IncTester, we should see the increment + ASSERT(tester.wait(4000 /* ms */)); // should not time out + ASSERT_EQUALS(tester.getVal(), 1); +} + +TEST(BackgroundJobBasic, SelfDeletingCase) { + mongo::BackgroundJob* j = new IncTester(0 /* inc without wait */, true /* self delete */); + j->go(); + + // the background thread should have continued running and this test should pass the + // heap-checker as well + mongo::sleepmillis(1000); + ASSERT_EQUALS(GLOBAL_val, 1); +} + +TEST(BackgroundJobLifeCycle, Go) { + class Job : public BackgroundJob { + public: + Job() : _hasRun(false) {} - class Job : public BackgroundJob { - public: - Job() : _hasRun(false) {} + virtual std::string name() const { + return "BackgroundLifeCycle::CannotCallGoAgain"; + } - virtual std::string name() const { - return "BackgroundLifeCycle::CannotCallGoAgain"; + virtual void run() { + { + stdx::lock_guard<stdx::mutex> lock(_mutex); + ASSERT_FALSE(_hasRun); + _hasRun = true; } - virtual void run() { - { - stdx::lock_guard<stdx::mutex> lock( _mutex ); - ASSERT_FALSE( _hasRun ); - _hasRun = true; - } - - _n.waitToBeNotified(); - } + _n.waitToBeNotified(); + } - void notify() { - _n.notifyOne(); - } + void notify() { + _n.notifyOne(); + } - private: - mutex _mutex; - bool _hasRun; - Notification _n; - }; + private: + mutex _mutex; + bool _hasRun; + Notification _n; + }; - Job j; + Job j; - // This call starts Job running. - j.go(); + // This call starts Job running. + j.go(); - // Calling 'go' again while it is running is an error. - ASSERT_THROWS(j.go(), MsgAssertionException); + // Calling 'go' again while it is running is an error. + ASSERT_THROWS(j.go(), MsgAssertionException); - // Stop the Job - j.notify(); - j.wait(); + // Stop the Job + j.notify(); + j.wait(); - // Calling 'go' on a done task is a no-op. If it were not, - // we would fail the assert in Job::run above. - j.go(); - } + // Calling 'go' on a done task is a no-op. If it were not, + // we would fail the assert in Job::run above. + j.go(); +} -} // namespace +} // namespace |