xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/quic/core/http/metadata_decoder_test.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2024 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/quic/core/http/metadata_decoder.h"
6 
7 #include "absl/strings/escaping.h"
8 #include "quiche/quic/core/qpack/qpack_encoder.h"
9 #include "quiche/quic/platform/api/quic_test.h"
10 #include "quiche/quic/test_tools/quic_test_utils.h"
11 
12 namespace quic {
13 namespace test {
14 namespace {
15 
16 class MetadataDecoderTest : public QuicTest {
17  protected:
EncodeHeaders(spdy::Http2HeaderBlock & headers)18   std::string EncodeHeaders(spdy::Http2HeaderBlock& headers) {
19     quic::NoopDecoderStreamErrorDelegate delegate;
20     quic::QpackEncoder encoder(&delegate, quic::HuffmanEncoding::kDisabled);
21     return encoder.EncodeHeaderList(id_, headers,
22                                     /*encoder_stream_sent_byte_count=*/nullptr);
23   }
24 
25   size_t max_header_list_size = 1 << 20;  // 1 MB
26   const QuicStreamId id_ = 1;
27 };
28 
TEST_F(MetadataDecoderTest,Initialize)29 TEST_F(MetadataDecoderTest, Initialize) {
30   const size_t frame_header_len = 4;
31   const size_t payload_len = 123;
32   MetadataDecoder decoder(id_, max_header_list_size, frame_header_len,
33                           payload_len);
34   EXPECT_EQ(frame_header_len + payload_len, decoder.frame_len());
35   EXPECT_EQ("", decoder.error_message());
36   EXPECT_TRUE(decoder.headers().empty());
37 }
38 
TEST_F(MetadataDecoderTest,Decode)39 TEST_F(MetadataDecoderTest, Decode) {
40   spdy::Http2HeaderBlock headers;
41   headers["key1"] = "val1";
42   headers["key2"] = "val2";
43   headers["key3"] = "val3";
44   std::string data = EncodeHeaders(headers);
45 
46   const size_t frame_header_len = 4;
47   MetadataDecoder decoder(id_, max_header_list_size, frame_header_len,
48                           data.length());
49   EXPECT_TRUE(decoder.Decode(data));
50   EXPECT_TRUE(decoder.EndHeaderBlock());
51   EXPECT_EQ(quic::test::AsHeaderList(headers), decoder.headers());
52 }
53 
TEST_F(MetadataDecoderTest,DecodeInvalidHeaders)54 TEST_F(MetadataDecoderTest, DecodeInvalidHeaders) {
55   std::string data = "aaaaaaaaaa";
56 
57   const size_t frame_header_len = 4;
58   MetadataDecoder decoder(id_, max_header_list_size, frame_header_len,
59                           data.length());
60   EXPECT_FALSE(decoder.Decode(data));
61   EXPECT_EQ("Error decoding metadata: Error decoding Required Insert Count.",
62             decoder.error_message());
63 }
64 
TEST_F(MetadataDecoderTest,TooLarge)65 TEST_F(MetadataDecoderTest, TooLarge) {
66   spdy::Http2HeaderBlock headers;
67   for (int i = 0; i < 1024; ++i) {
68     headers.AppendValueOrAddHeader(absl::StrCat(i), std::string(1024, 'a'));
69   }
70   std::string data = EncodeHeaders(headers);
71 
72   EXPECT_GT(data.length(), 1 << 20);
73   const size_t frame_header_len = 4;
74   MetadataDecoder decoder(id_, max_header_list_size, frame_header_len,
75                           data.length());
76   EXPECT_TRUE(decoder.Decode(data));
77   EXPECT_FALSE(decoder.EndHeaderBlock());
78   EXPECT_TRUE(decoder.error_message().empty());
79 }
80 
81 }  // namespace
82 }  // namespace test
83 }  // namespace quic
84