1 // Copyright 2010 The Kyua Authors.
2 // All rights reserved.
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are
8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above copyright
11 // notice, this list of conditions and the following disclaimer in the
12 // documentation and/or other materials provided with the distribution.
13 // * Neither the name of Google Inc. nor the names of its contributors
14 // may be used to endorse or promote products derived from this software
15 // without specific prior written permission.
17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 #include "utils/auto_array.ipp"
32 #include <sys/types.h>
37 #include <atf-c++.hpp>
39 #include "utils/defs.hpp"
41 using utils::auto_array;
47 /// Mock class to capture calls to the new and delete operators.
50 /// User-settable cookie to disambiguate instances of this class.
53 /// The current balance of existing test_array instances.
54 static ssize_t m_nblocks;
56 /// Captures invalid calls to new on an array.
58 /// \return Nothing; this always fails the test case.
60 operator new(const size_t /* size */)
62 ATF_FAIL("New called but should have been new[]");
66 /// Obtains memory for a new instance and increments m_nblocks.
68 /// \param size The amount of memory to allocate, in bytes.
70 /// \return A pointer to the allocated memory.
72 /// \throw std::bad_alloc If the memory cannot be allocated.
74 operator new[](const size_t size)
76 void* mem = ::operator new(size);
78 std::cout << "Allocated 'test_array' object " << mem << "\n";
82 /// Captures invalid calls to delete on an array.
84 /// \return Nothing; this always fails the test case.
86 operator delete(void* /* mem */)
88 ATF_FAIL("Delete called but should have been delete[]");
91 /// Deletes a previously allocated array and decrements m_nblocks.
93 /// \param mem The pointer to the memory to be deleted.
95 operator delete[](void* mem)
97 std::cout << "Releasing 'test_array' object " << mem << "\n";
99 ATF_FAIL("Unbalanced delete[]");
101 ::operator delete(mem);
106 ssize_t test_array::m_nblocks = 0;
109 } // anonymous namespace
112 ATF_TEST_CASE(scope);
113 ATF_TEST_CASE_HEAD(scope)
115 set_md_var("descr", "Tests the automatic scope handling in the "
116 "auto_array smart pointer class");
118 ATF_TEST_CASE_BODY(scope)
120 ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
122 auto_array< test_array > t(new test_array[10]);
123 ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
125 ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
130 ATF_TEST_CASE_HEAD(copy)
132 set_md_var("descr", "Tests the auto_array smart pointer class' copy "
135 ATF_TEST_CASE_BODY(copy)
137 ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
139 auto_array< test_array > t1(new test_array[10]);
140 ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
143 auto_array< test_array > t2(t1);
144 ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
146 ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
148 ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
152 ATF_TEST_CASE(copy_ref);
153 ATF_TEST_CASE_HEAD(copy_ref)
155 set_md_var("descr", "Tests the auto_array smart pointer class' copy "
156 "constructor through the auxiliary ref object");
158 ATF_TEST_CASE_BODY(copy_ref)
160 ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
162 auto_array< test_array > t1(new test_array[10]);
163 ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
166 auto_array< test_array > t2 = t1;
167 ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
169 ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
171 ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
176 ATF_TEST_CASE_HEAD(get)
178 set_md_var("descr", "Tests the auto_array smart pointer class' get "
181 ATF_TEST_CASE_BODY(get)
183 test_array* ta = new test_array[10];
184 auto_array< test_array > t(ta);
185 ATF_REQUIRE_EQ(t.get(), ta);
189 ATF_TEST_CASE(release);
190 ATF_TEST_CASE_HEAD(release)
192 set_md_var("descr", "Tests the auto_array smart pointer class' release "
195 ATF_TEST_CASE_BODY(release)
197 test_array* ta1 = new test_array[10];
199 auto_array< test_array > t(ta1);
200 ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
201 test_array* ta2 = t.release();
202 ATF_REQUIRE_EQ(ta2, ta1);
203 ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
205 ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
210 ATF_TEST_CASE(reset);
211 ATF_TEST_CASE_HEAD(reset)
213 set_md_var("descr", "Tests the auto_array smart pointer class' reset "
216 ATF_TEST_CASE_BODY(reset)
218 test_array* ta1 = new test_array[10];
219 test_array* ta2 = new test_array[10];
220 ATF_REQUIRE_EQ(test_array::m_nblocks, 2);
223 auto_array< test_array > t(ta1);
224 ATF_REQUIRE_EQ(test_array::m_nblocks, 2);
226 ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
228 ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
230 ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
234 ATF_TEST_CASE(assign);
235 ATF_TEST_CASE_HEAD(assign)
237 set_md_var("descr", "Tests the auto_array smart pointer class' "
238 "assignment operator");
240 ATF_TEST_CASE_BODY(assign)
242 ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
244 auto_array< test_array > t1(new test_array[10]);
245 ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
248 auto_array< test_array > t2;
250 ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
252 ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
254 ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
258 ATF_TEST_CASE(assign_ref);
259 ATF_TEST_CASE_HEAD(assign_ref)
261 set_md_var("descr", "Tests the auto_array smart pointer class' "
262 "assignment operator through the auxiliary ref "
265 ATF_TEST_CASE_BODY(assign_ref)
267 ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
269 auto_array< test_array > t1(new test_array[10]);
270 ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
273 auto_array< test_array > t2;
275 ATF_REQUIRE_EQ(test_array::m_nblocks, 1);
277 ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
279 ATF_REQUIRE_EQ(test_array::m_nblocks, 0);
283 ATF_TEST_CASE(access);
284 ATF_TEST_CASE_HEAD(access)
286 set_md_var("descr", "Tests the auto_array smart pointer class' access "
289 ATF_TEST_CASE_BODY(access)
291 auto_array< test_array > t(new test_array[10]);
293 for (int i = 0; i < 10; i++)
294 t[i].m_value = i * 2;
296 for (int i = 0; i < 10; i++)
297 ATF_REQUIRE_EQ(t[i].m_value, i * 2);
301 ATF_INIT_TEST_CASES(tcs)
303 ATF_ADD_TEST_CASE(tcs, scope);
304 ATF_ADD_TEST_CASE(tcs, copy);
305 ATF_ADD_TEST_CASE(tcs, copy_ref);
306 ATF_ADD_TEST_CASE(tcs, get);
307 ATF_ADD_TEST_CASE(tcs, release);
308 ATF_ADD_TEST_CASE(tcs, reset);
309 ATF_ADD_TEST_CASE(tcs, assign);
310 ATF_ADD_TEST_CASE(tcs, assign_ref);
311 ATF_ADD_TEST_CASE(tcs, access);