Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1025)

Side by Side Diff: net/quic/chromium/bidirectional_stream_quic_impl_unittest.cc

Issue 2914073002: Avoid crashing when a BidirectionalStreamQuicImpl is deleted during OnStreamReady. (Closed)
Patch Set: newline Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/quic/chromium/bidirectional_stream_quic_impl.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/quic/chromium/bidirectional_stream_quic_impl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698