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