//===-- allocator_test.cc -------------------------------------------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // 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 A(2 << 11); } TEST(AllocatorTest, Allocate) { Allocator A(2 << 11); auto B = A.Allocate(); ASSERT_NE(B.Data, nullptr); } TEST(AllocatorTest, OverAllocate) { Allocator 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 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 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