| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <mach/mach.h> |
| |
| #include "base/allocator/allocator_interception_mac.h" |
| #include "base/allocator/allocator_shim.h" |
| #include "base/allocator/malloc_zone_functions_mac.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace base { |
| namespace allocator { |
| |
| namespace { |
| void ResetMallocZone(ChromeMallocZone* zone) { |
| MallocZoneFunctions& functions = GetFunctionsForZone(zone); |
| ReplaceZoneFunctions(zone, &functions); |
| } |
| |
| void ResetAllMallocZones() { |
| ChromeMallocZone* default_malloc_zone = |
| reinterpret_cast<ChromeMallocZone*>(malloc_default_zone()); |
| ResetMallocZone(default_malloc_zone); |
| |
| vm_address_t* zones; |
| unsigned int count; |
| kern_return_t kr = malloc_get_all_zones(mach_task_self(), 0, &zones, &count); |
| if (kr != KERN_SUCCESS) |
| return; |
| for (unsigned int i = 0; i < count; ++i) { |
| ChromeMallocZone* zone = reinterpret_cast<ChromeMallocZone*>(zones[i]); |
| ResetMallocZone(zone); |
| } |
| } |
| } // namespace |
| |
| class AllocatorInterceptionTest : public testing::Test { |
| protected: |
| void TearDown() override { |
| ResetAllMallocZones(); |
| ClearAllMallocZonesForTesting(); |
| } |
| }; |
| |
| #if !defined(MEMORY_TOOL_REPLACES_ALLOCATOR) |
| TEST_F(AllocatorInterceptionTest, ShimNewMallocZones) { |
| InitializeAllocatorShim(); |
| ChromeMallocZone* default_malloc_zone = |
| reinterpret_cast<ChromeMallocZone*>(malloc_default_zone()); |
| |
| malloc_zone_t new_zone; |
| memset(&new_zone, 1, sizeof(malloc_zone_t)); |
| malloc_zone_register(&new_zone); |
| EXPECT_NE(new_zone.malloc, default_malloc_zone->malloc); |
| ShimNewMallocZones(); |
| EXPECT_EQ(new_zone.malloc, default_malloc_zone->malloc); |
| |
| malloc_zone_unregister(&new_zone); |
| } |
| #endif |
| |
| } // namespace allocator |
| } // namespace base |