| /* |
| * Copyright 2017 The Abseil Authors. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include <algorithm> |
| #include <cstdlib> |
| |
| #include "gtest/gtest.h" |
| #include "absl/base/internal/malloc_extension.h" |
| |
| namespace absl { |
| namespace base_internal { |
| namespace { |
| |
| TEST(MallocExtension, MallocExtension) { |
| void* a = malloc(1000); |
| |
| size_t cxx_bytes_used, c_bytes_used; |
| if (!MallocExtension::instance()->GetNumericProperty( |
| "generic.current_allocated_bytes", &cxx_bytes_used)) { |
| EXPECT_TRUE(ABSL_MALLOC_EXTENSION_TEST_ALLOW_MISSING_EXTENSION); |
| } else { |
| ASSERT_TRUE(MallocExtension::instance()->GetNumericProperty( |
| "generic.current_allocated_bytes", &cxx_bytes_used)); |
| #ifndef MEMORY_SANITIZER |
| EXPECT_GT(cxx_bytes_used, 1000); |
| EXPECT_GT(c_bytes_used, 1000); |
| #endif |
| |
| EXPECT_TRUE(MallocExtension::instance()->VerifyAllMemory()); |
| |
| EXPECT_EQ(MallocExtension::kOwned, |
| MallocExtension::instance()->GetOwnership(a)); |
| // TODO(csilvers): this relies on undocumented behavior that |
| // GetOwnership works on stack-allocated variables. Use a better test. |
| EXPECT_EQ(MallocExtension::kNotOwned, |
| MallocExtension::instance()->GetOwnership(&cxx_bytes_used)); |
| EXPECT_EQ(MallocExtension::kNotOwned, |
| MallocExtension::instance()->GetOwnership(nullptr)); |
| EXPECT_GE(MallocExtension::instance()->GetAllocatedSize(a), 1000); |
| // This is just a sanity check. If we allocated too much, tcmalloc is |
| // broken |
| EXPECT_LE(MallocExtension::instance()->GetAllocatedSize(a), 5000); |
| EXPECT_GE(MallocExtension::instance()->GetEstimatedAllocatedSize(1000), |
| 1000); |
| for (int i = 0; i < 10; ++i) { |
| void* p = malloc(i); |
| EXPECT_GE(MallocExtension::instance()->GetAllocatedSize(p), |
| MallocExtension::instance()->GetEstimatedAllocatedSize(i)); |
| free(p); |
| } |
| } |
| |
| free(a); |
| } |
| |
| TEST(nallocx, SaneBehavior) { |
| for (size_t size = 0; size < 64 * 1024; ++size) { |
| size_t alloc_size = nallocx(size, 0); |
| EXPECT_LE(size, alloc_size) << "size is " << size; |
| EXPECT_LE(alloc_size, std::max(size + 100, 2 * size)) << "size is " << size; |
| } |
| } |
| |
| } // namespace |
| } // namespace base_internal |
| } // namespace absl |