1 // Copyright 2016 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 "quiche/http2/test_tools/hpack_entry_collector.h"
6
7 // Tests of HpackEntryCollector.
8
9 #include "quiche/common/platform/api/quiche_logging.h"
10 #include "quiche/common/platform/api/quiche_test.h"
11
12 using ::testing::HasSubstr;
13
14 namespace http2 {
15 namespace test {
16 namespace {
17
TEST(HpackEntryCollectorTest,Clear)18 TEST(HpackEntryCollectorTest, Clear) {
19 HpackEntryCollector collector;
20 QUICHE_VLOG(1) << collector;
21 EXPECT_THAT(collector.ToString(), HasSubstr("!started"));
22 EXPECT_TRUE(collector.IsClear());
23 collector.set_header_type(HpackEntryType::kIndexedLiteralHeader);
24 EXPECT_FALSE(collector.IsClear());
25 QUICHE_VLOG(1) << collector;
26 collector.Clear();
27 EXPECT_TRUE(collector.IsClear());
28 collector.set_index(123);
29 EXPECT_FALSE(collector.IsClear());
30 QUICHE_VLOG(1) << collector;
31 collector.Clear();
32 EXPECT_TRUE(collector.IsClear());
33 collector.set_name(HpackStringCollector("name", true));
34 EXPECT_FALSE(collector.IsClear());
35 QUICHE_VLOG(1) << collector;
36 collector.Clear();
37 EXPECT_TRUE(collector.IsClear());
38 collector.set_value(HpackStringCollector("value", false));
39 EXPECT_FALSE(collector.IsClear());
40 QUICHE_VLOG(1) << collector;
41 }
42
43 // EXPECT_FATAL_FAILURE can not access variables in the scope of a test body,
44 // including the this variable so can not access non-static members. So, we
45 // define this test outside of the test body.
IndexedHeaderErrorTest()46 void IndexedHeaderErrorTest() {
47 HpackEntryCollector collector;
48 collector.OnIndexedHeader(1);
49 // The next statement will fail because the collector
50 // has already been used.
51 collector.OnIndexedHeader(234);
52 }
53
TEST(HpackEntryCollectorTest,IndexedHeader)54 TEST(HpackEntryCollectorTest, IndexedHeader) {
55 HpackEntryCollector collector;
56 collector.OnIndexedHeader(123);
57 QUICHE_VLOG(1) << collector;
58 EXPECT_FALSE(collector.IsClear());
59 EXPECT_TRUE(collector.IsComplete());
60 EXPECT_TRUE(collector.ValidateIndexedHeader(123));
61 EXPECT_THAT(collector.ToString(), HasSubstr("IndexedHeader"));
62 EXPECT_THAT(collector.ToString(), HasSubstr("Complete"));
63 EXPECT_FATAL_FAILURE(IndexedHeaderErrorTest(), "Value of: started_");
64 }
65
LiteralValueErrorTest()66 void LiteralValueErrorTest() {
67 HpackEntryCollector collector;
68 collector.OnStartLiteralHeader(HpackEntryType::kIndexedLiteralHeader, 1);
69 // OnNameStart is not expected because an index was specified for the name.
70 collector.OnNameStart(false, 10);
71 }
72
TEST(HpackEntryCollectorTest,LiteralValueHeader)73 TEST(HpackEntryCollectorTest, LiteralValueHeader) {
74 HpackEntryCollector collector;
75 collector.OnStartLiteralHeader(HpackEntryType::kIndexedLiteralHeader, 4);
76 QUICHE_VLOG(1) << collector;
77 EXPECT_FALSE(collector.IsClear());
78 EXPECT_FALSE(collector.IsComplete());
79 EXPECT_THAT(collector.ToString(), HasSubstr("!ended"));
80 collector.OnValueStart(true, 5);
81 QUICHE_VLOG(1) << collector;
82 collector.OnValueData("value", 5);
83 collector.OnValueEnd();
84 QUICHE_VLOG(1) << collector;
85 EXPECT_FALSE(collector.IsClear());
86 EXPECT_TRUE(collector.IsComplete());
87 EXPECT_TRUE(collector.ValidateLiteralValueHeader(
88 HpackEntryType::kIndexedLiteralHeader, 4, true, "value"));
89 EXPECT_THAT(collector.ToString(), HasSubstr("IndexedLiteralHeader"));
90 EXPECT_THAT(collector.ToString(), HasSubstr("Complete"));
91 EXPECT_FATAL_FAILURE(LiteralValueErrorTest(),
92 "Value of: LiteralNameExpected");
93 }
94
LiteralNameValueHeaderErrorTest()95 void LiteralNameValueHeaderErrorTest() {
96 HpackEntryCollector collector;
97 collector.OnStartLiteralHeader(HpackEntryType::kNeverIndexedLiteralHeader, 0);
98 // OnValueStart is not expected until the name has ended.
99 collector.OnValueStart(false, 10);
100 }
101
TEST(HpackEntryCollectorTest,LiteralNameValueHeader)102 TEST(HpackEntryCollectorTest, LiteralNameValueHeader) {
103 HpackEntryCollector collector;
104 collector.OnStartLiteralHeader(HpackEntryType::kUnindexedLiteralHeader, 0);
105 QUICHE_VLOG(1) << collector;
106 EXPECT_FALSE(collector.IsClear());
107 EXPECT_FALSE(collector.IsComplete());
108 collector.OnNameStart(false, 4);
109 collector.OnNameData("na", 2);
110 QUICHE_VLOG(1) << collector;
111 collector.OnNameData("me", 2);
112 collector.OnNameEnd();
113 collector.OnValueStart(true, 5);
114 QUICHE_VLOG(1) << collector;
115 collector.OnValueData("Value", 5);
116 collector.OnValueEnd();
117 QUICHE_VLOG(1) << collector;
118 EXPECT_FALSE(collector.IsClear());
119 EXPECT_TRUE(collector.IsComplete());
120 EXPECT_TRUE(collector.ValidateLiteralNameValueHeader(
121 HpackEntryType::kUnindexedLiteralHeader, false, "name", true, "Value"));
122 EXPECT_FATAL_FAILURE(LiteralNameValueHeaderErrorTest(),
123 "Value of: name_.HasEnded");
124 }
125
DynamicTableSizeUpdateErrorTest()126 void DynamicTableSizeUpdateErrorTest() {
127 HpackEntryCollector collector;
128 collector.OnDynamicTableSizeUpdate(123);
129 EXPECT_FALSE(collector.IsClear());
130 EXPECT_TRUE(collector.IsComplete());
131 EXPECT_TRUE(collector.ValidateDynamicTableSizeUpdate(123));
132 // The next statement will fail because the collector
133 // has already been used.
134 collector.OnDynamicTableSizeUpdate(234);
135 }
136
TEST(HpackEntryCollectorTest,DynamicTableSizeUpdate)137 TEST(HpackEntryCollectorTest, DynamicTableSizeUpdate) {
138 HpackEntryCollector collector;
139 collector.OnDynamicTableSizeUpdate(8192);
140 QUICHE_VLOG(1) << collector;
141 EXPECT_FALSE(collector.IsClear());
142 EXPECT_TRUE(collector.IsComplete());
143 EXPECT_TRUE(collector.ValidateDynamicTableSizeUpdate(8192));
144 EXPECT_EQ(collector,
145 HpackEntryCollector(HpackEntryType::kDynamicTableSizeUpdate, 8192));
146 EXPECT_NE(collector,
147 HpackEntryCollector(HpackEntryType::kIndexedHeader, 8192));
148 EXPECT_NE(collector,
149 HpackEntryCollector(HpackEntryType::kDynamicTableSizeUpdate, 8191));
150 EXPECT_FATAL_FAILURE(DynamicTableSizeUpdateErrorTest(), "Value of: started_");
151 }
152
153 } // namespace
154 } // namespace test
155 } // namespace http2
156