| Index: net/quic/core/spdy_utils_test.cc
|
| diff --git a/net/quic/core/spdy_utils_test.cc b/net/quic/core/spdy_utils_test.cc
|
| index 1b19488f4cd84671fedd77cd0d526cbe83276dbc..6acfc83d01b987b2bbcc754e916ac399f2e01046 100644
|
| --- a/net/quic/core/spdy_utils_test.cc
|
| +++ b/net/quic/core/spdy_utils_test.cc
|
| @@ -6,8 +6,9 @@
|
| #include <memory>
|
|
|
| #include "base/macros.h"
|
| +#include "net/quic/platform/api/quic_flag_utils.h"
|
| +#include "net/quic/platform/api/quic_flags.h"
|
| #include "net/quic/platform/api/quic_string_piece.h"
|
| -#include "net/quic/platform/api/quic_test.h"
|
| #include "net/quic/platform/api/quic_text_utils.h"
|
| #include "net/test/gtest_util.h"
|
|
|
| @@ -29,9 +30,7 @@ static std::unique_ptr<QuicHeaderList> FromList(
|
| return headers;
|
| }
|
|
|
| -class SpdyUtilsTest : public QuicTest {};
|
| -
|
| -TEST_F(SpdyUtilsTest, CopyAndValidateHeaders) {
|
| +TEST(CopyAndValidateHeaders, NormalUsage) {
|
| auto headers = FromList({// All cookie crumbs are joined.
|
| {"cookie", " part 1"},
|
| {"cookie", "part 2 "},
|
| @@ -70,7 +69,7 @@ TEST_F(SpdyUtilsTest, CopyAndValidateHeaders) {
|
| EXPECT_EQ(-1, content_length);
|
| }
|
|
|
| -TEST_F(SpdyUtilsTest, CopyAndValidateHeadersEmptyName) {
|
| +TEST(CopyAndValidateHeaders, EmptyName) {
|
| auto headers = FromList({{"foo", "foovalue"}, {"", "barvalue"}, {"baz", ""}});
|
| int64_t content_length = -1;
|
| SpdyHeaderBlock block;
|
| @@ -78,7 +77,7 @@ TEST_F(SpdyUtilsTest, CopyAndValidateHeadersEmptyName) {
|
| SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block));
|
| }
|
|
|
| -TEST_F(SpdyUtilsTest, CopyAndValidateHeadersUpperCaseName) {
|
| +TEST(CopyAndValidateHeaders, UpperCaseName) {
|
| auto headers =
|
| FromList({{"foo", "foovalue"}, {"bar", "barvalue"}, {"bAz", ""}});
|
| int64_t content_length = -1;
|
| @@ -87,7 +86,7 @@ TEST_F(SpdyUtilsTest, CopyAndValidateHeadersUpperCaseName) {
|
| SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block));
|
| }
|
|
|
| -TEST_F(SpdyUtilsTest, CopyAndValidateHeadersMultipleContentLengths) {
|
| +TEST(CopyAndValidateHeaders, MultipleContentLengths) {
|
| auto headers = FromList({{"content-length", "9"},
|
| {"foo", "foovalue"},
|
| {"content-length", "9"},
|
| @@ -107,7 +106,7 @@ TEST_F(SpdyUtilsTest, CopyAndValidateHeadersMultipleContentLengths) {
|
| EXPECT_EQ(9, content_length);
|
| }
|
|
|
| -TEST_F(SpdyUtilsTest, CopyAndValidateHeadersInconsistentContentLengths) {
|
| +TEST(CopyAndValidateHeaders, InconsistentContentLengths) {
|
| auto headers = FromList({{"content-length", "9"},
|
| {"foo", "foovalue"},
|
| {"content-length", "8"},
|
| @@ -119,7 +118,7 @@ TEST_F(SpdyUtilsTest, CopyAndValidateHeadersInconsistentContentLengths) {
|
| SpdyUtils::CopyAndValidateHeaders(*headers, &content_length, &block));
|
| }
|
|
|
| -TEST_F(SpdyUtilsTest, CopyAndValidateHeadersLargeContentLength) {
|
| +TEST(CopyAndValidateHeaders, LargeContentLength) {
|
| auto headers = FromList({{"content-length", "9000000000"},
|
| {"foo", "foovalue"},
|
| {"bar", "barvalue"},
|
| @@ -135,7 +134,7 @@ TEST_F(SpdyUtilsTest, CopyAndValidateHeadersLargeContentLength) {
|
| EXPECT_EQ(9000000000, content_length);
|
| }
|
|
|
| -TEST_F(SpdyUtilsTest, CopyAndValidateHeadersMultipleValues) {
|
| +TEST(CopyAndValidateHeaders, MultipleValues) {
|
| auto headers = FromList({{"foo", "foovalue"},
|
| {"bar", "barvalue"},
|
| {"baz", ""},
|
| @@ -152,7 +151,7 @@ TEST_F(SpdyUtilsTest, CopyAndValidateHeadersMultipleValues) {
|
| EXPECT_EQ(-1, content_length);
|
| }
|
|
|
| -TEST_F(SpdyUtilsTest, CopyAndValidateHeadersMoreThanTwoValues) {
|
| +TEST(CopyAndValidateHeaders, MoreThanTwoValues) {
|
| auto headers = FromList({{"set-cookie", "value1"},
|
| {"set-cookie", "value2"},
|
| {"set-cookie", "value3"}});
|
| @@ -166,7 +165,7 @@ TEST_F(SpdyUtilsTest, CopyAndValidateHeadersMoreThanTwoValues) {
|
| EXPECT_EQ(-1, content_length);
|
| }
|
|
|
| -TEST_F(SpdyUtilsTest, CopyAndValidateHeadersCookie) {
|
| +TEST(CopyAndValidateHeaders, Cookie) {
|
| auto headers = FromList({{"foo", "foovalue"},
|
| {"bar", "barvalue"},
|
| {"cookie", "value1"},
|
| @@ -181,7 +180,7 @@ TEST_F(SpdyUtilsTest, CopyAndValidateHeadersCookie) {
|
| EXPECT_EQ(-1, content_length);
|
| }
|
|
|
| -TEST_F(SpdyUtilsTest, CopyAndValidateHeadersMultipleCookies) {
|
| +TEST(CopyAndValidateHeaders, MultipleCookies) {
|
| auto headers = FromList({{"foo", "foovalue"},
|
| {"bar", "barvalue"},
|
| {"cookie", "value1"},
|
| @@ -197,7 +196,108 @@ TEST_F(SpdyUtilsTest, CopyAndValidateHeadersMultipleCookies) {
|
| EXPECT_EQ(-1, content_length);
|
| }
|
|
|
| -TEST_F(SpdyUtilsTest, GetUrlFromHeaderBlock) {
|
| +TEST(CopyAndValidateTrailers, SimplestValidList) {
|
| + // Verify that the simplest trailers are valid: just a final byte offset that
|
| + // gets parsed successfully.
|
| + auto trailers = FromList({{kFinalOffsetHeaderKey, "1234"}});
|
| + size_t final_byte_offset = 0;
|
| + SpdyHeaderBlock block;
|
| + EXPECT_TRUE(SpdyUtils::CopyAndValidateTrailers(*trailers, &final_byte_offset,
|
| + &block));
|
| + EXPECT_EQ(1234u, final_byte_offset);
|
| +}
|
| +
|
| +TEST(CopyAndValidateTrailers, EmptyTrailerList) {
|
| + // An empty trailer list will fail as required key kFinalOffsetHeaderKey is
|
| + // not present.
|
| + QuicHeaderList trailers;
|
| + size_t final_byte_offset = 0;
|
| + SpdyHeaderBlock block;
|
| + EXPECT_FALSE(
|
| + SpdyUtils::CopyAndValidateTrailers(trailers, &final_byte_offset, &block));
|
| +}
|
| +
|
| +TEST(CopyAndValidateTrailers, FinalByteOffsetNotPresent) {
|
| + // Validation fails if required kFinalOffsetHeaderKey is not present, even if
|
| + // the rest of the header block is valid.
|
| + auto trailers = FromList({{"key", "value"}});
|
| + size_t final_byte_offset = 0;
|
| + SpdyHeaderBlock block;
|
| + EXPECT_FALSE(SpdyUtils::CopyAndValidateTrailers(*trailers, &final_byte_offset,
|
| + &block));
|
| +}
|
| +
|
| +TEST(CopyAndValidateTrailers, EmptyName) {
|
| + // Trailer validation will fail with an empty header key, in an otherwise
|
| + // valid block of trailers.
|
| + auto trailers = FromList({{"", "value"}, {kFinalOffsetHeaderKey, "1234"}});
|
| + size_t final_byte_offset = 0;
|
| + SpdyHeaderBlock block;
|
| + EXPECT_FALSE(SpdyUtils::CopyAndValidateTrailers(*trailers, &final_byte_offset,
|
| + &block));
|
| +}
|
| +
|
| +TEST(CopyAndValidateTrailers, PseudoHeaderInTrailers) {
|
| + // Pseudo headers are illegal in trailers.
|
| + auto trailers =
|
| + FromList({{":pseudo_key", "value"}, {kFinalOffsetHeaderKey, "1234"}});
|
| + size_t final_byte_offset = 0;
|
| + SpdyHeaderBlock block;
|
| + EXPECT_FALSE(SpdyUtils::CopyAndValidateTrailers(*trailers, &final_byte_offset,
|
| + &block));
|
| +}
|
| +
|
| +TEST(CopyAndValidateTrailers, DuplicateTrailers) {
|
| + // Duplicate trailers are allowed, and their values are concatenated into a
|
| + // single string delimted with '\0'. Some of the duplicate headers
|
| + // deliberately have an empty value.
|
| + FLAGS_quic_reloadable_flag_quic_handle_duplicate_trailers = true;
|
| + auto trailers = FromList({{"key", "value0"},
|
| + {"key", "value1"},
|
| + {"key", ""},
|
| + {"key", ""},
|
| + {"key", "value2"},
|
| + {"key", ""},
|
| + {kFinalOffsetHeaderKey, "1234"},
|
| + {"other_key", "value"},
|
| + {"key", "non_contiguous_duplicate"}});
|
| + size_t final_byte_offset = 0;
|
| + SpdyHeaderBlock block;
|
| + EXPECT_TRUE(SpdyUtils::CopyAndValidateTrailers(*trailers, &final_byte_offset,
|
| + &block));
|
| + EXPECT_THAT(
|
| + block,
|
| + UnorderedElementsAre(
|
| + Pair("key",
|
| + QuicStringPiece(
|
| + "value0\0value1\0\0\0value2\0\0non_contiguous_duplicate",
|
| + 48)),
|
| + Pair("other_key", "value")));
|
| +}
|
| +
|
| +TEST(CopyAndValidateTrailers, DuplicateCookies) {
|
| + // Duplicate cookie headers in trailers should be concatenated into a single
|
| + // "; " delimted string.
|
| + FLAGS_quic_reloadable_flag_quic_handle_duplicate_trailers = true;
|
| + auto headers = FromList({{"cookie", " part 1"},
|
| + {"cookie", "part 2 "},
|
| + {"cookie", "part3"},
|
| + {"key", "value"},
|
| + {kFinalOffsetHeaderKey, "1234"},
|
| + {"cookie", " non_contiguous_cookie!"}});
|
| +
|
| + size_t final_byte_offset = 0;
|
| + SpdyHeaderBlock block;
|
| + EXPECT_TRUE(
|
| + SpdyUtils::CopyAndValidateTrailers(*headers, &final_byte_offset, &block));
|
| + EXPECT_THAT(
|
| + block,
|
| + UnorderedElementsAre(
|
| + Pair("cookie", " part 1; part 2 ; part3; non_contiguous_cookie!"),
|
| + Pair("key", "value")));
|
| +}
|
| +
|
| +TEST(GetUrlFromHeaderBlock, Basic) {
|
| SpdyHeaderBlock headers;
|
| EXPECT_EQ(SpdyUtils::GetUrlFromHeaderBlock(headers), "");
|
| headers[":scheme"] = "https";
|
| @@ -213,7 +313,7 @@ TEST_F(SpdyUtilsTest, GetUrlFromHeaderBlock) {
|
| "https://www.google.com/index.html");
|
| }
|
|
|
| -TEST_F(SpdyUtilsTest, GetHostNameFromHeaderBlock) {
|
| +TEST(GetHostNameFromHeaderBlock, NormalUsage) {
|
| SpdyHeaderBlock headers;
|
| EXPECT_EQ(SpdyUtils::GetHostNameFromHeaderBlock(headers), "");
|
| headers[":scheme"] = "https";
|
| @@ -233,7 +333,7 @@ TEST_F(SpdyUtilsTest, GetHostNameFromHeaderBlock) {
|
| EXPECT_EQ(SpdyUtils::GetHostNameFromHeaderBlock(headers), "192.168.1.1");
|
| }
|
|
|
| -TEST_F(SpdyUtilsTest, PopulateHeaderBlockFromUrl) {
|
| +TEST(PopulateHeaderBlockFromUrl, NormalUsage) {
|
| string url = "https://www.google.com/index.html";
|
| SpdyHeaderBlock headers;
|
| EXPECT_TRUE(SpdyUtils::PopulateHeaderBlockFromUrl(url, &headers));
|
| @@ -242,7 +342,7 @@ TEST_F(SpdyUtilsTest, PopulateHeaderBlockFromUrl) {
|
| EXPECT_EQ("/index.html", headers[":path"].as_string());
|
| }
|
|
|
| -TEST_F(SpdyUtilsTest, PopulateHeaderBlockFromUrlWithNoPath) {
|
| +TEST(PopulateHeaderBlockFromUrl, UrlWithNoPath) {
|
| string url = "https://www.google.com";
|
| SpdyHeaderBlock headers;
|
| EXPECT_TRUE(SpdyUtils::PopulateHeaderBlockFromUrl(url, &headers));
|
| @@ -251,7 +351,7 @@ TEST_F(SpdyUtilsTest, PopulateHeaderBlockFromUrlWithNoPath) {
|
| EXPECT_EQ("/", headers[":path"].as_string());
|
| }
|
|
|
| -TEST_F(SpdyUtilsTest, PopulateHeaderBlockFromUrlFails) {
|
| +TEST(PopulateHeaderBlockFromUrl, Failure) {
|
| SpdyHeaderBlock headers;
|
| EXPECT_FALSE(SpdyUtils::PopulateHeaderBlockFromUrl("/", &headers));
|
| EXPECT_FALSE(SpdyUtils::PopulateHeaderBlockFromUrl("/index.html", &headers));
|
|
|