summaryrefslogtreecommitdiff
path: root/src/mongo/util/background_job_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/util/background_job_test.cpp')
-rw-r--r--src/mongo/util/background_job_test.cpp189
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