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