OLD | NEW |
| (Empty) |
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 #include "net/quic/quic_arena_scoped_ptr.h" | |
5 | |
6 #include "net/quic/quic_one_block_arena.h" | |
7 #include "testing/gmock/include/gmock/gmock.h" | |
8 #include "testing/gtest/include/gtest/gtest.h" | |
9 | |
10 namespace net { | |
11 namespace { | |
12 | |
13 enum class TestParam { kFromHeap, kFromArena }; | |
14 | |
15 struct 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 | |
24 class QuicArenaScopedPtrParamTest : public ::testing::TestWithParam<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 | |
45 INSTANTIATE_TEST_CASE_P(QuicArenaScopedPtrParamTest, | |
46 QuicArenaScopedPtrParamTest, | |
47 testing::Values(TestParam::kFromHeap, | |
48 TestParam::kFromArena)); | |
49 | |
50 TEST(QuicArenaScopedPtrTest, 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 | |
58 TEST(QuicArenaScopedPtrTest, 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 | |
65 TEST_P(QuicArenaScopedPtrParamTest, Assign) { | |
66 QuicArenaScopedPtr<TestObject> ptr = CreateObject(12345); | |
67 ptr = CreateObject(54321); | |
68 EXPECT_EQ(54321u, ptr->value); | |
69 } | |
70 | |
71 TEST_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 | |
78 TEST_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 | |
87 TEST_P(QuicArenaScopedPtrParamTest, Reset) { | |
88 QuicArenaScopedPtr<TestObject> ptr = CreateObject(12345); | |
89 ptr.reset(new TestObject(54321)); | |
90 EXPECT_EQ(54321u, ptr->value); | |
91 } | |
92 | |
93 TEST_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 net | |
OLD | NEW |