| //===-- allocator_test.cpp ------------------------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file is a part of XRay, a function call tracing system. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "xray_allocator.h" |
| #include "xray_buffer_queue.h" |
| #include "gtest/gtest.h" |
| |
| namespace __xray { |
| namespace { |
| |
| struct TestData { |
| s64 First; |
| s64 Second; |
| }; |
| |
| TEST(AllocatorTest, Construction) { Allocator<sizeof(TestData)> A(2 << 11); } |
| |
| TEST(AllocatorTest, Allocate) { |
| Allocator<sizeof(TestData)> A(2 << 11); |
| auto B = A.Allocate(); |
| ASSERT_NE(B.Data, nullptr); |
| } |
| |
| TEST(AllocatorTest, OverAllocate) { |
| Allocator<sizeof(TestData)> A(sizeof(TestData)); |
| auto B1 = A.Allocate(); |
| ASSERT_NE(B1.Data, nullptr); |
| auto B2 = A.Allocate(); |
| ASSERT_EQ(B2.Data, nullptr); |
| } |
| |
| struct OddSizedData { |
| s64 A; |
| s32 B; |
| }; |
| |
| TEST(AllocatorTest, AllocateBoundaries) { |
| Allocator<sizeof(OddSizedData)> A(GetPageSizeCached()); |
| |
| // Keep allocating until we hit a nullptr block. |
| unsigned C = 0; |
| auto Expected = |
| GetPageSizeCached() / RoundUpTo(sizeof(OddSizedData), kCacheLineSize); |
| for (auto B = A.Allocate(); B.Data != nullptr; B = A.Allocate(), ++C) |
| ; |
| |
| ASSERT_EQ(C, Expected); |
| } |
| |
| TEST(AllocatorTest, AllocateFromNonOwned) { |
| bool Success = false; |
| BufferQueue BQ(GetPageSizeCached(), 10, Success); |
| ASSERT_TRUE(Success); |
| BufferQueue::Buffer B; |
| ASSERT_EQ(BQ.getBuffer(B), BufferQueue::ErrorCode::Ok); |
| { |
| Allocator<sizeof(OddSizedData)> A(B.Data, B.Size); |
| |
| // Keep allocating until we hit a nullptr block. |
| unsigned C = 0; |
| auto Expected = |
| GetPageSizeCached() / RoundUpTo(sizeof(OddSizedData), kCacheLineSize); |
| for (auto B = A.Allocate(); B.Data != nullptr; B = A.Allocate(), ++C) |
| ; |
| |
| ASSERT_EQ(C, Expected); |
| } |
| ASSERT_EQ(BQ.releaseBuffer(B), BufferQueue::ErrorCode::Ok); |
| } |
| |
| } // namespace |
| } // namespace __xray |