|  | // Copyright 2016 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "quiche/http2/test_tools/hpack_entry_collector.h" | 
|  |  | 
|  | // Tests of HpackEntryCollector. | 
|  |  | 
|  | #include "quiche/common/platform/api/quiche_logging.h" | 
|  | #include "quiche/common/platform/api/quiche_test.h" | 
|  |  | 
|  | using ::testing::HasSubstr; | 
|  |  | 
|  | namespace http2 { | 
|  | namespace test { | 
|  | namespace { | 
|  |  | 
|  | TEST(HpackEntryCollectorTest, Clear) { | 
|  | HpackEntryCollector collector; | 
|  | QUICHE_VLOG(1) << collector; | 
|  | EXPECT_THAT(collector.ToString(), HasSubstr("!started")); | 
|  | EXPECT_TRUE(collector.IsClear()); | 
|  | collector.set_header_type(HpackEntryType::kIndexedLiteralHeader); | 
|  | EXPECT_FALSE(collector.IsClear()); | 
|  | QUICHE_VLOG(1) << collector; | 
|  | collector.Clear(); | 
|  | EXPECT_TRUE(collector.IsClear()); | 
|  | collector.set_index(123); | 
|  | EXPECT_FALSE(collector.IsClear()); | 
|  | QUICHE_VLOG(1) << collector; | 
|  | collector.Clear(); | 
|  | EXPECT_TRUE(collector.IsClear()); | 
|  | collector.set_name(HpackStringCollector("name", true)); | 
|  | EXPECT_FALSE(collector.IsClear()); | 
|  | QUICHE_VLOG(1) << collector; | 
|  | collector.Clear(); | 
|  | EXPECT_TRUE(collector.IsClear()); | 
|  | collector.set_value(HpackStringCollector("value", false)); | 
|  | EXPECT_FALSE(collector.IsClear()); | 
|  | QUICHE_VLOG(1) << collector; | 
|  | } | 
|  |  | 
|  | // EXPECT_FATAL_FAILURE can not access variables in the scope of a test body, | 
|  | // including the this variable so can not access non-static members. So, we | 
|  | // define this test outside of the test body. | 
|  | void IndexedHeaderErrorTest() { | 
|  | HpackEntryCollector collector; | 
|  | collector.OnIndexedHeader(1); | 
|  | // The next statement will fail because the collector | 
|  | // has already been used. | 
|  | collector.OnIndexedHeader(234); | 
|  | } | 
|  |  | 
|  | TEST(HpackEntryCollectorTest, IndexedHeader) { | 
|  | HpackEntryCollector collector; | 
|  | collector.OnIndexedHeader(123); | 
|  | QUICHE_VLOG(1) << collector; | 
|  | EXPECT_FALSE(collector.IsClear()); | 
|  | EXPECT_TRUE(collector.IsComplete()); | 
|  | EXPECT_TRUE(collector.ValidateIndexedHeader(123)); | 
|  | EXPECT_THAT(collector.ToString(), HasSubstr("IndexedHeader")); | 
|  | EXPECT_THAT(collector.ToString(), HasSubstr("Complete")); | 
|  | EXPECT_FATAL_FAILURE(IndexedHeaderErrorTest(), "Value of: started_"); | 
|  | } | 
|  |  | 
|  | void LiteralValueErrorTest() { | 
|  | HpackEntryCollector collector; | 
|  | collector.OnStartLiteralHeader(HpackEntryType::kIndexedLiteralHeader, 1); | 
|  | // OnNameStart is not expected because an index was specified for the name. | 
|  | collector.OnNameStart(false, 10); | 
|  | } | 
|  |  | 
|  | TEST(HpackEntryCollectorTest, LiteralValueHeader) { | 
|  | HpackEntryCollector collector; | 
|  | collector.OnStartLiteralHeader(HpackEntryType::kIndexedLiteralHeader, 4); | 
|  | QUICHE_VLOG(1) << collector; | 
|  | EXPECT_FALSE(collector.IsClear()); | 
|  | EXPECT_FALSE(collector.IsComplete()); | 
|  | EXPECT_THAT(collector.ToString(), HasSubstr("!ended")); | 
|  | collector.OnValueStart(true, 5); | 
|  | QUICHE_VLOG(1) << collector; | 
|  | collector.OnValueData("value", 5); | 
|  | collector.OnValueEnd(); | 
|  | QUICHE_VLOG(1) << collector; | 
|  | EXPECT_FALSE(collector.IsClear()); | 
|  | EXPECT_TRUE(collector.IsComplete()); | 
|  | EXPECT_TRUE(collector.ValidateLiteralValueHeader( | 
|  | HpackEntryType::kIndexedLiteralHeader, 4, true, "value")); | 
|  | EXPECT_THAT(collector.ToString(), HasSubstr("IndexedLiteralHeader")); | 
|  | EXPECT_THAT(collector.ToString(), HasSubstr("Complete")); | 
|  | EXPECT_FATAL_FAILURE(LiteralValueErrorTest(), | 
|  | "Value of: LiteralNameExpected"); | 
|  | } | 
|  |  | 
|  | void LiteralNameValueHeaderErrorTest() { | 
|  | HpackEntryCollector collector; | 
|  | collector.OnStartLiteralHeader(HpackEntryType::kNeverIndexedLiteralHeader, 0); | 
|  | // OnValueStart is not expected until the name has ended. | 
|  | collector.OnValueStart(false, 10); | 
|  | } | 
|  |  | 
|  | TEST(HpackEntryCollectorTest, LiteralNameValueHeader) { | 
|  | HpackEntryCollector collector; | 
|  | collector.OnStartLiteralHeader(HpackEntryType::kUnindexedLiteralHeader, 0); | 
|  | QUICHE_VLOG(1) << collector; | 
|  | EXPECT_FALSE(collector.IsClear()); | 
|  | EXPECT_FALSE(collector.IsComplete()); | 
|  | collector.OnNameStart(false, 4); | 
|  | collector.OnNameData("na", 2); | 
|  | QUICHE_VLOG(1) << collector; | 
|  | collector.OnNameData("me", 2); | 
|  | collector.OnNameEnd(); | 
|  | collector.OnValueStart(true, 5); | 
|  | QUICHE_VLOG(1) << collector; | 
|  | collector.OnValueData("Value", 5); | 
|  | collector.OnValueEnd(); | 
|  | QUICHE_VLOG(1) << collector; | 
|  | EXPECT_FALSE(collector.IsClear()); | 
|  | EXPECT_TRUE(collector.IsComplete()); | 
|  | EXPECT_TRUE(collector.ValidateLiteralNameValueHeader( | 
|  | HpackEntryType::kUnindexedLiteralHeader, false, "name", true, "Value")); | 
|  | EXPECT_FATAL_FAILURE(LiteralNameValueHeaderErrorTest(), | 
|  | "Value of: name_.HasEnded"); | 
|  | } | 
|  |  | 
|  | void DynamicTableSizeUpdateErrorTest() { | 
|  | HpackEntryCollector collector; | 
|  | collector.OnDynamicTableSizeUpdate(123); | 
|  | EXPECT_FALSE(collector.IsClear()); | 
|  | EXPECT_TRUE(collector.IsComplete()); | 
|  | EXPECT_TRUE(collector.ValidateDynamicTableSizeUpdate(123)); | 
|  | // The next statement will fail because the collector | 
|  | // has already been used. | 
|  | collector.OnDynamicTableSizeUpdate(234); | 
|  | } | 
|  |  | 
|  | TEST(HpackEntryCollectorTest, DynamicTableSizeUpdate) { | 
|  | HpackEntryCollector collector; | 
|  | collector.OnDynamicTableSizeUpdate(8192); | 
|  | QUICHE_VLOG(1) << collector; | 
|  | EXPECT_FALSE(collector.IsClear()); | 
|  | EXPECT_TRUE(collector.IsComplete()); | 
|  | EXPECT_TRUE(collector.ValidateDynamicTableSizeUpdate(8192)); | 
|  | EXPECT_EQ(collector, | 
|  | HpackEntryCollector(HpackEntryType::kDynamicTableSizeUpdate, 8192)); | 
|  | EXPECT_NE(collector, | 
|  | HpackEntryCollector(HpackEntryType::kIndexedHeader, 8192)); | 
|  | EXPECT_NE(collector, | 
|  | HpackEntryCollector(HpackEntryType::kDynamicTableSizeUpdate, 8191)); | 
|  | EXPECT_FATAL_FAILURE(DynamicTableSizeUpdateErrorTest(), "Value of: started_"); | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  | }  // namespace test | 
|  | }  // namespace http2 |