xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/quic/core/quic_one_block_arena_test.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright (c) 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "quiche/quic/core/quic_one_block_arena.h"
6 
7 #include <cstdint>
8 
9 #include "quiche/quic/platform/api/quic_expect_bug.h"
10 #include "quiche/quic/platform/api/quic_test.h"
11 #include "quiche/quic/test_tools/quic_test_utils.h"
12 
13 namespace quic::test {
14 namespace {
15 
16 static const uint32_t kMaxAlign = 8;
17 
18 struct TestObject {
19   uint32_t value;
20 };
21 
22 class QuicOneBlockArenaTest : public QuicTest {};
23 
TEST_F(QuicOneBlockArenaTest,AllocateSuccess)24 TEST_F(QuicOneBlockArenaTest, AllocateSuccess) {
25   QuicOneBlockArena<1024> arena;
26   QuicArenaScopedPtr<TestObject> ptr = arena.New<TestObject>();
27   EXPECT_TRUE(ptr.is_from_arena());
28 }
29 
TEST_F(QuicOneBlockArenaTest,Exhaust)30 TEST_F(QuicOneBlockArenaTest, Exhaust) {
31   QuicOneBlockArena<1024> arena;
32   for (size_t i = 0; i < 1024 / kMaxAlign; ++i) {
33     QuicArenaScopedPtr<TestObject> ptr = arena.New<TestObject>();
34     EXPECT_TRUE(ptr.is_from_arena());
35   }
36   QuicArenaScopedPtr<TestObject> ptr;
37   EXPECT_QUIC_BUG(ptr = arena.New<TestObject>(),
38                   "Ran out of space in QuicOneBlockArena");
39   EXPECT_FALSE(ptr.is_from_arena());
40 }
41 
TEST_F(QuicOneBlockArenaTest,NoOverlaps)42 TEST_F(QuicOneBlockArenaTest, NoOverlaps) {
43   QuicOneBlockArena<1024> arena;
44   std::vector<QuicArenaScopedPtr<TestObject>> objects;
45   QuicIntervalSet<uintptr_t> used;
46   for (size_t i = 0; i < 1024 / kMaxAlign; ++i) {
47     QuicArenaScopedPtr<TestObject> ptr = arena.New<TestObject>();
48     EXPECT_TRUE(ptr.is_from_arena());
49 
50     uintptr_t begin = reinterpret_cast<uintptr_t>(ptr.get());
51     uintptr_t end = begin + sizeof(TestObject);
52     EXPECT_FALSE(used.Contains(begin));
53     EXPECT_FALSE(used.Contains(end - 1));
54     used.Add(begin, end);
55   }
56 }
57 
58 }  // namespace
59 }  // namespace quic::test
60