/* * Project: MoleCuilder * Description: creates and alters molecular systems * Copyright (C) 2010 University of Bonn. All rights reserved. * Please see the LICENSE file or "Copyright notice" in builder.cpp for details. */ /* * WorkerPoolUnitTest.cpp * * Created on: Feb 28, 2012 * Author: heber */ // include config.h #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include "WorkerPoolUnitTest.hpp" #include #include "CodePatterns/Assert.hpp" #include "Pool/WorkerPool.hpp" #include "WorkerAddress.hpp" #ifdef HAVE_TESTRUNNER #include "UnitTestMain.hpp" #endif /*HAVE_TESTRUNNER*/ /********************************************** Test classes **************************************/ #include "stubs/FragmentJobStub.hpp" // Registers the fixture into the 'registry' CPPUNIT_TEST_SUITE_REGISTRATION( WorkerPoolTest ); void WorkerPoolTest::setUp() { // Throw assertions ASSERT_DO(Assert::Throw); pool = new WorkerPool(); } void WorkerPoolTest::tearDown() { delete pool; } /** UnitTest for working add/removeWorker */ void WorkerPoolTest::WorkerTest() { WorkerAddress address("service", "port"); WorkerAddress otheraddress("otherservice", "otherport"); // add worker CPPUNIT_ASSERT( pool->addWorker(address) ); CPPUNIT_ASSERT_EQUAL( (size_t)1, pool->idle_queue.size() ); CPPUNIT_ASSERT_EQUAL( (size_t)0, pool->busy_queue.size() ); CPPUNIT_ASSERT_EQUAL( (size_t)1, pool->pool.size() ); // remove non-present worker std::cout << "The following error message is intended and does not indicate a failure." << std::endl; CPPUNIT_ASSERT( !pool->removeWorker(otheraddress) ); // check for presence CPPUNIT_ASSERT( pool->presentInPool(address) ); CPPUNIT_ASSERT( !pool->presentInPool(otheraddress) ); // remove worker CPPUNIT_ASSERT( pool->removeWorker(address) ); CPPUNIT_ASSERT_EQUAL( (size_t)0, pool->idle_queue.size() ); CPPUNIT_ASSERT_EQUAL( (size_t)0, pool->busy_queue.size() ); CPPUNIT_ASSERT_EQUAL( (size_t)0, pool->pool.size() ); } /** UnitTest for working (un)markWorkerBusy */ void WorkerPoolTest::markBusyTest() { WorkerAddress address("service", "port"); CPPUNIT_ASSERT( pool->addWorker(address) ); // check that not busy CPPUNIT_ASSERT( !pool->isWorkerBusy(address) ); CPPUNIT_ASSERT_EQUAL( (size_t)1, pool->idle_queue.size() ); CPPUNIT_ASSERT_EQUAL( (size_t)0, pool->busy_queue.size() ); CPPUNIT_ASSERT_EQUAL( (size_t)1, pool->pool.size() ); // unmark and check pool->unmarkWorkerBusy(address); CPPUNIT_ASSERT( !pool->isWorkerBusy(address) ); CPPUNIT_ASSERT_EQUAL( (size_t)1, pool->idle_queue.size() ); CPPUNIT_ASSERT_EQUAL( (size_t)0, pool->busy_queue.size() ); // mark as busy and check const WorkerAddress otheraddress = pool->getNextIdleWorker(); CPPUNIT_ASSERT( pool->isWorkerBusy(address) ); CPPUNIT_ASSERT_EQUAL( (size_t)0, pool->idle_queue.size() ); CPPUNIT_ASSERT_EQUAL( (size_t)1, pool->busy_queue.size() ); // get one more CPPUNIT_ASSERT( !pool->presentIdleWorkers() ); #ifndef NDEBUG std::cout << "The following assertion is intended and does not indicate a failure." << std::endl; CPPUNIT_ASSERT_THROW( pool->getNextIdleWorker(), Assert::AssertionFailure ); #else const WorkerAddress emptyAddress = pool->getNextIdleWorker(); #endif CPPUNIT_ASSERT( pool->isWorkerBusy(address) ); CPPUNIT_ASSERT_EQUAL( (size_t)0, pool->idle_queue.size() ); CPPUNIT_ASSERT_EQUAL( (size_t)1, pool->busy_queue.size() ); // unmark and check pool->unmarkWorkerBusy(address); CPPUNIT_ASSERT( !pool->isWorkerBusy(address) ); CPPUNIT_ASSERT_EQUAL( (size_t)1, pool->idle_queue.size() ); CPPUNIT_ASSERT_EQUAL( (size_t)0, pool->busy_queue.size() ); }