aboutsummaryrefslogtreecommitdiff
path: root/test/eh/LeakCheck.h
diff options
context:
space:
mode:
Diffstat (limited to 'test/eh/LeakCheck.h')
-rw-r--r--test/eh/LeakCheck.h198
1 files changed, 0 insertions, 198 deletions
diff --git a/test/eh/LeakCheck.h b/test/eh/LeakCheck.h
deleted file mode 100644
index b6e7267..0000000
--- a/test/eh/LeakCheck.h
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Copyright (c) 1997
- * Mark of the Unicorn, Inc.
- *
- * Permission to use, copy, modify, distribute and sell this software
- * and its documentation for any purpose is hereby granted without fee,
- * provided that the above copyright notice appear in all copies and
- * that both that copyright notice and this permission notice appear
- * in supporting documentation. Mark of the Unicorn makes no
- * representations about the suitability of this software for any
- * purpose. It is provided "as is" without express or implied warranty.
- */
-/***********************************************************************************
- LeakCheck.h
-
- SUMMARY: A suite of template functions for verifying the behavior of
- operations in the presence of exceptions. Requires that the operations
- be written so that each operation that could cause an exception causes
- simulate_possible_failure() to be called (see "nc_alloc.h").
-
-***********************************************************************************/
-#ifndef INCLUDED_MOTU_LeakCheck
-#define INCLUDED_MOTU_LeakCheck 1
-
-#include "Prefix.h"
-
-#include "nc_alloc.h"
-
-#include <cstdio>
-#include <cassert>
-#include <iterator>
-
-#include <iostream>
-
-EH_BEGIN_NAMESPACE
-
-template <class T1, class T2>
-inline ostream& operator << (
-ostream& s,
-const pair <T1, T2>& p) {
- return s<<'['<<p.first<<":"<<p.second<<']';
-}
-EH_END_NAMESPACE
-
-/*===================================================================================
- CheckInvariant
-
- EFFECTS: Generalized function to check an invariant on a container. Specialize
- this for particular containers if such a check is available.
-====================================================================================*/
-template <class C>
-void CheckInvariant(const C&)
-{}
-
-/*===================================================================================
- WeakCheck
-
- EFFECTS: Given a value and an operation, repeatedly applies the operation to a
- copy of the value triggering the nth possible exception, where n increments
- with each repetition until no exception is thrown or max_iters is reached.
- Reports any detected memory leaks and checks any invariant defined for the
- value type whether the operation succeeds or fails.
-====================================================================================*/
-template <class Value, class Operation>
-void WeakCheck(const Value& v, const Operation& op, long max_iters = 2000000) {
- bool succeeded = false;
- bool failed = false;
- gTestController.SetCurrentTestCategory("weak");
- for (long count = 0; !succeeded && !failed && count < max_iters; ++count) {
- gTestController.BeginLeakDetection();
- {
- Value dup = v;
-#ifndef EH_NO_EXCEPTIONS
- try {
-#endif
- gTestController.SetFailureCountdown(count);
- op( dup );
- succeeded = true;
-#ifndef EH_NO_EXCEPTIONS
- }
- catch (...) {} // Just try again.
-#endif
- gTestController.CancelFailureCountdown();
- CheckInvariant(dup);
- }
- failed = gTestController.ReportLeaked();
- EH_ASSERT( !failed );
-
- if ( succeeded )
- gTestController.ReportSuccess(count);
- }
- EH_ASSERT( succeeded || failed ); // Make sure the count hasn't gone over
-}
-
-/*===================================================================================
- ConstCheck
-
- EFFECTS: Similar to WeakCheck (above), but for operations which may not modify
- their arguments. The operation is performed on the value itself, and no
- invariant checking is performed. Leak checking still occurs.
-====================================================================================*/
-template <class Value, class Operation>
-void ConstCheck(const Value& v, const Operation& op, long max_iters = 2000000) {
- bool succeeded = false;
- bool failed = false;
- gTestController.SetCurrentTestCategory("const");
- for (long count = 0; !succeeded && !failed && count < max_iters; ++count) {
- gTestController.BeginLeakDetection();
- {
-#ifndef EH_NO_EXCEPTIONS
- try {
-#endif
- gTestController.SetFailureCountdown(count);
- op( v );
- succeeded = true;
-#ifndef EH_NO_EXCEPTIONS
- }
- catch(...) {} // Just try again.
-# endif
- gTestController.CancelFailureCountdown();
- }
- failed = gTestController.ReportLeaked();
- EH_ASSERT( !failed );
-
- if ( succeeded )
- gTestController.ReportSuccess(count);
- }
- EH_ASSERT( succeeded || failed ); // Make sure the count hasn't gone over
-}
-
-/*===================================================================================
- StrongCheck
-
- EFFECTS: Similar to WeakCheck (above), but additionally checks a component of
- the "strong guarantee": if the operation fails due to an exception, the
- value being operated on must be unchanged, as checked with operator==().
-
- CAVEATS: Note that this does not check everything required for the strong
- guarantee, which says that if an exception is thrown, the operation has no
- effects. Do do that we would have to check that no there were no side-effects
- on objects which are not part of v (e.g. iterator validity must be preserved).
-
-====================================================================================*/
-template <class Value, class Operation>
-void StrongCheck(const Value& v, const Operation& op, long max_iters = 2000000) {
- bool succeeded = false;
- bool failed = false;
- gTestController.SetCurrentTestCategory("strong");
- for ( long count = 0; !succeeded && !failed && count < max_iters; count++ ) {
- gTestController.BeginLeakDetection();
-
- {
- Value dup = v;
- {
-#ifndef EH_NO_EXCEPTIONS
- try {
-#endif
- gTestController.SetFailureCountdown(count);
- op( dup );
- succeeded = true;
- gTestController.CancelFailureCountdown();
-# ifndef EH_NO_EXCEPTIONS
- }
- catch (...) {
- gTestController.CancelFailureCountdown();
- bool unchanged = (dup == v);
- EH_ASSERT( unchanged );
-
- if ( !unchanged ) {
-#if 0
- typedef typename Value::value_type value_type;
- EH_STD::ostream_iterator<value_type> o(EH_STD::cerr, " ");
- EH_STD::cerr<<"EH test FAILED:\nStrong guaranee failed !\n";
- EH_STD::copy(dup.begin(), dup.end(), o);
- EH_STD::cerr<<"\nOriginal is:\n";
- EH_STD::copy(v.begin(), v.end(), o);
- EH_STD::cerr<<EH_STD::endl;
-#endif
- failed = true;
- }
- } // Just try again.
-# endif
- CheckInvariant(v);
- }
- }
-
- bool leaked = gTestController.ReportLeaked();
- EH_ASSERT( !leaked );
- if ( leaked )
- failed = true;
-
- if ( succeeded )
- gTestController.ReportSuccess(count);
- }
- EH_ASSERT( succeeded || failed ); // Make sure the count hasn't gone over
-}
-
-#endif // INCLUDED_MOTU_LeakCheck