Home | History | Annotate | Download | only in tests
      1 /**
      2  * @file utility_tests.cpp
      3  * tests utility.h and op_exception.h
      4  *
      5  * @remark Copyright 2003 OProfile authors
      6  * @remark Read the file COPYING
      7  *
      8  * @author John Levon
      9  * @author Philippe Elie
     10  */
     11 
     12 #include <stdlib.h>
     13 #include <new>
     14 #include <iostream>
     15 
     16 #include "utility.h"
     17 #include "op_exception.h"
     18 
     19 using namespace std;
     20 
     21 static int nb_new;
     22 static int nb_new_array;
     23 
     24 void* operator new(size_t size) throw(bad_alloc)
     25 {
     26 	nb_new++;
     27 	return malloc(size);
     28 }
     29 
     30 void* operator new[](size_t size) throw(bad_alloc)
     31 {
     32 	nb_new_array++;
     33 	return malloc(size);
     34 }
     35 
     36 void operator delete(void * p) throw()
     37 {
     38 	nb_new--;
     39 	if (p)
     40 		free(p);
     41 }
     42 
     43 void operator delete[](void * p) throw()
     44 {
     45 	nb_new_array--;
     46 	if (p)
     47 		free(p);
     48 }
     49 
     50 
     51 void check_alloc()
     52 {
     53 	if (nb_new) {
     54 		cerr << "new(size_t) leak\n";
     55 		exit(EXIT_FAILURE);
     56 	}
     57 
     58 	if (nb_new_array) {
     59 		cerr << "new[](size_t) leak\n";
     60 		exit(EXIT_FAILURE);
     61 	}
     62 }
     63 
     64 
     65 struct A {};
     66 
     67 template <typename Throw, typename Catch>
     68 void throw_tests()
     69 {
     70 	scoped_ptr<A> a(new A);
     71 	try {
     72 		scoped_ptr<A> a(new A);
     73 		throw Throw("");
     74 	}
     75 	catch (Catch const &) {
     76 	}
     77 }
     78 
     79 
     80 template <typename Throw, typename Catch>
     81 void throw_tests(bool)
     82 {
     83 	scoped_array<A> b(new A[10]);
     84 	try {
     85 		scoped_array<A> a(new A[10]);
     86 		throw Throw("");
     87 	}
     88 	catch (Catch const &) {
     89 	}
     90 }
     91 
     92 
     93 void tests_new()
     94 {
     95 	throw_tests<op_fatal_error, op_fatal_error>();
     96 	throw_tests<op_fatal_error, op_exception>();
     97 	throw_tests<op_runtime_error, op_runtime_error>();
     98 	throw_tests<op_runtime_error, runtime_error>();
     99 	throw_tests<op_fatal_error, op_fatal_error>(true);
    100 	throw_tests<op_fatal_error, op_exception>(true);
    101 	throw_tests<op_runtime_error, op_runtime_error>(true);
    102 	throw_tests<op_runtime_error, runtime_error>(true);
    103 }
    104 
    105 
    106 int main()
    107 {
    108 	try {
    109 		tests_new();
    110 		check_alloc();
    111 	}
    112 	catch (...) {
    113 		cerr << "unknown exception\n";
    114 		return EXIT_FAILURE;
    115 	}
    116 
    117 	return EXIT_SUCCESS;
    118 }
    119