1158381Sambrisko/*
2158381Sambrisko	$Id: LockerTestCase.h 301 2002-07-18 05:32:00Z tylerdauwalder $
3158381Sambrisko
4158381Sambrisko	This file defines a couple of common classes for testing BLocker
5158381Sambrisko	functionality.
6158381Sambrisko
7158381Sambrisko	*/
8158381Sambrisko
9158381Sambrisko
10158381Sambrisko#ifndef LockerTestCase_H
11158381Sambrisko#define LockerTestCase_H
12158381Sambrisko
13158381Sambrisko#include <ThreadedTestCase.h>
14158381Sambrisko#include <string>
15158381Sambrisko
16158381Sambriskoclass BLocker;
17158381Sambrisko
18158381Sambrisko//
19158381Sambrisko// The SafetyLock class is a utility class for use in actual tests
20158381Sambrisko// of the BLocker interfaces.  It is used to make sure that if the
21158381Sambrisko// test fails and an exception is thrown with the lock held, that
22158381Sambrisko// lock will be released.  Without this SafetyLock, there could be
23158381Sambrisko// deadlocks if one thread in a test has a failure while holding the
24158381Sambrisko// lock.  It should be used like so:
25158381Sambrisko//
26158381Sambrisko// void myTestClass::myTestFunc(void)
27158381Sambrisko// {
28158381Sambrisko//   SafetyLock mySafetyLock(theLocker);
29158381Sambrisko//   ...perform tests without worrying about holding the lock on assert...
30158381Sambrisko//
31257179Sglebius
32158381Sambriskoclass SafetyLock {
33158381Sambriskoprivate:
34158381Sambrisko	BLocker *theLocker;
35158381Sambrisko
36158381Sambriskopublic:
37158381Sambrisko	SafetyLock(BLocker *aLock) {theLocker = aLock;};
38158381Sambrisko	virtual ~SafetyLock() {if (theLocker != NULL) theLocker->Unlock(); };
39158381Sambrisko};
40158381Sambrisko
41158381Sambrisko
42158381Sambrisko//
43158381Sambrisko// All BLocker tests should be derived from the LockerTestCase class.
44158381Sambrisko// This class provides a BLocker allocated on construction to the
45158381Sambrisko// derived class.  This BLocker is the member "theLocker".  Also,
46158381Sambrisko// there is a member function called CheckLock() which ensures that
47158381Sambrisko// the lock is sane.
48158381Sambrisko//
49158381Sambrisko
50158381Sambriskoclass LockerTestCase : public BThreadedTestCase {
51158381Sambrisko
52158381Sambriskoprotected:
53158381Sambrisko	BLocker *theLocker;
54158381Sambrisko
55158381Sambrisko	void CheckLock(int);
56158381Sambrisko
57158381Sambriskopublic:
58158381Sambrisko	LockerTestCase(std::string name, bool);
59158381Sambrisko	virtual ~LockerTestCase();
60158381Sambrisko};
61158381Sambrisko
62158381Sambrisko#endif
63158381Sambrisko
64158381Sambrisko
65158381Sambrisko
66158381Sambrisko