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