| // 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 |