15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/spdy/hpack_entry.h" 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <string> 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace net { 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using std::string; 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass HpackEntryTest : public ::testing::Test { 185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu protected: 195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu HpackEntryTest() 205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu : name_("header-name"), 215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu value_("header value"), 225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu total_insertions_(0), 235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu table_size_(0) {} 245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // These builders maintain the same external table invariants that a "real" 265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // table (ie HpackHeaderTable) would. 275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu HpackEntry StaticEntry() { 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return HpackEntry(name_, value_, true, total_insertions_++); 295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu HpackEntry DynamicEntry() { 315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ++table_size_; 325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu size_t index = total_insertions_++; 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return HpackEntry(name_, value_, false, index); 345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void DropEntry() { --table_size_; } 365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) size_t IndexOf(const HpackEntry& entry) const { 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (entry.IsStatic()) { 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 1 + entry.InsertionIndex() + table_size_; 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return total_insertions_ - entry.InsertionIndex(); 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu size_t Size() { 465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return name_.size() + value_.size() + HpackEntry::kSizeOverhead; 475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu string name_, value_; 505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private: 525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Referenced by HpackEntry instances. 535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu size_t total_insertions_; 545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu size_t table_size_; 555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}; 565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(HpackEntryTest, StaticConstructor) { 585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu HpackEntry entry(StaticEntry()); 595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(name_, entry.name()); 615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(value_, entry.value()); 625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_TRUE(entry.IsStatic()); 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1u, IndexOf(entry)); 645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(Size(), entry.Size()); 655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(HpackEntryTest, DynamicConstructor) { 685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu HpackEntry entry(DynamicEntry()); 695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(name_, entry.name()); 715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(value_, entry.value()); 725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_FALSE(entry.IsStatic()); 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1u, IndexOf(entry)); 745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(Size(), entry.Size()); 755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(HpackEntryTest, LookupConstructor) { 785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu HpackEntry entry(name_, value_); 795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(name_, entry.name()); 815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(value_, entry.value()); 825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_FALSE(entry.IsStatic()); 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0u, IndexOf(entry)); 845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(Size(), entry.Size()); 855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(HpackEntryTest, DefaultConstructor) { 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) HpackEntry entry; 895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(entry.name().empty()); 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(entry.value().empty()); 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(HpackEntry::kSizeOverhead, entry.Size()); 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(HpackEntryTest, IndexUpdate) { 965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu HpackEntry static1(StaticEntry()); 975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu HpackEntry static2(StaticEntry()); 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1u, IndexOf(static1)); 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(2u, IndexOf(static2)); 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu HpackEntry dynamic1(DynamicEntry()); 1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu HpackEntry dynamic2(DynamicEntry()); 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1u, IndexOf(dynamic2)); 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(2u, IndexOf(dynamic1)); 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(3u, IndexOf(static1)); 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(4u, IndexOf(static2)); 1095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DropEntry(); // Drops |dynamic1|. 1115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1u, IndexOf(dynamic2)); 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(2u, IndexOf(static1)); 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(3u, IndexOf(static2)); 1155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu HpackEntry dynamic3(DynamicEntry()); 1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1u, IndexOf(dynamic3)); 119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(2u, IndexOf(dynamic2)); 120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(3u, IndexOf(static1)); 121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(4u, IndexOf(static2)); 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace net 127