blob: 181ab3f852c24859e9d33ac0a1f0c6dca023f50a [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// 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 team5be974e2020-12-29 18:35:24 -05005#include "quic/core/quic_one_block_arena.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -05006
7#include <cstdint>
8
QUICHE team5be974e2020-12-29 18:35:24 -05009#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 teama6ef0a62019-03-07 20:34:33 -050013
14namespace quic {
15namespace {
16
17static const uint32_t kMaxAlign = 8;
18
19struct TestObject {
20 uint32_t value;
21};
22
23class QuicOneBlockArenaTest : public QuicTest {};
24
25TEST_F(QuicOneBlockArenaTest, AllocateSuccess) {
fayang2205d952020-05-12 13:45:56 -070026 QuicOneBlockArena<1024> arena;
QUICHE teama6ef0a62019-03-07 20:34:33 -050027 QuicArenaScopedPtr<TestObject> ptr = arena.New<TestObject>();
28 EXPECT_TRUE(ptr.is_from_arena());
29}
30
31TEST_F(QuicOneBlockArenaTest, Exhaust) {
fayang2205d952020-05-12 13:45:56 -070032 QuicOneBlockArena<1024> arena;
33 for (size_t i = 0; i < 1024 / kMaxAlign; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050034 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
43TEST_F(QuicOneBlockArenaTest, NoOverlaps) {
fayang2205d952020-05-12 13:45:56 -070044 QuicOneBlockArena<1024> arena;
QUICHE teama6ef0a62019-03-07 20:34:33 -050045 std::vector<QuicArenaScopedPtr<TestObject>> objects;
46 QuicIntervalSet<uintptr_t> used;
fayang2205d952020-05-12 13:45:56 -070047 for (size_t i = 0; i < 1024 / kMaxAlign; ++i) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050048 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