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 11namespace net { 12 13namespace { 14 15using std::string; 16 17class 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_++); 29 } 30 HpackEntry DynamicEntry() { 31 ++table_size_; 32 size_t index = total_insertions_++; 33 return HpackEntry(name_, value_, false, index); 34 } 35 void DropEntry() { --table_size_; } 36 37 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 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 57TEST_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 67TEST_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 77TEST_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 87TEST_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 95TEST_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