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
operator new(size_t size)24 void* operator new(size_t size) throw(bad_alloc)
25 {
26 nb_new++;
27 return malloc(size);
28 }
29
operator new[](size_t size)30 void* operator new[](size_t size) throw(bad_alloc)
31 {
32 nb_new_array++;
33 return malloc(size);
34 }
35
operator delete(void * p)36 void operator delete(void * p) throw()
37 {
38 nb_new--;
39 if (p)
40 free(p);
41 }
42
operator delete[](void * p)43 void operator delete[](void * p) throw()
44 {
45 nb_new_array--;
46 if (p)
47 free(p);
48 }
49
50
check_alloc()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>
throw_tests()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>
throw_tests(bool)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
tests_new()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
main()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