| // 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 |