| /** |
| * @file utility_tests.cpp |
| * tests utility.h and op_exception.h |
| * |
| * @remark Copyright 2003 OProfile authors |
| * @remark Read the file COPYING |
| * |
| * @author John Levon |
| * @author Philippe Elie |
| */ |
| |
| #include <stdlib.h> |
| #include <new> |
| #include <iostream> |
| |
| #include "utility.h" |
| #include "op_exception.h" |
| |
| using namespace std; |
| |
| static int nb_new; |
| static int nb_new_array; |
| |
| void* operator new(size_t size) throw(bad_alloc) |
| { |
| nb_new++; |
| return malloc(size); |
| } |
| |
| void* operator new[](size_t size) throw(bad_alloc) |
| { |
| nb_new_array++; |
| return malloc(size); |
| } |
| |
| void operator delete(void * p) throw() |
| { |
| nb_new--; |
| if (p) |
| free(p); |
| } |
| |
| void operator delete[](void * p) throw() |
| { |
| nb_new_array--; |
| if (p) |
| free(p); |
| } |
| |
| |
| void check_alloc() |
| { |
| if (nb_new) { |
| cerr << "new(size_t) leak\n"; |
| exit(EXIT_FAILURE); |
| } |
| |
| if (nb_new_array) { |
| cerr << "new[](size_t) leak\n"; |
| exit(EXIT_FAILURE); |
| } |
| } |
| |
| |
| struct A {}; |
| |
| template <typename Throw, typename Catch> |
| void throw_tests() |
| { |
| scoped_ptr<A> a(new A); |
| try { |
| scoped_ptr<A> a(new A); |
| throw Throw(""); |
| } |
| catch (Catch const &) { |
| } |
| } |
| |
| |
| template <typename Throw, typename Catch> |
| void throw_tests(bool) |
| { |
| scoped_array<A> b(new A[10]); |
| try { |
| scoped_array<A> a(new A[10]); |
| throw Throw(""); |
| } |
| catch (Catch const &) { |
| } |
| } |
| |
| |
| void tests_new() |
| { |
| throw_tests<op_fatal_error, op_fatal_error>(); |
| throw_tests<op_fatal_error, op_exception>(); |
| throw_tests<op_runtime_error, op_runtime_error>(); |
| throw_tests<op_runtime_error, runtime_error>(); |
| throw_tests<op_fatal_error, op_fatal_error>(true); |
| throw_tests<op_fatal_error, op_exception>(true); |
| throw_tests<op_runtime_error, op_runtime_error>(true); |
| throw_tests<op_runtime_error, runtime_error>(true); |
| } |
| |
| |
| int main() |
| { |
| try { |
| tests_new(); |
| check_alloc(); |
| } |
| catch (...) { |
| cerr << "unknown exception\n"; |
| return EXIT_FAILURE; |
| } |
| |
| return EXIT_SUCCESS; |
| } |