| Index: net/spdy/hpack_entry_test.cc
|
| diff --git a/net/spdy/hpack_entry_test.cc b/net/spdy/hpack_entry_test.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..6a57aac0ac0277259cfb2bf547760e944efd57b3
|
| --- /dev/null
|
| +++ b/net/spdy/hpack_entry_test.cc
|
| @@ -0,0 +1,147 @@
|
| +#include "net/spdy/hpack_entry.h"
|
| +
|
| +#include <string>
|
| +
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace net {
|
| +
|
| +namespace {
|
| +
|
| +using std::string;
|
| +
|
| +const char kName[] = "headername";
|
| +const uint32 kNameStringLength = arraysize(kName) - 1;
|
| +const char kValue[] = "Header Value";
|
| +const uint32 kValueStringLength = arraysize(kValue) - 1;
|
| +
|
| +// Make sure a default-constructed entry is still valid and starts off
|
| +// empty, unreferenced, and untouched.
|
| +TEST(HpackEntryTest, DefaultConstructor) {
|
| + HpackEntry entry;
|
| + EXPECT_TRUE(entry.name().empty());
|
| + EXPECT_TRUE(entry.value().empty());
|
| + EXPECT_FALSE(entry.IsReferenced());
|
| + EXPECT_EQ(HpackEntry::kUntouched, entry.TouchCount());
|
| + EXPECT_EQ(HpackEntry::kSizeOverhead, entry.Size());
|
| +}
|
| +
|
| +// Make sure a non-default-constructed HpackEntry starts off with
|
| +// copies of the given name and value, and unreferenced and untouched.
|
| +TEST(HpackEntryTest, NormalConstructor) {
|
| + string name = kName;
|
| + string value = kValue;
|
| + HpackEntry entry(name, value);
|
| + EXPECT_EQ(name, entry.name());
|
| + EXPECT_EQ(value, entry.value());
|
| +
|
| + ++name[0];
|
| + ++value[0];
|
| + EXPECT_NE(name, entry.name());
|
| + EXPECT_NE(value, entry.name());
|
| +
|
| + EXPECT_FALSE(entry.IsReferenced());
|
| + EXPECT_EQ(HpackEntry::kUntouched, entry.TouchCount());
|
| + EXPECT_EQ(
|
| + kNameStringLength + kValueStringLength + HpackEntry::kSizeOverhead,
|
| + entry.Size());
|
| +}
|
| +
|
| +// Make sure twiddling the referenced bit doesn't affect the touch
|
| +// count when it's kUntouched.
|
| +TEST(HpackEntryTest, IsReferencedUntouched) {
|
| + HpackEntry entry(kName, kValue);
|
| + EXPECT_FALSE(entry.IsReferenced());
|
| + EXPECT_EQ(HpackEntry::kUntouched, entry.TouchCount());
|
| +
|
| + entry.SetReferenced(true);
|
| + EXPECT_TRUE(entry.IsReferenced());
|
| + EXPECT_EQ(HpackEntry::kUntouched, entry.TouchCount());
|
| +
|
| + entry.SetReferenced(false);
|
| + EXPECT_FALSE(entry.IsReferenced());
|
| + EXPECT_EQ(HpackEntry::kUntouched, entry.TouchCount());
|
| +}
|
| +
|
| +// Make sure changing the touch count doesn't affect the referenced
|
| +// bit when it's false.
|
| +TEST(HpackEntryTest, TouchCountNotReferenced) {
|
| + HpackEntry entry(kName, kValue);
|
| + EXPECT_FALSE(entry.IsReferenced());
|
| + EXPECT_EQ(HpackEntry::kUntouched, entry.TouchCount());
|
| +
|
| + entry.AddTouches(0);
|
| + EXPECT_FALSE(entry.IsReferenced());
|
| + EXPECT_EQ(0u, entry.TouchCount());
|
| +
|
| + entry.AddTouches(255);
|
| + EXPECT_FALSE(entry.IsReferenced());
|
| + EXPECT_EQ(255u, entry.TouchCount());
|
| +
|
| + // Assumes kUntouched is 1 + max touch count.
|
| + entry.AddTouches(HpackEntry::kUntouched - 256);
|
| + EXPECT_FALSE(entry.IsReferenced());
|
| + EXPECT_EQ(HpackEntry::kUntouched - 1, entry.TouchCount());
|
| +
|
| + entry.ClearTouches();
|
| + EXPECT_FALSE(entry.IsReferenced());
|
| + EXPECT_EQ(HpackEntry::kUntouched, entry.TouchCount());
|
| +}
|
| +
|
| +// Make sure changing the touch count doesn't affect the referenced
|
| +// bit when it's true.
|
| +TEST(HpackEntryTest, TouchCountReferenced) {
|
| + HpackEntry entry(kName, kValue);
|
| + entry.SetReferenced(true);
|
| + EXPECT_TRUE(entry.IsReferenced());
|
| + EXPECT_EQ(HpackEntry::kUntouched, entry.TouchCount());
|
| +
|
| + entry.AddTouches(0);
|
| + EXPECT_TRUE(entry.IsReferenced());
|
| + EXPECT_EQ(0u, entry.TouchCount());
|
| +
|
| + entry.AddTouches(255);
|
| + EXPECT_TRUE(entry.IsReferenced());
|
| + EXPECT_EQ(255u, entry.TouchCount());
|
| +
|
| + // Assumes kUntouched is 1 + max touch count.
|
| + entry.AddTouches(HpackEntry::kUntouched - 256);
|
| + EXPECT_TRUE(entry.IsReferenced());
|
| + EXPECT_EQ(HpackEntry::kUntouched - 1, entry.TouchCount());
|
| +
|
| + entry.ClearTouches();
|
| + EXPECT_TRUE(entry.IsReferenced());
|
| + EXPECT_EQ(HpackEntry::kUntouched, entry.TouchCount());
|
| +}
|
| +
|
| +// Make sure equality takes into account all entry fields.
|
| +TEST(HpackEntryTest, Equals) {
|
| + HpackEntry entry1(kName, kValue);
|
| + HpackEntry entry2(kName, kValue);
|
| + EXPECT_TRUE(entry1.Equals(entry2));
|
| +
|
| + entry2.SetReferenced(true);
|
| + EXPECT_FALSE(entry1.Equals(entry2));
|
| + entry2.SetReferenced(false);
|
| + EXPECT_TRUE(entry1.Equals(entry2));
|
| +
|
| + entry2.AddTouches(0);
|
| + EXPECT_FALSE(entry1.Equals(entry2));
|
| + entry2.ClearTouches();
|
| + EXPECT_TRUE(entry1.Equals(entry2));
|
| +
|
| + entry2.AddTouches(1);
|
| + EXPECT_FALSE(entry1.Equals(entry2));
|
| + entry2.ClearTouches();
|
| + EXPECT_TRUE(entry1.Equals(entry2));
|
| +
|
| + HpackEntry entry3(kName, string(kValue) + kValue);
|
| + EXPECT_FALSE(entry1.Equals(entry3));
|
| +
|
| + HpackEntry entry4(string(kName) + kName, kValue);
|
| + EXPECT_FALSE(entry1.Equals(entry4));
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +} // namespace net
|
|
|