1 // Copyright 2014 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.
5 #include "net/spdy/hpack_entry.h"
9 #include "testing/gtest/include/gtest/gtest.h"
17 class HpackEntryTest : public ::testing::Test {
20 : name_("header-name"),
21 value_("header value"),
25 // These builders maintain the same external table invariants that a "real"
26 // table (ie HpackHeaderTable) would.
27 HpackEntry StaticEntry() {
28 return HpackEntry(name_, value_, true, total_insertions_++, &table_size_);
30 HpackEntry DynamicEntry() {
32 size_t index = total_insertions_++;
33 return HpackEntry(name_, value_, false, index, &total_insertions_);
35 void DropEntry() { --table_size_; }
38 return name_.size() + value_.size() + HpackEntry::kSizeOverhead;
44 // Referenced by HpackEntry instances.
45 size_t total_insertions_;
49 TEST_F(HpackEntryTest, StaticConstructor) {
50 HpackEntry entry(StaticEntry());
52 EXPECT_EQ(name_, entry.name());
53 EXPECT_EQ(value_, entry.value());
54 EXPECT_TRUE(entry.IsStatic());
55 EXPECT_EQ(1u, entry.Index());
56 EXPECT_EQ(0u, entry.state());
57 EXPECT_EQ(Size(), entry.Size());
60 TEST_F(HpackEntryTest, DynamicConstructor) {
61 HpackEntry entry(DynamicEntry());
63 EXPECT_EQ(name_, entry.name());
64 EXPECT_EQ(value_, entry.value());
65 EXPECT_FALSE(entry.IsStatic());
66 EXPECT_EQ(1u, entry.Index());
67 EXPECT_EQ(0u, entry.state());
68 EXPECT_EQ(Size(), entry.Size());
71 TEST_F(HpackEntryTest, LookupConstructor) {
72 HpackEntry entry(name_, value_);
74 EXPECT_EQ(name_, entry.name());
75 EXPECT_EQ(value_, entry.value());
76 EXPECT_FALSE(entry.IsStatic());
77 EXPECT_EQ(0u, entry.Index());
78 EXPECT_EQ(0u, entry.state());
79 EXPECT_EQ(Size(), entry.Size());
82 TEST_F(HpackEntryTest, DefaultConstructor) {
85 EXPECT_TRUE(entry.name().empty());
86 EXPECT_TRUE(entry.value().empty());
87 EXPECT_EQ(0u, entry.state());
88 EXPECT_EQ(HpackEntry::kSizeOverhead, entry.Size());
91 TEST_F(HpackEntryTest, IndexUpdate) {
92 HpackEntry static1(StaticEntry());
93 HpackEntry static2(StaticEntry());
95 EXPECT_EQ(1u, static1.Index());
96 EXPECT_EQ(2u, static2.Index());
98 HpackEntry dynamic1(DynamicEntry());
99 HpackEntry dynamic2(DynamicEntry());
101 EXPECT_EQ(1u, dynamic2.Index());
102 EXPECT_EQ(2u, dynamic1.Index());
103 EXPECT_EQ(3u, static1.Index());
104 EXPECT_EQ(4u, static2.Index());
106 DropEntry(); // Drops |dynamic1|.
108 EXPECT_EQ(1u, dynamic2.Index());
109 EXPECT_EQ(2u, static1.Index());
110 EXPECT_EQ(3u, static2.Index());
112 HpackEntry dynamic3(DynamicEntry());
114 EXPECT_EQ(1u, dynamic3.Index());
115 EXPECT_EQ(2u, dynamic2.Index());
116 EXPECT_EQ(3u, static1.Index());
117 EXPECT_EQ(4u, static2.Index());
120 TEST_F(HpackEntryTest, ComparatorNameOrdering) {
121 HpackEntry entry1(StaticEntry());
123 HpackEntry entry2(StaticEntry());
125 EXPECT_FALSE(HpackEntry::Comparator()(&entry1, &entry2));
126 EXPECT_TRUE(HpackEntry::Comparator()(&entry2, &entry1));
129 TEST_F(HpackEntryTest, ComparatorValueOrdering) {
130 HpackEntry entry1(StaticEntry());
132 HpackEntry entry2(StaticEntry());
134 EXPECT_FALSE(HpackEntry::Comparator()(&entry1, &entry2));
135 EXPECT_TRUE(HpackEntry::Comparator()(&entry2, &entry1));
138 TEST_F(HpackEntryTest, ComparatorIndexOrdering) {
139 HpackEntry entry1(StaticEntry());
140 HpackEntry entry2(StaticEntry());
142 EXPECT_TRUE(HpackEntry::Comparator()(&entry1, &entry2));
143 EXPECT_FALSE(HpackEntry::Comparator()(&entry2, &entry1));
145 HpackEntry entry3(DynamicEntry());
146 HpackEntry entry4(DynamicEntry());
148 // |entry4| has lower index than |entry3|.
149 EXPECT_TRUE(HpackEntry::Comparator()(&entry4, &entry3));
150 EXPECT_FALSE(HpackEntry::Comparator()(&entry3, &entry4));
152 // |entry3| has lower index than |entry1|.
153 EXPECT_TRUE(HpackEntry::Comparator()(&entry3, &entry1));
154 EXPECT_FALSE(HpackEntry::Comparator()(&entry1, &entry3));
156 // |entry1| & |entry2| ordering is preserved, though each Index() has changed.
157 EXPECT_TRUE(HpackEntry::Comparator()(&entry1, &entry2));
158 EXPECT_FALSE(HpackEntry::Comparator()(&entry2, &entry1));
161 TEST_F(HpackEntryTest, ComparatorEqualityOrdering) {
162 HpackEntry entry1(StaticEntry());
163 HpackEntry entry2(DynamicEntry());
165 EXPECT_FALSE(HpackEntry::Comparator()(&entry1, &entry1));
166 EXPECT_FALSE(HpackEntry::Comparator()(&entry2, &entry2));