blob: 8512ce085427ba694b6793f65d6d10b952f92774 [file] [log] [blame]
// 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