| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/quic/chromium/bidirectional_stream_quic_impl.h" | 5 #include "net/quic/chromium/bidirectional_stream_quic_impl.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/callback_helpers.h" | 9 #include "base/callback_helpers.h" |
| 10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
| (...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 278 bool trailers_received_; | 278 bool trailers_received_; |
| 279 | 279 |
| 280 DISALLOW_COPY_AND_ASSIGN(TestDelegateBase); | 280 DISALLOW_COPY_AND_ASSIGN(TestDelegateBase); |
| 281 }; | 281 }; |
| 282 | 282 |
| 283 // A delegate that deletes the stream in a particular callback. | 283 // A delegate that deletes the stream in a particular callback. |
| 284 class DeleteStreamDelegate : public TestDelegateBase { | 284 class DeleteStreamDelegate : public TestDelegateBase { |
| 285 public: | 285 public: |
| 286 // Specifies in which callback the stream can be deleted. | 286 // Specifies in which callback the stream can be deleted. |
| 287 enum Phase { | 287 enum Phase { |
| 288 ON_STREAM_READY, |
| 288 ON_HEADERS_RECEIVED, | 289 ON_HEADERS_RECEIVED, |
| 289 ON_DATA_READ, | 290 ON_DATA_READ, |
| 290 ON_TRAILERS_RECEIVED, | 291 ON_TRAILERS_RECEIVED, |
| 291 ON_FAILED, | 292 ON_FAILED, |
| 292 }; | 293 }; |
| 293 | 294 |
| 294 DeleteStreamDelegate(IOBuffer* buf, int buf_len, Phase phase) | 295 DeleteStreamDelegate(IOBuffer* buf, int buf_len, Phase phase) |
| 295 : TestDelegateBase(buf, buf_len), phase_(phase) {} | 296 : TestDelegateBase(buf, buf_len), phase_(phase) {} |
| 296 ~DeleteStreamDelegate() override {} | 297 ~DeleteStreamDelegate() override {} |
| 297 | 298 |
| 299 void OnStreamReady(bool request_headers_sent) override { |
| 300 TestDelegateBase::OnStreamReady(request_headers_sent); |
| 301 if (phase_ == ON_STREAM_READY) |
| 302 DeleteStream(); |
| 303 } |
| 304 |
| 298 void OnHeadersReceived(const SpdyHeaderBlock& response_headers) override { | 305 void OnHeadersReceived(const SpdyHeaderBlock& response_headers) override { |
| 299 // Make a copy of |response_headers| before the stream is deleted, since | 306 // Make a copy of |response_headers| before the stream is deleted, since |
| 300 // the headers are owned by the stream. | 307 // the headers are owned by the stream. |
| 301 SpdyHeaderBlock headers_copy = response_headers.Clone(); | 308 SpdyHeaderBlock headers_copy = response_headers.Clone(); |
| 302 if (phase_ == ON_HEADERS_RECEIVED) { | 309 if (phase_ == ON_HEADERS_RECEIVED) |
| 303 DeleteStream(); | 310 DeleteStream(); |
| 304 } | |
| 305 TestDelegateBase::OnHeadersReceived(headers_copy); | 311 TestDelegateBase::OnHeadersReceived(headers_copy); |
| 306 } | 312 } |
| 307 | 313 |
| 308 void OnDataSent() override { NOTREACHED(); } | 314 void OnDataSent() override { NOTREACHED(); } |
| 309 | 315 |
| 310 void OnDataRead(int bytes_read) override { | 316 void OnDataRead(int bytes_read) override { |
| 311 DCHECK_NE(ON_HEADERS_RECEIVED, phase_); | 317 DCHECK_NE(ON_HEADERS_RECEIVED, phase_); |
| 312 if (phase_ == ON_DATA_READ) | 318 if (phase_ == ON_DATA_READ) |
| 313 DeleteStream(); | 319 DeleteStream(); |
| 314 TestDelegateBase::OnDataRead(bytes_read); | 320 TestDelegateBase::OnDataRead(bytes_read); |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 391 void TearDown() override { | 397 void TearDown() override { |
| 392 EXPECT_TRUE(socket_data_->AllReadDataConsumed()); | 398 EXPECT_TRUE(socket_data_->AllReadDataConsumed()); |
| 393 EXPECT_TRUE(socket_data_->AllWriteDataConsumed()); | 399 EXPECT_TRUE(socket_data_->AllWriteDataConsumed()); |
| 394 } | 400 } |
| 395 | 401 |
| 396 // Adds a packet to the list of expected writes. | 402 // Adds a packet to the list of expected writes. |
| 397 void AddWrite(std::unique_ptr<QuicReceivedPacket> packet) { | 403 void AddWrite(std::unique_ptr<QuicReceivedPacket> packet) { |
| 398 writes_.push_back(PacketToWrite(SYNCHRONOUS, packet.release())); | 404 writes_.push_back(PacketToWrite(SYNCHRONOUS, packet.release())); |
| 399 } | 405 } |
| 400 | 406 |
| 407 // Adds a write error to the list of expected writes. |
| 408 void AddWriteError(IoMode mode, int rv) { |
| 409 writes_.push_back(PacketToWrite(mode, rv)); |
| 410 } |
| 411 |
| 401 void ProcessPacket(std::unique_ptr<QuicReceivedPacket> packet) { | 412 void ProcessPacket(std::unique_ptr<QuicReceivedPacket> packet) { |
| 402 connection_->ProcessUdpPacket( | 413 connection_->ProcessUdpPacket( |
| 403 QuicSocketAddress(QuicSocketAddressImpl(self_addr_)), | 414 QuicSocketAddress(QuicSocketAddressImpl(self_addr_)), |
| 404 QuicSocketAddress(QuicSocketAddressImpl(peer_addr_)), *packet); | 415 QuicSocketAddress(QuicSocketAddressImpl(peer_addr_)), *packet); |
| 405 } | 416 } |
| 406 | 417 |
| 407 // Configures the test fixture to use the list of expected writes. | 418 // Configures the test fixture to use the list of expected writes. |
| 408 void Initialize() { | 419 void Initialize() { |
| 409 crypto_client_stream_factory_.set_handshake_mode( | 420 crypto_client_stream_factory_.set_handshake_mode( |
| 410 MockCryptoClientStream::ZERO_RTT); | 421 MockCryptoClientStream::ZERO_RTT); |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 587 SpdyHeaderBlock trailers, | 598 SpdyHeaderBlock trailers, |
| 588 size_t* spdy_headers_frame_length, | 599 size_t* spdy_headers_frame_length, |
| 589 QuicStreamOffset* offset) { | 600 QuicStreamOffset* offset) { |
| 590 return server_maker_.MakeResponseHeadersPacket( | 601 return server_maker_.MakeResponseHeadersPacket( |
| 591 packet_number, stream_id_, !kIncludeVersion, fin, std::move(trailers), | 602 packet_number, stream_id_, !kIncludeVersion, fin, std::move(trailers), |
| 592 spdy_headers_frame_length, offset); | 603 spdy_headers_frame_length, offset); |
| 593 } | 604 } |
| 594 | 605 |
| 595 std::unique_ptr<QuicReceivedPacket> ConstructClientRstStreamPacket( | 606 std::unique_ptr<QuicReceivedPacket> ConstructClientRstStreamPacket( |
| 596 QuicPacketNumber packet_number) { | 607 QuicPacketNumber packet_number) { |
| 597 return ConstructRstStreamCancelledPacket(packet_number, 0, &client_maker_); | 608 return ConstructRstStreamCancelledPacket(packet_number, !kIncludeVersion, 0, |
| 609 &client_maker_); |
| 598 } | 610 } |
| 599 | 611 |
| 600 std::unique_ptr<QuicReceivedPacket> ConstructServerRstStreamPacket( | 612 std::unique_ptr<QuicReceivedPacket> ConstructServerRstStreamPacket( |
| 601 QuicPacketNumber packet_number) { | 613 QuicPacketNumber packet_number) { |
| 602 return ConstructRstStreamCancelledPacket(packet_number, 0, &server_maker_); | 614 return ConstructRstStreamCancelledPacket(packet_number, !kIncludeVersion, 0, |
| 615 &server_maker_); |
| 616 } |
| 617 |
| 618 std::unique_ptr<QuicReceivedPacket> ConstructClientEarlyRstStreamPacket( |
| 619 QuicPacketNumber packet_number) { |
| 620 return ConstructRstStreamCancelledPacket(packet_number, kIncludeVersion, 0, |
| 621 &client_maker_); |
| 603 } | 622 } |
| 604 | 623 |
| 605 std::unique_ptr<QuicReceivedPacket> ConstructRstStreamCancelledPacket( | 624 std::unique_ptr<QuicReceivedPacket> ConstructRstStreamCancelledPacket( |
| 606 QuicPacketNumber packet_number, | 625 QuicPacketNumber packet_number, |
| 626 bool include_version, |
| 607 size_t bytes_written, | 627 size_t bytes_written, |
| 608 QuicTestPacketMaker* maker) { | 628 QuicTestPacketMaker* maker) { |
| 609 std::unique_ptr<QuicReceivedPacket> packet( | 629 std::unique_ptr<QuicReceivedPacket> packet( |
| 610 maker->MakeRstPacket(packet_number, !kIncludeVersion, stream_id_, | 630 maker->MakeRstPacket(packet_number, include_version, stream_id_, |
| 611 QUIC_STREAM_CANCELLED, bytes_written)); | 631 QUIC_STREAM_CANCELLED, bytes_written)); |
| 612 DVLOG(2) << "packet(" << packet_number << "): " << std::endl | 632 DVLOG(2) << "packet(" << packet_number << "): " << std::endl |
| 613 << QuicTextUtils::HexDump(packet->AsStringPiece()); | 633 << QuicTextUtils::HexDump(packet->AsStringPiece()); |
| 614 return packet; | 634 return packet; |
| 615 } | 635 } |
| 616 | 636 |
| 617 std::unique_ptr<QuicReceivedPacket> ConstructClientAckAndRstStreamPacket( | 637 std::unique_ptr<QuicReceivedPacket> ConstructClientAckAndRstStreamPacket( |
| 618 QuicPacketNumber packet_number, | 638 QuicPacketNumber packet_number, |
| 619 QuicPacketNumber largest_received, | 639 QuicPacketNumber largest_received, |
| 620 QuicPacketNumber smallest_received, | 640 QuicPacketNumber smallest_received, |
| (...skipping 981 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1602 EXPECT_THAT(delegate->error(), IsError(ERR_UNEXPECTED)); | 1622 EXPECT_THAT(delegate->error(), IsError(ERR_UNEXPECTED)); |
| 1603 EXPECT_EQ(0, delegate->on_data_read_count()); | 1623 EXPECT_EQ(0, delegate->on_data_read_count()); |
| 1604 EXPECT_EQ(0, delegate->on_data_sent_count()); | 1624 EXPECT_EQ(0, delegate->on_data_sent_count()); |
| 1605 EXPECT_EQ(kProtoQUIC, delegate->GetProtocol()); | 1625 EXPECT_EQ(kProtoQUIC, delegate->GetProtocol()); |
| 1606 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length), | 1626 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length), |
| 1607 delegate->GetTotalSentBytes()); | 1627 delegate->GetTotalSentBytes()); |
| 1608 EXPECT_EQ(static_cast<int64_t>(spdy_response_headers_frame_length), | 1628 EXPECT_EQ(static_cast<int64_t>(spdy_response_headers_frame_length), |
| 1609 delegate->GetTotalReceivedBytes()); | 1629 delegate->GetTotalReceivedBytes()); |
| 1610 } | 1630 } |
| 1611 | 1631 |
| 1632 TEST_P(BidirectionalStreamQuicImplTest, SessionCloseDuringOnStreamReady) { |
| 1633 SetRequest("POST", "/", DEFAULT_PRIORITY); |
| 1634 QuicStreamOffset header_stream_offset = 0; |
| 1635 AddWrite(ConstructInitialSettingsPacket(1, &header_stream_offset)); |
| 1636 AddWriteError(SYNCHRONOUS, ERR_CONNECTION_REFUSED); |
| 1637 |
| 1638 Initialize(); |
| 1639 |
| 1640 BidirectionalStreamRequestInfo request; |
| 1641 request.method = "POST"; |
| 1642 request.url = GURL("http://www.google.com/"); |
| 1643 request.end_stream_on_headers = false; |
| 1644 request.priority = DEFAULT_PRIORITY; |
| 1645 |
| 1646 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
| 1647 std::unique_ptr<DeleteStreamDelegate> delegate(new DeleteStreamDelegate( |
| 1648 read_buffer.get(), kReadBufferSize, DeleteStreamDelegate::ON_FAILED)); |
| 1649 delegate->Start(&request, net_log().bound(), session()->CreateHandle()); |
| 1650 ConfirmHandshake(); |
| 1651 delegate->WaitUntilNextCallback(); // OnStreamReady |
| 1652 |
| 1653 EXPECT_EQ(0, delegate->on_data_read_count()); |
| 1654 EXPECT_EQ(0, delegate->on_data_sent_count()); |
| 1655 } |
| 1656 |
| 1657 TEST_P(BidirectionalStreamQuicImplTest, DeleteStreamDuringOnStreamReady) { |
| 1658 SetRequest("POST", "/", DEFAULT_PRIORITY); |
| 1659 size_t spdy_request_headers_frame_length; |
| 1660 QuicStreamOffset header_stream_offset = 0; |
| 1661 AddWrite(ConstructInitialSettingsPacket(1, &header_stream_offset)); |
| 1662 AddWrite(ConstructRequestHeadersPacketInner( |
| 1663 2, GetNthClientInitiatedStreamId(0), !kFin, DEFAULT_PRIORITY, |
| 1664 &spdy_request_headers_frame_length, &header_stream_offset)); |
| 1665 AddWrite(ConstructClientEarlyRstStreamPacket(3)); |
| 1666 |
| 1667 Initialize(); |
| 1668 |
| 1669 BidirectionalStreamRequestInfo request; |
| 1670 request.method = "POST"; |
| 1671 request.url = GURL("http://www.google.com/"); |
| 1672 request.end_stream_on_headers = false; |
| 1673 request.priority = DEFAULT_PRIORITY; |
| 1674 |
| 1675 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
| 1676 std::unique_ptr<DeleteStreamDelegate> delegate( |
| 1677 new DeleteStreamDelegate(read_buffer.get(), kReadBufferSize, |
| 1678 DeleteStreamDelegate::ON_STREAM_READY)); |
| 1679 delegate->Start(&request, net_log().bound(), session()->CreateHandle()); |
| 1680 ConfirmHandshake(); |
| 1681 delegate->WaitUntilNextCallback(); // OnStreamReady |
| 1682 |
| 1683 EXPECT_EQ(0, delegate->on_data_read_count()); |
| 1684 EXPECT_EQ(0, delegate->on_data_sent_count()); |
| 1685 } |
| 1686 |
| 1612 TEST_P(BidirectionalStreamQuicImplTest, DeleteStreamAfterReadData) { | 1687 TEST_P(BidirectionalStreamQuicImplTest, DeleteStreamAfterReadData) { |
| 1613 SetRequest("POST", "/", DEFAULT_PRIORITY); | 1688 SetRequest("POST", "/", DEFAULT_PRIORITY); |
| 1614 size_t spdy_request_headers_frame_length; | 1689 size_t spdy_request_headers_frame_length; |
| 1615 QuicStreamOffset header_stream_offset = 0; | 1690 QuicStreamOffset header_stream_offset = 0; |
| 1616 AddWrite(ConstructInitialSettingsPacket(1, &header_stream_offset)); | 1691 AddWrite(ConstructInitialSettingsPacket(1, &header_stream_offset)); |
| 1617 AddWrite(ConstructRequestHeadersPacketInner( | 1692 AddWrite(ConstructRequestHeadersPacketInner( |
| 1618 2, GetNthClientInitiatedStreamId(0), !kFin, DEFAULT_PRIORITY, | 1693 2, GetNthClientInitiatedStreamId(0), !kFin, DEFAULT_PRIORITY, |
| 1619 &spdy_request_headers_frame_length, &header_stream_offset)); | 1694 &spdy_request_headers_frame_length, &header_stream_offset)); |
| 1620 AddWrite(ConstructClientAckAndRstStreamPacket(3, 2, 1, 1)); | 1695 AddWrite(ConstructClientAckAndRstStreamPacket(3, 2, 1, 1)); |
| 1621 | 1696 |
| (...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1896 | 1971 |
| 1897 base::RunLoop().RunUntilIdle(); | 1972 base::RunLoop().RunUntilIdle(); |
| 1898 | 1973 |
| 1899 EXPECT_EQ(1, delegate->on_data_read_count()); | 1974 EXPECT_EQ(1, delegate->on_data_read_count()); |
| 1900 EXPECT_EQ(0, delegate->on_data_sent_count()); | 1975 EXPECT_EQ(0, delegate->on_data_sent_count()); |
| 1901 } | 1976 } |
| 1902 | 1977 |
| 1903 } // namespace test | 1978 } // namespace test |
| 1904 | 1979 |
| 1905 } // namespace net | 1980 } // namespace net |
| OLD | NEW |