| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/tools/quic/quic_simple_server_stream.h" | 5 #include "net/tools/quic/quic_simple_server_stream.h" |
| 6 | 6 |
| 7 #include <list> | 7 #include <list> |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| 11 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
| 12 #include "base/strings/string_number_conversions.h" | 12 #include "base/strings/string_number_conversions.h" |
| 13 #include "base/strings/string_piece.h" | 13 #include "base/strings/string_piece.h" |
| 14 #include "net/quic/core/quic_connection.h" | 14 #include "net/quic/core/quic_connection.h" |
| 15 #include "net/quic/core/quic_flags.h" | 15 #include "net/quic/core/quic_flags.h" |
| 16 #include "net/quic/core/quic_protocol.h" | 16 #include "net/quic/core/quic_protocol.h" |
| 17 #include "net/quic/core/quic_utils.h" | 17 #include "net/quic/core/quic_utils.h" |
| 18 #include "net/quic/core/spdy_utils.h" | 18 #include "net/quic/core/spdy_utils.h" |
| 19 #include "net/quic/test_tools/crypto_test_utils.h" | 19 #include "net/quic/test_tools/crypto_test_utils.h" |
| 20 #include "net/quic/test_tools/quic_stream_peer.h" |
| 20 #include "net/quic/test_tools/quic_test_utils.h" | 21 #include "net/quic/test_tools/quic_test_utils.h" |
| 21 #include "net/quic/test_tools/reliable_quic_stream_peer.h" | |
| 22 #include "net/test/gtest_util.h" | 22 #include "net/test/gtest_util.h" |
| 23 #include "net/tools/epoll_server/epoll_server.h" | 23 #include "net/tools/epoll_server/epoll_server.h" |
| 24 #include "net/tools/quic/quic_in_memory_cache.h" | 24 #include "net/tools/quic/quic_in_memory_cache.h" |
| 25 #include "net/tools/quic/quic_simple_server_session.h" | 25 #include "net/tools/quic/quic_simple_server_session.h" |
| 26 #include "net/tools/quic/test_tools/quic_in_memory_cache_peer.h" | 26 #include "net/tools/quic/test_tools/quic_in_memory_cache_peer.h" |
| 27 #include "testing/gmock/include/gmock/gmock.h" | 27 #include "testing/gmock/include/gmock/gmock.h" |
| 28 #include "testing/gtest/include/gtest/gtest.h" | 28 #include "testing/gtest/include/gtest/gtest.h" |
| 29 #include "url/gurl.h" | 29 #include "url/gurl.h" |
| 30 | 30 |
| 31 using base::StringPiece; | 31 using base::StringPiece; |
| 32 using net::test::MockQuicConnection; | 32 using net::test::MockQuicConnection; |
| 33 using net::test::MockQuicConnectionHelper; | 33 using net::test::MockQuicConnectionHelper; |
| 34 using net::test::MockQuicSpdySession; | 34 using net::test::MockQuicSpdySession; |
| 35 using net::test::ReliableQuicStreamPeer; | 35 using net::test::QuicStreamPeer; |
| 36 using net::test::SupportedVersions; | 36 using net::test::SupportedVersions; |
| 37 using net::test::kInitialSessionFlowControlWindowForTest; | 37 using net::test::kInitialSessionFlowControlWindowForTest; |
| 38 using net::test::kInitialStreamFlowControlWindowForTest; | 38 using net::test::kInitialStreamFlowControlWindowForTest; |
| 39 using std::string; | 39 using std::string; |
| 40 using testing::_; | 40 using testing::_; |
| 41 using testing::AnyNumber; | 41 using testing::AnyNumber; |
| 42 using testing::Invoke; | 42 using testing::Invoke; |
| 43 using testing::InvokeArgument; | 43 using testing::InvokeArgument; |
| 44 using testing::InSequence; | 44 using testing::InSequence; |
| 45 using testing::Return; | 45 using testing::Return; |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 } | 107 } |
| 108 | 108 |
| 109 ~MockQuicSimpleServerSession() override {} | 109 ~MockQuicSimpleServerSession() override {} |
| 110 | 110 |
| 111 MOCK_METHOD3(OnConnectionClosed, | 111 MOCK_METHOD3(OnConnectionClosed, |
| 112 void(QuicErrorCode error, | 112 void(QuicErrorCode error, |
| 113 const string& error_details, | 113 const string& error_details, |
| 114 ConnectionCloseSource source)); | 114 ConnectionCloseSource source)); |
| 115 MOCK_METHOD1(CreateIncomingDynamicStream, QuicSpdyStream*(QuicStreamId id)); | 115 MOCK_METHOD1(CreateIncomingDynamicStream, QuicSpdyStream*(QuicStreamId id)); |
| 116 MOCK_METHOD6(WritevData, | 116 MOCK_METHOD6(WritevData, |
| 117 QuicConsumedData(ReliableQuicStream* stream, | 117 QuicConsumedData(QuicStream* stream, |
| 118 QuicStreamId id, | 118 QuicStreamId id, |
| 119 QuicIOVector data, | 119 QuicIOVector data, |
| 120 QuicStreamOffset offset, | 120 QuicStreamOffset offset, |
| 121 bool fin, | 121 bool fin, |
| 122 QuicAckListenerInterface*)); | 122 QuicAckListenerInterface*)); |
| 123 MOCK_METHOD4(OnStreamHeaderList, | 123 MOCK_METHOD4(OnStreamHeaderList, |
| 124 void(QuicStreamId stream_id, | 124 void(QuicStreamId stream_id, |
| 125 bool fin, | 125 bool fin, |
| 126 size_t frame_len, | 126 size_t frame_len, |
| 127 const QuicHeaderList& header_list)); | 127 const QuicHeaderList& header_list)); |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 330 stream_->set_fin_received(true); | 330 stream_->set_fin_received(true); |
| 331 | 331 |
| 332 InSequence s; | 332 InSequence s; |
| 333 EXPECT_CALL(session_, WriteHeadersMock(stream_->id(), _, false, _, nullptr)); | 333 EXPECT_CALL(session_, WriteHeadersMock(stream_->id(), _, false, _, nullptr)); |
| 334 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) | 334 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
| 335 .Times(1) | 335 .Times(1) |
| 336 .WillOnce(Return(QuicConsumedData( | 336 .WillOnce(Return(QuicConsumedData( |
| 337 strlen(QuicSimpleServerStream::kErrorResponseBody), true))); | 337 strlen(QuicSimpleServerStream::kErrorResponseBody), true))); |
| 338 | 338 |
| 339 QuicSimpleServerStreamPeer::SendResponse(stream_); | 339 QuicSimpleServerStreamPeer::SendResponse(stream_); |
| 340 EXPECT_FALSE(ReliableQuicStreamPeer::read_side_closed(stream_)); | 340 EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_)); |
| 341 EXPECT_TRUE(stream_->reading_stopped()); | 341 EXPECT_TRUE(stream_->reading_stopped()); |
| 342 EXPECT_TRUE(stream_->write_side_closed()); | 342 EXPECT_TRUE(stream_->write_side_closed()); |
| 343 } | 343 } |
| 344 | 344 |
| 345 TEST_P(QuicSimpleServerStreamTest, SendResponseWithIllegalResponseStatus2) { | 345 TEST_P(QuicSimpleServerStreamTest, SendResponseWithIllegalResponseStatus2) { |
| 346 // Send an illegal response with response status not supported by HTTP/2. | 346 // Send an illegal response with response status not supported by HTTP/2. |
| 347 SpdyHeaderBlock* request_headers = stream_->mutable_headers(); | 347 SpdyHeaderBlock* request_headers = stream_->mutable_headers(); |
| 348 (*request_headers)[":path"] = "/bar"; | 348 (*request_headers)[":path"] = "/bar"; |
| 349 (*request_headers)[":authority"] = "www.google.com"; | 349 (*request_headers)[":authority"] = "www.google.com"; |
| 350 (*request_headers)[":version"] = "HTTP/1.1"; | 350 (*request_headers)[":version"] = "HTTP/1.1"; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 361 stream_->set_fin_received(true); | 361 stream_->set_fin_received(true); |
| 362 | 362 |
| 363 InSequence s; | 363 InSequence s; |
| 364 EXPECT_CALL(session_, WriteHeadersMock(stream_->id(), _, false, _, nullptr)); | 364 EXPECT_CALL(session_, WriteHeadersMock(stream_->id(), _, false, _, nullptr)); |
| 365 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) | 365 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
| 366 .Times(1) | 366 .Times(1) |
| 367 .WillOnce(Return(QuicConsumedData( | 367 .WillOnce(Return(QuicConsumedData( |
| 368 strlen(QuicSimpleServerStream::kErrorResponseBody), true))); | 368 strlen(QuicSimpleServerStream::kErrorResponseBody), true))); |
| 369 | 369 |
| 370 QuicSimpleServerStreamPeer::SendResponse(stream_); | 370 QuicSimpleServerStreamPeer::SendResponse(stream_); |
| 371 EXPECT_FALSE(ReliableQuicStreamPeer::read_side_closed(stream_)); | 371 EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_)); |
| 372 EXPECT_TRUE(stream_->reading_stopped()); | 372 EXPECT_TRUE(stream_->reading_stopped()); |
| 373 EXPECT_TRUE(stream_->write_side_closed()); | 373 EXPECT_TRUE(stream_->write_side_closed()); |
| 374 } | 374 } |
| 375 | 375 |
| 376 TEST_P(QuicSimpleServerStreamTest, SendPushResponseWith404Response) { | 376 TEST_P(QuicSimpleServerStreamTest, SendPushResponseWith404Response) { |
| 377 // Create a new promised stream with even id(). | 377 // Create a new promised stream with even id(). |
| 378 QuicSimpleServerStreamPeer* promised_stream = | 378 QuicSimpleServerStreamPeer* promised_stream = |
| 379 new QuicSimpleServerStreamPeer(2, &session_); | 379 new QuicSimpleServerStreamPeer(2, &session_); |
| 380 session_.ActivateStream(base::WrapUnique(promised_stream)); | 380 session_.ActivateStream(base::WrapUnique(promised_stream)); |
| 381 | 381 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 417 "www.google.com", "/bar", std::move(response_headers_), body); | 417 "www.google.com", "/bar", std::move(response_headers_), body); |
| 418 stream_->set_fin_received(true); | 418 stream_->set_fin_received(true); |
| 419 | 419 |
| 420 InSequence s; | 420 InSequence s; |
| 421 EXPECT_CALL(session_, WriteHeadersMock(stream_->id(), _, false, _, nullptr)); | 421 EXPECT_CALL(session_, WriteHeadersMock(stream_->id(), _, false, _, nullptr)); |
| 422 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) | 422 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
| 423 .Times(1) | 423 .Times(1) |
| 424 .WillOnce(Return(QuicConsumedData(body.length(), true))); | 424 .WillOnce(Return(QuicConsumedData(body.length(), true))); |
| 425 | 425 |
| 426 QuicSimpleServerStreamPeer::SendResponse(stream_); | 426 QuicSimpleServerStreamPeer::SendResponse(stream_); |
| 427 EXPECT_FALSE(ReliableQuicStreamPeer::read_side_closed(stream_)); | 427 EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_)); |
| 428 EXPECT_TRUE(stream_->reading_stopped()); | 428 EXPECT_TRUE(stream_->reading_stopped()); |
| 429 EXPECT_TRUE(stream_->write_side_closed()); | 429 EXPECT_TRUE(stream_->write_side_closed()); |
| 430 } | 430 } |
| 431 | 431 |
| 432 TEST_P(QuicSimpleServerStreamTest, SendReponseWithPushResources) { | 432 TEST_P(QuicSimpleServerStreamTest, SendReponseWithPushResources) { |
| 433 // Tests that if a reponse has push resources to be send, SendResponse() will | 433 // Tests that if a reponse has push resources to be send, SendResponse() will |
| 434 // call PromisePushResources() to handle these resources. | 434 // call PromisePushResources() to handle these resources. |
| 435 | 435 |
| 436 // Add a request and response with valid headers into cache. | 436 // Add a request and response with valid headers into cache. |
| 437 string host = "www.google.com"; | 437 string host = "www.google.com"; |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 520 | 520 |
| 521 stream_->set_fin_received(true); | 521 stream_->set_fin_received(true); |
| 522 | 522 |
| 523 InSequence s; | 523 InSequence s; |
| 524 EXPECT_CALL(session_, WriteHeadersMock(_, _, _, _, _)); | 524 EXPECT_CALL(session_, WriteHeadersMock(_, _, _, _, _)); |
| 525 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) | 525 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
| 526 .Times(1) | 526 .Times(1) |
| 527 .WillOnce(Return(QuicConsumedData(3, true))); | 527 .WillOnce(Return(QuicConsumedData(3, true))); |
| 528 | 528 |
| 529 QuicSimpleServerStreamPeer::SendErrorResponse(stream_); | 529 QuicSimpleServerStreamPeer::SendErrorResponse(stream_); |
| 530 EXPECT_FALSE(ReliableQuicStreamPeer::read_side_closed(stream_)); | 530 EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_)); |
| 531 EXPECT_TRUE(stream_->reading_stopped()); | 531 EXPECT_TRUE(stream_->reading_stopped()); |
| 532 EXPECT_TRUE(stream_->write_side_closed()); | 532 EXPECT_TRUE(stream_->write_side_closed()); |
| 533 } | 533 } |
| 534 | 534 |
| 535 TEST_P(QuicSimpleServerStreamTest, InvalidMultipleContentLength) { | 535 TEST_P(QuicSimpleServerStreamTest, InvalidMultipleContentLength) { |
| 536 EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); | 536 EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); |
| 537 | 537 |
| 538 SpdyHeaderBlock request_headers; | 538 SpdyHeaderBlock request_headers; |
| 539 // \000 is a way to write the null byte when followed by a literal digit. | 539 // \000 is a way to write the null byte when followed by a literal digit. |
| 540 header_list_.OnHeader("content-length", StringPiece("11\00012", 5)); | 540 header_list_.OnHeader("content-length", StringPiece("11\00012", 5)); |
| 541 | 541 |
| 542 headers_string_ = SpdyUtils::SerializeUncompressedHeaders(request_headers); | 542 headers_string_ = SpdyUtils::SerializeUncompressedHeaders(request_headers); |
| 543 | 543 |
| 544 EXPECT_CALL(session_, WriteHeadersMock(_, _, _, _, _)); | 544 EXPECT_CALL(session_, WriteHeadersMock(_, _, _, _, _)); |
| 545 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) | 545 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
| 546 .Times(AnyNumber()) | 546 .Times(AnyNumber()) |
| 547 .WillRepeatedly(Invoke(MockQuicSession::ConsumeAllData)); | 547 .WillRepeatedly(Invoke(MockQuicSession::ConsumeAllData)); |
| 548 stream_->OnStreamHeaderList(true, kFakeFrameLen, header_list_); | 548 stream_->OnStreamHeaderList(true, kFakeFrameLen, header_list_); |
| 549 | 549 |
| 550 EXPECT_TRUE(ReliableQuicStreamPeer::read_side_closed(stream_)); | 550 EXPECT_TRUE(QuicStreamPeer::read_side_closed(stream_)); |
| 551 EXPECT_TRUE(stream_->reading_stopped()); | 551 EXPECT_TRUE(stream_->reading_stopped()); |
| 552 EXPECT_TRUE(stream_->write_side_closed()); | 552 EXPECT_TRUE(stream_->write_side_closed()); |
| 553 } | 553 } |
| 554 | 554 |
| 555 TEST_P(QuicSimpleServerStreamTest, InvalidLeadingNullContentLength) { | 555 TEST_P(QuicSimpleServerStreamTest, InvalidLeadingNullContentLength) { |
| 556 EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); | 556 EXPECT_CALL(session_, SendRstStream(_, QUIC_STREAM_NO_ERROR, _)).Times(0); |
| 557 | 557 |
| 558 SpdyHeaderBlock request_headers; | 558 SpdyHeaderBlock request_headers; |
| 559 // \000 is a way to write the null byte when followed by a literal digit. | 559 // \000 is a way to write the null byte when followed by a literal digit. |
| 560 header_list_.OnHeader("content-length", StringPiece("\00012", 3)); | 560 header_list_.OnHeader("content-length", StringPiece("\00012", 3)); |
| 561 | 561 |
| 562 headers_string_ = SpdyUtils::SerializeUncompressedHeaders(request_headers); | 562 headers_string_ = SpdyUtils::SerializeUncompressedHeaders(request_headers); |
| 563 | 563 |
| 564 EXPECT_CALL(session_, WriteHeadersMock(_, _, _, _, _)); | 564 EXPECT_CALL(session_, WriteHeadersMock(_, _, _, _, _)); |
| 565 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) | 565 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
| 566 .Times(AnyNumber()) | 566 .Times(AnyNumber()) |
| 567 .WillRepeatedly(Invoke(MockQuicSession::ConsumeAllData)); | 567 .WillRepeatedly(Invoke(MockQuicSession::ConsumeAllData)); |
| 568 stream_->OnStreamHeaderList(true, kFakeFrameLen, header_list_); | 568 stream_->OnStreamHeaderList(true, kFakeFrameLen, header_list_); |
| 569 | 569 |
| 570 EXPECT_TRUE(ReliableQuicStreamPeer::read_side_closed(stream_)); | 570 EXPECT_TRUE(QuicStreamPeer::read_side_closed(stream_)); |
| 571 EXPECT_TRUE(stream_->reading_stopped()); | 571 EXPECT_TRUE(stream_->reading_stopped()); |
| 572 EXPECT_TRUE(stream_->write_side_closed()); | 572 EXPECT_TRUE(stream_->write_side_closed()); |
| 573 } | 573 } |
| 574 | 574 |
| 575 TEST_P(QuicSimpleServerStreamTest, ValidMultipleContentLength) { | 575 TEST_P(QuicSimpleServerStreamTest, ValidMultipleContentLength) { |
| 576 SpdyHeaderBlock request_headers; | 576 SpdyHeaderBlock request_headers; |
| 577 // \000 is a way to write the null byte when followed by a literal digit. | 577 // \000 is a way to write the null byte when followed by a literal digit. |
| 578 header_list_.OnHeader("content-length", StringPiece("11\00011", 5)); | 578 header_list_.OnHeader("content-length", StringPiece("11\00011", 5)); |
| 579 | 579 |
| 580 headers_string_ = SpdyUtils::SerializeUncompressedHeaders(request_headers); | 580 headers_string_ = SpdyUtils::SerializeUncompressedHeaders(request_headers); |
| 581 | 581 |
| 582 stream_->OnStreamHeaderList(false, kFakeFrameLen, header_list_); | 582 stream_->OnStreamHeaderList(false, kFakeFrameLen, header_list_); |
| 583 | 583 |
| 584 EXPECT_EQ(11, QuicSimpleServerStreamPeer::content_length(stream_)); | 584 EXPECT_EQ(11, QuicSimpleServerStreamPeer::content_length(stream_)); |
| 585 EXPECT_FALSE(ReliableQuicStreamPeer::read_side_closed(stream_)); | 585 EXPECT_FALSE(QuicStreamPeer::read_side_closed(stream_)); |
| 586 EXPECT_FALSE(stream_->reading_stopped()); | 586 EXPECT_FALSE(stream_->reading_stopped()); |
| 587 EXPECT_FALSE(stream_->write_side_closed()); | 587 EXPECT_FALSE(stream_->write_side_closed()); |
| 588 } | 588 } |
| 589 | 589 |
| 590 TEST_P(QuicSimpleServerStreamTest, SendQuicRstStreamNoErrorWithEarlyResponse) { | 590 TEST_P(QuicSimpleServerStreamTest, SendQuicRstStreamNoErrorWithEarlyResponse) { |
| 591 InSequence s; | 591 InSequence s; |
| 592 EXPECT_CALL(session_, WriteHeadersMock(stream_->id(), _, false, _, nullptr)); | 592 EXPECT_CALL(session_, WriteHeadersMock(stream_->id(), _, false, _, nullptr)); |
| 593 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) | 593 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)) |
| 594 .Times(1) | 594 .Times(1) |
| 595 .WillOnce(Return(QuicConsumedData(3, true))); | 595 .WillOnce(Return(QuicConsumedData(3, true))); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 640 }; | 640 }; |
| 641 StringPiece data(arr, arraysize(arr)); | 641 StringPiece data(arr, arraysize(arr)); |
| 642 QuicStreamFrame frame(stream_->id(), true, 0, data); | 642 QuicStreamFrame frame(stream_->id(), true, 0, data); |
| 643 // Verify that we don't crash when we get a invalid headers in stream frame. | 643 // Verify that we don't crash when we get a invalid headers in stream frame. |
| 644 stream_->OnStreamFrame(frame); | 644 stream_->OnStreamFrame(frame); |
| 645 } | 645 } |
| 646 | 646 |
| 647 } // namespace | 647 } // namespace |
| 648 } // namespace test | 648 } // namespace test |
| 649 } // namespace net | 649 } // namespace net |
| OLD | NEW |