Index: runtime/vm/malloc_hooks_test.cc |
diff --git a/runtime/vm/malloc_hooks_test.cc b/runtime/vm/malloc_hooks_test.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b0c5d361228f27db9c2e9d4d010d4c5f9044b816 |
--- /dev/null |
+++ b/runtime/vm/malloc_hooks_test.cc |
@@ -0,0 +1,80 @@ |
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+#include "platform/globals.h" |
+ |
+#if defined(DART_USE_TCMALLOC) && !defined(PRODUCT) |
+ |
+#include "platform/assert.h" |
+#include "vm/class_finalizer.h" |
+#include "vm/globals.h" |
+#include "vm/malloc_hooks.h" |
+#include "vm/symbols.h" |
+#include "vm/unit_test.h" |
+ |
+namespace dart { |
+ |
+// Note: for these tests, there is no need to call MallocHooks::Init() or |
+// MallocHooks::TearDown() as this is all done by the VM test framework. |
+ |
+static void MallocHookTestBufferInitializer(volatile char* buffer, |
+ uintptr_t size) { |
+ // Run through the buffer and do something. If we don't do this and the memory |
+ // in buffer isn't touched, the tcmalloc hooks won't be called. |
+ for (uintptr_t i = 0; i < size; ++i) { |
+ buffer[i] = i; |
+ } |
+} |
+ |
+ |
+UNIT_TEST_CASE(BasicMallocHookTest) { |
+ MallocHooks::ResetStats(); |
+ EXPECT_EQ(0L, MallocHooks::allocation_count()); |
+ EXPECT_EQ(0L, MallocHooks::heap_allocated_memory_in_bytes()); |
+ |
+ const intptr_t buffer_size = 10; |
+ char* buffer = new char[buffer_size]; |
+ MallocHookTestBufferInitializer(buffer, buffer_size); |
+ |
+ EXPECT_EQ(1L, MallocHooks::allocation_count()); |
+ EXPECT_EQ(static_cast<intptr_t>(sizeof(char) * buffer_size), |
+ MallocHooks::heap_allocated_memory_in_bytes()); |
+ |
+ delete[] buffer; |
+ EXPECT_EQ(0L, MallocHooks::allocation_count()); |
+ EXPECT_EQ(0L, MallocHooks::heap_allocated_memory_in_bytes()); |
+} |
+ |
+ |
+UNIT_TEST_CASE(FreeUnseenMemoryMallocHookTest) { |
+ const intptr_t pre_hook_buffer_size = 3; |
+ char* pre_hook_buffer = new char[pre_hook_buffer_size]; |
+ MallocHookTestBufferInitializer(pre_hook_buffer, pre_hook_buffer_size); |
+ |
+ MallocHooks::ResetStats(); |
+ EXPECT_EQ(0L, MallocHooks::allocation_count()); |
+ EXPECT_EQ(0L, MallocHooks::heap_allocated_memory_in_bytes()); |
+ |
+ const intptr_t buffer_size = 10; |
+ volatile char* buffer = new char[buffer_size]; |
+ MallocHookTestBufferInitializer(buffer, buffer_size); |
+ |
+ EXPECT_EQ(1L, MallocHooks::allocation_count()); |
+ EXPECT_EQ(static_cast<intptr_t>(sizeof(char) * buffer_size), |
+ MallocHooks::heap_allocated_memory_in_bytes()); |
+ |
+ delete[] pre_hook_buffer; |
+ EXPECT_EQ(1L, MallocHooks::allocation_count()); |
+ EXPECT_EQ(static_cast<intptr_t>(sizeof(char) * buffer_size), |
+ MallocHooks::heap_allocated_memory_in_bytes()); |
+ |
+ |
+ delete[] buffer; |
+ EXPECT_EQ(0L, MallocHooks::allocation_count()); |
+ EXPECT_EQ(0L, MallocHooks::heap_allocated_memory_in_bytes()); |
+} |
+ |
+}; // namespace dart |
+ |
+#endif // defined(DART_USE_TCMALLOC) && !defined(PRODUCT) |