Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / net / spdy / hpack_entry_test.cc
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.
4
5 #include "net/spdy/hpack_entry.h"
6
7 #include <string>
8
9 #include "testing/gtest/include/gtest/gtest.h"
10
11 namespace net {
12
13 namespace {
14
15 using std::string;
16
17 class HpackEntryTest : public ::testing::Test {
18  protected:
19   HpackEntryTest()
20       : name_("header-name"),
21         value_("header value"),
22         total_insertions_(0),
23         table_size_(0) {}
24
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_);
29   }
30   HpackEntry DynamicEntry() {
31     ++table_size_;
32     size_t index = total_insertions_++;
33     return HpackEntry(name_, value_, false, index, &total_insertions_);
34   }
35   void DropEntry() { --table_size_; }
36
37   size_t Size() {
38     return name_.size() + value_.size() + HpackEntry::kSizeOverhead;
39   }
40
41   string name_, value_;
42
43  private:
44   // Referenced by HpackEntry instances.
45   size_t total_insertions_;
46   size_t table_size_;
47 };
48
49 TEST_F(HpackEntryTest, StaticConstructor) {
50   HpackEntry entry(StaticEntry());
51
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());
58 }
59
60 TEST_F(HpackEntryTest, DynamicConstructor) {
61   HpackEntry entry(DynamicEntry());
62
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());
69 }
70
71 TEST_F(HpackEntryTest, LookupConstructor) {
72   HpackEntry entry(name_, value_);
73
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());
80 }
81
82 TEST_F(HpackEntryTest, DefaultConstructor) {
83   HpackEntry entry;
84
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());
89 }
90
91 TEST_F(HpackEntryTest, IndexUpdate) {
92   HpackEntry static1(StaticEntry());
93   HpackEntry static2(StaticEntry());
94
95   EXPECT_EQ(1u, static1.Index());
96   EXPECT_EQ(2u, static2.Index());
97
98   HpackEntry dynamic1(DynamicEntry());
99   HpackEntry dynamic2(DynamicEntry());
100
101   EXPECT_EQ(1u, dynamic2.Index());
102   EXPECT_EQ(2u, dynamic1.Index());
103   EXPECT_EQ(3u, static1.Index());
104   EXPECT_EQ(4u, static2.Index());
105
106   DropEntry();  // Drops |dynamic1|.
107
108   EXPECT_EQ(1u, dynamic2.Index());
109   EXPECT_EQ(2u, static1.Index());
110   EXPECT_EQ(3u, static2.Index());
111
112   HpackEntry dynamic3(DynamicEntry());
113
114   EXPECT_EQ(1u, dynamic3.Index());
115   EXPECT_EQ(2u, dynamic2.Index());
116   EXPECT_EQ(3u, static1.Index());
117   EXPECT_EQ(4u, static2.Index());
118 }
119
120 TEST_F(HpackEntryTest, ComparatorNameOrdering) {
121   HpackEntry entry1(StaticEntry());
122   name_[0]--;
123   HpackEntry entry2(StaticEntry());
124
125   EXPECT_FALSE(HpackEntry::Comparator()(&entry1, &entry2));
126   EXPECT_TRUE(HpackEntry::Comparator()(&entry2, &entry1));
127 }
128
129 TEST_F(HpackEntryTest, ComparatorValueOrdering) {
130   HpackEntry entry1(StaticEntry());
131   value_[0]--;
132   HpackEntry entry2(StaticEntry());
133
134   EXPECT_FALSE(HpackEntry::Comparator()(&entry1, &entry2));
135   EXPECT_TRUE(HpackEntry::Comparator()(&entry2, &entry1));
136 }
137
138 TEST_F(HpackEntryTest, ComparatorIndexOrdering) {
139   HpackEntry entry1(StaticEntry());
140   HpackEntry entry2(StaticEntry());
141
142   EXPECT_TRUE(HpackEntry::Comparator()(&entry1, &entry2));
143   EXPECT_FALSE(HpackEntry::Comparator()(&entry2, &entry1));
144
145   HpackEntry entry3(DynamicEntry());
146   HpackEntry entry4(DynamicEntry());
147
148   // |entry4| has lower index than |entry3|.
149   EXPECT_TRUE(HpackEntry::Comparator()(&entry4, &entry3));
150   EXPECT_FALSE(HpackEntry::Comparator()(&entry3, &entry4));
151
152   // |entry3| has lower index than |entry1|.
153   EXPECT_TRUE(HpackEntry::Comparator()(&entry3, &entry1));
154   EXPECT_FALSE(HpackEntry::Comparator()(&entry1, &entry3));
155
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));
159 }
160
161 TEST_F(HpackEntryTest, ComparatorEqualityOrdering) {
162   HpackEntry entry1(StaticEntry());
163   HpackEntry entry2(DynamicEntry());
164
165   EXPECT_FALSE(HpackEntry::Comparator()(&entry1, &entry1));
166   EXPECT_FALSE(HpackEntry::Comparator()(&entry2, &entry2));
167 }
168
169 }  // namespace
170
171 }  // namespace net