QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 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 | |
QUICHE team | 5be974e | 2020-12-29 18:35:24 -0500 | [diff] [blame] | 5 | #include "quic/core/quic_one_block_arena.h" |
QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 6 | |
| 7 | #include <cstdint> |
| 8 | |
QUICHE team | 5be974e | 2020-12-29 18:35:24 -0500 | [diff] [blame] | 9 | #include "quic/platform/api/quic_containers.h" |
| 10 | #include "quic/platform/api/quic_expect_bug.h" |
| 11 | #include "quic/platform/api/quic_test.h" |
| 12 | #include "quic/test_tools/quic_test_utils.h" |
QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 13 | |
| 14 | namespace quic { |
| 15 | namespace { |
| 16 | |
| 17 | static const uint32_t kMaxAlign = 8; |
| 18 | |
| 19 | struct TestObject { |
| 20 | uint32_t value; |
| 21 | }; |
| 22 | |
| 23 | class QuicOneBlockArenaTest : public QuicTest {}; |
| 24 | |
| 25 | TEST_F(QuicOneBlockArenaTest, AllocateSuccess) { |
fayang | 2205d95 | 2020-05-12 13:45:56 -0700 | [diff] [blame] | 26 | QuicOneBlockArena<1024> arena; |
QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 27 | QuicArenaScopedPtr<TestObject> ptr = arena.New<TestObject>(); |
| 28 | EXPECT_TRUE(ptr.is_from_arena()); |
| 29 | } |
| 30 | |
| 31 | TEST_F(QuicOneBlockArenaTest, Exhaust) { |
fayang | 2205d95 | 2020-05-12 13:45:56 -0700 | [diff] [blame] | 32 | QuicOneBlockArena<1024> arena; |
| 33 | for (size_t i = 0; i < 1024 / kMaxAlign; ++i) { |
QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 34 | QuicArenaScopedPtr<TestObject> ptr = arena.New<TestObject>(); |
| 35 | EXPECT_TRUE(ptr.is_from_arena()); |
| 36 | } |
| 37 | QuicArenaScopedPtr<TestObject> ptr; |
| 38 | EXPECT_QUIC_BUG(ptr = arena.New<TestObject>(), |
| 39 | "Ran out of space in QuicOneBlockArena"); |
| 40 | EXPECT_FALSE(ptr.is_from_arena()); |
| 41 | } |
| 42 | |
| 43 | TEST_F(QuicOneBlockArenaTest, NoOverlaps) { |
fayang | 2205d95 | 2020-05-12 13:45:56 -0700 | [diff] [blame] | 44 | QuicOneBlockArena<1024> arena; |
QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 45 | std::vector<QuicArenaScopedPtr<TestObject>> objects; |
| 46 | QuicIntervalSet<uintptr_t> used; |
fayang | 2205d95 | 2020-05-12 13:45:56 -0700 | [diff] [blame] | 47 | for (size_t i = 0; i < 1024 / kMaxAlign; ++i) { |
QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 48 | QuicArenaScopedPtr<TestObject> ptr = arena.New<TestObject>(); |
| 49 | EXPECT_TRUE(ptr.is_from_arena()); |
| 50 | |
| 51 | uintptr_t begin = reinterpret_cast<uintptr_t>(ptr.get()); |
| 52 | uintptr_t end = begin + sizeof(TestObject); |
| 53 | EXPECT_FALSE(used.Contains(begin)); |
| 54 | EXPECT_FALSE(used.Contains(end - 1)); |
| 55 | used.Add(begin, end); |
| 56 | } |
| 57 | } |
| 58 | |
| 59 | } // namespace |
| 60 | } // namespace quic |