#include <Locker.h>
#include <TestSuiteAddon.h>
#include <ThreadedTestCaller.h>
#include <cppunit/TestSuite.h>
#include <cppunit/extensions/HelperMacros.h>
#include <string.h>
static const bigtime_t SNOOZE_TIME = 200000;
class LockerDestructionTest : public BThreadedTestCase {
public:
LockerDestructionTest(std::string name, bool isBenaphore);
virtual ~LockerDestructionTest();
void SimpleWaiterThread();
void SimpleDeleterThread();
void TimeoutWaiterThread();
void TimeoutDeleterThread();
static CppUnit::Test* suite();
private:
BLocker* fLocker;
};
LockerDestructionTest::LockerDestructionTest(std::string name, bool isBenaphore)
:
BThreadedTestCase(name),
fLocker(new BLocker(isBenaphore))
{
}
LockerDestructionTest::~LockerDestructionTest()
{
if (fLocker != NULL)
delete fLocker;
}
void
LockerDestructionTest::SimpleWaiterThread()
{
CPPUNIT_ASSERT(fLocker->Lock());
snooze(SNOOZE_TIME);
fLocker->Unlock();
snooze(SNOOZE_TIME);
CPPUNIT_ASSERT(!fLocker->Lock());
}
void
LockerDestructionTest::SimpleDeleterThread()
{
BLocker* tmpLock;
snooze(SNOOZE_TIME);
CPPUNIT_ASSERT(fLocker->Lock());
snooze(SNOOZE_TIME);
snooze(SNOOZE_TIME);
tmpLock = fLocker;
fLocker = NULL;
delete tmpLock;
}
void
LockerDestructionTest::TimeoutWaiterThread()
{
CPPUNIT_ASSERT(fLocker->LockWithTimeout(SNOOZE_TIME) == B_OK);
snooze(SNOOZE_TIME);
fLocker->Unlock();
snooze(SNOOZE_TIME);
CPPUNIT_ASSERT(fLocker->LockWithTimeout(SNOOZE_TIME * 10) == B_BAD_SEM_ID);
}
void
LockerDestructionTest::TimeoutDeleterThread()
{
BLocker* tmpLock;
snooze(SNOOZE_TIME / 10);
CPPUNIT_ASSERT(fLocker->LockWithTimeout(SNOOZE_TIME / 10) == B_TIMED_OUT);
CPPUNIT_ASSERT(fLocker->LockWithTimeout(SNOOZE_TIME * 10) == B_OK);
snooze(SNOOZE_TIME);
snooze(SNOOZE_TIME);
tmpLock = fLocker;
fLocker = NULL;
delete tmpLock;
}
CppUnit::Test*
LockerDestructionTest::suite()
{
typedef BThreadedTestCaller<LockerDestructionTest> LockerDestructionTestCaller;
CppUnit::TestSuite* testSuite = new CppUnit::TestSuite("LockerDestructionTest");
LockerDestructionTest* simpleBenaphore = new LockerDestructionTest("SimpleBenaphore", true);
LockerDestructionTestCaller* simpleBenaphoreCaller
= new LockerDestructionTestCaller("BLocker::Destruction Test #1 (benaphore)", simpleBenaphore);
simpleBenaphoreCaller->addThread("Waiter", &LockerDestructionTest::SimpleWaiterThread);
simpleBenaphoreCaller->addThread("Deleter", &LockerDestructionTest::SimpleDeleterThread);
testSuite->addTest(simpleBenaphoreCaller);
LockerDestructionTest* simpleSemaphore = new LockerDestructionTest("SimpleSemaphore", false);
LockerDestructionTestCaller* simpleSemaphoreCaller
= new LockerDestructionTestCaller("BLocker::Destruction Test #1 (semaphore)", simpleSemaphore);
simpleSemaphoreCaller->addThread("Waiter", &LockerDestructionTest::SimpleWaiterThread);
simpleSemaphoreCaller->addThread("Deleter", &LockerDestructionTest::SimpleDeleterThread);
testSuite->addTest(simpleSemaphoreCaller);
LockerDestructionTest* timeoutBenaphore = new LockerDestructionTest("TimeoutBenaphore", true);
LockerDestructionTestCaller* timeoutBenaphoreCaller
= new LockerDestructionTestCaller("BLocker::Destruction Test #2 (benaphore)", timeoutBenaphore);
timeoutBenaphoreCaller->addThread("Waiter", &LockerDestructionTest::TimeoutWaiterThread);
timeoutBenaphoreCaller->addThread("Deleter", &LockerDestructionTest::TimeoutDeleterThread);
testSuite->addTest(timeoutBenaphoreCaller);
LockerDestructionTest* timeoutSemaphore = new LockerDestructionTest("TimeoutSemaphore", false);
LockerDestructionTestCaller* timeoutSemaphoreCaller
= new LockerDestructionTestCaller("BLocker::Destruction Test #2 (semaphore)", timeoutSemaphore);
timeoutSemaphoreCaller->addThread("Waiter", &LockerDestructionTest::TimeoutWaiterThread);
timeoutSemaphoreCaller->addThread("Deleter", &LockerDestructionTest::TimeoutDeleterThread);
testSuite->addTest(timeoutSemaphoreCaller);
return testSuite;
}
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(LockerDestructionTest, getTestSuiteName());