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