| Index: net/quic/quic_arena_scoped_ptr_test.cc
|
| diff --git a/net/quic/quic_arena_scoped_ptr_test.cc b/net/quic/quic_arena_scoped_ptr_test.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d9ce1b15752aef14ccdb7bd4e8cfffafd122e631
|
| --- /dev/null
|
| +++ b/net/quic/quic_arena_scoped_ptr_test.cc
|
| @@ -0,0 +1,107 @@
|
| +// Copyright (c) 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +#include "net/quic/quic_arena_scoped_ptr.h"
|
| +
|
| +#include "net/quic/quic_one_block_arena.h"
|
| +#include "testing/gmock/include/gmock/gmock.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +// #include "testing/base/public/gunit.h"
|
| +
|
| +namespace net {
|
| +namespace {
|
| +
|
| +enum class TestParam { kFromHeap, kFromArena };
|
| +
|
| +struct TestObject {
|
| + explicit TestObject(uintptr_t value) : value(value) { buffer.resize(1024); }
|
| + uintptr_t value;
|
| +
|
| + // Ensure that we have a non-trivial destructor that will leak memory if it's
|
| + // not called.
|
| + std::vector<char> buffer;
|
| +};
|
| +
|
| +class QuicArenaScopedPtrParamTest : public ::testing::TestWithParam<TestParam> {
|
| + protected:
|
| + QuicArenaScopedPtrParamTest() { FLAGS_quic_enable_arena_allocation = true; }
|
| +
|
| + QuicArenaScopedPtr<TestObject> CreateObject(uintptr_t value) {
|
| + QuicArenaScopedPtr<TestObject> ptr;
|
| + switch (GetParam()) {
|
| + case TestParam::kFromHeap:
|
| + ptr = QuicArenaScopedPtr<TestObject>(new TestObject(value));
|
| + CHECK(!ptr.is_from_arena());
|
| + break;
|
| + case TestParam::kFromArena:
|
| + ptr = arena_.New<TestObject>(value);
|
| + CHECK(ptr.is_from_arena());
|
| + break;
|
| + }
|
| + return ptr;
|
| + }
|
| +
|
| + private:
|
| + QuicOneBlockArena<1024> arena_;
|
| +};
|
| +
|
| +INSTANTIATE_TEST_CASE_P(QuicArenaScopedPtrParamTest,
|
| + QuicArenaScopedPtrParamTest,
|
| + testing::Values(TestParam::kFromHeap,
|
| + TestParam::kFromArena));
|
| +
|
| +TEST(QuicArenaScopedPtrTest, NullObjects) {
|
| + FLAGS_quic_enable_arena_allocation = true;
|
| + QuicArenaScopedPtr<TestObject> def;
|
| + QuicArenaScopedPtr<TestObject> null(nullptr);
|
| + EXPECT_EQ(def, null);
|
| + EXPECT_EQ(def, nullptr);
|
| + EXPECT_EQ(null, nullptr);
|
| +}
|
| +
|
| +TEST(QuicArenaScopedPtrTest, FromArena) {
|
| + FLAGS_quic_enable_arena_allocation = true;
|
| + QuicOneBlockArena<1024> arena_;
|
| + EXPECT_TRUE(arena_.New<TestObject>(0).is_from_arena());
|
| + EXPECT_FALSE(
|
| + QuicArenaScopedPtr<TestObject>(new TestObject(0)).is_from_arena());
|
| +}
|
| +
|
| +TEST_P(QuicArenaScopedPtrParamTest, Assign) {
|
| + QuicArenaScopedPtr<TestObject> ptr = CreateObject(12345);
|
| + ptr = CreateObject(54321);
|
| + EXPECT_EQ(54321u, ptr->value);
|
| +}
|
| +
|
| +TEST_P(QuicArenaScopedPtrParamTest, MoveConstruct) {
|
| + QuicArenaScopedPtr<TestObject> ptr1 = CreateObject(12345);
|
| + QuicArenaScopedPtr<TestObject> ptr2(std::move(ptr1));
|
| + EXPECT_EQ(nullptr, ptr1);
|
| + EXPECT_EQ(12345u, ptr2->value);
|
| +}
|
| +
|
| +TEST_P(QuicArenaScopedPtrParamTest, Accessors) {
|
| + QuicArenaScopedPtr<TestObject> ptr = CreateObject(12345);
|
| + EXPECT_EQ(12345u, (*ptr).value);
|
| + EXPECT_EQ(12345u, ptr->value);
|
| + // We explicitly want to test that get() returns a valid pointer to the data,
|
| + // but the call looks redundant.
|
| + EXPECT_EQ(12345u, ptr.get()->value); // NOLINT
|
| +}
|
| +
|
| +TEST_P(QuicArenaScopedPtrParamTest, Reset) {
|
| + QuicArenaScopedPtr<TestObject> ptr = CreateObject(12345);
|
| + ptr.reset(new TestObject(54321));
|
| + EXPECT_EQ(54321u, ptr->value);
|
| +}
|
| +
|
| +TEST_P(QuicArenaScopedPtrParamTest, Swap) {
|
| + QuicArenaScopedPtr<TestObject> ptr1 = CreateObject(12345);
|
| + QuicArenaScopedPtr<TestObject> ptr2 = CreateObject(54321);
|
| + ptr1.swap(ptr2);
|
| + EXPECT_EQ(12345u, ptr2->value);
|
| + EXPECT_EQ(54321u, ptr1->value);
|
| +}
|
| +
|
| +} // namespace
|
| +} // namespace net
|
|
|