• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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:
HpackEntryTest()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.
StaticEntry()27   HpackEntry StaticEntry() {
28     return HpackEntry(name_, value_, true, total_insertions_++);
29   }
DynamicEntry()30   HpackEntry DynamicEntry() {
31     ++table_size_;
32     size_t index = total_insertions_++;
33     return HpackEntry(name_, value_, false, index);
34   }
DropEntry()35   void DropEntry() { --table_size_; }
36 
IndexOf(const HpackEntry & entry) const37   size_t IndexOf(const HpackEntry& entry) const {
38     if (entry.IsStatic()) {
39       return 1 + entry.InsertionIndex() + table_size_;
40     } else {
41       return total_insertions_ - entry.InsertionIndex();
42     }
43   }
44 
Size()45   size_t Size() {
46     return name_.size() + value_.size() + HpackEntry::kSizeOverhead;
47   }
48 
49   string name_, value_;
50 
51  private:
52   // Referenced by HpackEntry instances.
53   size_t total_insertions_;
54   size_t table_size_;
55 };
56 
TEST_F(HpackEntryTest,StaticConstructor)57 TEST_F(HpackEntryTest, StaticConstructor) {
58   HpackEntry entry(StaticEntry());
59 
60   EXPECT_EQ(name_, entry.name());
61   EXPECT_EQ(value_, entry.value());
62   EXPECT_TRUE(entry.IsStatic());
63   EXPECT_EQ(1u, IndexOf(entry));
64   EXPECT_EQ(Size(), entry.Size());
65 }
66 
TEST_F(HpackEntryTest,DynamicConstructor)67 TEST_F(HpackEntryTest, DynamicConstructor) {
68   HpackEntry entry(DynamicEntry());
69 
70   EXPECT_EQ(name_, entry.name());
71   EXPECT_EQ(value_, entry.value());
72   EXPECT_FALSE(entry.IsStatic());
73   EXPECT_EQ(1u, IndexOf(entry));
74   EXPECT_EQ(Size(), entry.Size());
75 }
76 
TEST_F(HpackEntryTest,LookupConstructor)77 TEST_F(HpackEntryTest, LookupConstructor) {
78   HpackEntry entry(name_, value_);
79 
80   EXPECT_EQ(name_, entry.name());
81   EXPECT_EQ(value_, entry.value());
82   EXPECT_FALSE(entry.IsStatic());
83   EXPECT_EQ(0u, IndexOf(entry));
84   EXPECT_EQ(Size(), entry.Size());
85 }
86 
TEST_F(HpackEntryTest,DefaultConstructor)87 TEST_F(HpackEntryTest, DefaultConstructor) {
88   HpackEntry entry;
89 
90   EXPECT_TRUE(entry.name().empty());
91   EXPECT_TRUE(entry.value().empty());
92   EXPECT_EQ(HpackEntry::kSizeOverhead, entry.Size());
93 }
94 
TEST_F(HpackEntryTest,IndexUpdate)95 TEST_F(HpackEntryTest, IndexUpdate) {
96   HpackEntry static1(StaticEntry());
97   HpackEntry static2(StaticEntry());
98 
99   EXPECT_EQ(1u, IndexOf(static1));
100   EXPECT_EQ(2u, IndexOf(static2));
101 
102   HpackEntry dynamic1(DynamicEntry());
103   HpackEntry dynamic2(DynamicEntry());
104 
105   EXPECT_EQ(1u, IndexOf(dynamic2));
106   EXPECT_EQ(2u, IndexOf(dynamic1));
107   EXPECT_EQ(3u, IndexOf(static1));
108   EXPECT_EQ(4u, IndexOf(static2));
109 
110   DropEntry();  // Drops |dynamic1|.
111 
112   EXPECT_EQ(1u, IndexOf(dynamic2));
113   EXPECT_EQ(2u, IndexOf(static1));
114   EXPECT_EQ(3u, IndexOf(static2));
115 
116   HpackEntry dynamic3(DynamicEntry());
117 
118   EXPECT_EQ(1u, IndexOf(dynamic3));
119   EXPECT_EQ(2u, IndexOf(dynamic2));
120   EXPECT_EQ(3u, IndexOf(static1));
121   EXPECT_EQ(4u, IndexOf(static2));
122 }
123 
124 }  // namespace
125 
126 }  // namespace net
127