// Copyright 2024 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "quiche/quic/core/http/metadata_decoder.h"

#include "absl/strings/escaping.h"
#include "quiche/quic/core/qpack/qpack_encoder.h"
#include "quiche/quic/platform/api/quic_test.h"
#include "quiche/quic/test_tools/quic_test_utils.h"

namespace quic {
namespace test {
namespace {

class MetadataDecoderTest : public QuicTest {
 protected:
  std::string EncodeHeaders(spdy::Http2HeaderBlock& headers) {
    quic::NoopDecoderStreamErrorDelegate delegate;
    quic::QpackEncoder encoder(&delegate, quic::HuffmanEncoding::kDisabled);
    return encoder.EncodeHeaderList(id_, headers,
                                    /*encoder_stream_sent_byte_count=*/nullptr);
  }

  size_t max_header_list_size = 1 << 20;  // 1 MB
  const QuicStreamId id_ = 1;
};

TEST_F(MetadataDecoderTest, Initialize) {
  const size_t frame_header_len = 4;
  const size_t payload_len = 123;
  MetadataDecoder decoder(id_, max_header_list_size, frame_header_len,
                          payload_len);
  EXPECT_EQ(frame_header_len + payload_len, decoder.frame_len());
  EXPECT_EQ("", decoder.error_message());
  EXPECT_TRUE(decoder.headers().empty());
}

TEST_F(MetadataDecoderTest, Decode) {
  spdy::Http2HeaderBlock headers;
  headers["key1"] = "val1";
  headers["key2"] = "val2";
  headers["key3"] = "val3";
  std::string data = EncodeHeaders(headers);

  const size_t frame_header_len = 4;
  MetadataDecoder decoder(id_, max_header_list_size, frame_header_len,
                          data.length());
  EXPECT_TRUE(decoder.Decode(data));
  EXPECT_TRUE(decoder.EndHeaderBlock());
  EXPECT_EQ(quic::test::AsHeaderList(headers), decoder.headers());
}

TEST_F(MetadataDecoderTest, DecodeInvalidHeaders) {
  std::string data = "aaaaaaaaaa";

  const size_t frame_header_len = 4;
  MetadataDecoder decoder(id_, max_header_list_size, frame_header_len,
                          data.length());
  EXPECT_FALSE(decoder.Decode(data));
  EXPECT_EQ("Error decoding metadata: Error decoding Required Insert Count.",
            decoder.error_message());
}

TEST_F(MetadataDecoderTest, TooLarge) {
  spdy::Http2HeaderBlock headers;
  for (int i = 0; i < 1024; ++i) {
    headers.AppendValueOrAddHeader(absl::StrCat(i), std::string(1024, 'a'));
  }
  std::string data = EncodeHeaders(headers);

  EXPECT_GT(data.length(), 1 << 20);
  const size_t frame_header_len = 4;
  MetadataDecoder decoder(id_, max_header_list_size, frame_header_len,
                          data.length());
  EXPECT_TRUE(decoder.Decode(data));
  EXPECT_FALSE(decoder.EndHeaderBlock());
  EXPECT_TRUE(decoder.error_message().empty());
}

}  // namespace
}  // namespace test
}  // namespace quic
