blob: 109fd37cc277c8c8ac355cadced8c0d735935db5 [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
5#include "net/third_party/quiche/src/quic/core/quic_arena_scoped_ptr.h"
6
7#include "net/third_party/quiche/src/quic/core/quic_one_block_arena.h"
8#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
9
10namespace quic {
11namespace {
12
13enum class TestParam { kFromHeap, kFromArena };
14
15struct TestObject {
16 explicit TestObject(uintptr_t value) : value(value) { buffer.resize(1024); }
17 uintptr_t value;
18
19 // Ensure that we have a non-trivial destructor that will leak memory if it's
20 // not called.
21 std::vector<char> buffer;
22};
23
24class QuicArenaScopedPtrParamTest : public QuicTestWithParam<TestParam> {
25 protected:
26 QuicArenaScopedPtr<TestObject> CreateObject(uintptr_t value) {
27 QuicArenaScopedPtr<TestObject> ptr;
28 switch (GetParam()) {
29 case TestParam::kFromHeap:
30 ptr = QuicArenaScopedPtr<TestObject>(new TestObject(value));
31 CHECK(!ptr.is_from_arena());
32 break;
33 case TestParam::kFromArena:
34 ptr = arena_.New<TestObject>(value);
35 CHECK(ptr.is_from_arena());
36 break;
37 }
38 return ptr;
39 }
40
41 private:
42 QuicOneBlockArena<1024> arena_;
43};
44
45INSTANTIATE_TEST_SUITE_P(QuicArenaScopedPtrParamTest,
46 QuicArenaScopedPtrParamTest,
47 testing::Values(TestParam::kFromHeap,
48 TestParam::kFromArena));
49
50TEST_P(QuicArenaScopedPtrParamTest, NullObjects) {
51 QuicArenaScopedPtr<TestObject> def;
52 QuicArenaScopedPtr<TestObject> null(nullptr);
53 EXPECT_EQ(def, null);
54 EXPECT_EQ(def, nullptr);
55 EXPECT_EQ(null, nullptr);
56}
57
58TEST_P(QuicArenaScopedPtrParamTest, FromArena) {
59 QuicOneBlockArena<1024> arena_;
60 EXPECT_TRUE(arena_.New<TestObject>(0).is_from_arena());
61 EXPECT_FALSE(
62 QuicArenaScopedPtr<TestObject>(new TestObject(0)).is_from_arena());
63}
64
65TEST_P(QuicArenaScopedPtrParamTest, Assign) {
66 QuicArenaScopedPtr<TestObject> ptr = CreateObject(12345);
67 ptr = CreateObject(54321);
68 EXPECT_EQ(54321u, ptr->value);
69}
70
71TEST_P(QuicArenaScopedPtrParamTest, MoveConstruct) {
72 QuicArenaScopedPtr<TestObject> ptr1 = CreateObject(12345);
73 QuicArenaScopedPtr<TestObject> ptr2(std::move(ptr1));
74 EXPECT_EQ(nullptr, ptr1);
75 EXPECT_EQ(12345u, ptr2->value);
76}
77
78TEST_P(QuicArenaScopedPtrParamTest, Accessors) {
79 QuicArenaScopedPtr<TestObject> ptr = CreateObject(12345);
80 EXPECT_EQ(12345u, (*ptr).value);
81 EXPECT_EQ(12345u, ptr->value);
82 // We explicitly want to test that get() returns a valid pointer to the data,
83 // but the call looks redundant.
84 EXPECT_EQ(12345u, ptr.get()->value); // NOLINT
85}
86
87TEST_P(QuicArenaScopedPtrParamTest, Reset) {
88 QuicArenaScopedPtr<TestObject> ptr = CreateObject(12345);
89 ptr.reset(new TestObject(54321));
90 EXPECT_EQ(54321u, ptr->value);
91}
92
93TEST_P(QuicArenaScopedPtrParamTest, Swap) {
94 QuicArenaScopedPtr<TestObject> ptr1 = CreateObject(12345);
95 QuicArenaScopedPtr<TestObject> ptr2 = CreateObject(54321);
96 ptr1.swap(ptr2);
97 EXPECT_EQ(12345u, ptr2->value);
98 EXPECT_EQ(54321u, ptr1->value);
99}
100
101} // namespace
102} // namespace quic