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