xref: /llvm-project/compiler-rt/lib/xray/tests/unit/allocator_test.cpp (revision bc0d697db9e3552cebe21c3f1832c14762bd6ebd)
1 //===-- allocator_test.cpp ------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file is a part of XRay, a function call tracing system.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "xray_allocator.h"
14 #include "xray_buffer_queue.h"
15 #include "gtest/gtest.h"
16 
17 namespace __xray {
18 namespace {
19 
20 struct TestData {
21   s64 First;
22   s64 Second;
23 };
24 
TEST(AllocatorTest,Construction)25 TEST(AllocatorTest, Construction) { Allocator<sizeof(TestData)> A(2 << 11); }
26 
TEST(AllocatorTest,Allocate)27 TEST(AllocatorTest, Allocate) {
28   Allocator<sizeof(TestData)> A(2 << 11);
29   auto B = A.Allocate();
30   ASSERT_NE(B.Data, nullptr);
31 }
32 
TEST(AllocatorTest,OverAllocate)33 TEST(AllocatorTest, OverAllocate) {
34   Allocator<sizeof(TestData)> A(sizeof(TestData));
35   auto B1 = A.Allocate();
36   ASSERT_NE(B1.Data, nullptr);
37   auto B2 = A.Allocate();
38   ASSERT_EQ(B2.Data, nullptr);
39 }
40 
41 struct OddSizedData {
42   s64 A;
43   s32 B;
44 };
45 
TEST(AllocatorTest,AllocateBoundaries)46 TEST(AllocatorTest, AllocateBoundaries) {
47   Allocator<sizeof(OddSizedData)> A(GetPageSizeCached());
48 
49   // Keep allocating until we hit a nullptr block.
50   unsigned C = 0;
51   auto Expected =
52       GetPageSizeCached() / RoundUpTo(sizeof(OddSizedData), kCacheLineSize);
53   for (auto B = A.Allocate(); B.Data != nullptr; B = A.Allocate(), ++C)
54     ;
55 
56   ASSERT_EQ(C, Expected);
57 }
58 
TEST(AllocatorTest,AllocateFromNonOwned)59 TEST(AllocatorTest, AllocateFromNonOwned) {
60   bool Success = false;
61   BufferQueue BQ(GetPageSizeCached(), 10, Success);
62   ASSERT_TRUE(Success);
63   BufferQueue::Buffer B;
64   ASSERT_EQ(BQ.getBuffer(B), BufferQueue::ErrorCode::Ok);
65   {
66     Allocator<sizeof(OddSizedData)> A(B.Data, B.Size);
67 
68     // Keep allocating until we hit a nullptr block.
69     unsigned C = 0;
70     auto Expected =
71         GetPageSizeCached() / RoundUpTo(sizeof(OddSizedData), kCacheLineSize);
72     for (auto B = A.Allocate(); B.Data != nullptr; B = A.Allocate(), ++C)
73       ;
74 
75     ASSERT_EQ(C, Expected);
76   }
77   ASSERT_EQ(BQ.releaseBuffer(B), BufferQueue::ErrorCode::Ok);
78 }
79 
80 } // namespace
81 } // namespace __xray
82