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_block_collector.h"
6
7 // Tests of HpackBlockCollector. Not intended to be comprehensive, as
8 // HpackBlockCollector is itself support for testing HpackBlockDecoder, and
9 // should be pretty thoroughly exercised via the tests of HpackBlockDecoder.
10
11 #include "quiche/http2/test_tools/hpack_block_builder.h"
12 #include "quiche/common/platform/api/quiche_test.h"
13
14 namespace http2 {
15 namespace test {
16 namespace {
17
TEST(HpackBlockCollectorTest,Clear)18 TEST(HpackBlockCollectorTest, Clear) {
19 HpackBlockCollector collector;
20 EXPECT_TRUE(collector.IsClear());
21 EXPECT_TRUE(collector.IsNotPending());
22
23 collector.OnIndexedHeader(234);
24 EXPECT_FALSE(collector.IsClear());
25 EXPECT_TRUE(collector.IsNotPending());
26
27 collector.Clear();
28 EXPECT_TRUE(collector.IsClear());
29 EXPECT_TRUE(collector.IsNotPending());
30
31 collector.OnDynamicTableSizeUpdate(0);
32 EXPECT_FALSE(collector.IsClear());
33 EXPECT_TRUE(collector.IsNotPending());
34
35 collector.Clear();
36 collector.OnStartLiteralHeader(HpackEntryType::kIndexedLiteralHeader, 1);
37 EXPECT_FALSE(collector.IsClear());
38 EXPECT_FALSE(collector.IsNotPending());
39 }
40
TEST(HpackBlockCollectorTest,IndexedHeader)41 TEST(HpackBlockCollectorTest, IndexedHeader) {
42 HpackBlockCollector a;
43 a.OnIndexedHeader(123);
44 EXPECT_TRUE(a.ValidateSoleIndexedHeader(123));
45
46 HpackBlockCollector b;
47 EXPECT_FALSE(a.VerifyEq(b));
48
49 b.OnIndexedHeader(1);
50 EXPECT_TRUE(b.ValidateSoleIndexedHeader(1));
51 EXPECT_FALSE(a.VerifyEq(b));
52
53 b.Clear();
54 b.OnIndexedHeader(123);
55 EXPECT_TRUE(a.VerifyEq(b));
56
57 b.OnIndexedHeader(234);
58 EXPECT_FALSE(b.VerifyEq(a));
59 a.OnIndexedHeader(234);
60 EXPECT_TRUE(b.VerifyEq(a));
61
62 std::string expected;
63 {
64 HpackBlockBuilder hbb;
65 hbb.AppendIndexedHeader(123);
66 hbb.AppendIndexedHeader(234);
67 EXPECT_EQ(3u, hbb.size());
68 expected = hbb.buffer();
69 }
70 std::string actual;
71 {
72 HpackBlockBuilder hbb;
73 a.AppendToHpackBlockBuilder(&hbb);
74 EXPECT_EQ(3u, hbb.size());
75 actual = hbb.buffer();
76 }
77 EXPECT_EQ(expected, actual);
78 }
79
TEST(HpackBlockCollectorTest,DynamicTableSizeUpdate)80 TEST(HpackBlockCollectorTest, DynamicTableSizeUpdate) {
81 HpackBlockCollector a;
82 a.OnDynamicTableSizeUpdate(0);
83 EXPECT_TRUE(a.ValidateSoleDynamicTableSizeUpdate(0));
84
85 HpackBlockCollector b;
86 EXPECT_FALSE(a.VerifyEq(b));
87
88 b.OnDynamicTableSizeUpdate(1);
89 EXPECT_TRUE(b.ValidateSoleDynamicTableSizeUpdate(1));
90 EXPECT_FALSE(a.VerifyEq(b));
91
92 b.Clear();
93 b.OnDynamicTableSizeUpdate(0);
94 EXPECT_TRUE(a.VerifyEq(b));
95
96 b.OnDynamicTableSizeUpdate(4096);
97 EXPECT_FALSE(b.VerifyEq(a));
98 a.OnDynamicTableSizeUpdate(4096);
99 EXPECT_TRUE(b.VerifyEq(a));
100
101 std::string expected;
102 {
103 HpackBlockBuilder hbb;
104 hbb.AppendDynamicTableSizeUpdate(0);
105 hbb.AppendDynamicTableSizeUpdate(4096);
106 EXPECT_EQ(4u, hbb.size());
107 expected = hbb.buffer();
108 }
109 std::string actual;
110 {
111 HpackBlockBuilder hbb;
112 a.AppendToHpackBlockBuilder(&hbb);
113 EXPECT_EQ(4u, hbb.size());
114 actual = hbb.buffer();
115 }
116 EXPECT_EQ(expected, actual);
117 }
118
119 } // namespace
120 } // namespace test
121 } // namespace http2
122