Home | History | Annotate | Download | only in spdy
      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_++);
     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 
     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 
     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 
     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 
     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 
     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