diff options
Diffstat (limited to 'chromium/net/third_party/quiche/src/quiche/balsa/balsa_frame_test.cc')
-rw-r--r-- | chromium/net/third_party/quiche/src/quiche/balsa/balsa_frame_test.cc | 91 |
1 files changed, 71 insertions, 20 deletions
diff --git a/chromium/net/third_party/quiche/src/quiche/balsa/balsa_frame_test.cc b/chromium/net/third_party/quiche/src/quiche/balsa/balsa_frame_test.cc index 1ce4c7b540f..4618bbcf3b2 100644 --- a/chromium/net/third_party/quiche/src/quiche/balsa/balsa_frame_test.cc +++ b/chromium/net/third_party/quiche/src/quiche/balsa/balsa_frame_test.cc @@ -539,6 +539,8 @@ class BalsaVisitorMock : public BalsaVisitorInterface { MOCK_METHOD(void, OnRawBodyInput, (absl::string_view input), (override)); MOCK_METHOD(void, OnBodyChunkInput, (absl::string_view input), (override)); MOCK_METHOD(void, OnHeaderInput, (absl::string_view input), (override)); + MOCK_METHOD(void, OnHeader, (absl::string_view key, absl::string_view value), + (override)); MOCK_METHOD(void, OnTrailerInput, (absl::string_view input), (override)); MOCK_METHOD(void, ProcessHeaders, (const FakeHeaders& headers)); MOCK_METHOD(void, ProcessTrailers, (const FakeHeaders& headers)); @@ -577,8 +579,11 @@ class HTTPBalsaFrameTest : public QuicheTest { balsa_frame_.set_http_validation_policy( HttpValidationPolicy::CreateDefault()); balsa_frame_.set_balsa_headers(&headers_); + balsa_frame_.set_balsa_trailer(&trailer_); balsa_frame_.set_balsa_visitor(&visitor_mock_); balsa_frame_.set_is_request(true); + + EXPECT_CALL(visitor_mock_, OnHeader).Times(AnyNumber()); } void VerifyFirstLineParsing(const std::string& firstline, @@ -1197,6 +1202,60 @@ TEST_F(HTTPBalsaFrameTest, NothingBadHappensWhenNoVisitorIsAssigned) { balsa_frame_.ProcessInput(trailer.data(), trailer.size())); EXPECT_TRUE(balsa_frame_.MessageFullyRead()); EXPECT_EQ(BalsaFrameEnums::BALSA_NO_ERROR, balsa_frame_.ErrorCode()); + const absl::string_view crass = trailer_.GetHeader("crass"); + EXPECT_EQ("monkeys", crass); + const absl::string_view funky = trailer_.GetHeader("funky"); + EXPECT_EQ("monkeys", funky); +} + +TEST_F(HTTPBalsaFrameTest, RequestWithTrailers) { + std::string headers = + "GET / HTTP/1.1\r\n" + "Connection: close\r\n" + "transfer-encoding: chunked\r\n" + "\r\n"; + + std::string chunks = + "3\r\n" + "123\r\n" + "0\r\n"; + std::string trailer = + "crass: monkeys\r\n" + "funky: monkeys\r\n" + "\r\n"; + + InSequence s; + + // OnHeader() visitor method is called as soon as headers are parsed. + EXPECT_CALL(visitor_mock_, OnHeader("Connection", "close")); + EXPECT_CALL(visitor_mock_, OnHeader("transfer-encoding", "chunked")); + ASSERT_EQ(headers.size(), + balsa_frame_.ProcessInput(headers.data(), headers.size())); + testing::Mock::VerifyAndClearExpectations(&visitor_mock_); + + ASSERT_EQ(chunks.size(), + balsa_frame_.ProcessInput(chunks.data(), chunks.size())); + + EXPECT_CALL(visitor_mock_, OnHeader("crass", "monkeys")); + EXPECT_CALL(visitor_mock_, OnHeader("funky", "monkeys")); + + FakeHeaders fake_trailers; + fake_trailers.AddKeyValue("crass", "monkeys"); + fake_trailers.AddKeyValue("funky", "monkeys"); + EXPECT_CALL(visitor_mock_, ProcessTrailers(fake_trailers)); + + EXPECT_CALL(visitor_mock_, OnTrailerInput(_)).Times(AtLeast(1)); + + EXPECT_EQ(trailer.size(), + balsa_frame_.ProcessInput(trailer.data(), trailer.size())); + + EXPECT_TRUE(balsa_frame_.MessageFullyRead()); + EXPECT_EQ(BalsaFrameEnums::BALSA_NO_ERROR, balsa_frame_.ErrorCode()); + + const absl::string_view crass = trailer_.GetHeader("crass"); + EXPECT_EQ("monkeys", crass); + const absl::string_view funky = trailer_.GetHeader("funky"); + EXPECT_EQ("monkeys", funky); } TEST_F(HTTPBalsaFrameTest, NothingBadHappensWhenNoVisitorIsAssignedInResponse) { @@ -1215,7 +1274,6 @@ TEST_F(HTTPBalsaFrameTest, NothingBadHappensWhenNoVisitorIsAssignedInResponse) { "funky: monkeys\r\n" "\r\n"; balsa_frame_.set_is_request(false); - balsa_frame_.set_balsa_trailer(&trailer_); balsa_frame_.set_balsa_visitor(nullptr); ASSERT_EQ(headers.size(), @@ -1297,7 +1355,6 @@ TEST_F(HTTPBalsaFrameTest, "\n"; balsa_frame_.set_is_request(false); - balsa_frame_.set_balsa_trailer(&trailer_); ASSERT_EQ(headers.size(), balsa_frame_.ProcessInput(headers.data(), headers.size())); @@ -2128,7 +2185,6 @@ TEST_F(HTTPBalsaFrameTest, fake_headers_in_trailer.AddKeyValue("a_trailer_key", "and a trailer value"); balsa_frame_.set_is_request(false); - balsa_frame_.set_balsa_trailer(&trailer_); { InSequence s1; @@ -2201,7 +2257,6 @@ TEST_F( fake_headers_in_trailer.AddKeyValue("a_trailer_key", "and a trailer value"); balsa_frame_.set_is_request(false); - balsa_frame_.set_balsa_trailer(&trailer_); { InSequence s1; @@ -2296,8 +2351,10 @@ TEST(HTTPBalsaFrame, EXPECT_CALL(visitor_mock, OnResponseFirstLineInput( "HTTP/1.1 \t 200 Ok all is well", "HTTP/1.1", "200", "Ok all is well")); + EXPECT_CALL(visitor_mock, OnHeader); EXPECT_CALL(visitor_mock, ProcessHeaders(fake_headers)); EXPECT_CALL(visitor_mock, HeaderDone()); + EXPECT_CALL(visitor_mock, OnHeader); EXPECT_CALL(visitor_mock, ProcessTrailers(fake_headers_in_trailer)); EXPECT_CALL(visitor_mock, MessageDone()); } @@ -2346,9 +2403,8 @@ TEST(HTTPBalsaFrame, TEST_F(HTTPBalsaFrameTest, AppropriateActionTakenWhenHeadersTooLongWithTooMuchInput) { - std::string message = - "GET /asflkasfdhjsafdkljhasfdlkjhasdflkjhsafdlkjhh HTTP/1.1\r\n" - "\r\n"; + const absl::string_view message = + "GET /asflkasfdhjsafdkljhasfdlkjhasdflkjhsafdlkjhh HTTP/1.1"; const size_t kAmountLessThanHeaderLen = 10; ASSERT_LE(kAmountLessThanHeaderLen, message.size()); @@ -2420,6 +2476,7 @@ class BalsaFrameParsingTest : public QuicheTest { EXPECT_CALL(visitor_mock_, OnRequestFirstLineInput("GET / HTTP/1.1", "GET", "/", "HTTP/1.1")); EXPECT_CALL(visitor_mock_, OnHeaderInput(_)); + EXPECT_CALL(visitor_mock_, OnHeader).Times(AnyNumber()); EXPECT_CALL(visitor_mock_, HandleError(BalsaFrameEnums::INVALID_HEADER_FORMAT)); @@ -2448,6 +2505,7 @@ class BalsaFrameParsingTest : public QuicheTest { EXPECT_CALL(visitor_mock_, OnResponseFirstLineInput); EXPECT_CALL(visitor_mock_, OnHeaderInput); + EXPECT_CALL(visitor_mock_, OnHeader).Times(AnyNumber()); EXPECT_CALL(visitor_mock_, ProcessHeaders); EXPECT_CALL(visitor_mock_, HeaderDone); EXPECT_CALL(visitor_mock_, OnChunkLength(3)); @@ -2458,6 +2516,7 @@ class BalsaFrameParsingTest : public QuicheTest { EXPECT_CALL(visitor_mock_, OnChunkExtensionInput); EXPECT_CALL(visitor_mock_, OnRawBodyInput); EXPECT_CALL(visitor_mock_, OnRawBodyInput); + EXPECT_CALL(visitor_mock_, OnHeader).Times(AnyNumber()); const auto expected_error = invalid_name_char ? BalsaFrameEnums::INVALID_TRAILER_NAME_CHARACTER : BalsaFrameEnums::INVALID_TRAILER_FORMAT; @@ -2525,6 +2584,8 @@ TEST_F(BalsaFrameParsingTest, AppropriateActionTakenWhenHeaderColonsAreFunny) { EXPECT_CALL(visitor_mock_, OnRequestFirstLineInput("GET / HTTP/1.1", "GET", "/", "HTTP/1.1")); EXPECT_CALL(visitor_mock_, OnHeaderInput(_)); + EXPECT_CALL(visitor_mock_, OnHeader("i", "")); + EXPECT_CALL(visitor_mock_, OnHeader("", "val")); EXPECT_CALL(visitor_mock_, HandleWarning(BalsaFrameEnums::HEADER_MISSING_COLON)) .Times(27); @@ -3123,7 +3184,6 @@ TEST_F(HTTPBalsaFrameTest, TrailerMissingColon) { "\r\n"; balsa_frame_.set_is_request(false); - balsa_frame_.set_balsa_trailer(&trailer_); EXPECT_CALL(visitor_mock_, HandleWarning(BalsaFrameEnums::TRAILER_MISSING_COLON)); ASSERT_EQ(headers.size(), @@ -3215,7 +3275,6 @@ TEST_F(HTTPBalsaFrameTest, MultipleHeadersInTrailer) { EXPECT_CALL(visitor_mock_, OnBodyChunkInput("123")); balsa_frame_.set_is_request(false); - balsa_frame_.set_balsa_trailer(&trailer_); ASSERT_EQ(headers.size(), balsa_frame_.ProcessInput(headers.data(), headers.size())); @@ -3282,7 +3341,6 @@ TEST_F(HTTPBalsaFrameTest, FrameAndResetAndFrameAgain) { "\n"; balsa_frame_.set_is_request(false); - balsa_frame_.set_balsa_trailer(&trailer_); balsa_frame_.set_balsa_visitor(nullptr); ASSERT_EQ(headers.size(), @@ -3513,7 +3571,6 @@ TEST_F(HTTPBalsaFrameTest, GibberishInHeadersAndTrailer) { std::string trailer = absl::StrCat("k: v\n", gibberish_headers, "\n"); balsa_frame_.set_is_request(false); - balsa_frame_.set_balsa_trailer(&trailer_); balsa_frame_.set_balsa_visitor(nullptr); ASSERT_EQ(headers.size(), @@ -3541,12 +3598,6 @@ TEST_F(HTTPBalsaFrameTest, GibberishInHeadersAndTrailer) { EXPECT_EQ("bar : eeep : baz", field_value); } -// Test that trailer is not allowed for request. -TEST_F(HTTPBalsaFrameTest, TrailerIsNotAllowedInRequest) { - EXPECT_QUICHE_BUG(balsa_frame_.set_balsa_trailer(&trailer_), - "Trailer in request is not allowed"); -} - // Note we reuse the header length limit because trailer is just multiple // headers. TEST_F(HTTPBalsaFrameTest, TrailerTooLong) { @@ -3566,7 +3617,6 @@ TEST_F(HTTPBalsaFrameTest, TrailerTooLong) { "\r\n"; balsa_frame_.set_is_request(false); - balsa_frame_.set_balsa_trailer(&trailer_); ASSERT_LT(headers.size(), trailer.size()); balsa_frame_.set_max_header_length(headers.size()); @@ -3584,8 +3634,8 @@ TEST_F(HTTPBalsaFrameTest, TrailerTooLong) { EXPECT_EQ(BalsaFrameEnums::TRAILER_TOO_LONG, balsa_frame_.ErrorCode()); } -// If the trailer_ object in the framer is not set, ProcessTrailers won't be -// called. +// If the `trailer_` object in the framer is set to `nullptr`, +// ProcessTrailers() will not be called. TEST_F(HTTPBalsaFrameTest, NoProcessTrailersCallWhenFramerHasNullTrailerObject) { std::string headers = @@ -3602,6 +3652,7 @@ TEST_F(HTTPBalsaFrameTest, "\r\n"; balsa_frame_.set_is_request(false); + balsa_frame_.set_balsa_trailer(nullptr); EXPECT_CALL(visitor_mock_, ProcessTrailers(_)).Times(0); ASSERT_EQ(headers.size(), |