// 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 "base/allocator/malloc_zone_functions_mac.h" #include "testing/gtest/include/gtest/gtest.h" namespace base { namespace allocator { class MallocZoneFunctionsTest : public testing::Test { protected: void TearDown() override { ClearAllMallocZonesForTesting(); } }; TEST_F(MallocZoneFunctionsTest, TestDefaultZoneMallocFree) { ChromeMallocZone* malloc_zone = reinterpret_cast(malloc_default_zone()); StoreMallocZone(malloc_zone); int* test = reinterpret_cast( g_malloc_zones[0].malloc(malloc_default_zone(), 33)); test[0] = 1; test[1] = 2; g_malloc_zones[0].free(malloc_default_zone(), test); } TEST_F(MallocZoneFunctionsTest, IsZoneAlreadyStored) { ChromeMallocZone* malloc_zone = reinterpret_cast(malloc_default_zone()); EXPECT_FALSE(IsMallocZoneAlreadyStored(malloc_zone)); StoreMallocZone(malloc_zone); EXPECT_TRUE(IsMallocZoneAlreadyStored(malloc_zone)); } TEST_F(MallocZoneFunctionsTest, CannotDoubleStoreZone) { ChromeMallocZone* malloc_zone = reinterpret_cast(malloc_default_zone()); StoreMallocZone(malloc_zone); StoreMallocZone(malloc_zone); EXPECT_EQ(1, GetMallocZoneCountForTesting()); } TEST_F(MallocZoneFunctionsTest, CannotStoreMoreThanMaxZones) { std::vector zones; zones.resize(kMaxZoneCount * 2); for (int i = 0; i < kMaxZoneCount * 2; ++i) { ChromeMallocZone& zone = zones[i]; memcpy(&zone, malloc_default_zone(), sizeof(ChromeMallocZone)); StoreMallocZone(&zone); } int max_zone_count = kMaxZoneCount; EXPECT_EQ(max_zone_count, GetMallocZoneCountForTesting()); } } // namespace allocator } // namespace base