| Index: net/quic/spdy_utils_test.cc
|
| diff --git a/net/quic/spdy_utils_test.cc b/net/quic/spdy_utils_test.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b727638caa2a6d1eebb47e23b6c666eb9f656425
|
| --- /dev/null
|
| +++ b/net/quic/spdy_utils_test.cc
|
| @@ -0,0 +1,140 @@
|
| +// Copyright 2016 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 "net/quic/spdy_utils.h"
|
| +
|
| +#include "base/macros.h"
|
| +#include "base/strings/string_number_conversions.h"
|
| +#include "net/test/gtest_util.h"
|
| +
|
| +using std::string;
|
| +
|
| +namespace net {
|
| +namespace test {
|
| +
|
| +TEST(SpdyUtilsTest, SerializeAndParseHeaders) {
|
| + // Creates a SpdyHeaderBlock with some key->value pairs, serializes it, then
|
| + // parses the serialized output and verifies that the end result is the same
|
| + // as the headers that the test started with.
|
| +
|
| + SpdyHeaderBlock input_headers;
|
| + input_headers[":pseudo1"] = "pseudo value1";
|
| + input_headers[":pseudo2"] = "pseudo value2";
|
| + input_headers["key1"] = "value1";
|
| + const int kContentLength = 1234;
|
| + input_headers["content-length"] = base::IntToString(kContentLength);
|
| + input_headers["key2"] = "value2";
|
| +
|
| + // Serialize the header block.
|
| + string serialized_headers =
|
| + SpdyUtils::SerializeUncompressedHeaders(input_headers);
|
| +
|
| + // Take the serialized header block, and parse back into SpdyHeaderBlock.
|
| + SpdyHeaderBlock output_headers;
|
| + int content_length = -1;
|
| + ASSERT_TRUE(SpdyUtils::ParseHeaders(serialized_headers.data(),
|
| + serialized_headers.size(),
|
| + &content_length, &output_headers));
|
| +
|
| + // Should be back to the original headers.
|
| + EXPECT_EQ(content_length, kContentLength);
|
| + EXPECT_EQ(output_headers, input_headers);
|
| +}
|
| +
|
| +TEST(SpdyUtilsTest, SerializeAndParseValidTrailers) {
|
| + // Creates a SpdyHeaderBlock with some valid Trailers key->value pairs,
|
| + // serializes it, then parses the serialized output and verifies that the end
|
| + // result is the same as the trailers that the test started with.
|
| + SpdyHeaderBlock input_trailers;
|
| + const size_t kFinalOffset = 5678;
|
| + input_trailers[kFinalOffsetHeaderKey] = base::IntToString(kFinalOffset);
|
| + input_trailers["key1"] = "value1";
|
| + input_trailers["key2"] = "value2";
|
| +
|
| + // Serialize the trailers.
|
| + string serialized_trailers =
|
| + SpdyUtils::SerializeUncompressedHeaders(input_trailers);
|
| +
|
| + // Take the serialized trailers, and parse back into a SpdyHeaderBlock.
|
| + SpdyHeaderBlock output_trailers;
|
| + size_t final_byte_offset = 0;
|
| + EXPECT_TRUE(SpdyUtils::ParseTrailers(serialized_trailers.data(),
|
| + serialized_trailers.size(),
|
| + &final_byte_offset, &output_trailers));
|
| +
|
| + // Should be back to the original trailers, without the final offset header.
|
| + EXPECT_EQ(final_byte_offset, kFinalOffset);
|
| + input_trailers.erase(kFinalOffsetHeaderKey);
|
| + EXPECT_EQ(output_trailers, input_trailers);
|
| +}
|
| +
|
| +TEST(SpdyUtilsTest, SerializeAndParseTrailersWithoutFinalOffset) {
|
| + // Verifies that parsing fails if Trailers are missing a final offset header.
|
| +
|
| + SpdyHeaderBlock input_trailers;
|
| + input_trailers["key1"] = "value1";
|
| + input_trailers["key2"] = "value2";
|
| +
|
| + // Serialize the trailers.
|
| + string serialized_trailers =
|
| + SpdyUtils::SerializeUncompressedHeaders(input_trailers);
|
| +
|
| + // Parsing the serialized trailers fails because of the missing final offset.
|
| + SpdyHeaderBlock output_trailers;
|
| + size_t final_byte_offset = 0;
|
| + EXPECT_FALSE(SpdyUtils::ParseTrailers(serialized_trailers.data(),
|
| + serialized_trailers.size(),
|
| + &final_byte_offset, &output_trailers));
|
| + EXPECT_EQ(final_byte_offset, 0u);
|
| +}
|
| +
|
| +TEST(SpdyUtilsTest, SerializeAndParseTrailersWithPseudoHeaders) {
|
| + // Verifies that parsing fails if Trailers include pseudo-headers.
|
| +
|
| + SpdyHeaderBlock input_trailers;
|
| + input_trailers[kFinalOffsetHeaderKey] = "12345";
|
| + input_trailers[":disallowed-pseudo-header"] = "pseudo value";
|
| + input_trailers["key1"] = "value1";
|
| + input_trailers["key2"] = "value2";
|
| +
|
| + // Serialize the trailers.
|
| + string serialized_trailers =
|
| + SpdyUtils::SerializeUncompressedHeaders(input_trailers);
|
| +
|
| + // Parsing the serialized trailers fails because of the extra pseudo header.
|
| + SpdyHeaderBlock output_trailers;
|
| + size_t final_byte_offset = 0;
|
| + EXPECT_FALSE(SpdyUtils::ParseTrailers(serialized_trailers.data(),
|
| + serialized_trailers.size(),
|
| + &final_byte_offset, &output_trailers));
|
| +}
|
| +
|
| +TEST(SpdyUtilsTest, GetUrlFromHeaderBlock) {
|
| + SpdyHeaderBlock headers;
|
| + EXPECT_EQ(SpdyUtils::GetUrlFromHeaderBlock(headers), "");
|
| + headers[":scheme"] = "https";
|
| + EXPECT_EQ(SpdyUtils::GetUrlFromHeaderBlock(headers), "");
|
| + headers[":authority"] = "www.google.com";
|
| + EXPECT_EQ(SpdyUtils::GetUrlFromHeaderBlock(headers), "");
|
| + headers[":path"] = "/index.html";
|
| + EXPECT_EQ(SpdyUtils::GetUrlFromHeaderBlock(headers),
|
| + "https://www.google.com/index.html");
|
| + headers["key1"] = "value1";
|
| + headers["key2"] = "value2";
|
| + EXPECT_EQ(SpdyUtils::GetUrlFromHeaderBlock(headers),
|
| + "https://www.google.com/index.html");
|
| +}
|
| +
|
| +TEST(SpdyUtilsTest, UrlIsValid) {
|
| + SpdyHeaderBlock headers;
|
| + EXPECT_FALSE(SpdyUtils::UrlIsValid(headers));
|
| + headers[":scheme"] = "https";
|
| + EXPECT_FALSE(SpdyUtils::UrlIsValid(headers));
|
| + headers[":authority"] = "www.google.com";
|
| + EXPECT_FALSE(SpdyUtils::UrlIsValid(headers));
|
| + headers[":path"] = "/index.html";
|
| + EXPECT_TRUE(SpdyUtils::UrlIsValid(headers));
|
| +}
|
| +
|
| +} // namespace test
|
| +} // namespace net_quic
|
|
|