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