summaryrefslogtreecommitdiff
path: root/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_round_trip_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_round_trip_test.cc')
-rw-r--r--chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_round_trip_test.cc136
1 files changed, 136 insertions, 0 deletions
diff --git a/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_round_trip_test.cc b/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_round_trip_test.cc
new file mode 100644
index 00000000000..00a18c53eb8
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quiche/quic/core/qpack/qpack_round_trip_test.cc
@@ -0,0 +1,136 @@
+// Copyright (c) 2018 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 <string>
+#include <tuple>
+
+#include "absl/strings/string_view.h"
+#include "quiche/quic/platform/api/quic_test.h"
+#include "quiche/quic/test_tools/qpack/qpack_decoder_test_utils.h"
+#include "quiche/quic/test_tools/qpack/qpack_encoder_test_utils.h"
+#include "quiche/quic/test_tools/qpack/qpack_test_utils.h"
+#include "quiche/spdy/core/spdy_header_block.h"
+
+using ::testing::Values;
+
+namespace quic {
+namespace test {
+namespace {
+
+class QpackRoundTripTest : public QuicTestWithParam<FragmentMode> {
+ public:
+ QpackRoundTripTest() = default;
+ ~QpackRoundTripTest() override = default;
+
+ spdy::Http2HeaderBlock EncodeThenDecode(
+ const spdy::Http2HeaderBlock& header_list) {
+ NoopDecoderStreamErrorDelegate decoder_stream_error_delegate;
+ NoopQpackStreamSenderDelegate encoder_stream_sender_delegate;
+ QpackEncoder encoder(&decoder_stream_error_delegate);
+ encoder.set_qpack_stream_sender_delegate(&encoder_stream_sender_delegate);
+ std::string encoded_header_block =
+ encoder.EncodeHeaderList(/* stream_id = */ 1, header_list, nullptr);
+
+ TestHeadersHandler handler;
+ NoopEncoderStreamErrorDelegate encoder_stream_error_delegate;
+ NoopQpackStreamSenderDelegate decoder_stream_sender_delegate;
+ // TODO(b/112770235): Test dynamic table and blocked streams.
+ QpackDecode(
+ /* maximum_dynamic_table_capacity = */ 0,
+ /* maximum_blocked_streams = */ 0, &encoder_stream_error_delegate,
+ &decoder_stream_sender_delegate, &handler,
+ FragmentModeToFragmentSizeGenerator(GetParam()), encoded_header_block);
+
+ EXPECT_TRUE(handler.decoding_completed());
+ EXPECT_FALSE(handler.decoding_error_detected());
+
+ return handler.ReleaseHeaderList();
+ }
+};
+
+INSTANTIATE_TEST_SUITE_P(All, QpackRoundTripTest,
+ Values(FragmentMode::kSingleChunk,
+ FragmentMode::kOctetByOctet));
+
+TEST_P(QpackRoundTripTest, Empty) {
+ spdy::Http2HeaderBlock header_list;
+ spdy::Http2HeaderBlock output = EncodeThenDecode(header_list);
+ EXPECT_EQ(header_list, output);
+}
+
+TEST_P(QpackRoundTripTest, EmptyName) {
+ spdy::Http2HeaderBlock header_list;
+ header_list["foo"] = "bar";
+ header_list[""] = "bar";
+
+ spdy::Http2HeaderBlock output = EncodeThenDecode(header_list);
+ EXPECT_EQ(header_list, output);
+}
+
+TEST_P(QpackRoundTripTest, EmptyValue) {
+ spdy::Http2HeaderBlock header_list;
+ header_list["foo"] = "";
+ header_list[""] = "";
+
+ spdy::Http2HeaderBlock output = EncodeThenDecode(header_list);
+ EXPECT_EQ(header_list, output);
+}
+
+TEST_P(QpackRoundTripTest, MultipleWithLongEntries) {
+ spdy::Http2HeaderBlock header_list;
+ header_list["foo"] = "bar";
+ header_list[":path"] = "/";
+ header_list["foobaar"] = std::string(127, 'Z');
+ header_list[std::string(1000, 'b')] = std::string(1000, 'c');
+
+ spdy::Http2HeaderBlock output = EncodeThenDecode(header_list);
+ EXPECT_EQ(header_list, output);
+}
+
+TEST_P(QpackRoundTripTest, StaticTable) {
+ {
+ spdy::Http2HeaderBlock header_list;
+ header_list[":method"] = "GET";
+ header_list["accept-encoding"] = "gzip, deflate";
+ header_list["cache-control"] = "";
+ header_list["foo"] = "bar";
+ header_list[":path"] = "/";
+
+ spdy::Http2HeaderBlock output = EncodeThenDecode(header_list);
+ EXPECT_EQ(header_list, output);
+ }
+ {
+ spdy::Http2HeaderBlock header_list;
+ header_list[":method"] = "POST";
+ header_list["accept-encoding"] = "brotli";
+ header_list["cache-control"] = "foo";
+ header_list["foo"] = "bar";
+ header_list[":path"] = "/";
+
+ spdy::Http2HeaderBlock output = EncodeThenDecode(header_list);
+ EXPECT_EQ(header_list, output);
+ }
+ {
+ spdy::Http2HeaderBlock header_list;
+ header_list[":method"] = "CONNECT";
+ header_list["accept-encoding"] = "";
+ header_list["foo"] = "bar";
+ header_list[":path"] = "/";
+
+ spdy::Http2HeaderBlock output = EncodeThenDecode(header_list);
+ EXPECT_EQ(header_list, output);
+ }
+}
+
+TEST_P(QpackRoundTripTest, ValueHasNullCharacter) {
+ spdy::Http2HeaderBlock header_list;
+ header_list["foo"] = absl::string_view("bar\0bar\0baz", 11);
+
+ spdy::Http2HeaderBlock output = EncodeThenDecode(header_list);
+ EXPECT_EQ(header_list, output);
+}
+
+} // namespace
+} // namespace test
+} // namespace quic