| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/core/quic_connection.h" | 5 #include "net/quic/core/quic_connection.h" |
| 6 | 6 |
| 7 #include <errno.h> | 7 #include <errno.h> |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include <ostream> | 9 #include <ostream> |
| 10 #include <utility> | 10 #include <utility> |
| 11 | 11 |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/macros.h" | 13 #include "base/macros.h" |
| 14 #include "net/base/net_errors.h" | 14 #include "net/base/net_errors.h" |
| 15 #include "net/quic/core/congestion_control/loss_detection_interface.h" | 15 #include "net/quic/core/congestion_control/loss_detection_interface.h" |
| 16 #include "net/quic/core/congestion_control/send_algorithm_interface.h" | 16 #include "net/quic/core/congestion_control/send_algorithm_interface.h" |
| 17 #include "net/quic/core/crypto/null_encrypter.h" | 17 #include "net/quic/core/crypto/null_encrypter.h" |
| 18 #include "net/quic/core/crypto/quic_decrypter.h" | 18 #include "net/quic/core/crypto/quic_decrypter.h" |
| 19 #include "net/quic/core/crypto/quic_encrypter.h" | 19 #include "net/quic/core/crypto/quic_encrypter.h" |
| 20 #include "net/quic/core/quic_flags.h" | |
| 21 #include "net/quic/core/quic_packets.h" | 20 #include "net/quic/core/quic_packets.h" |
| 22 #include "net/quic/core/quic_simple_buffer_allocator.h" | 21 #include "net/quic/core/quic_simple_buffer_allocator.h" |
| 23 #include "net/quic/core/quic_utils.h" | 22 #include "net/quic/core/quic_utils.h" |
| 23 #include "net/quic/platform/api/quic_flags.h" |
| 24 #include "net/quic/platform/api/quic_logging.h" | 24 #include "net/quic/platform/api/quic_logging.h" |
| 25 #include "net/quic/platform/api/quic_reference_counted.h" | 25 #include "net/quic/platform/api/quic_reference_counted.h" |
| 26 #include "net/quic/platform/api/quic_str_cat.h" | 26 #include "net/quic/platform/api/quic_str_cat.h" |
| 27 #include "net/quic/test_tools/mock_clock.h" | 27 #include "net/quic/test_tools/mock_clock.h" |
| 28 #include "net/quic/test_tools/mock_random.h" | 28 #include "net/quic/test_tools/mock_random.h" |
| 29 #include "net/quic/test_tools/quic_config_peer.h" | 29 #include "net/quic/test_tools/quic_config_peer.h" |
| 30 #include "net/quic/test_tools/quic_connection_peer.h" | 30 #include "net/quic/test_tools/quic_connection_peer.h" |
| 31 #include "net/quic/test_tools/quic_framer_peer.h" | 31 #include "net/quic/test_tools/quic_framer_peer.h" |
| 32 #include "net/quic/test_tools/quic_packet_creator_peer.h" | 32 #include "net/quic/test_tools/quic_packet_creator_peer.h" |
| 33 #include "net/quic/test_tools/quic_packet_generator_peer.h" | 33 #include "net/quic/test_tools/quic_packet_generator_peer.h" |
| (...skipping 18 matching lines...) Expand all Loading... |
| 52 using testing::StrictMock; | 52 using testing::StrictMock; |
| 53 using testing::_; | 53 using testing::_; |
| 54 | 54 |
| 55 namespace net { | 55 namespace net { |
| 56 namespace test { | 56 namespace test { |
| 57 namespace { | 57 namespace { |
| 58 | 58 |
| 59 const char data1[] = "foo"; | 59 const char data1[] = "foo"; |
| 60 const char data2[] = "bar"; | 60 const char data2[] = "bar"; |
| 61 | 61 |
| 62 const bool kFin = true; | |
| 63 const bool kHasStopWaiting = true; | 62 const bool kHasStopWaiting = true; |
| 64 | 63 |
| 65 const int kDefaultRetransmissionTimeMs = 500; | 64 const int kDefaultRetransmissionTimeMs = 500; |
| 66 | 65 |
| 67 const QuicSocketAddress kPeerAddress = | 66 const QuicSocketAddress kPeerAddress = |
| 68 QuicSocketAddress(QuicIpAddress::Loopback6(), | 67 QuicSocketAddress(QuicIpAddress::Loopback6(), |
| 69 /*port=*/12345); | 68 /*port=*/12345); |
| 70 const QuicSocketAddress kSelfAddress = | 69 const QuicSocketAddress kSelfAddress = |
| 71 QuicSocketAddress(QuicIpAddress::Loopback6(), | 70 QuicSocketAddress(QuicIpAddress::Loopback6(), |
| 72 /*port=*/443); | 71 /*port=*/443); |
| (...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 383 } | 382 } |
| 384 | 383 |
| 385 const std::vector<std::unique_ptr<QuicStreamFrame>>& stream_frames() const { | 384 const std::vector<std::unique_ptr<QuicStreamFrame>>& stream_frames() const { |
| 386 return framer_.stream_frames(); | 385 return framer_.stream_frames(); |
| 387 } | 386 } |
| 388 | 387 |
| 389 const std::vector<QuicPingFrame>& ping_frames() const { | 388 const std::vector<QuicPingFrame>& ping_frames() const { |
| 390 return framer_.ping_frames(); | 389 return framer_.ping_frames(); |
| 391 } | 390 } |
| 392 | 391 |
| 392 const std::vector<QuicPaddingFrame>& padding_frames() const { |
| 393 return framer_.padding_frames(); |
| 394 } |
| 395 |
| 393 size_t last_packet_size() { return last_packet_size_; } | 396 size_t last_packet_size() { return last_packet_size_; } |
| 394 | 397 |
| 395 const QuicVersionNegotiationPacket* version_negotiation_packet() { | 398 const QuicVersionNegotiationPacket* version_negotiation_packet() { |
| 396 return framer_.version_negotiation_packet(); | 399 return framer_.version_negotiation_packet(); |
| 397 } | 400 } |
| 398 | 401 |
| 399 void set_is_write_blocked_data_buffered(bool buffered) { | 402 void set_is_write_blocked_data_buffered(bool buffered) { |
| 400 is_write_blocked_data_buffered_ = buffered; | 403 is_write_blocked_data_buffered_ = buffered; |
| 401 } | 404 } |
| 402 | 405 |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 504 serialized_packet.retransmittable_frames.push_back( | 507 serialized_packet.retransmittable_frames.push_back( |
| 505 QuicFrame(new QuicStreamFrame())); | 508 QuicFrame(new QuicStreamFrame())); |
| 506 } | 509 } |
| 507 OnSerializedPacket(&serialized_packet); | 510 OnSerializedPacket(&serialized_packet); |
| 508 } | 511 } |
| 509 | 512 |
| 510 QuicConsumedData SendStreamDataWithString( | 513 QuicConsumedData SendStreamDataWithString( |
| 511 QuicStreamId id, | 514 QuicStreamId id, |
| 512 QuicStringPiece data, | 515 QuicStringPiece data, |
| 513 QuicStreamOffset offset, | 516 QuicStreamOffset offset, |
| 514 bool fin, | 517 StreamSendingState state, |
| 515 QuicReferenceCountedPointer<QuicAckListenerInterface> ack_listener) { | 518 QuicReferenceCountedPointer<QuicAckListenerInterface> ack_listener) { |
| 516 if (id != kCryptoStreamId && this->encryption_level() == ENCRYPTION_NONE) { | 519 if (id != kCryptoStreamId && this->encryption_level() == ENCRYPTION_NONE) { |
| 517 this->SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE); | 520 this->SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE); |
| 518 } | 521 } |
| 519 struct iovec iov; | 522 struct iovec iov; |
| 520 QuicIOVector data_iov(MakeIOVector(data, &iov)); | 523 QuicIOVector data_iov(MakeIOVector(data, &iov)); |
| 521 return QuicConnection::SendStreamData(id, data_iov, offset, fin, | 524 return QuicConnection::SendStreamData(id, data_iov, offset, state, |
| 522 std::move(ack_listener)); | 525 std::move(ack_listener)); |
| 523 } | 526 } |
| 524 | 527 |
| 525 QuicConsumedData SendStreamData3() { | 528 QuicConsumedData SendStreamData3() { |
| 526 return SendStreamDataWithString(kClientDataStreamId1, "food", 0, !kFin, | 529 return SendStreamDataWithString(kClientDataStreamId1, "food", 0, NO_FIN, |
| 527 nullptr); | 530 nullptr); |
| 528 } | 531 } |
| 529 | 532 |
| 530 QuicConsumedData SendStreamData5() { | 533 QuicConsumedData SendStreamData5() { |
| 531 return SendStreamDataWithString(kClientDataStreamId2, "food2", 0, !kFin, | 534 return SendStreamDataWithString(kClientDataStreamId2, "food2", 0, NO_FIN, |
| 532 nullptr); | 535 nullptr); |
| 533 } | 536 } |
| 534 | 537 |
| 535 // Ensures the connection can write stream data before writing. | 538 // Ensures the connection can write stream data before writing. |
| 536 QuicConsumedData EnsureWritableAndSendStreamData5() { | 539 QuicConsumedData EnsureWritableAndSendStreamData5() { |
| 537 EXPECT_TRUE(CanWriteStreamData()); | 540 EXPECT_TRUE(CanWriteStreamData()); |
| 538 return SendStreamData5(); | 541 return SendStreamData5(); |
| 539 } | 542 } |
| 540 | 543 |
| 541 // The crypto stream has special semantics so that it is not blocked by a | 544 // The crypto stream has special semantics so that it is not blocked by a |
| 542 // congestion window limitation, and also so that it gets put into a separate | 545 // congestion window limitation, and also so that it gets put into a separate |
| 543 // packet (so that it is easier to reason about a crypto frame not being | 546 // packet (so that it is easier to reason about a crypto frame not being |
| 544 // split needlessly across packet boundaries). As a result, we have separate | 547 // split needlessly across packet boundaries). As a result, we have separate |
| 545 // tests for some cases for this stream. | 548 // tests for some cases for this stream. |
| 546 QuicConsumedData SendCryptoStreamData() { | 549 QuicConsumedData SendCryptoStreamData() { |
| 547 return SendStreamDataWithString(kCryptoStreamId, "chlo", 0, !kFin, nullptr); | 550 return SendStreamDataWithString(kCryptoStreamId, "chlo", 0, NO_FIN, |
| 551 nullptr); |
| 548 } | 552 } |
| 549 | 553 |
| 550 void set_version(QuicVersion version) { | 554 void set_version(QuicVersion version) { |
| 551 QuicConnectionPeer::GetFramer(this)->set_version(version); | 555 QuicConnectionPeer::GetFramer(this)->set_version(version); |
| 552 } | 556 } |
| 553 | 557 |
| 554 void SetSupportedVersions(const QuicVersionVector& versions) { | 558 void SetSupportedVersions(const QuicVersionVector& versions) { |
| 555 QuicConnectionPeer::GetFramer(this)->SetSupportedVersions(versions); | 559 QuicConnectionPeer::GetFramer(this)->SetSupportedVersions(versions); |
| 556 writer()->SetSupportedVersions(versions); | 560 writer()->SetSupportedVersions(versions); |
| 557 } | 561 } |
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 878 size_t encrypted_length = peer_framer_.EncryptPayload( | 882 size_t encrypted_length = peer_framer_.EncryptPayload( |
| 879 ENCRYPTION_NONE, number, *packet, buffer, kMaxPacketSize); | 883 ENCRYPTION_NONE, number, *packet, buffer, kMaxPacketSize); |
| 880 connection_.ProcessUdpPacket( | 884 connection_.ProcessUdpPacket( |
| 881 kSelfAddress, kPeerAddress, | 885 kSelfAddress, kPeerAddress, |
| 882 QuicReceivedPacket(buffer, encrypted_length, QuicTime::Zero(), false)); | 886 QuicReceivedPacket(buffer, encrypted_length, QuicTime::Zero(), false)); |
| 883 } | 887 } |
| 884 | 888 |
| 885 QuicByteCount SendStreamDataToPeer(QuicStreamId id, | 889 QuicByteCount SendStreamDataToPeer(QuicStreamId id, |
| 886 QuicStringPiece data, | 890 QuicStringPiece data, |
| 887 QuicStreamOffset offset, | 891 QuicStreamOffset offset, |
| 888 bool fin, | 892 StreamSendingState state, |
| 889 QuicPacketNumber* last_packet) { | 893 QuicPacketNumber* last_packet) { |
| 890 QuicByteCount packet_size; | 894 QuicByteCount packet_size; |
| 891 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 895 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
| 892 .WillOnce(DoAll(SaveArg<3>(&packet_size), Return(true))); | 896 .WillOnce(DoAll(SaveArg<3>(&packet_size), Return(true))); |
| 893 connection_.SendStreamDataWithString(id, data, offset, fin, nullptr); | 897 connection_.SendStreamDataWithString(id, data, offset, state, nullptr); |
| 894 if (last_packet != nullptr) { | 898 if (last_packet != nullptr) { |
| 895 *last_packet = creator_->packet_number(); | 899 *last_packet = creator_->packet_number(); |
| 896 } | 900 } |
| 897 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 901 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
| 898 .Times(AnyNumber()); | 902 .Times(AnyNumber()); |
| 899 return packet_size; | 903 return packet_size; |
| 900 } | 904 } |
| 901 | 905 |
| 902 void SendAckPacketToPeer() { | 906 void SendAckPacketToPeer() { |
| 903 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); | 907 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
| (...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1411 EXPECT_EQ(3u, writer_->packets_write_attempts()); | 1415 EXPECT_EQ(3u, writer_->packets_write_attempts()); |
| 1412 | 1416 |
| 1413 ProcessPacket(4); | 1417 ProcessPacket(4); |
| 1414 // Should not cause an ack. | 1418 // Should not cause an ack. |
| 1415 EXPECT_EQ(3u, writer_->packets_write_attempts()); | 1419 EXPECT_EQ(3u, writer_->packets_write_attempts()); |
| 1416 } | 1420 } |
| 1417 | 1421 |
| 1418 TEST_P(QuicConnectionTest, OutOfOrderAckReceiptCausesNoAck) { | 1422 TEST_P(QuicConnectionTest, OutOfOrderAckReceiptCausesNoAck) { |
| 1419 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 1423 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 1420 | 1424 |
| 1421 SendStreamDataToPeer(1, "foo", 0, !kFin, nullptr); | 1425 SendStreamDataToPeer(1, "foo", 0, NO_FIN, nullptr); |
| 1422 SendStreamDataToPeer(1, "bar", 3, !kFin, nullptr); | 1426 SendStreamDataToPeer(1, "bar", 3, NO_FIN, nullptr); |
| 1423 EXPECT_EQ(2u, writer_->packets_write_attempts()); | 1427 EXPECT_EQ(2u, writer_->packets_write_attempts()); |
| 1424 | 1428 |
| 1425 QuicAckFrame ack1 = InitAckFrame(1); | 1429 QuicAckFrame ack1 = InitAckFrame(1); |
| 1426 QuicAckFrame ack2 = InitAckFrame(2); | 1430 QuicAckFrame ack2 = InitAckFrame(2); |
| 1427 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 1431 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 1428 ProcessAckPacket(2, &ack2); | 1432 ProcessAckPacket(2, &ack2); |
| 1429 // Should ack immediately since we have missing packets. | 1433 // Should ack immediately since we have missing packets. |
| 1430 EXPECT_EQ(2u, writer_->packets_write_attempts()); | 1434 EXPECT_EQ(2u, writer_->packets_write_attempts()); |
| 1431 | 1435 |
| 1432 ProcessAckPacket(1, &ack1); | 1436 ProcessAckPacket(1, &ack1); |
| 1433 // Should not ack an ack filling a missing packet. | 1437 // Should not ack an ack filling a missing packet. |
| 1434 EXPECT_EQ(2u, writer_->packets_write_attempts()); | 1438 EXPECT_EQ(2u, writer_->packets_write_attempts()); |
| 1435 } | 1439 } |
| 1436 | 1440 |
| 1437 TEST_P(QuicConnectionTest, AckReceiptCausesAckSend) { | 1441 TEST_P(QuicConnectionTest, AckReceiptCausesAckSend) { |
| 1438 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 1442 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 1439 QuicPacketNumber original; | 1443 QuicPacketNumber original; |
| 1440 QuicByteCount packet_size; | 1444 QuicByteCount packet_size; |
| 1441 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 1445 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
| 1442 .WillOnce( | 1446 .WillOnce( |
| 1443 DoAll(SaveArg<2>(&original), SaveArg<3>(&packet_size), Return(true))); | 1447 DoAll(SaveArg<2>(&original), SaveArg<3>(&packet_size), Return(true))); |
| 1444 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, nullptr); | 1448 connection_.SendStreamDataWithString(3, "foo", 0, NO_FIN, nullptr); |
| 1445 QuicAckFrame frame = InitAckFrame(original); | 1449 QuicAckFrame frame = InitAckFrame(original); |
| 1446 NackPacket(original, &frame); | 1450 NackPacket(original, &frame); |
| 1447 // First nack triggers early retransmit. | 1451 // First nack triggers early retransmit. |
| 1448 SendAlgorithmInterface::CongestionVector lost_packets; | 1452 SendAlgorithmInterface::CongestionVector lost_packets; |
| 1449 lost_packets.push_back(std::make_pair(1, kMaxPacketSize)); | 1453 lost_packets.push_back(std::make_pair(1, kMaxPacketSize)); |
| 1450 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) | 1454 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) |
| 1451 .WillOnce(SetArgPointee<4>(lost_packets)); | 1455 .WillOnce(SetArgPointee<4>(lost_packets)); |
| 1452 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 1456 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 1453 QuicPacketNumber retransmission; | 1457 QuicPacketNumber retransmission; |
| 1454 EXPECT_CALL(*send_algorithm_, | 1458 EXPECT_CALL(*send_algorithm_, |
| 1455 OnPacketSent(_, _, _, packet_size - kQuicVersionSize, _)) | 1459 OnPacketSent(_, _, _, packet_size - kQuicVersionSize, _)) |
| 1456 .WillOnce(DoAll(SaveArg<2>(&retransmission), Return(true))); | 1460 .WillOnce(DoAll(SaveArg<2>(&retransmission), Return(true))); |
| 1457 | 1461 |
| 1458 ProcessAckPacket(&frame); | 1462 ProcessAckPacket(&frame); |
| 1459 | 1463 |
| 1460 QuicAckFrame frame2 = InitAckFrame(retransmission); | 1464 QuicAckFrame frame2 = InitAckFrame(retransmission); |
| 1461 NackPacket(original, &frame2); | 1465 NackPacket(original, &frame2); |
| 1462 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 1466 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 1463 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)); | 1467 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)); |
| 1464 ProcessAckPacket(&frame2); | 1468 ProcessAckPacket(&frame2); |
| 1465 | 1469 |
| 1466 // Now if the peer sends an ack which still reports the retransmitted packet | 1470 // Now if the peer sends an ack which still reports the retransmitted packet |
| 1467 // as missing, that will bundle an ack with data after two acks in a row | 1471 // as missing, that will bundle an ack with data after two acks in a row |
| 1468 // indicate the high water mark needs to be raised. | 1472 // indicate the high water mark needs to be raised. |
| 1469 EXPECT_CALL(*send_algorithm_, | 1473 EXPECT_CALL(*send_algorithm_, |
| 1470 OnPacketSent(_, _, _, _, HAS_RETRANSMITTABLE_DATA)); | 1474 OnPacketSent(_, _, _, _, HAS_RETRANSMITTABLE_DATA)); |
| 1471 connection_.SendStreamDataWithString(3, "foo", 3, !kFin, nullptr); | 1475 connection_.SendStreamDataWithString(3, "foo", 3, NO_FIN, nullptr); |
| 1472 // No ack sent. | 1476 // No ack sent. |
| 1473 EXPECT_EQ(1u, writer_->frame_count()); | 1477 EXPECT_EQ(1u, writer_->frame_count()); |
| 1474 EXPECT_EQ(1u, writer_->stream_frames().size()); | 1478 EXPECT_EQ(1u, writer_->stream_frames().size()); |
| 1475 | 1479 |
| 1476 // No more packet loss for the rest of the test. | 1480 // No more packet loss for the rest of the test. |
| 1477 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)).Times(AnyNumber()); | 1481 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)).Times(AnyNumber()); |
| 1478 ProcessAckPacket(&frame2); | 1482 ProcessAckPacket(&frame2); |
| 1479 EXPECT_CALL(*send_algorithm_, | 1483 EXPECT_CALL(*send_algorithm_, |
| 1480 OnPacketSent(_, _, _, _, HAS_RETRANSMITTABLE_DATA)); | 1484 OnPacketSent(_, _, _, _, HAS_RETRANSMITTABLE_DATA)); |
| 1481 connection_.SendStreamDataWithString(3, "foo", 3, !kFin, nullptr); | 1485 connection_.SendStreamDataWithString(3, "foo", 3, NO_FIN, nullptr); |
| 1482 // Ack bundled. | 1486 // Ack bundled. |
| 1483 if (GetParam().no_stop_waiting) { | 1487 if (GetParam().no_stop_waiting) { |
| 1484 EXPECT_EQ(2u, writer_->frame_count()); | 1488 EXPECT_EQ(2u, writer_->frame_count()); |
| 1485 } else { | 1489 } else { |
| 1486 EXPECT_EQ(3u, writer_->frame_count()); | 1490 EXPECT_EQ(3u, writer_->frame_count()); |
| 1487 } | 1491 } |
| 1488 EXPECT_EQ(1u, writer_->stream_frames().size()); | 1492 EXPECT_EQ(1u, writer_->stream_frames().size()); |
| 1489 EXPECT_FALSE(writer_->ack_frames().empty()); | 1493 EXPECT_FALSE(writer_->ack_frames().empty()); |
| 1490 | 1494 |
| 1491 // But an ack with no missing packets will not send an ack. | 1495 // But an ack with no missing packets will not send an ack. |
| 1492 AckPacket(original, &frame2); | 1496 AckPacket(original, &frame2); |
| 1493 ProcessAckPacket(&frame2); | 1497 ProcessAckPacket(&frame2); |
| 1494 ProcessAckPacket(&frame2); | 1498 ProcessAckPacket(&frame2); |
| 1495 } | 1499 } |
| 1496 | 1500 |
| 1497 TEST_P(QuicConnectionTest, 20AcksCausesAckSend) { | 1501 TEST_P(QuicConnectionTest, 20AcksCausesAckSend) { |
| 1498 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 1502 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 1499 | 1503 |
| 1500 SendStreamDataToPeer(1, "foo", 0, !kFin, nullptr); | 1504 SendStreamDataToPeer(1, "foo", 0, NO_FIN, nullptr); |
| 1501 | 1505 |
| 1502 QuicAlarm* ack_alarm = QuicConnectionPeer::GetAckAlarm(&connection_); | 1506 QuicAlarm* ack_alarm = QuicConnectionPeer::GetAckAlarm(&connection_); |
| 1503 // But an ack with no missing packets will not send an ack. | 1507 // But an ack with no missing packets will not send an ack. |
| 1504 QuicAckFrame frame = InitAckFrame(1); | 1508 QuicAckFrame frame = InitAckFrame(1); |
| 1505 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 1509 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 1506 for (int i = 0; i < 19; ++i) { | 1510 for (int i = 0; i < 19; ++i) { |
| 1507 ProcessAckPacket(&frame); | 1511 ProcessAckPacket(&frame); |
| 1508 EXPECT_FALSE(ack_alarm->IsSet()); | 1512 EXPECT_FALSE(ack_alarm->IsSet()); |
| 1509 } | 1513 } |
| 1510 EXPECT_EQ(1u, writer_->packets_write_attempts()); | 1514 EXPECT_EQ(1u, writer_->packets_write_attempts()); |
| 1511 // The 20th ack packet will cause an ack to be sent. | 1515 // The 20th ack packet will cause an ack to be sent. |
| 1512 ProcessAckPacket(&frame); | 1516 ProcessAckPacket(&frame); |
| 1513 EXPECT_EQ(2u, writer_->packets_write_attempts()); | 1517 EXPECT_EQ(2u, writer_->packets_write_attempts()); |
| 1514 } | 1518 } |
| 1515 | 1519 |
| 1516 TEST_P(QuicConnectionTest, LeastUnackedLower) { | 1520 TEST_P(QuicConnectionTest, LeastUnackedLower) { |
| 1517 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 1521 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 1518 | 1522 |
| 1519 SendStreamDataToPeer(1, "foo", 0, !kFin, nullptr); | 1523 SendStreamDataToPeer(1, "foo", 0, NO_FIN, nullptr); |
| 1520 SendStreamDataToPeer(1, "bar", 3, !kFin, nullptr); | 1524 SendStreamDataToPeer(1, "bar", 3, NO_FIN, nullptr); |
| 1521 SendStreamDataToPeer(1, "eep", 6, !kFin, nullptr); | 1525 SendStreamDataToPeer(1, "eep", 6, NO_FIN, nullptr); |
| 1522 | 1526 |
| 1523 // Start out saying the least unacked is 2. | 1527 // Start out saying the least unacked is 2. |
| 1524 QuicPacketCreatorPeer::SetPacketNumber(&peer_creator_, 5); | 1528 QuicPacketCreatorPeer::SetPacketNumber(&peer_creator_, 5); |
| 1525 QuicStopWaitingFrame frame = InitStopWaitingFrame(2); | 1529 QuicStopWaitingFrame frame = InitStopWaitingFrame(2); |
| 1526 ProcessStopWaitingPacket(&frame); | 1530 ProcessStopWaitingPacket(&frame); |
| 1527 | 1531 |
| 1528 // Change it to 1, but lower the packet number to fake out-of-order packets. | 1532 // Change it to 1, but lower the packet number to fake out-of-order packets. |
| 1529 // This should be fine. | 1533 // This should be fine. |
| 1530 QuicPacketCreatorPeer::SetPacketNumber(&peer_creator_, 1); | 1534 QuicPacketCreatorPeer::SetPacketNumber(&peer_creator_, 1); |
| 1531 // The scheduler will not process out of order acks, but all packet processing | 1535 // The scheduler will not process out of order acks, but all packet processing |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1546 } | 1550 } |
| 1547 QuicStopWaitingFrame frame3 = InitStopWaitingFrame(1); | 1551 QuicStopWaitingFrame frame3 = InitStopWaitingFrame(1); |
| 1548 ProcessStopWaitingPacket(&frame3); | 1552 ProcessStopWaitingPacket(&frame3); |
| 1549 } | 1553 } |
| 1550 | 1554 |
| 1551 TEST_P(QuicConnectionTest, TooManySentPackets) { | 1555 TEST_P(QuicConnectionTest, TooManySentPackets) { |
| 1552 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 1556 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 1553 | 1557 |
| 1554 const int num_packets = kMaxTrackedPackets + 100; | 1558 const int num_packets = kMaxTrackedPackets + 100; |
| 1555 for (int i = 0; i < num_packets; ++i) { | 1559 for (int i = 0; i < num_packets; ++i) { |
| 1556 SendStreamDataToPeer(1, "foo", 3 * i, !kFin, nullptr); | 1560 SendStreamDataToPeer(1, "foo", 3 * i, NO_FIN, nullptr); |
| 1557 } | 1561 } |
| 1558 | 1562 |
| 1559 // Ack packet 1, which leaves more than the limit outstanding. | 1563 // Ack packet 1, which leaves more than the limit outstanding. |
| 1560 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 1564 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 1561 | 1565 |
| 1562 // Nack the first packet and ack the rest, leaving a huge gap. | 1566 // Nack the first packet and ack the rest, leaving a huge gap. |
| 1563 QuicAckFrame frame1 = InitAckFrame(num_packets); | 1567 QuicAckFrame frame1 = InitAckFrame(num_packets); |
| 1564 NackPacket(1, &frame1); | 1568 NackPacket(1, &frame1); |
| 1565 ProcessAckPacket(&frame1); | 1569 ProcessAckPacket(&frame1); |
| 1566 } | 1570 } |
| 1567 | 1571 |
| 1568 TEST_P(QuicConnectionTest, TooManyReceivedPackets) { | 1572 TEST_P(QuicConnectionTest, TooManyReceivedPackets) { |
| 1569 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 1573 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 1570 // Miss 99 of every 100 packets for 5500 packets. | 1574 // Miss 99 of every 100 packets for 5500 packets. |
| 1571 for (QuicPacketNumber i = 1; i < kMaxTrackedPackets + 500; i += 100) { | 1575 for (QuicPacketNumber i = 1; i < kMaxTrackedPackets + 500; i += 100) { |
| 1572 ProcessPacket(i); | 1576 ProcessPacket(i); |
| 1573 if (!connection_.connected()) { | 1577 if (!connection_.connected()) { |
| 1574 break; | 1578 break; |
| 1575 } | 1579 } |
| 1576 } | 1580 } |
| 1577 } | 1581 } |
| 1578 | 1582 |
| 1579 TEST_P(QuicConnectionTest, LargestObservedLower) { | 1583 TEST_P(QuicConnectionTest, LargestObservedLower) { |
| 1580 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 1584 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 1581 | 1585 |
| 1582 SendStreamDataToPeer(1, "foo", 0, !kFin, nullptr); | 1586 SendStreamDataToPeer(1, "foo", 0, NO_FIN, nullptr); |
| 1583 SendStreamDataToPeer(1, "bar", 3, !kFin, nullptr); | 1587 SendStreamDataToPeer(1, "bar", 3, NO_FIN, nullptr); |
| 1584 SendStreamDataToPeer(1, "eep", 6, !kFin, nullptr); | 1588 SendStreamDataToPeer(1, "eep", 6, NO_FIN, nullptr); |
| 1585 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 1589 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 1586 | 1590 |
| 1587 // Start out saying the largest observed is 2. | 1591 // Start out saying the largest observed is 2. |
| 1588 QuicAckFrame frame1 = InitAckFrame(1); | 1592 QuicAckFrame frame1 = InitAckFrame(1); |
| 1589 QuicAckFrame frame2 = InitAckFrame(2); | 1593 QuicAckFrame frame2 = InitAckFrame(2); |
| 1590 ProcessAckPacket(&frame2); | 1594 ProcessAckPacket(&frame2); |
| 1591 | 1595 |
| 1592 // Now change it to 1, and it should cause a connection error. | 1596 // Now change it to 1, and it should cause a connection error. |
| 1593 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_ACK_DATA, _, | 1597 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_ACK_DATA, _, |
| 1594 ConnectionCloseSource::FROM_SELF)); | 1598 ConnectionCloseSource::FROM_SELF)); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1612 ProcessPacket(1); | 1616 ProcessPacket(1); |
| 1613 | 1617 |
| 1614 QuicPacketCreatorPeer::SetPacketNumber(&peer_creator_, 1); | 1618 QuicPacketCreatorPeer::SetPacketNumber(&peer_creator_, 1); |
| 1615 QuicAckFrame frame1 = InitAckFrame(0); | 1619 QuicAckFrame frame1 = InitAckFrame(0); |
| 1616 ProcessAckPacket(&frame1); | 1620 ProcessAckPacket(&frame1); |
| 1617 } | 1621 } |
| 1618 | 1622 |
| 1619 TEST_P(QuicConnectionTest, BasicSending) { | 1623 TEST_P(QuicConnectionTest, BasicSending) { |
| 1620 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 1624 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 1621 QuicPacketNumber last_packet; | 1625 QuicPacketNumber last_packet; |
| 1622 SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet); // Packet 1 | 1626 SendStreamDataToPeer(1, "foo", 0, NO_FIN, &last_packet); // Packet 1 |
| 1623 EXPECT_EQ(1u, last_packet); | 1627 EXPECT_EQ(1u, last_packet); |
| 1624 SendAckPacketToPeer(); // Packet 2 | 1628 SendAckPacketToPeer(); // Packet 2 |
| 1625 | 1629 |
| 1626 if (GetParam().no_stop_waiting) { | 1630 if (GetParam().no_stop_waiting) { |
| 1627 // Expect no stop waiting frame is sent. | 1631 // Expect no stop waiting frame is sent. |
| 1628 EXPECT_EQ(0u, least_unacked()); | 1632 EXPECT_EQ(0u, least_unacked()); |
| 1629 } else { | 1633 } else { |
| 1630 EXPECT_EQ(1u, least_unacked()); | 1634 EXPECT_EQ(1u, least_unacked()); |
| 1631 } | 1635 } |
| 1632 | 1636 |
| 1633 SendAckPacketToPeer(); // Packet 3 | 1637 SendAckPacketToPeer(); // Packet 3 |
| 1634 if (GetParam().no_stop_waiting) { | 1638 if (GetParam().no_stop_waiting) { |
| 1635 // Expect no stop waiting frame is sent. | 1639 // Expect no stop waiting frame is sent. |
| 1636 EXPECT_EQ(0u, least_unacked()); | 1640 EXPECT_EQ(0u, least_unacked()); |
| 1637 } else { | 1641 } else { |
| 1638 EXPECT_EQ(1u, least_unacked()); | 1642 EXPECT_EQ(1u, least_unacked()); |
| 1639 } | 1643 } |
| 1640 | 1644 |
| 1641 SendStreamDataToPeer(1, "bar", 3, !kFin, &last_packet); // Packet 4 | 1645 SendStreamDataToPeer(1, "bar", 3, NO_FIN, &last_packet); // Packet 4 |
| 1642 EXPECT_EQ(4u, last_packet); | 1646 EXPECT_EQ(4u, last_packet); |
| 1643 SendAckPacketToPeer(); // Packet 5 | 1647 SendAckPacketToPeer(); // Packet 5 |
| 1644 if (GetParam().no_stop_waiting) { | 1648 if (GetParam().no_stop_waiting) { |
| 1645 // Expect no stop waiting frame is sent. | 1649 // Expect no stop waiting frame is sent. |
| 1646 EXPECT_EQ(0u, least_unacked()); | 1650 EXPECT_EQ(0u, least_unacked()); |
| 1647 } else { | 1651 } else { |
| 1648 EXPECT_EQ(1u, least_unacked()); | 1652 EXPECT_EQ(1u, least_unacked()); |
| 1649 } | 1653 } |
| 1650 | 1654 |
| 1651 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 1655 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1684 // If we force an ack, we shouldn't change our retransmit state. | 1688 // If we force an ack, we shouldn't change our retransmit state. |
| 1685 SendAckPacketToPeer(); // Packet 7 | 1689 SendAckPacketToPeer(); // Packet 7 |
| 1686 if (GetParam().no_stop_waiting) { | 1690 if (GetParam().no_stop_waiting) { |
| 1687 // Expect no stop waiting frame is sent. | 1691 // Expect no stop waiting frame is sent. |
| 1688 EXPECT_EQ(0u, least_unacked()); | 1692 EXPECT_EQ(0u, least_unacked()); |
| 1689 } else { | 1693 } else { |
| 1690 EXPECT_EQ(7u, least_unacked()); | 1694 EXPECT_EQ(7u, least_unacked()); |
| 1691 } | 1695 } |
| 1692 | 1696 |
| 1693 // But if we send more data it should. | 1697 // But if we send more data it should. |
| 1694 SendStreamDataToPeer(1, "eep", 6, !kFin, &last_packet); // Packet 8 | 1698 SendStreamDataToPeer(1, "eep", 6, NO_FIN, &last_packet); // Packet 8 |
| 1695 EXPECT_EQ(8u, last_packet); | 1699 EXPECT_EQ(8u, last_packet); |
| 1696 SendAckPacketToPeer(); // Packet 9 | 1700 SendAckPacketToPeer(); // Packet 9 |
| 1697 if (GetParam().no_stop_waiting) { | 1701 if (GetParam().no_stop_waiting) { |
| 1698 // Expect no stop waiting frame is sent. | 1702 // Expect no stop waiting frame is sent. |
| 1699 EXPECT_EQ(0u, least_unacked()); | 1703 EXPECT_EQ(0u, least_unacked()); |
| 1700 } else { | 1704 } else { |
| 1701 EXPECT_EQ(7u, least_unacked()); | 1705 EXPECT_EQ(7u, least_unacked()); |
| 1702 } | 1706 } |
| 1703 } | 1707 } |
| 1704 | 1708 |
| 1705 // QuicConnection should record the the packet sent-time prior to sending the | 1709 // QuicConnection should record the the packet sent-time prior to sending the |
| 1706 // packet. | 1710 // packet. |
| 1707 TEST_P(QuicConnectionTest, RecordSentTimeBeforePacketSent) { | 1711 TEST_P(QuicConnectionTest, RecordSentTimeBeforePacketSent) { |
| 1708 // We're using a MockClock for the tests, so we have complete control over the | 1712 // We're using a MockClock for the tests, so we have complete control over the |
| 1709 // time. | 1713 // time. |
| 1710 // Our recorded timestamp for the last packet sent time will be passed in to | 1714 // Our recorded timestamp for the last packet sent time will be passed in to |
| 1711 // the send_algorithm. Make sure that it is set to the correct value. | 1715 // the send_algorithm. Make sure that it is set to the correct value. |
| 1712 QuicTime actual_recorded_send_time = QuicTime::Zero(); | 1716 QuicTime actual_recorded_send_time = QuicTime::Zero(); |
| 1713 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 1717 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
| 1714 .WillOnce(DoAll(SaveArg<0>(&actual_recorded_send_time), Return(true))); | 1718 .WillOnce(DoAll(SaveArg<0>(&actual_recorded_send_time), Return(true))); |
| 1715 | 1719 |
| 1716 // First send without any pause and check the result. | 1720 // First send without any pause and check the result. |
| 1717 QuicTime expected_recorded_send_time = clock_.Now(); | 1721 QuicTime expected_recorded_send_time = clock_.Now(); |
| 1718 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, nullptr); | 1722 connection_.SendStreamDataWithString(1, "foo", 0, NO_FIN, nullptr); |
| 1719 EXPECT_EQ(expected_recorded_send_time, actual_recorded_send_time) | 1723 EXPECT_EQ(expected_recorded_send_time, actual_recorded_send_time) |
| 1720 << "Expected time = " << expected_recorded_send_time.ToDebuggingValue() | 1724 << "Expected time = " << expected_recorded_send_time.ToDebuggingValue() |
| 1721 << ". Actual time = " << actual_recorded_send_time.ToDebuggingValue(); | 1725 << ". Actual time = " << actual_recorded_send_time.ToDebuggingValue(); |
| 1722 | 1726 |
| 1723 // Now pause during the write, and check the results. | 1727 // Now pause during the write, and check the results. |
| 1724 actual_recorded_send_time = QuicTime::Zero(); | 1728 actual_recorded_send_time = QuicTime::Zero(); |
| 1725 const QuicTime::Delta write_pause_time_delta = | 1729 const QuicTime::Delta write_pause_time_delta = |
| 1726 QuicTime::Delta::FromMilliseconds(5000); | 1730 QuicTime::Delta::FromMilliseconds(5000); |
| 1727 SetWritePauseTimeDelta(write_pause_time_delta); | 1731 SetWritePauseTimeDelta(write_pause_time_delta); |
| 1728 expected_recorded_send_time = clock_.Now(); | 1732 expected_recorded_send_time = clock_.Now(); |
| 1729 | 1733 |
| 1730 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 1734 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
| 1731 .WillOnce(DoAll(SaveArg<0>(&actual_recorded_send_time), Return(true))); | 1735 .WillOnce(DoAll(SaveArg<0>(&actual_recorded_send_time), Return(true))); |
| 1732 connection_.SendStreamDataWithString(2, "baz", 0, !kFin, nullptr); | 1736 connection_.SendStreamDataWithString(2, "baz", 0, NO_FIN, nullptr); |
| 1733 EXPECT_EQ(expected_recorded_send_time, actual_recorded_send_time) | 1737 EXPECT_EQ(expected_recorded_send_time, actual_recorded_send_time) |
| 1734 << "Expected time = " << expected_recorded_send_time.ToDebuggingValue() | 1738 << "Expected time = " << expected_recorded_send_time.ToDebuggingValue() |
| 1735 << ". Actual time = " << actual_recorded_send_time.ToDebuggingValue(); | 1739 << ". Actual time = " << actual_recorded_send_time.ToDebuggingValue(); |
| 1736 } | 1740 } |
| 1737 | 1741 |
| 1738 TEST_P(QuicConnectionTest, FramePacking) { | 1742 TEST_P(QuicConnectionTest, FramePacking) { |
| 1739 // Send an ack and two stream frames in 1 packet by queueing them. | 1743 // Send an ack and two stream frames in 1 packet by queueing them. |
| 1740 { | 1744 { |
| 1741 QuicConnection::ScopedPacketBundler bundler(&connection_, | 1745 QuicConnection::ScopedPacketBundler bundler(&connection_, |
| 1742 QuicConnection::SEND_ACK); | 1746 QuicConnection::SEND_ACK); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1769 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); | 1773 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); |
| 1770 QuicConnection::ScopedPacketBundler bundler(&connection_, | 1774 QuicConnection::ScopedPacketBundler bundler(&connection_, |
| 1771 QuicConnection::SEND_ACK); | 1775 QuicConnection::SEND_ACK); |
| 1772 connection_.SendStreamData3(); | 1776 connection_.SendStreamData3(); |
| 1773 connection_.SendCryptoStreamData(); | 1777 connection_.SendCryptoStreamData(); |
| 1774 } | 1778 } |
| 1775 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 1779 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 1776 EXPECT_FALSE(connection_.HasQueuedData()); | 1780 EXPECT_FALSE(connection_.HasQueuedData()); |
| 1777 | 1781 |
| 1778 // Parse the last packet and ensure it's the crypto stream frame. | 1782 // Parse the last packet and ensure it's the crypto stream frame. |
| 1779 EXPECT_EQ(1u, writer_->frame_count()); | 1783 EXPECT_EQ(2u, writer_->frame_count()); |
| 1780 ASSERT_EQ(1u, writer_->stream_frames().size()); | 1784 ASSERT_EQ(1u, writer_->stream_frames().size()); |
| 1785 ASSERT_EQ(1u, writer_->padding_frames().size()); |
| 1781 EXPECT_EQ(kCryptoStreamId, writer_->stream_frames()[0]->stream_id); | 1786 EXPECT_EQ(kCryptoStreamId, writer_->stream_frames()[0]->stream_id); |
| 1782 } | 1787 } |
| 1783 | 1788 |
| 1784 TEST_P(QuicConnectionTest, FramePackingCryptoThenNonCrypto) { | 1789 TEST_P(QuicConnectionTest, FramePackingCryptoThenNonCrypto) { |
| 1785 // Send an ack and two stream frames (one crypto, then one non-crypto) in 2 | 1790 // Send an ack and two stream frames (one crypto, then one non-crypto) in 2 |
| 1786 // packets by queueing them. | 1791 // packets by queueing them. |
| 1787 { | 1792 { |
| 1788 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); | 1793 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); |
| 1789 QuicConnection::ScopedPacketBundler bundler(&connection_, | 1794 QuicConnection::ScopedPacketBundler bundler(&connection_, |
| 1790 QuicConnection::SEND_ACK); | 1795 QuicConnection::SEND_ACK); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1840 // Send data in 1 packet by writing multiple blocks in a single iovector | 1845 // Send data in 1 packet by writing multiple blocks in a single iovector |
| 1841 // using writev. | 1846 // using writev. |
| 1842 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); | 1847 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); |
| 1843 | 1848 |
| 1844 char data[] = "ABCD"; | 1849 char data[] = "ABCD"; |
| 1845 struct iovec iov[2]; | 1850 struct iovec iov[2]; |
| 1846 iov[0].iov_base = data; | 1851 iov[0].iov_base = data; |
| 1847 iov[0].iov_len = 2; | 1852 iov[0].iov_len = 2; |
| 1848 iov[1].iov_base = data + 2; | 1853 iov[1].iov_base = data + 2; |
| 1849 iov[1].iov_len = 2; | 1854 iov[1].iov_len = 2; |
| 1850 connection_.SendStreamData(1, QuicIOVector(iov, 2, 4), 0, !kFin, nullptr); | 1855 connection_.SendStreamData(1, QuicIOVector(iov, 2, 4), 0, NO_FIN, nullptr); |
| 1851 | 1856 |
| 1852 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 1857 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 1853 EXPECT_FALSE(connection_.HasQueuedData()); | 1858 EXPECT_FALSE(connection_.HasQueuedData()); |
| 1854 | 1859 |
| 1855 // Parse the last packet and ensure multiple iovector blocks have | 1860 // Parse the last packet and ensure multiple iovector blocks have |
| 1856 // been packed into a single stream frame from one stream. | 1861 // been packed into a single stream frame from one stream. |
| 1857 EXPECT_EQ(1u, writer_->frame_count()); | 1862 EXPECT_EQ(2u, writer_->frame_count()); |
| 1858 EXPECT_EQ(1u, writer_->stream_frames().size()); | 1863 EXPECT_EQ(1u, writer_->stream_frames().size()); |
| 1864 EXPECT_EQ(1u, writer_->padding_frames().size()); |
| 1859 QuicStreamFrame* frame = writer_->stream_frames()[0].get(); | 1865 QuicStreamFrame* frame = writer_->stream_frames()[0].get(); |
| 1860 EXPECT_EQ(1u, frame->stream_id); | 1866 EXPECT_EQ(1u, frame->stream_id); |
| 1861 EXPECT_EQ("ABCD", QuicStringPiece(frame->data_buffer, frame->data_length)); | 1867 EXPECT_EQ("ABCD", QuicStringPiece(frame->data_buffer, frame->data_length)); |
| 1862 } | 1868 } |
| 1863 | 1869 |
| 1864 TEST_P(QuicConnectionTest, FramePackingSendvQueued) { | 1870 TEST_P(QuicConnectionTest, FramePackingSendvQueued) { |
| 1865 // Try to send two stream frames in 1 packet by using writev. | 1871 // Try to send two stream frames in 1 packet by using writev. |
| 1866 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); | 1872 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); |
| 1867 | 1873 |
| 1868 BlockOnNextWrite(); | 1874 BlockOnNextWrite(); |
| 1869 char data[] = "ABCD"; | 1875 char data[] = "ABCD"; |
| 1870 struct iovec iov[2]; | 1876 struct iovec iov[2]; |
| 1871 iov[0].iov_base = data; | 1877 iov[0].iov_base = data; |
| 1872 iov[0].iov_len = 2; | 1878 iov[0].iov_len = 2; |
| 1873 iov[1].iov_base = data + 2; | 1879 iov[1].iov_base = data + 2; |
| 1874 iov[1].iov_len = 2; | 1880 iov[1].iov_len = 2; |
| 1875 connection_.SendStreamData(1, QuicIOVector(iov, 2, 4), 0, !kFin, nullptr); | 1881 connection_.SendStreamData(1, QuicIOVector(iov, 2, 4), 0, NO_FIN, nullptr); |
| 1876 | 1882 |
| 1877 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 1883 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 1878 EXPECT_TRUE(connection_.HasQueuedData()); | 1884 EXPECT_TRUE(connection_.HasQueuedData()); |
| 1879 | 1885 |
| 1880 // Unblock the writes and actually send. | 1886 // Unblock the writes and actually send. |
| 1881 writer_->SetWritable(); | 1887 writer_->SetWritable(); |
| 1882 connection_.OnCanWrite(); | 1888 connection_.OnCanWrite(); |
| 1883 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 1889 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 1884 | 1890 |
| 1885 // Parse the last packet and ensure it's one stream frame from one stream. | 1891 // Parse the last packet and ensure it's one stream frame from one stream. |
| 1886 EXPECT_EQ(1u, writer_->frame_count()); | 1892 EXPECT_EQ(2u, writer_->frame_count()); |
| 1887 EXPECT_EQ(1u, writer_->stream_frames().size()); | 1893 EXPECT_EQ(1u, writer_->stream_frames().size()); |
| 1894 EXPECT_EQ(1u, writer_->padding_frames().size()); |
| 1888 EXPECT_EQ(1u, writer_->stream_frames()[0]->stream_id); | 1895 EXPECT_EQ(1u, writer_->stream_frames()[0]->stream_id); |
| 1889 } | 1896 } |
| 1890 | 1897 |
| 1891 TEST_P(QuicConnectionTest, SendingZeroBytes) { | 1898 TEST_P(QuicConnectionTest, SendingZeroBytes) { |
| 1892 connection_.SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE); | 1899 connection_.SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE); |
| 1893 // Send a zero byte write with a fin using writev. | 1900 // Send a zero byte write with a fin using writev. |
| 1894 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); | 1901 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); |
| 1895 QuicIOVector empty_iov(nullptr, 0, 0); | 1902 QuicIOVector empty_iov(nullptr, 0, 0); |
| 1896 connection_.SendStreamData(kHeadersStreamId, empty_iov, 0, kFin, nullptr); | 1903 connection_.SendStreamData(kHeadersStreamId, empty_iov, 0, FIN, nullptr); |
| 1897 | 1904 |
| 1898 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 1905 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 1899 EXPECT_FALSE(connection_.HasQueuedData()); | 1906 EXPECT_FALSE(connection_.HasQueuedData()); |
| 1900 | 1907 |
| 1901 // Parse the last packet and ensure it's one stream frame from one stream. | 1908 // Parse the last packet and ensure it's one stream frame from one stream. |
| 1902 EXPECT_EQ(1u, writer_->frame_count()); | 1909 EXPECT_EQ(1u, writer_->frame_count()); |
| 1903 EXPECT_EQ(1u, writer_->stream_frames().size()); | 1910 EXPECT_EQ(1u, writer_->stream_frames().size()); |
| 1904 EXPECT_EQ(kHeadersStreamId, writer_->stream_frames()[0]->stream_id); | 1911 EXPECT_EQ(kHeadersStreamId, writer_->stream_frames()[0]->stream_id); |
| 1905 EXPECT_TRUE(writer_->stream_frames()[0]->fin); | 1912 EXPECT_TRUE(writer_->stream_frames()[0]->fin); |
| 1906 } | 1913 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1919 // Send data and ensure the ack is bundled. | 1926 // Send data and ensure the ack is bundled. |
| 1920 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(8); | 1927 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(8); |
| 1921 size_t len = 10000; | 1928 size_t len = 10000; |
| 1922 std::unique_ptr<char[]> data_array(new char[len]); | 1929 std::unique_ptr<char[]> data_array(new char[len]); |
| 1923 memset(data_array.get(), '?', len); | 1930 memset(data_array.get(), '?', len); |
| 1924 struct iovec iov; | 1931 struct iovec iov; |
| 1925 iov.iov_base = data_array.get(); | 1932 iov.iov_base = data_array.get(); |
| 1926 iov.iov_len = len; | 1933 iov.iov_len = len; |
| 1927 QuicIOVector iovector(&iov, 1, len); | 1934 QuicIOVector iovector(&iov, 1, len); |
| 1928 QuicConsumedData consumed = | 1935 QuicConsumedData consumed = |
| 1929 connection_.SendStreamData(kHeadersStreamId, iovector, 0, true, nullptr); | 1936 connection_.SendStreamData(kHeadersStreamId, iovector, 0, FIN, nullptr); |
| 1930 EXPECT_EQ(len, consumed.bytes_consumed); | 1937 EXPECT_EQ(len, consumed.bytes_consumed); |
| 1931 EXPECT_TRUE(consumed.fin_consumed); | 1938 EXPECT_TRUE(consumed.fin_consumed); |
| 1932 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 1939 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 1933 EXPECT_FALSE(connection_.HasQueuedData()); | 1940 EXPECT_FALSE(connection_.HasQueuedData()); |
| 1934 | 1941 |
| 1935 // Parse the last packet and ensure it's one stream frame with a fin. | 1942 // Parse the last packet and ensure it's one stream frame with a fin. |
| 1936 EXPECT_EQ(1u, writer_->frame_count()); | 1943 EXPECT_EQ(1u, writer_->frame_count()); |
| 1937 EXPECT_EQ(1u, writer_->stream_frames().size()); | 1944 EXPECT_EQ(1u, writer_->stream_frames().size()); |
| 1938 EXPECT_EQ(kHeadersStreamId, writer_->stream_frames()[0]->stream_id); | 1945 EXPECT_EQ(kHeadersStreamId, writer_->stream_frames()[0]->stream_id); |
| 1939 EXPECT_TRUE(writer_->stream_frames()[0]->fin); | 1946 EXPECT_TRUE(writer_->stream_frames()[0]->fin); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1964 // two different streams. | 1971 // two different streams. |
| 1965 EXPECT_EQ(2u, writer_->frame_count()); | 1972 EXPECT_EQ(2u, writer_->frame_count()); |
| 1966 EXPECT_EQ(2u, writer_->stream_frames().size()); | 1973 EXPECT_EQ(2u, writer_->stream_frames().size()); |
| 1967 EXPECT_EQ(kClientDataStreamId1, writer_->stream_frames()[0]->stream_id); | 1974 EXPECT_EQ(kClientDataStreamId1, writer_->stream_frames()[0]->stream_id); |
| 1968 EXPECT_EQ(kClientDataStreamId2, writer_->stream_frames()[1]->stream_id); | 1975 EXPECT_EQ(kClientDataStreamId2, writer_->stream_frames()[1]->stream_id); |
| 1969 } | 1976 } |
| 1970 | 1977 |
| 1971 TEST_P(QuicConnectionTest, RetransmitOnNack) { | 1978 TEST_P(QuicConnectionTest, RetransmitOnNack) { |
| 1972 QuicPacketNumber last_packet; | 1979 QuicPacketNumber last_packet; |
| 1973 QuicByteCount second_packet_size; | 1980 QuicByteCount second_packet_size; |
| 1974 SendStreamDataToPeer(3, "foo", 0, !kFin, &last_packet); // Packet 1 | 1981 SendStreamDataToPeer(3, "foo", 0, NO_FIN, &last_packet); // Packet 1 |
| 1975 second_packet_size = | 1982 second_packet_size = |
| 1976 SendStreamDataToPeer(3, "foos", 3, !kFin, &last_packet); // Packet 2 | 1983 SendStreamDataToPeer(3, "foos", 3, NO_FIN, &last_packet); // Packet 2 |
| 1977 SendStreamDataToPeer(3, "fooos", 7, !kFin, &last_packet); // Packet 3 | 1984 SendStreamDataToPeer(3, "fooos", 7, NO_FIN, &last_packet); // Packet 3 |
| 1978 | 1985 |
| 1979 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 1986 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 1980 | 1987 |
| 1981 // Don't lose a packet on an ack, and nothing is retransmitted. | 1988 // Don't lose a packet on an ack, and nothing is retransmitted. |
| 1982 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 1989 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 1983 QuicAckFrame ack_one = InitAckFrame(1); | 1990 QuicAckFrame ack_one = InitAckFrame(1); |
| 1984 ProcessAckPacket(&ack_one); | 1991 ProcessAckPacket(&ack_one); |
| 1985 | 1992 |
| 1986 // Lose a packet and ensure it triggers retransmission. | 1993 // Lose a packet and ensure it triggers retransmission. |
| 1987 QuicAckFrame nack_two = InitAckFrame(3); | 1994 QuicAckFrame nack_two = InitAckFrame(3); |
| 1988 NackPacket(2, &nack_two); | 1995 NackPacket(2, &nack_two); |
| 1989 SendAlgorithmInterface::CongestionVector lost_packets; | 1996 SendAlgorithmInterface::CongestionVector lost_packets; |
| 1990 lost_packets.push_back(std::make_pair(2, kMaxPacketSize)); | 1997 lost_packets.push_back(std::make_pair(2, kMaxPacketSize)); |
| 1991 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) | 1998 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) |
| 1992 .WillOnce(SetArgPointee<4>(lost_packets)); | 1999 .WillOnce(SetArgPointee<4>(lost_packets)); |
| 1993 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 2000 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 1994 EXPECT_CALL(*send_algorithm_, | 2001 EXPECT_CALL(*send_algorithm_, |
| 1995 OnPacketSent(_, _, _, second_packet_size - kQuicVersionSize, _)) | 2002 OnPacketSent(_, _, _, second_packet_size - kQuicVersionSize, _)) |
| 1996 .Times(1); | 2003 .Times(1); |
| 1997 ProcessAckPacket(&nack_two); | 2004 ProcessAckPacket(&nack_two); |
| 1998 } | 2005 } |
| 1999 | 2006 |
| 2000 TEST_P(QuicConnectionTest, DoNotSendQueuedPacketForResetStream) { | 2007 TEST_P(QuicConnectionTest, DoNotSendQueuedPacketForResetStream) { |
| 2001 // Block the connection to queue the packet. | 2008 // Block the connection to queue the packet. |
| 2002 BlockOnNextWrite(); | 2009 BlockOnNextWrite(); |
| 2003 | 2010 |
| 2004 QuicStreamId stream_id = 2; | 2011 QuicStreamId stream_id = 2; |
| 2005 connection_.SendStreamDataWithString(stream_id, "foo", 0, !kFin, nullptr); | 2012 connection_.SendStreamDataWithString(stream_id, "foo", 0, NO_FIN, nullptr); |
| 2006 | 2013 |
| 2007 // Now that there is a queued packet, reset the stream. | 2014 // Now that there is a queued packet, reset the stream. |
| 2008 connection_.SendRstStream(stream_id, QUIC_ERROR_PROCESSING_STREAM, 14); | 2015 connection_.SendRstStream(stream_id, QUIC_ERROR_PROCESSING_STREAM, 14); |
| 2009 | 2016 |
| 2010 // Unblock the connection and verify that only the RST_STREAM is sent. | 2017 // Unblock the connection and verify that only the RST_STREAM is sent. |
| 2011 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); | 2018 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
| 2012 writer_->SetWritable(); | 2019 writer_->SetWritable(); |
| 2013 connection_.OnCanWrite(); | 2020 connection_.OnCanWrite(); |
| 2014 EXPECT_EQ(1u, writer_->frame_count()); | 2021 EXPECT_EQ(1u, writer_->frame_count()); |
| 2015 EXPECT_EQ(1u, writer_->rst_stream_frames().size()); | 2022 EXPECT_EQ(1u, writer_->rst_stream_frames().size()); |
| 2016 } | 2023 } |
| 2017 | 2024 |
| 2018 TEST_P(QuicConnectionTest, SendQueuedPacketForQuicRstStreamNoError) { | 2025 TEST_P(QuicConnectionTest, SendQueuedPacketForQuicRstStreamNoError) { |
| 2019 // Block the connection to queue the packet. | 2026 // Block the connection to queue the packet. |
| 2020 BlockOnNextWrite(); | 2027 BlockOnNextWrite(); |
| 2021 | 2028 |
| 2022 QuicStreamId stream_id = 2; | 2029 QuicStreamId stream_id = 2; |
| 2023 connection_.SendStreamDataWithString(stream_id, "foo", 0, !kFin, nullptr); | 2030 connection_.SendStreamDataWithString(stream_id, "foo", 0, NO_FIN, nullptr); |
| 2024 | 2031 |
| 2025 // Now that there is a queued packet, reset the stream. | 2032 // Now that there is a queued packet, reset the stream. |
| 2026 connection_.SendRstStream(stream_id, QUIC_STREAM_NO_ERROR, 14); | 2033 connection_.SendRstStream(stream_id, QUIC_STREAM_NO_ERROR, 14); |
| 2027 | 2034 |
| 2028 // Unblock the connection and verify that the RST_STREAM is sent and the data | 2035 // Unblock the connection and verify that the RST_STREAM is sent and the data |
| 2029 // packet is sent. | 2036 // packet is sent. |
| 2030 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(AtLeast(2)); | 2037 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(AtLeast(2)); |
| 2031 writer_->SetWritable(); | 2038 writer_->SetWritable(); |
| 2032 connection_.OnCanWrite(); | 2039 connection_.OnCanWrite(); |
| 2033 EXPECT_EQ(1u, writer_->frame_count()); | 2040 EXPECT_EQ(1u, writer_->frame_count()); |
| 2034 EXPECT_EQ(1u, writer_->rst_stream_frames().size()); | 2041 EXPECT_EQ(1u, writer_->rst_stream_frames().size()); |
| 2035 } | 2042 } |
| 2036 | 2043 |
| 2037 TEST_P(QuicConnectionTest, DoNotRetransmitForResetStreamOnNack) { | 2044 TEST_P(QuicConnectionTest, DoNotRetransmitForResetStreamOnNack) { |
| 2038 QuicStreamId stream_id = 2; | 2045 QuicStreamId stream_id = 2; |
| 2039 QuicPacketNumber last_packet; | 2046 QuicPacketNumber last_packet; |
| 2040 SendStreamDataToPeer(stream_id, "foo", 0, !kFin, &last_packet); | 2047 SendStreamDataToPeer(stream_id, "foo", 0, NO_FIN, &last_packet); |
| 2041 SendStreamDataToPeer(stream_id, "foos", 3, !kFin, &last_packet); | 2048 SendStreamDataToPeer(stream_id, "foos", 3, NO_FIN, &last_packet); |
| 2042 SendStreamDataToPeer(stream_id, "fooos", 7, !kFin, &last_packet); | 2049 SendStreamDataToPeer(stream_id, "fooos", 7, NO_FIN, &last_packet); |
| 2043 | 2050 |
| 2044 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); | 2051 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
| 2045 connection_.SendRstStream(stream_id, QUIC_ERROR_PROCESSING_STREAM, 14); | 2052 connection_.SendRstStream(stream_id, QUIC_ERROR_PROCESSING_STREAM, 14); |
| 2046 | 2053 |
| 2047 // Lose a packet and ensure it does not trigger retransmission. | 2054 // Lose a packet and ensure it does not trigger retransmission. |
| 2048 QuicAckFrame nack_two = InitAckFrame(last_packet); | 2055 QuicAckFrame nack_two = InitAckFrame(last_packet); |
| 2049 NackPacket(last_packet - 1, &nack_two); | 2056 NackPacket(last_packet - 1, &nack_two); |
| 2050 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2057 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 2051 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)); | 2058 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)); |
| 2052 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 2059 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 2053 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0); | 2060 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0); |
| 2054 ProcessAckPacket(&nack_two); | 2061 ProcessAckPacket(&nack_two); |
| 2055 } | 2062 } |
| 2056 | 2063 |
| 2057 TEST_P(QuicConnectionTest, RetransmitForQuicRstStreamNoErrorOnNack) { | 2064 TEST_P(QuicConnectionTest, RetransmitForQuicRstStreamNoErrorOnNack) { |
| 2058 QuicStreamId stream_id = 2; | 2065 QuicStreamId stream_id = 2; |
| 2059 QuicPacketNumber last_packet; | 2066 QuicPacketNumber last_packet; |
| 2060 SendStreamDataToPeer(stream_id, "foo", 0, !kFin, &last_packet); | 2067 SendStreamDataToPeer(stream_id, "foo", 0, NO_FIN, &last_packet); |
| 2061 SendStreamDataToPeer(stream_id, "foos", 3, !kFin, &last_packet); | 2068 SendStreamDataToPeer(stream_id, "foos", 3, NO_FIN, &last_packet); |
| 2062 SendStreamDataToPeer(stream_id, "fooos", 7, !kFin, &last_packet); | 2069 SendStreamDataToPeer(stream_id, "fooos", 7, NO_FIN, &last_packet); |
| 2063 | 2070 |
| 2064 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); | 2071 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
| 2065 connection_.SendRstStream(stream_id, QUIC_STREAM_NO_ERROR, 14); | 2072 connection_.SendRstStream(stream_id, QUIC_STREAM_NO_ERROR, 14); |
| 2066 | 2073 |
| 2067 // Lose a packet, ensure it triggers retransmission. | 2074 // Lose a packet, ensure it triggers retransmission. |
| 2068 QuicAckFrame nack_two = InitAckFrame(last_packet); | 2075 QuicAckFrame nack_two = InitAckFrame(last_packet); |
| 2069 NackPacket(last_packet - 1, &nack_two); | 2076 NackPacket(last_packet - 1, &nack_two); |
| 2070 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2077 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 2071 SendAlgorithmInterface::CongestionVector lost_packets; | 2078 SendAlgorithmInterface::CongestionVector lost_packets; |
| 2072 lost_packets.push_back(std::make_pair(last_packet - 1, kMaxPacketSize)); | 2079 lost_packets.push_back(std::make_pair(last_packet - 1, kMaxPacketSize)); |
| 2073 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) | 2080 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) |
| 2074 .WillOnce(SetArgPointee<4>(lost_packets)); | 2081 .WillOnce(SetArgPointee<4>(lost_packets)); |
| 2075 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 2082 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 2076 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(AtLeast(1)); | 2083 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(AtLeast(1)); |
| 2077 ProcessAckPacket(&nack_two); | 2084 ProcessAckPacket(&nack_two); |
| 2078 } | 2085 } |
| 2079 | 2086 |
| 2080 TEST_P(QuicConnectionTest, DoNotRetransmitForResetStreamOnRTO) { | 2087 TEST_P(QuicConnectionTest, DoNotRetransmitForResetStreamOnRTO) { |
| 2081 QuicStreamId stream_id = 2; | 2088 QuicStreamId stream_id = 2; |
| 2082 QuicPacketNumber last_packet; | 2089 QuicPacketNumber last_packet; |
| 2083 SendStreamDataToPeer(stream_id, "foo", 0, !kFin, &last_packet); | 2090 SendStreamDataToPeer(stream_id, "foo", 0, NO_FIN, &last_packet); |
| 2084 | 2091 |
| 2085 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); | 2092 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
| 2086 connection_.SendRstStream(stream_id, QUIC_ERROR_PROCESSING_STREAM, 14); | 2093 connection_.SendRstStream(stream_id, QUIC_ERROR_PROCESSING_STREAM, 14); |
| 2087 | 2094 |
| 2088 // Fire the RTO and verify that the RST_STREAM is resent, not stream data. | 2095 // Fire the RTO and verify that the RST_STREAM is resent, not stream data. |
| 2089 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); | 2096 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
| 2090 clock_.AdvanceTime(DefaultRetransmissionTime()); | 2097 clock_.AdvanceTime(DefaultRetransmissionTime()); |
| 2091 connection_.GetRetransmissionAlarm()->Fire(); | 2098 connection_.GetRetransmissionAlarm()->Fire(); |
| 2092 EXPECT_EQ(1u, writer_->frame_count()); | 2099 EXPECT_EQ(1u, writer_->frame_count()); |
| 2093 EXPECT_EQ(1u, writer_->rst_stream_frames().size()); | 2100 EXPECT_EQ(1u, writer_->rst_stream_frames().size()); |
| 2094 EXPECT_EQ(stream_id, writer_->rst_stream_frames().front().stream_id); | 2101 EXPECT_EQ(stream_id, writer_->rst_stream_frames().front().stream_id); |
| 2095 } | 2102 } |
| 2096 | 2103 |
| 2097 // Ensure that if the only data in flight is non-retransmittable, the | 2104 // Ensure that if the only data in flight is non-retransmittable, the |
| 2098 // retransmission alarm is not set. | 2105 // retransmission alarm is not set. |
| 2099 TEST_P(QuicConnectionTest, CancelRetransmissionAlarmAfterResetStream) { | 2106 TEST_P(QuicConnectionTest, CancelRetransmissionAlarmAfterResetStream) { |
| 2100 QuicStreamId stream_id = 2; | 2107 QuicStreamId stream_id = 2; |
| 2101 QuicPacketNumber last_data_packet; | 2108 QuicPacketNumber last_data_packet; |
| 2102 SendStreamDataToPeer(stream_id, "foo", 0, !kFin, &last_data_packet); | 2109 SendStreamDataToPeer(stream_id, "foo", 0, NO_FIN, &last_data_packet); |
| 2103 | 2110 |
| 2104 // Cancel the stream. | 2111 // Cancel the stream. |
| 2105 const QuicPacketNumber rst_packet = last_data_packet + 1; | 2112 const QuicPacketNumber rst_packet = last_data_packet + 1; |
| 2106 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, rst_packet, _, _)).Times(1); | 2113 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, rst_packet, _, _)).Times(1); |
| 2107 connection_.SendRstStream(stream_id, QUIC_ERROR_PROCESSING_STREAM, 14); | 2114 connection_.SendRstStream(stream_id, QUIC_ERROR_PROCESSING_STREAM, 14); |
| 2108 | 2115 |
| 2109 // Ack the RST_STREAM frame (since it's retransmittable), but not the data | 2116 // Ack the RST_STREAM frame (since it's retransmittable), but not the data |
| 2110 // packet, which is no longer retransmittable since the stream was cancelled. | 2117 // packet, which is no longer retransmittable since the stream was cancelled. |
| 2111 QuicAckFrame nack_stream_data = InitAckFrame(rst_packet); | 2118 QuicAckFrame nack_stream_data = InitAckFrame(rst_packet); |
| 2112 NackPacket(last_data_packet, &nack_stream_data); | 2119 NackPacket(last_data_packet, &nack_stream_data); |
| 2113 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2120 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 2114 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 2121 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 2115 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0); | 2122 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0); |
| 2116 ProcessAckPacket(&nack_stream_data); | 2123 ProcessAckPacket(&nack_stream_data); |
| 2117 | 2124 |
| 2118 // Ensure that the data is still in flight, but the retransmission alarm is no | 2125 // Ensure that the data is still in flight, but the retransmission alarm is no |
| 2119 // longer set. | 2126 // longer set. |
| 2120 EXPECT_GT(QuicSentPacketManagerPeer::GetBytesInFlight(manager_), 0u); | 2127 EXPECT_GT(QuicSentPacketManagerPeer::GetBytesInFlight(manager_), 0u); |
| 2121 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); | 2128 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); |
| 2122 } | 2129 } |
| 2123 | 2130 |
| 2124 TEST_P(QuicConnectionTest, RetransmitForQuicRstStreamNoErrorOnRTO) { | 2131 TEST_P(QuicConnectionTest, RetransmitForQuicRstStreamNoErrorOnRTO) { |
| 2125 connection_.SetMaxTailLossProbes(0); | 2132 connection_.SetMaxTailLossProbes(0); |
| 2126 | 2133 |
| 2127 QuicStreamId stream_id = 2; | 2134 QuicStreamId stream_id = 2; |
| 2128 QuicPacketNumber last_packet; | 2135 QuicPacketNumber last_packet; |
| 2129 SendStreamDataToPeer(stream_id, "foo", 0, !kFin, &last_packet); | 2136 SendStreamDataToPeer(stream_id, "foo", 0, NO_FIN, &last_packet); |
| 2130 | 2137 |
| 2131 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); | 2138 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
| 2132 connection_.SendRstStream(stream_id, QUIC_STREAM_NO_ERROR, 14); | 2139 connection_.SendRstStream(stream_id, QUIC_STREAM_NO_ERROR, 14); |
| 2133 | 2140 |
| 2134 // Fire the RTO and verify that the RST_STREAM is resent, the stream data | 2141 // Fire the RTO and verify that the RST_STREAM is resent, the stream data |
| 2135 // is sent. | 2142 // is sent. |
| 2136 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(AtLeast(2)); | 2143 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(AtLeast(2)); |
| 2137 clock_.AdvanceTime(DefaultRetransmissionTime()); | 2144 clock_.AdvanceTime(DefaultRetransmissionTime()); |
| 2138 connection_.GetRetransmissionAlarm()->Fire(); | 2145 connection_.GetRetransmissionAlarm()->Fire(); |
| 2139 EXPECT_EQ(1u, writer_->frame_count()); | 2146 EXPECT_EQ(1u, writer_->frame_count()); |
| 2140 ASSERT_EQ(1u, writer_->rst_stream_frames().size()); | 2147 ASSERT_EQ(1u, writer_->rst_stream_frames().size()); |
| 2141 EXPECT_EQ(stream_id, writer_->rst_stream_frames().front().stream_id); | 2148 EXPECT_EQ(stream_id, writer_->rst_stream_frames().front().stream_id); |
| 2142 } | 2149 } |
| 2143 | 2150 |
| 2144 TEST_P(QuicConnectionTest, DoNotSendPendingRetransmissionForResetStream) { | 2151 TEST_P(QuicConnectionTest, DoNotSendPendingRetransmissionForResetStream) { |
| 2145 QuicStreamId stream_id = 2; | 2152 QuicStreamId stream_id = 2; |
| 2146 QuicPacketNumber last_packet; | 2153 QuicPacketNumber last_packet; |
| 2147 SendStreamDataToPeer(stream_id, "foo", 0, !kFin, &last_packet); | 2154 SendStreamDataToPeer(stream_id, "foo", 0, NO_FIN, &last_packet); |
| 2148 SendStreamDataToPeer(stream_id, "foos", 3, !kFin, &last_packet); | 2155 SendStreamDataToPeer(stream_id, "foos", 3, NO_FIN, &last_packet); |
| 2149 BlockOnNextWrite(); | 2156 BlockOnNextWrite(); |
| 2150 connection_.SendStreamDataWithString(stream_id, "fooos", 7, !kFin, nullptr); | 2157 connection_.SendStreamDataWithString(stream_id, "fooos", 7, NO_FIN, nullptr); |
| 2151 | 2158 |
| 2152 // Lose a packet which will trigger a pending retransmission. | 2159 // Lose a packet which will trigger a pending retransmission. |
| 2153 QuicAckFrame ack = InitAckFrame(last_packet); | 2160 QuicAckFrame ack = InitAckFrame(last_packet); |
| 2154 NackPacket(last_packet - 1, &ack); | 2161 NackPacket(last_packet - 1, &ack); |
| 2155 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2162 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 2156 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)); | 2163 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)); |
| 2157 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 2164 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 2158 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0); | 2165 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0); |
| 2159 ProcessAckPacket(&ack); | 2166 ProcessAckPacket(&ack); |
| 2160 | 2167 |
| 2161 connection_.SendRstStream(stream_id, QUIC_ERROR_PROCESSING_STREAM, 14); | 2168 connection_.SendRstStream(stream_id, QUIC_ERROR_PROCESSING_STREAM, 14); |
| 2162 | 2169 |
| 2163 // Unblock the connection and verify that the RST_STREAM is sent but not the | 2170 // Unblock the connection and verify that the RST_STREAM is sent but not the |
| 2164 // second data packet nor a retransmit. | 2171 // second data packet nor a retransmit. |
| 2165 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); | 2172 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
| 2166 writer_->SetWritable(); | 2173 writer_->SetWritable(); |
| 2167 connection_.OnCanWrite(); | 2174 connection_.OnCanWrite(); |
| 2168 EXPECT_EQ(1u, writer_->frame_count()); | 2175 EXPECT_EQ(1u, writer_->frame_count()); |
| 2169 EXPECT_EQ(1u, writer_->rst_stream_frames().size()); | 2176 EXPECT_EQ(1u, writer_->rst_stream_frames().size()); |
| 2170 EXPECT_EQ(stream_id, writer_->rst_stream_frames().front().stream_id); | 2177 EXPECT_EQ(stream_id, writer_->rst_stream_frames().front().stream_id); |
| 2171 } | 2178 } |
| 2172 | 2179 |
| 2173 TEST_P(QuicConnectionTest, SendPendingRetransmissionForQuicRstStreamNoError) { | 2180 TEST_P(QuicConnectionTest, SendPendingRetransmissionForQuicRstStreamNoError) { |
| 2174 QuicStreamId stream_id = 2; | 2181 QuicStreamId stream_id = 2; |
| 2175 QuicPacketNumber last_packet; | 2182 QuicPacketNumber last_packet; |
| 2176 SendStreamDataToPeer(stream_id, "foo", 0, !kFin, &last_packet); | 2183 SendStreamDataToPeer(stream_id, "foo", 0, NO_FIN, &last_packet); |
| 2177 SendStreamDataToPeer(stream_id, "foos", 3, !kFin, &last_packet); | 2184 SendStreamDataToPeer(stream_id, "foos", 3, NO_FIN, &last_packet); |
| 2178 BlockOnNextWrite(); | 2185 BlockOnNextWrite(); |
| 2179 connection_.SendStreamDataWithString(stream_id, "fooos", 7, !kFin, nullptr); | 2186 connection_.SendStreamDataWithString(stream_id, "fooos", 7, NO_FIN, nullptr); |
| 2180 | 2187 |
| 2181 // Lose a packet which will trigger a pending retransmission. | 2188 // Lose a packet which will trigger a pending retransmission. |
| 2182 QuicAckFrame ack = InitAckFrame(last_packet); | 2189 QuicAckFrame ack = InitAckFrame(last_packet); |
| 2183 NackPacket(last_packet - 1, &ack); | 2190 NackPacket(last_packet - 1, &ack); |
| 2184 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2191 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 2185 SendAlgorithmInterface::CongestionVector lost_packets; | 2192 SendAlgorithmInterface::CongestionVector lost_packets; |
| 2186 lost_packets.push_back(std::make_pair(last_packet - 1, kMaxPacketSize)); | 2193 lost_packets.push_back(std::make_pair(last_packet - 1, kMaxPacketSize)); |
| 2187 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) | 2194 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) |
| 2188 .WillOnce(SetArgPointee<4>(lost_packets)); | 2195 .WillOnce(SetArgPointee<4>(lost_packets)); |
| 2189 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 2196 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 2190 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0); | 2197 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0); |
| 2191 ProcessAckPacket(&ack); | 2198 ProcessAckPacket(&ack); |
| 2192 | 2199 |
| 2193 connection_.SendRstStream(stream_id, QUIC_STREAM_NO_ERROR, 14); | 2200 connection_.SendRstStream(stream_id, QUIC_STREAM_NO_ERROR, 14); |
| 2194 | 2201 |
| 2195 // Unblock the connection and verify that the RST_STREAM is sent and the | 2202 // Unblock the connection and verify that the RST_STREAM is sent and the |
| 2196 // second data packet or a retransmit is sent. | 2203 // second data packet or a retransmit is sent. |
| 2197 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(AtLeast(2)); | 2204 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(AtLeast(2)); |
| 2198 writer_->SetWritable(); | 2205 writer_->SetWritable(); |
| 2199 connection_.OnCanWrite(); | 2206 connection_.OnCanWrite(); |
| 2200 EXPECT_EQ(1u, writer_->frame_count()); | 2207 EXPECT_EQ(1u, writer_->frame_count()); |
| 2201 EXPECT_EQ(0u, writer_->rst_stream_frames().size()); | 2208 EXPECT_EQ(0u, writer_->rst_stream_frames().size()); |
| 2202 } | 2209 } |
| 2203 | 2210 |
| 2204 TEST_P(QuicConnectionTest, RetransmitAckedPacket) { | 2211 TEST_P(QuicConnectionTest, RetransmitAckedPacket) { |
| 2205 QuicPacketNumber last_packet; | 2212 QuicPacketNumber last_packet; |
| 2206 SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet); // Packet 1 | 2213 SendStreamDataToPeer(1, "foo", 0, NO_FIN, &last_packet); // Packet 1 |
| 2207 SendStreamDataToPeer(1, "foos", 3, !kFin, &last_packet); // Packet 2 | 2214 SendStreamDataToPeer(1, "foos", 3, NO_FIN, &last_packet); // Packet 2 |
| 2208 SendStreamDataToPeer(1, "fooos", 7, !kFin, &last_packet); // Packet 3 | 2215 SendStreamDataToPeer(1, "fooos", 7, NO_FIN, &last_packet); // Packet 3 |
| 2209 | 2216 |
| 2210 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2217 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 2211 | 2218 |
| 2212 // Instigate a loss with an ack. | 2219 // Instigate a loss with an ack. |
| 2213 QuicAckFrame nack_two = InitAckFrame(3); | 2220 QuicAckFrame nack_two = InitAckFrame(3); |
| 2214 NackPacket(2, &nack_two); | 2221 NackPacket(2, &nack_two); |
| 2215 // The first nack should trigger a fast retransmission, but we'll be | 2222 // The first nack should trigger a fast retransmission, but we'll be |
| 2216 // write blocked, so the packet will be queued. | 2223 // write blocked, so the packet will be queued. |
| 2217 BlockOnNextWrite(); | 2224 BlockOnNextWrite(); |
| 2218 | 2225 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 2241 EXPECT_FALSE(QuicConnectionPeer::HasRetransmittableFrames(&connection_, 4)); | 2248 EXPECT_FALSE(QuicConnectionPeer::HasRetransmittableFrames(&connection_, 4)); |
| 2242 } | 2249 } |
| 2243 | 2250 |
| 2244 TEST_P(QuicConnectionTest, RetransmitNackedLargestObserved) { | 2251 TEST_P(QuicConnectionTest, RetransmitNackedLargestObserved) { |
| 2245 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2252 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 2246 QuicPacketNumber largest_observed; | 2253 QuicPacketNumber largest_observed; |
| 2247 QuicByteCount packet_size; | 2254 QuicByteCount packet_size; |
| 2248 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 2255 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
| 2249 .WillOnce(DoAll(SaveArg<2>(&largest_observed), SaveArg<3>(&packet_size), | 2256 .WillOnce(DoAll(SaveArg<2>(&largest_observed), SaveArg<3>(&packet_size), |
| 2250 Return(true))); | 2257 Return(true))); |
| 2251 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, nullptr); | 2258 connection_.SendStreamDataWithString(3, "foo", 0, NO_FIN, nullptr); |
| 2252 | 2259 |
| 2253 QuicAckFrame frame = InitAckFrame(1); | 2260 QuicAckFrame frame = InitAckFrame(1); |
| 2254 NackPacket(largest_observed, &frame); | 2261 NackPacket(largest_observed, &frame); |
| 2255 // The first nack should retransmit the largest observed packet. | 2262 // The first nack should retransmit the largest observed packet. |
| 2256 SendAlgorithmInterface::CongestionVector lost_packets; | 2263 SendAlgorithmInterface::CongestionVector lost_packets; |
| 2257 lost_packets.push_back(std::make_pair(1, kMaxPacketSize)); | 2264 lost_packets.push_back(std::make_pair(1, kMaxPacketSize)); |
| 2258 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) | 2265 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) |
| 2259 .WillOnce(SetArgPointee<4>(lost_packets)); | 2266 .WillOnce(SetArgPointee<4>(lost_packets)); |
| 2260 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 2267 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 2261 EXPECT_CALL(*send_algorithm_, | 2268 EXPECT_CALL(*send_algorithm_, |
| 2262 OnPacketSent(_, _, _, packet_size - kQuicVersionSize, _)); | 2269 OnPacketSent(_, _, _, packet_size - kQuicVersionSize, _)); |
| 2263 ProcessAckPacket(&frame); | 2270 ProcessAckPacket(&frame); |
| 2264 } | 2271 } |
| 2265 | 2272 |
| 2266 TEST_P(QuicConnectionTest, QueueAfterTwoRTOs) { | 2273 TEST_P(QuicConnectionTest, QueueAfterTwoRTOs) { |
| 2267 connection_.SetMaxTailLossProbes(0); | 2274 connection_.SetMaxTailLossProbes(0); |
| 2268 | 2275 |
| 2269 for (int i = 0; i < 10; ++i) { | 2276 for (int i = 0; i < 10; ++i) { |
| 2270 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); | 2277 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
| 2271 connection_.SendStreamDataWithString(3, "foo", i * 3, !kFin, nullptr); | 2278 connection_.SendStreamDataWithString(3, "foo", i * 3, NO_FIN, nullptr); |
| 2272 } | 2279 } |
| 2273 | 2280 |
| 2274 // Block the writer and ensure they're queued. | 2281 // Block the writer and ensure they're queued. |
| 2275 BlockOnNextWrite(); | 2282 BlockOnNextWrite(); |
| 2276 clock_.AdvanceTime(DefaultRetransmissionTime()); | 2283 clock_.AdvanceTime(DefaultRetransmissionTime()); |
| 2277 // Only one packet should be retransmitted. | 2284 // Only one packet should be retransmitted. |
| 2278 connection_.GetRetransmissionAlarm()->Fire(); | 2285 connection_.GetRetransmissionAlarm()->Fire(); |
| 2279 EXPECT_TRUE(connection_.HasQueuedData()); | 2286 EXPECT_TRUE(connection_.HasQueuedData()); |
| 2280 | 2287 |
| 2281 // Unblock the writer. | 2288 // Unblock the writer. |
| 2282 writer_->SetWritable(); | 2289 writer_->SetWritable(); |
| 2283 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds( | 2290 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds( |
| 2284 2 * DefaultRetransmissionTime().ToMicroseconds())); | 2291 2 * DefaultRetransmissionTime().ToMicroseconds())); |
| 2285 // Retransmit already retransmitted packets event though the packet number | 2292 // Retransmit already retransmitted packets event though the packet number |
| 2286 // greater than the largest observed. | 2293 // greater than the largest observed. |
| 2287 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); | 2294 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); |
| 2288 connection_.GetRetransmissionAlarm()->Fire(); | 2295 connection_.GetRetransmissionAlarm()->Fire(); |
| 2289 connection_.OnCanWrite(); | 2296 connection_.OnCanWrite(); |
| 2290 } | 2297 } |
| 2291 | 2298 |
| 2292 TEST_P(QuicConnectionTest, WriteBlockedBufferedThenSent) { | 2299 TEST_P(QuicConnectionTest, WriteBlockedBufferedThenSent) { |
| 2293 BlockOnNextWrite(); | 2300 BlockOnNextWrite(); |
| 2294 writer_->set_is_write_blocked_data_buffered(true); | 2301 writer_->set_is_write_blocked_data_buffered(true); |
| 2295 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); | 2302 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
| 2296 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, nullptr); | 2303 connection_.SendStreamDataWithString(1, "foo", 0, NO_FIN, nullptr); |
| 2297 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); | 2304 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); |
| 2298 | 2305 |
| 2299 writer_->SetWritable(); | 2306 writer_->SetWritable(); |
| 2300 connection_.OnCanWrite(); | 2307 connection_.OnCanWrite(); |
| 2301 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); | 2308 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); |
| 2302 } | 2309 } |
| 2303 | 2310 |
| 2304 TEST_P(QuicConnectionTest, WriteBlockedThenSent) { | 2311 TEST_P(QuicConnectionTest, WriteBlockedThenSent) { |
| 2305 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0); | 2312 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0); |
| 2306 BlockOnNextWrite(); | 2313 BlockOnNextWrite(); |
| 2307 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, nullptr); | 2314 connection_.SendStreamDataWithString(1, "foo", 0, NO_FIN, nullptr); |
| 2308 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); | 2315 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); |
| 2309 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 2316 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 2310 | 2317 |
| 2311 // The second packet should also be queued, in order to ensure packets are | 2318 // The second packet should also be queued, in order to ensure packets are |
| 2312 // never sent out of order. | 2319 // never sent out of order. |
| 2313 writer_->SetWritable(); | 2320 writer_->SetWritable(); |
| 2314 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, nullptr); | 2321 connection_.SendStreamDataWithString(1, "foo", 0, NO_FIN, nullptr); |
| 2315 EXPECT_EQ(2u, connection_.NumQueuedPackets()); | 2322 EXPECT_EQ(2u, connection_.NumQueuedPackets()); |
| 2316 | 2323 |
| 2317 // Now both are sent in order when we unblock. | 2324 // Now both are sent in order when we unblock. |
| 2318 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); | 2325 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); |
| 2319 connection_.OnCanWrite(); | 2326 connection_.OnCanWrite(); |
| 2320 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); | 2327 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); |
| 2321 } | 2328 } |
| 2322 | 2329 |
| 2323 TEST_P(QuicConnectionTest, RetransmitWriteBlockedAckedOriginalThenSent) { | 2330 TEST_P(QuicConnectionTest, RetransmitWriteBlockedAckedOriginalThenSent) { |
| 2324 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2331 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 2325 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, nullptr); | 2332 connection_.SendStreamDataWithString(3, "foo", 0, NO_FIN, nullptr); |
| 2326 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); | 2333 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); |
| 2327 | 2334 |
| 2328 BlockOnNextWrite(); | 2335 BlockOnNextWrite(); |
| 2329 writer_->set_is_write_blocked_data_buffered(true); | 2336 writer_->set_is_write_blocked_data_buffered(true); |
| 2330 // Simulate the retransmission alarm firing. | 2337 // Simulate the retransmission alarm firing. |
| 2331 clock_.AdvanceTime(DefaultRetransmissionTime()); | 2338 clock_.AdvanceTime(DefaultRetransmissionTime()); |
| 2332 connection_.GetRetransmissionAlarm()->Fire(); | 2339 connection_.GetRetransmissionAlarm()->Fire(); |
| 2333 | 2340 |
| 2334 // Ack the sent packet before the callback returns, which happens in | 2341 // Ack the sent packet before the callback returns, which happens in |
| 2335 // rare circumstances with write blocked sockets. | 2342 // rare circumstances with write blocked sockets. |
| 2336 QuicAckFrame ack = InitAckFrame(1); | 2343 QuicAckFrame ack = InitAckFrame(1); |
| 2337 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 2344 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 2338 ProcessAckPacket(&ack); | 2345 ProcessAckPacket(&ack); |
| 2339 | 2346 |
| 2340 writer_->SetWritable(); | 2347 writer_->SetWritable(); |
| 2341 connection_.OnCanWrite(); | 2348 connection_.OnCanWrite(); |
| 2342 // There is now a pending packet, but with no retransmittable frames. | 2349 // There is now a pending packet, but with no retransmittable frames. |
| 2343 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); | 2350 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); |
| 2344 EXPECT_FALSE(QuicConnectionPeer::HasRetransmittableFrames(&connection_, 2)); | 2351 EXPECT_FALSE(QuicConnectionPeer::HasRetransmittableFrames(&connection_, 2)); |
| 2345 } | 2352 } |
| 2346 | 2353 |
| 2347 TEST_P(QuicConnectionTest, AlarmsWhenWriteBlocked) { | 2354 TEST_P(QuicConnectionTest, AlarmsWhenWriteBlocked) { |
| 2348 // Block the connection. | 2355 // Block the connection. |
| 2349 BlockOnNextWrite(); | 2356 BlockOnNextWrite(); |
| 2350 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, nullptr); | 2357 connection_.SendStreamDataWithString(3, "foo", 0, NO_FIN, nullptr); |
| 2351 EXPECT_EQ(1u, writer_->packets_write_attempts()); | 2358 EXPECT_EQ(1u, writer_->packets_write_attempts()); |
| 2352 EXPECT_TRUE(writer_->IsWriteBlocked()); | 2359 EXPECT_TRUE(writer_->IsWriteBlocked()); |
| 2353 | 2360 |
| 2354 // Set the send and resumption alarms. Fire the alarms and ensure they don't | 2361 // Set the send and resumption alarms. Fire the alarms and ensure they don't |
| 2355 // attempt to write. | 2362 // attempt to write. |
| 2356 connection_.GetResumeWritesAlarm()->Set(clock_.ApproximateNow()); | 2363 connection_.GetResumeWritesAlarm()->Set(clock_.ApproximateNow()); |
| 2357 connection_.GetSendAlarm()->Set(clock_.ApproximateNow()); | 2364 connection_.GetSendAlarm()->Set(clock_.ApproximateNow()); |
| 2358 connection_.GetResumeWritesAlarm()->Fire(); | 2365 connection_.GetResumeWritesAlarm()->Fire(); |
| 2359 connection_.GetSendAlarm()->Fire(); | 2366 connection_.GetSendAlarm()->Fire(); |
| 2360 EXPECT_TRUE(writer_->IsWriteBlocked()); | 2367 EXPECT_TRUE(writer_->IsWriteBlocked()); |
| 2361 EXPECT_EQ(1u, writer_->packets_write_attempts()); | 2368 EXPECT_EQ(1u, writer_->packets_write_attempts()); |
| 2362 } | 2369 } |
| 2363 | 2370 |
| 2364 TEST_P(QuicConnectionTest, NoLimitPacketsPerNack) { | 2371 TEST_P(QuicConnectionTest, NoLimitPacketsPerNack) { |
| 2365 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2372 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 2366 int offset = 0; | 2373 int offset = 0; |
| 2367 // Send packets 1 to 15. | 2374 // Send packets 1 to 15. |
| 2368 for (int i = 0; i < 15; ++i) { | 2375 for (int i = 0; i < 15; ++i) { |
| 2369 SendStreamDataToPeer(1, "foo", offset, !kFin, nullptr); | 2376 SendStreamDataToPeer(1, "foo", offset, NO_FIN, nullptr); |
| 2370 offset += 3; | 2377 offset += 3; |
| 2371 } | 2378 } |
| 2372 | 2379 |
| 2373 // Ack 15, nack 1-14. | 2380 // Ack 15, nack 1-14. |
| 2374 | 2381 |
| 2375 QuicAckFrame nack = InitAckFrame(15); | 2382 QuicAckFrame nack = InitAckFrame(15); |
| 2376 for (int i = 1; i < 15; ++i) { | 2383 for (int i = 1; i < 15; ++i) { |
| 2377 NackPacket(i, &nack); | 2384 NackPacket(i, &nack); |
| 2378 } | 2385 } |
| 2379 | 2386 |
| 2380 // 14 packets have been NACK'd and lost. | 2387 // 14 packets have been NACK'd and lost. |
| 2381 SendAlgorithmInterface::CongestionVector lost_packets; | 2388 SendAlgorithmInterface::CongestionVector lost_packets; |
| 2382 for (int i = 1; i < 15; ++i) { | 2389 for (int i = 1; i < 15; ++i) { |
| 2383 lost_packets.push_back(std::make_pair(i, kMaxPacketSize)); | 2390 lost_packets.push_back(std::make_pair(i, kMaxPacketSize)); |
| 2384 } | 2391 } |
| 2385 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) | 2392 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) |
| 2386 .WillOnce(SetArgPointee<4>(lost_packets)); | 2393 .WillOnce(SetArgPointee<4>(lost_packets)); |
| 2387 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 2394 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 2388 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(14); | 2395 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(14); |
| 2389 ProcessAckPacket(&nack); | 2396 ProcessAckPacket(&nack); |
| 2390 } | 2397 } |
| 2391 | 2398 |
| 2392 // Test sending multiple acks from the connection to the session. | 2399 // Test sending multiple acks from the connection to the session. |
| 2393 TEST_P(QuicConnectionTest, MultipleAcks) { | 2400 TEST_P(QuicConnectionTest, MultipleAcks) { |
| 2394 QuicPacketNumber last_packet; | 2401 QuicPacketNumber last_packet; |
| 2395 SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet); // Packet 1 | 2402 SendStreamDataToPeer(1, "foo", 0, NO_FIN, &last_packet); // Packet 1 |
| 2396 EXPECT_EQ(1u, last_packet); | 2403 EXPECT_EQ(1u, last_packet); |
| 2397 SendStreamDataToPeer(3, "foo", 0, !kFin, &last_packet); // Packet 2 | 2404 SendStreamDataToPeer(3, "foo", 0, NO_FIN, &last_packet); // Packet 2 |
| 2398 EXPECT_EQ(2u, last_packet); | 2405 EXPECT_EQ(2u, last_packet); |
| 2399 SendAckPacketToPeer(); // Packet 3 | 2406 SendAckPacketToPeer(); // Packet 3 |
| 2400 SendStreamDataToPeer(5, "foo", 0, !kFin, &last_packet); // Packet 4 | 2407 SendStreamDataToPeer(5, "foo", 0, NO_FIN, &last_packet); // Packet 4 |
| 2401 EXPECT_EQ(4u, last_packet); | 2408 EXPECT_EQ(4u, last_packet); |
| 2402 SendStreamDataToPeer(1, "foo", 3, !kFin, &last_packet); // Packet 5 | 2409 SendStreamDataToPeer(1, "foo", 3, NO_FIN, &last_packet); // Packet 5 |
| 2403 EXPECT_EQ(5u, last_packet); | 2410 EXPECT_EQ(5u, last_packet); |
| 2404 SendStreamDataToPeer(3, "foo", 3, !kFin, &last_packet); // Packet 6 | 2411 SendStreamDataToPeer(3, "foo", 3, NO_FIN, &last_packet); // Packet 6 |
| 2405 EXPECT_EQ(6u, last_packet); | 2412 EXPECT_EQ(6u, last_packet); |
| 2406 | 2413 |
| 2407 // Client will ack packets 1, 2, [!3], 4, 5. | 2414 // Client will ack packets 1, 2, [!3], 4, 5. |
| 2408 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 2415 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 2409 QuicAckFrame frame1 = InitAckFrame(5); | 2416 QuicAckFrame frame1 = InitAckFrame(5); |
| 2410 NackPacket(3, &frame1); | 2417 NackPacket(3, &frame1); |
| 2411 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2418 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 2412 ProcessAckPacket(&frame1); | 2419 ProcessAckPacket(&frame1); |
| 2413 | 2420 |
| 2414 // Now the client implicitly acks 3, and explicitly acks 6. | 2421 // Now the client implicitly acks 3, and explicitly acks 6. |
| 2415 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 2422 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 2416 QuicAckFrame frame2 = InitAckFrame(6); | 2423 QuicAckFrame frame2 = InitAckFrame(6); |
| 2417 ProcessAckPacket(&frame2); | 2424 ProcessAckPacket(&frame2); |
| 2418 } | 2425 } |
| 2419 | 2426 |
| 2420 TEST_P(QuicConnectionTest, DontLatchUnackedPacket) { | 2427 TEST_P(QuicConnectionTest, DontLatchUnackedPacket) { |
| 2421 SendStreamDataToPeer(1, "foo", 0, !kFin, nullptr); // Packet 1; | 2428 SendStreamDataToPeer(1, "foo", 0, NO_FIN, nullptr); // Packet 1; |
| 2422 // From now on, we send acks, so the send algorithm won't mark them pending. | 2429 // From now on, we send acks, so the send algorithm won't mark them pending. |
| 2423 ON_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 2430 ON_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
| 2424 .WillByDefault(Return(false)); | 2431 .WillByDefault(Return(false)); |
| 2425 SendAckPacketToPeer(); // Packet 2 | 2432 SendAckPacketToPeer(); // Packet 2 |
| 2426 | 2433 |
| 2427 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2434 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 2428 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 2435 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 2429 QuicAckFrame frame = InitAckFrame(1); | 2436 QuicAckFrame frame = InitAckFrame(1); |
| 2430 ProcessAckPacket(&frame); | 2437 ProcessAckPacket(&frame); |
| 2431 | 2438 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 2453 EXPECT_EQ(3u, least_unacked()); | 2460 EXPECT_EQ(3u, least_unacked()); |
| 2454 } | 2461 } |
| 2455 | 2462 |
| 2456 // Ack the ack, which updates the rtt and raises the least unacked. | 2463 // Ack the ack, which updates the rtt and raises the least unacked. |
| 2457 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 2464 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 2458 frame = InitAckFrame(3); | 2465 frame = InitAckFrame(3); |
| 2459 ProcessAckPacket(&frame); | 2466 ProcessAckPacket(&frame); |
| 2460 | 2467 |
| 2461 ON_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 2468 ON_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
| 2462 .WillByDefault(Return(true)); | 2469 .WillByDefault(Return(true)); |
| 2463 SendStreamDataToPeer(1, "bar", 3, false, nullptr); // Packet 4 | 2470 SendStreamDataToPeer(1, "bar", 3, NO_FIN, nullptr); // Packet 4 |
| 2464 EXPECT_EQ(4u, stop_waiting()->least_unacked); | 2471 EXPECT_EQ(4u, stop_waiting()->least_unacked); |
| 2465 ON_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 2472 ON_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
| 2466 .WillByDefault(Return(false)); | 2473 .WillByDefault(Return(false)); |
| 2467 SendAckPacketToPeer(); // Packet 5 | 2474 SendAckPacketToPeer(); // Packet 5 |
| 2468 if (GetParam().no_stop_waiting) { | 2475 if (GetParam().no_stop_waiting) { |
| 2469 // Expect no stop waiting frame is sent. | 2476 // Expect no stop waiting frame is sent. |
| 2470 EXPECT_EQ(0u, least_unacked()); | 2477 EXPECT_EQ(0u, least_unacked()); |
| 2471 } else { | 2478 } else { |
| 2472 EXPECT_EQ(4u, least_unacked()); | 2479 EXPECT_EQ(4u, least_unacked()); |
| 2473 } | 2480 } |
| 2474 | 2481 |
| 2475 // Send two data packets at the end, and ensure if the last one is acked, | 2482 // Send two data packets at the end, and ensure if the last one is acked, |
| 2476 // the least unacked is raised above the ack packets. | 2483 // the least unacked is raised above the ack packets. |
| 2477 ON_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 2484 ON_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
| 2478 .WillByDefault(Return(true)); | 2485 .WillByDefault(Return(true)); |
| 2479 SendStreamDataToPeer(1, "bar", 6, false, nullptr); // Packet 6 | 2486 SendStreamDataToPeer(1, "bar", 6, NO_FIN, nullptr); // Packet 6 |
| 2480 SendStreamDataToPeer(1, "bar", 9, false, nullptr); // Packet 7 | 2487 SendStreamDataToPeer(1, "bar", 9, NO_FIN, nullptr); // Packet 7 |
| 2481 | 2488 |
| 2482 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 2489 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 2483 frame = InitAckFrame(7); | 2490 frame = InitAckFrame(7); |
| 2484 NackPacket(5, &frame); | 2491 NackPacket(5, &frame); |
| 2485 NackPacket(6, &frame); | 2492 NackPacket(6, &frame); |
| 2486 ProcessAckPacket(&frame); | 2493 ProcessAckPacket(&frame); |
| 2487 | 2494 |
| 2488 EXPECT_EQ(6u, stop_waiting()->least_unacked); | 2495 EXPECT_EQ(6u, stop_waiting()->least_unacked); |
| 2489 } | 2496 } |
| 2490 | 2497 |
| 2491 TEST_P(QuicConnectionTest, TLP) { | 2498 TEST_P(QuicConnectionTest, TLP) { |
| 2492 connection_.SetMaxTailLossProbes(1); | 2499 connection_.SetMaxTailLossProbes(1); |
| 2493 | 2500 |
| 2494 SendStreamDataToPeer(3, "foo", 0, !kFin, nullptr); | 2501 SendStreamDataToPeer(3, "foo", 0, NO_FIN, nullptr); |
| 2495 EXPECT_EQ(1u, stop_waiting()->least_unacked); | 2502 EXPECT_EQ(1u, stop_waiting()->least_unacked); |
| 2496 QuicTime retransmission_time = | 2503 QuicTime retransmission_time = |
| 2497 connection_.GetRetransmissionAlarm()->deadline(); | 2504 connection_.GetRetransmissionAlarm()->deadline(); |
| 2498 EXPECT_NE(QuicTime::Zero(), retransmission_time); | 2505 EXPECT_NE(QuicTime::Zero(), retransmission_time); |
| 2499 | 2506 |
| 2500 EXPECT_EQ(1u, writer_->header().packet_number); | 2507 EXPECT_EQ(1u, writer_->header().packet_number); |
| 2501 // Simulate the retransmission alarm firing and sending a tlp, | 2508 // Simulate the retransmission alarm firing and sending a tlp, |
| 2502 // so send algorithm's OnRetransmissionTimeout is not called. | 2509 // so send algorithm's OnRetransmissionTimeout is not called. |
| 2503 clock_.AdvanceTime(retransmission_time - clock_.Now()); | 2510 clock_.AdvanceTime(retransmission_time - clock_.Now()); |
| 2504 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 2u, _, _)); | 2511 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 2u, _, _)); |
| 2505 connection_.GetRetransmissionAlarm()->Fire(); | 2512 connection_.GetRetransmissionAlarm()->Fire(); |
| 2506 EXPECT_EQ(2u, writer_->header().packet_number); | 2513 EXPECT_EQ(2u, writer_->header().packet_number); |
| 2507 // We do not raise the high water mark yet. | 2514 // We do not raise the high water mark yet. |
| 2508 EXPECT_EQ(1u, stop_waiting()->least_unacked); | 2515 EXPECT_EQ(1u, stop_waiting()->least_unacked); |
| 2509 } | 2516 } |
| 2510 | 2517 |
| 2511 TEST_P(QuicConnectionTest, RTO) { | 2518 TEST_P(QuicConnectionTest, RTO) { |
| 2512 connection_.SetMaxTailLossProbes(0); | 2519 connection_.SetMaxTailLossProbes(0); |
| 2513 | 2520 |
| 2514 QuicTime default_retransmission_time = | 2521 QuicTime default_retransmission_time = |
| 2515 clock_.ApproximateNow() + DefaultRetransmissionTime(); | 2522 clock_.ApproximateNow() + DefaultRetransmissionTime(); |
| 2516 SendStreamDataToPeer(3, "foo", 0, !kFin, nullptr); | 2523 SendStreamDataToPeer(3, "foo", 0, NO_FIN, nullptr); |
| 2517 EXPECT_EQ(1u, stop_waiting()->least_unacked); | 2524 EXPECT_EQ(1u, stop_waiting()->least_unacked); |
| 2518 | 2525 |
| 2519 EXPECT_EQ(1u, writer_->header().packet_number); | 2526 EXPECT_EQ(1u, writer_->header().packet_number); |
| 2520 EXPECT_EQ(default_retransmission_time, | 2527 EXPECT_EQ(default_retransmission_time, |
| 2521 connection_.GetRetransmissionAlarm()->deadline()); | 2528 connection_.GetRetransmissionAlarm()->deadline()); |
| 2522 // Simulate the retransmission alarm firing. | 2529 // Simulate the retransmission alarm firing. |
| 2523 clock_.AdvanceTime(DefaultRetransmissionTime()); | 2530 clock_.AdvanceTime(DefaultRetransmissionTime()); |
| 2524 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 2u, _, _)); | 2531 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 2u, _, _)); |
| 2525 connection_.GetRetransmissionAlarm()->Fire(); | 2532 connection_.GetRetransmissionAlarm()->Fire(); |
| 2526 EXPECT_EQ(2u, writer_->header().packet_number); | 2533 EXPECT_EQ(2u, writer_->header().packet_number); |
| 2527 // We do not raise the high water mark yet. | 2534 // We do not raise the high water mark yet. |
| 2528 EXPECT_EQ(1u, stop_waiting()->least_unacked); | 2535 EXPECT_EQ(1u, stop_waiting()->least_unacked); |
| 2529 } | 2536 } |
| 2530 | 2537 |
| 2531 TEST_P(QuicConnectionTest, RetransmitWithSameEncryptionLevel) { | 2538 TEST_P(QuicConnectionTest, RetransmitWithSameEncryptionLevel) { |
| 2532 use_tagging_decrypter(); | 2539 use_tagging_decrypter(); |
| 2533 | 2540 |
| 2534 // A TaggingEncrypter puts kTagSize copies of the given byte (0x01 here) at | 2541 // A TaggingEncrypter puts kTagSize copies of the given byte (0x01 here) at |
| 2535 // the end of the packet. We can test this to check which encrypter was used. | 2542 // the end of the packet. We can test this to check which encrypter was used. |
| 2536 connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01)); | 2543 connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01)); |
| 2537 SendStreamDataToPeer(kCryptoStreamId, "foo", 0, !kFin, nullptr); | 2544 SendStreamDataToPeer(kCryptoStreamId, "foo", 0, NO_FIN, nullptr); |
| 2538 EXPECT_EQ(0x01010101u, writer_->final_bytes_of_last_packet()); | 2545 EXPECT_EQ(0x01010101u, writer_->final_bytes_of_last_packet()); |
| 2539 | 2546 |
| 2540 connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(0x02)); | 2547 connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(0x02)); |
| 2541 connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL); | 2548 connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL); |
| 2542 SendStreamDataToPeer(3, "foo", 0, !kFin, nullptr); | 2549 SendStreamDataToPeer(3, "foo", 0, NO_FIN, nullptr); |
| 2543 EXPECT_EQ(0x02020202u, writer_->final_bytes_of_last_packet()); | 2550 EXPECT_EQ(0x02020202u, writer_->final_bytes_of_last_packet()); |
| 2544 | 2551 |
| 2545 { | 2552 { |
| 2546 InSequence s; | 2553 InSequence s; |
| 2547 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 3, _, _)); | 2554 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 3, _, _)); |
| 2548 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 4, _, _)); | 2555 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 4, _, _)); |
| 2549 } | 2556 } |
| 2550 | 2557 |
| 2551 // Manually mark both packets for retransmission. | 2558 // Manually mark both packets for retransmission. |
| 2552 connection_.RetransmitUnackedPackets(ALL_UNACKED_RETRANSMISSION); | 2559 connection_.RetransmitUnackedPackets(ALL_UNACKED_RETRANSMISSION); |
| 2553 | 2560 |
| 2554 // Packet should have been sent with ENCRYPTION_NONE. | 2561 // Packet should have been sent with ENCRYPTION_NONE. |
| 2555 EXPECT_EQ(0x01010101u, writer_->final_bytes_of_previous_packet()); | 2562 EXPECT_EQ(0x01010101u, writer_->final_bytes_of_previous_packet()); |
| 2556 | 2563 |
| 2557 // Packet should have been sent with ENCRYPTION_INITIAL. | 2564 // Packet should have been sent with ENCRYPTION_INITIAL. |
| 2558 EXPECT_EQ(0x02020202u, writer_->final_bytes_of_last_packet()); | 2565 EXPECT_EQ(0x02020202u, writer_->final_bytes_of_last_packet()); |
| 2559 } | 2566 } |
| 2560 | 2567 |
| 2561 TEST_P(QuicConnectionTest, SendHandshakeMessages) { | 2568 TEST_P(QuicConnectionTest, SendHandshakeMessages) { |
| 2562 use_tagging_decrypter(); | 2569 use_tagging_decrypter(); |
| 2563 // A TaggingEncrypter puts kTagSize copies of the given byte (0x01 here) at | 2570 // A TaggingEncrypter puts kTagSize copies of the given byte (0x01 here) at |
| 2564 // the end of the packet. We can test this to check which encrypter was used. | 2571 // the end of the packet. We can test this to check which encrypter was used. |
| 2565 connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01)); | 2572 connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01)); |
| 2566 | 2573 |
| 2567 // Attempt to send a handshake message and have the socket block. | 2574 // Attempt to send a handshake message and have the socket block. |
| 2568 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _)) | 2575 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _)) |
| 2569 .WillRepeatedly(testing::Return(QuicTime::Delta::Zero())); | 2576 .WillRepeatedly(testing::Return(QuicTime::Delta::Zero())); |
| 2570 BlockOnNextWrite(); | 2577 BlockOnNextWrite(); |
| 2571 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, nullptr); | 2578 connection_.SendStreamDataWithString(1, "foo", 0, NO_FIN, nullptr); |
| 2572 // The packet should be serialized, but not queued. | 2579 // The packet should be serialized, but not queued. |
| 2573 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 2580 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 2574 | 2581 |
| 2575 // Switch to the new encrypter. | 2582 // Switch to the new encrypter. |
| 2576 connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(0x02)); | 2583 connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(0x02)); |
| 2577 connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL); | 2584 connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL); |
| 2578 | 2585 |
| 2579 // Now become writeable and flush the packets. | 2586 // Now become writeable and flush the packets. |
| 2580 writer_->SetWritable(); | 2587 writer_->SetWritable(); |
| 2581 EXPECT_CALL(visitor_, OnCanWrite()); | 2588 EXPECT_CALL(visitor_, OnCanWrite()); |
| 2582 connection_.OnCanWrite(); | 2589 connection_.OnCanWrite(); |
| 2583 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 2590 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 2584 | 2591 |
| 2585 // Verify that the handshake packet went out at the null encryption. | 2592 // Verify that the handshake packet went out at the null encryption. |
| 2586 EXPECT_EQ(0x01010101u, writer_->final_bytes_of_last_packet()); | 2593 EXPECT_EQ(0x01010101u, writer_->final_bytes_of_last_packet()); |
| 2587 } | 2594 } |
| 2588 | 2595 |
| 2589 TEST_P(QuicConnectionTest, | 2596 TEST_P(QuicConnectionTest, |
| 2590 DropRetransmitsForNullEncryptedPacketAfterForwardSecure) { | 2597 DropRetransmitsForNullEncryptedPacketAfterForwardSecure) { |
| 2591 use_tagging_decrypter(); | 2598 use_tagging_decrypter(); |
| 2592 connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01)); | 2599 connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01)); |
| 2593 QuicPacketNumber packet_number; | 2600 QuicPacketNumber packet_number; |
| 2594 SendStreamDataToPeer(kCryptoStreamId, "foo", 0, !kFin, &packet_number); | 2601 SendStreamDataToPeer(kCryptoStreamId, "foo", 0, NO_FIN, &packet_number); |
| 2595 | 2602 |
| 2596 // Simulate the retransmission alarm firing and the socket blocking. | 2603 // Simulate the retransmission alarm firing and the socket blocking. |
| 2597 BlockOnNextWrite(); | 2604 BlockOnNextWrite(); |
| 2598 clock_.AdvanceTime(DefaultRetransmissionTime()); | 2605 clock_.AdvanceTime(DefaultRetransmissionTime()); |
| 2599 connection_.GetRetransmissionAlarm()->Fire(); | 2606 connection_.GetRetransmissionAlarm()->Fire(); |
| 2600 | 2607 |
| 2601 // Go forward secure. | 2608 // Go forward secure. |
| 2602 connection_.SetEncrypter(ENCRYPTION_FORWARD_SECURE, | 2609 connection_.SetEncrypter(ENCRYPTION_FORWARD_SECURE, |
| 2603 new TaggingEncrypter(0x02)); | 2610 new TaggingEncrypter(0x02)); |
| 2604 connection_.SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE); | 2611 connection_.SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE); |
| 2605 connection_.NeuterUnencryptedPackets(); | 2612 connection_.NeuterUnencryptedPackets(); |
| 2606 | 2613 |
| 2607 EXPECT_EQ(QuicTime::Zero(), connection_.GetRetransmissionAlarm()->deadline()); | 2614 EXPECT_EQ(QuicTime::Zero(), connection_.GetRetransmissionAlarm()->deadline()); |
| 2608 // Unblock the socket and ensure that no packets are sent. | 2615 // Unblock the socket and ensure that no packets are sent. |
| 2609 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0); | 2616 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0); |
| 2610 writer_->SetWritable(); | 2617 writer_->SetWritable(); |
| 2611 connection_.OnCanWrite(); | 2618 connection_.OnCanWrite(); |
| 2612 } | 2619 } |
| 2613 | 2620 |
| 2614 TEST_P(QuicConnectionTest, RetransmitPacketsWithInitialEncryption) { | 2621 TEST_P(QuicConnectionTest, RetransmitPacketsWithInitialEncryption) { |
| 2615 use_tagging_decrypter(); | 2622 use_tagging_decrypter(); |
| 2616 connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01)); | 2623 connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01)); |
| 2617 connection_.SetDefaultEncryptionLevel(ENCRYPTION_NONE); | 2624 connection_.SetDefaultEncryptionLevel(ENCRYPTION_NONE); |
| 2618 | 2625 |
| 2619 SendStreamDataToPeer(1, "foo", 0, !kFin, nullptr); | 2626 SendStreamDataToPeer(1, "foo", 0, NO_FIN, nullptr); |
| 2620 | 2627 |
| 2621 connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(0x02)); | 2628 connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(0x02)); |
| 2622 connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL); | 2629 connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL); |
| 2623 | 2630 |
| 2624 SendStreamDataToPeer(2, "bar", 0, !kFin, nullptr); | 2631 SendStreamDataToPeer(2, "bar", 0, NO_FIN, nullptr); |
| 2625 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); | 2632 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
| 2626 | 2633 |
| 2627 connection_.RetransmitUnackedPackets(ALL_INITIAL_RETRANSMISSION); | 2634 connection_.RetransmitUnackedPackets(ALL_INITIAL_RETRANSMISSION); |
| 2628 } | 2635 } |
| 2629 | 2636 |
| 2630 TEST_P(QuicConnectionTest, BufferNonDecryptablePackets) { | 2637 TEST_P(QuicConnectionTest, BufferNonDecryptablePackets) { |
| 2631 // SetFromConfig is always called after construction from InitializeSession. | 2638 // SetFromConfig is always called after construction from InitializeSession. |
| 2632 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | 2639 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); |
| 2633 QuicConfig config; | 2640 QuicConfig config; |
| 2634 connection_.SetFromConfig(config); | 2641 connection_.SetFromConfig(config); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2688 ProcessDataPacketAtLevel(102, !kHasStopWaiting, ENCRYPTION_INITIAL); | 2695 ProcessDataPacketAtLevel(102, !kHasStopWaiting, ENCRYPTION_INITIAL); |
| 2689 } | 2696 } |
| 2690 | 2697 |
| 2691 TEST_P(QuicConnectionTest, TestRetransmitOrder) { | 2698 TEST_P(QuicConnectionTest, TestRetransmitOrder) { |
| 2692 connection_.SetMaxTailLossProbes(0); | 2699 connection_.SetMaxTailLossProbes(0); |
| 2693 | 2700 |
| 2694 QuicByteCount first_packet_size; | 2701 QuicByteCount first_packet_size; |
| 2695 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 2702 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
| 2696 .WillOnce(DoAll(SaveArg<3>(&first_packet_size), Return(true))); | 2703 .WillOnce(DoAll(SaveArg<3>(&first_packet_size), Return(true))); |
| 2697 | 2704 |
| 2698 connection_.SendStreamDataWithString(3, "first_packet", 0, !kFin, nullptr); | 2705 connection_.SendStreamDataWithString(3, "first_packet", 0, NO_FIN, nullptr); |
| 2699 QuicByteCount second_packet_size; | 2706 QuicByteCount second_packet_size; |
| 2700 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 2707 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
| 2701 .WillOnce(DoAll(SaveArg<3>(&second_packet_size), Return(true))); | 2708 .WillOnce(DoAll(SaveArg<3>(&second_packet_size), Return(true))); |
| 2702 connection_.SendStreamDataWithString(3, "second_packet", 12, !kFin, nullptr); | 2709 connection_.SendStreamDataWithString(3, "second_packet", 12, NO_FIN, nullptr); |
| 2703 EXPECT_NE(first_packet_size, second_packet_size); | 2710 EXPECT_NE(first_packet_size, second_packet_size); |
| 2704 // Advance the clock by huge time to make sure packets will be retransmitted. | 2711 // Advance the clock by huge time to make sure packets will be retransmitted. |
| 2705 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(10)); | 2712 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(10)); |
| 2706 { | 2713 { |
| 2707 InSequence s; | 2714 InSequence s; |
| 2708 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, first_packet_size, _)); | 2715 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, first_packet_size, _)); |
| 2709 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, second_packet_size, _)); | 2716 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, second_packet_size, _)); |
| 2710 } | 2717 } |
| 2711 connection_.GetRetransmissionAlarm()->Fire(); | 2718 connection_.GetRetransmissionAlarm()->Fire(); |
| 2712 | 2719 |
| 2713 // Advance again and expect the packets to be sent again in the same order. | 2720 // Advance again and expect the packets to be sent again in the same order. |
| 2714 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(20)); | 2721 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(20)); |
| 2715 { | 2722 { |
| 2716 InSequence s; | 2723 InSequence s; |
| 2717 EXPECT_CALL(visitor_, OnPathDegrading()); | 2724 EXPECT_CALL(visitor_, OnPathDegrading()); |
| 2718 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, first_packet_size, _)); | 2725 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, first_packet_size, _)); |
| 2719 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, second_packet_size, _)); | 2726 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, second_packet_size, _)); |
| 2720 } | 2727 } |
| 2721 connection_.GetRetransmissionAlarm()->Fire(); | 2728 connection_.GetRetransmissionAlarm()->Fire(); |
| 2722 } | 2729 } |
| 2723 | 2730 |
| 2724 TEST_P(QuicConnectionTest, SetRTOAfterWritingToSocket) { | 2731 TEST_P(QuicConnectionTest, SetRTOAfterWritingToSocket) { |
| 2725 BlockOnNextWrite(); | 2732 BlockOnNextWrite(); |
| 2726 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, nullptr); | 2733 connection_.SendStreamDataWithString(1, "foo", 0, NO_FIN, nullptr); |
| 2727 // Make sure that RTO is not started when the packet is queued. | 2734 // Make sure that RTO is not started when the packet is queued. |
| 2728 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); | 2735 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); |
| 2729 | 2736 |
| 2730 // Test that RTO is started once we write to the socket. | 2737 // Test that RTO is started once we write to the socket. |
| 2731 writer_->SetWritable(); | 2738 writer_->SetWritable(); |
| 2732 connection_.OnCanWrite(); | 2739 connection_.OnCanWrite(); |
| 2733 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); | 2740 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); |
| 2734 } | 2741 } |
| 2735 | 2742 |
| 2736 TEST_P(QuicConnectionTest, DelayRTOWithAckReceipt) { | 2743 TEST_P(QuicConnectionTest, DelayRTOWithAckReceipt) { |
| 2737 connection_.SetMaxTailLossProbes(0); | 2744 connection_.SetMaxTailLossProbes(0); |
| 2738 | 2745 |
| 2739 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2746 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 2740 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); | 2747 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); |
| 2741 connection_.SendStreamDataWithString(2, "foo", 0, !kFin, nullptr); | 2748 connection_.SendStreamDataWithString(2, "foo", 0, NO_FIN, nullptr); |
| 2742 connection_.SendStreamDataWithString(3, "bar", 0, !kFin, nullptr); | 2749 connection_.SendStreamDataWithString(3, "bar", 0, NO_FIN, nullptr); |
| 2743 QuicAlarm* retransmission_alarm = connection_.GetRetransmissionAlarm(); | 2750 QuicAlarm* retransmission_alarm = connection_.GetRetransmissionAlarm(); |
| 2744 EXPECT_TRUE(retransmission_alarm->IsSet()); | 2751 EXPECT_TRUE(retransmission_alarm->IsSet()); |
| 2745 EXPECT_EQ(clock_.Now() + DefaultRetransmissionTime(), | 2752 EXPECT_EQ(clock_.Now() + DefaultRetransmissionTime(), |
| 2746 retransmission_alarm->deadline()); | 2753 retransmission_alarm->deadline()); |
| 2747 | 2754 |
| 2748 // Advance the time right before the RTO, then receive an ack for the first | 2755 // Advance the time right before the RTO, then receive an ack for the first |
| 2749 // packet to delay the RTO. | 2756 // packet to delay the RTO. |
| 2750 clock_.AdvanceTime(DefaultRetransmissionTime()); | 2757 clock_.AdvanceTime(DefaultRetransmissionTime()); |
| 2751 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 2758 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 2752 QuicAckFrame ack = InitAckFrame(1); | 2759 QuicAckFrame ack = InitAckFrame(1); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 2774 QuicTime expected_rto_time = | 2781 QuicTime expected_rto_time = |
| 2775 connection_.sent_packet_manager().GetRetransmissionTime(); | 2782 connection_.sent_packet_manager().GetRetransmissionTime(); |
| 2776 EXPECT_EQ(next_rto_time, expected_rto_time); | 2783 EXPECT_EQ(next_rto_time, expected_rto_time); |
| 2777 } | 2784 } |
| 2778 | 2785 |
| 2779 TEST_P(QuicConnectionTest, TestQueued) { | 2786 TEST_P(QuicConnectionTest, TestQueued) { |
| 2780 connection_.SetMaxTailLossProbes(0); | 2787 connection_.SetMaxTailLossProbes(0); |
| 2781 | 2788 |
| 2782 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 2789 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 2783 BlockOnNextWrite(); | 2790 BlockOnNextWrite(); |
| 2784 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, nullptr); | 2791 connection_.SendStreamDataWithString(1, "foo", 0, NO_FIN, nullptr); |
| 2785 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 2792 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 2786 | 2793 |
| 2787 // Unblock the writes and actually send. | 2794 // Unblock the writes and actually send. |
| 2788 writer_->SetWritable(); | 2795 writer_->SetWritable(); |
| 2789 connection_.OnCanWrite(); | 2796 connection_.OnCanWrite(); |
| 2790 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 2797 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 2791 } | 2798 } |
| 2792 | 2799 |
| 2793 TEST_P(QuicConnectionTest, InitialTimeout) { | 2800 TEST_P(QuicConnectionTest, InitialTimeout) { |
| 2794 EXPECT_TRUE(connection_.connected()); | 2801 EXPECT_TRUE(connection_.connected()); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2828 connection_.SetNetworkTimeouts(timeout, timeout); | 2835 connection_.SetNetworkTimeouts(timeout, timeout); |
| 2829 EXPECT_TRUE(connection_.connected()); | 2836 EXPECT_TRUE(connection_.connected()); |
| 2830 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(AnyNumber()); | 2837 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(AnyNumber()); |
| 2831 | 2838 |
| 2832 QuicTime handshake_timeout = | 2839 QuicTime handshake_timeout = |
| 2833 clock_.ApproximateNow() + timeout - QuicTime::Delta::FromSeconds(1); | 2840 clock_.ApproximateNow() + timeout - QuicTime::Delta::FromSeconds(1); |
| 2834 EXPECT_EQ(handshake_timeout, connection_.GetTimeoutAlarm()->deadline()); | 2841 EXPECT_EQ(handshake_timeout, connection_.GetTimeoutAlarm()->deadline()); |
| 2835 EXPECT_TRUE(connection_.connected()); | 2842 EXPECT_TRUE(connection_.connected()); |
| 2836 | 2843 |
| 2837 // Send and ack new data 3 seconds later to lengthen the idle timeout. | 2844 // Send and ack new data 3 seconds later to lengthen the idle timeout. |
| 2838 SendStreamDataToPeer(kHeadersStreamId, "GET /", 0, kFin, nullptr); | 2845 SendStreamDataToPeer(kHeadersStreamId, "GET /", 0, FIN, nullptr); |
| 2839 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(3)); | 2846 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(3)); |
| 2840 QuicAckFrame frame = InitAckFrame(1); | 2847 QuicAckFrame frame = InitAckFrame(1); |
| 2841 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2848 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 2842 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 2849 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 2843 ProcessAckPacket(&frame); | 2850 ProcessAckPacket(&frame); |
| 2844 | 2851 |
| 2845 // Fire early to verify it wouldn't timeout yet. | 2852 // Fire early to verify it wouldn't timeout yet. |
| 2846 connection_.GetTimeoutAlarm()->Fire(); | 2853 connection_.GetTimeoutAlarm()->Fire(); |
| 2847 EXPECT_TRUE(connection_.GetTimeoutAlarm()->IsSet()); | 2854 EXPECT_TRUE(connection_.GetTimeoutAlarm()->IsSet()); |
| 2848 EXPECT_TRUE(connection_.connected()); | 2855 EXPECT_TRUE(connection_.connected()); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 2866 | 2873 |
| 2867 TEST_P(QuicConnectionTest, PingAfterSend) { | 2874 TEST_P(QuicConnectionTest, PingAfterSend) { |
| 2868 EXPECT_TRUE(connection_.connected()); | 2875 EXPECT_TRUE(connection_.connected()); |
| 2869 EXPECT_CALL(visitor_, HasOpenDynamicStreams()).WillRepeatedly(Return(true)); | 2876 EXPECT_CALL(visitor_, HasOpenDynamicStreams()).WillRepeatedly(Return(true)); |
| 2870 EXPECT_FALSE(connection_.GetPingAlarm()->IsSet()); | 2877 EXPECT_FALSE(connection_.GetPingAlarm()->IsSet()); |
| 2871 | 2878 |
| 2872 // Advance to 5ms, and send a packet to the peer, which will set | 2879 // Advance to 5ms, and send a packet to the peer, which will set |
| 2873 // the ping alarm. | 2880 // the ping alarm. |
| 2874 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5)); | 2881 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5)); |
| 2875 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); | 2882 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); |
| 2876 SendStreamDataToPeer(kHeadersStreamId, "GET /", 0, kFin, nullptr); | 2883 SendStreamDataToPeer(kHeadersStreamId, "GET /", 0, FIN, nullptr); |
| 2877 EXPECT_TRUE(connection_.GetPingAlarm()->IsSet()); | 2884 EXPECT_TRUE(connection_.GetPingAlarm()->IsSet()); |
| 2878 EXPECT_EQ(clock_.ApproximateNow() + QuicTime::Delta::FromSeconds(15), | 2885 EXPECT_EQ(clock_.ApproximateNow() + QuicTime::Delta::FromSeconds(15), |
| 2879 connection_.GetPingAlarm()->deadline()); | 2886 connection_.GetPingAlarm()->deadline()); |
| 2880 | 2887 |
| 2881 // Now recevie and ACK of the previous packet, which will move the | 2888 // Now recevie and ACK of the previous packet, which will move the |
| 2882 // ping alarm forward. | 2889 // ping alarm forward. |
| 2883 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5)); | 2890 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5)); |
| 2884 QuicAckFrame frame = InitAckFrame(1); | 2891 QuicAckFrame frame = InitAckFrame(1); |
| 2885 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2892 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 2886 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 2893 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 2911 EXPECT_CALL(visitor_, HasOpenDynamicStreams()).WillRepeatedly(Return(true)); | 2918 EXPECT_CALL(visitor_, HasOpenDynamicStreams()).WillRepeatedly(Return(true)); |
| 2912 EXPECT_FALSE(connection_.GetPingAlarm()->IsSet()); | 2919 EXPECT_FALSE(connection_.GetPingAlarm()->IsSet()); |
| 2913 | 2920 |
| 2914 // Use a reduced ping timeout for this connection. | 2921 // Use a reduced ping timeout for this connection. |
| 2915 connection_.set_ping_timeout(QuicTime::Delta::FromSeconds(10)); | 2922 connection_.set_ping_timeout(QuicTime::Delta::FromSeconds(10)); |
| 2916 | 2923 |
| 2917 // Advance to 5ms, and send a packet to the peer, which will set | 2924 // Advance to 5ms, and send a packet to the peer, which will set |
| 2918 // the ping alarm. | 2925 // the ping alarm. |
| 2919 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5)); | 2926 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5)); |
| 2920 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); | 2927 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); |
| 2921 SendStreamDataToPeer(kHeadersStreamId, "GET /", 0, kFin, nullptr); | 2928 SendStreamDataToPeer(kHeadersStreamId, "GET /", 0, FIN, nullptr); |
| 2922 EXPECT_TRUE(connection_.GetPingAlarm()->IsSet()); | 2929 EXPECT_TRUE(connection_.GetPingAlarm()->IsSet()); |
| 2923 EXPECT_EQ(clock_.ApproximateNow() + QuicTime::Delta::FromSeconds(10), | 2930 EXPECT_EQ(clock_.ApproximateNow() + QuicTime::Delta::FromSeconds(10), |
| 2924 connection_.GetPingAlarm()->deadline()); | 2931 connection_.GetPingAlarm()->deadline()); |
| 2925 | 2932 |
| 2926 // Now recevie and ACK of the previous packet, which will move the | 2933 // Now recevie and ACK of the previous packet, which will move the |
| 2927 // ping alarm forward. | 2934 // ping alarm forward. |
| 2928 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5)); | 2935 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5)); |
| 2929 QuicAckFrame frame = InitAckFrame(1); | 2936 QuicAckFrame frame = InitAckFrame(1); |
| 2930 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2937 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 2931 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 2938 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2965 EXPECT_EQ(new_mtu, mtu_probe_size); | 2972 EXPECT_EQ(new_mtu, mtu_probe_size); |
| 2966 EXPECT_EQ(1u, creator_->packet_number()); | 2973 EXPECT_EQ(1u, creator_->packet_number()); |
| 2967 | 2974 |
| 2968 // Send more than MTU worth of data. No acknowledgement was received so far, | 2975 // Send more than MTU worth of data. No acknowledgement was received so far, |
| 2969 // so the MTU should be at its old value. | 2976 // so the MTU should be at its old value. |
| 2970 const string data(kDefaultMaxPacketSize + 1, '.'); | 2977 const string data(kDefaultMaxPacketSize + 1, '.'); |
| 2971 QuicByteCount size_before_mtu_change; | 2978 QuicByteCount size_before_mtu_change; |
| 2972 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 2979 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
| 2973 .WillOnce(DoAll(SaveArg<3>(&size_before_mtu_change), Return(true))) | 2980 .WillOnce(DoAll(SaveArg<3>(&size_before_mtu_change), Return(true))) |
| 2974 .WillOnce(Return(true)); | 2981 .WillOnce(Return(true)); |
| 2975 connection_.SendStreamDataWithString(3, data, 0, kFin, nullptr); | 2982 connection_.SendStreamDataWithString(3, data, 0, FIN, nullptr); |
| 2976 EXPECT_EQ(3u, creator_->packet_number()); | 2983 EXPECT_EQ(3u, creator_->packet_number()); |
| 2977 EXPECT_EQ(kDefaultMaxPacketSize, size_before_mtu_change); | 2984 EXPECT_EQ(kDefaultMaxPacketSize, size_before_mtu_change); |
| 2978 | 2985 |
| 2979 // Acknowledge all packets so far. | 2986 // Acknowledge all packets so far. |
| 2980 QuicAckFrame probe_ack = InitAckFrame(3); | 2987 QuicAckFrame probe_ack = InitAckFrame(3); |
| 2981 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2988 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 2982 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 2989 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 2983 ProcessAckPacket(&probe_ack); | 2990 ProcessAckPacket(&probe_ack); |
| 2984 EXPECT_EQ(new_mtu, connection_.max_packet_length()); | 2991 EXPECT_EQ(new_mtu, connection_.max_packet_length()); |
| 2985 | 2992 |
| 2986 // Send the same data again. Check that it fits into a single packet now. | 2993 // Send the same data again. Check that it fits into a single packet now. |
| 2987 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); | 2994 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
| 2988 connection_.SendStreamDataWithString(3, data, 0, kFin, nullptr); | 2995 connection_.SendStreamDataWithString(3, data, 0, FIN, nullptr); |
| 2989 EXPECT_EQ(4u, creator_->packet_number()); | 2996 EXPECT_EQ(4u, creator_->packet_number()); |
| 2990 } | 2997 } |
| 2991 | 2998 |
| 2992 // Tests whether MTU discovery does not happen when it is not explicitly enabled | 2999 // Tests whether MTU discovery does not happen when it is not explicitly enabled |
| 2993 // by the connection options. | 3000 // by the connection options. |
| 2994 TEST_P(QuicConnectionTest, MtuDiscoveryDisabled) { | 3001 TEST_P(QuicConnectionTest, MtuDiscoveryDisabled) { |
| 2995 EXPECT_TRUE(connection_.connected()); | 3002 EXPECT_TRUE(connection_.connected()); |
| 2996 | 3003 |
| 2997 const QuicPacketCount number_of_packets = kPacketsBetweenMtuProbesBase * 2; | 3004 const QuicPacketCount number_of_packets = kPacketsBetweenMtuProbesBase * 2; |
| 2998 for (QuicPacketCount i = 0; i < number_of_packets; i++) { | 3005 for (QuicPacketCount i = 0; i < number_of_packets; i++) { |
| 2999 SendStreamDataToPeer(3, ".", i, /*fin=*/false, nullptr); | 3006 SendStreamDataToPeer(3, ".", i, NO_FIN, nullptr); |
| 3000 EXPECT_FALSE(connection_.GetMtuDiscoveryAlarm()->IsSet()); | 3007 EXPECT_FALSE(connection_.GetMtuDiscoveryAlarm()->IsSet()); |
| 3001 EXPECT_EQ(0u, connection_.mtu_probe_count()); | 3008 EXPECT_EQ(0u, connection_.mtu_probe_count()); |
| 3002 } | 3009 } |
| 3003 } | 3010 } |
| 3004 | 3011 |
| 3005 // Tests whether MTU discovery works when the probe gets acknowledged on the | 3012 // Tests whether MTU discovery works when the probe gets acknowledged on the |
| 3006 // first try. | 3013 // first try. |
| 3007 TEST_P(QuicConnectionTest, MtuDiscoveryEnabled) { | 3014 TEST_P(QuicConnectionTest, MtuDiscoveryEnabled) { |
| 3008 EXPECT_TRUE(connection_.connected()); | 3015 EXPECT_TRUE(connection_.connected()); |
| 3009 | 3016 |
| 3010 connection_.EnablePathMtuDiscovery(send_algorithm_); | 3017 connection_.EnablePathMtuDiscovery(send_algorithm_); |
| 3011 | 3018 |
| 3012 // Send enough packets so that the next one triggers path MTU discovery. | 3019 // Send enough packets so that the next one triggers path MTU discovery. |
| 3013 for (QuicPacketCount i = 0; i < kPacketsBetweenMtuProbesBase - 1; i++) { | 3020 for (QuicPacketCount i = 0; i < kPacketsBetweenMtuProbesBase - 1; i++) { |
| 3014 SendStreamDataToPeer(3, ".", i, /*fin=*/false, nullptr); | 3021 SendStreamDataToPeer(3, ".", i, NO_FIN, nullptr); |
| 3015 ASSERT_FALSE(connection_.GetMtuDiscoveryAlarm()->IsSet()); | 3022 ASSERT_FALSE(connection_.GetMtuDiscoveryAlarm()->IsSet()); |
| 3016 } | 3023 } |
| 3017 | 3024 |
| 3018 // Trigger the probe. | 3025 // Trigger the probe. |
| 3019 SendStreamDataToPeer(3, "!", kPacketsBetweenMtuProbesBase, | 3026 SendStreamDataToPeer(3, "!", kPacketsBetweenMtuProbesBase, NO_FIN, nullptr); |
| 3020 /*fin=*/false, nullptr); | |
| 3021 ASSERT_TRUE(connection_.GetMtuDiscoveryAlarm()->IsSet()); | 3027 ASSERT_TRUE(connection_.GetMtuDiscoveryAlarm()->IsSet()); |
| 3022 QuicByteCount probe_size; | 3028 QuicByteCount probe_size; |
| 3023 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 3029 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
| 3024 .WillOnce(DoAll(SaveArg<3>(&probe_size), Return(true))); | 3030 .WillOnce(DoAll(SaveArg<3>(&probe_size), Return(true))); |
| 3025 connection_.GetMtuDiscoveryAlarm()->Fire(); | 3031 connection_.GetMtuDiscoveryAlarm()->Fire(); |
| 3026 EXPECT_EQ(kMtuDiscoveryTargetPacketSizeHigh, probe_size); | 3032 EXPECT_EQ(kMtuDiscoveryTargetPacketSizeHigh, probe_size); |
| 3027 | 3033 |
| 3028 const QuicPacketCount probe_packet_number = kPacketsBetweenMtuProbesBase + 1; | 3034 const QuicPacketCount probe_packet_number = kPacketsBetweenMtuProbesBase + 1; |
| 3029 ASSERT_EQ(probe_packet_number, creator_->packet_number()); | 3035 ASSERT_EQ(probe_packet_number, creator_->packet_number()); |
| 3030 | 3036 |
| 3031 // Acknowledge all packets sent so far. | 3037 // Acknowledge all packets sent so far. |
| 3032 QuicAckFrame probe_ack = InitAckFrame(probe_packet_number); | 3038 QuicAckFrame probe_ack = InitAckFrame(probe_packet_number); |
| 3033 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3039 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 3034 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 3040 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 3035 ProcessAckPacket(&probe_ack); | 3041 ProcessAckPacket(&probe_ack); |
| 3036 EXPECT_EQ(kMtuDiscoveryTargetPacketSizeHigh, connection_.max_packet_length()); | 3042 EXPECT_EQ(kMtuDiscoveryTargetPacketSizeHigh, connection_.max_packet_length()); |
| 3037 EXPECT_EQ(0u, connection_.GetBytesInFlight()); | 3043 EXPECT_EQ(0u, connection_.GetBytesInFlight()); |
| 3038 | 3044 |
| 3039 // Send more packets, and ensure that none of them sets the alarm. | 3045 // Send more packets, and ensure that none of them sets the alarm. |
| 3040 for (QuicPacketCount i = 0; i < 4 * kPacketsBetweenMtuProbesBase; i++) { | 3046 for (QuicPacketCount i = 0; i < 4 * kPacketsBetweenMtuProbesBase; i++) { |
| 3041 SendStreamDataToPeer(3, ".", i, /*fin=*/false, nullptr); | 3047 SendStreamDataToPeer(3, ".", i, NO_FIN, nullptr); |
| 3042 ASSERT_FALSE(connection_.GetMtuDiscoveryAlarm()->IsSet()); | 3048 ASSERT_FALSE(connection_.GetMtuDiscoveryAlarm()->IsSet()); |
| 3043 } | 3049 } |
| 3044 | 3050 |
| 3045 EXPECT_EQ(1u, connection_.mtu_probe_count()); | 3051 EXPECT_EQ(1u, connection_.mtu_probe_count()); |
| 3046 } | 3052 } |
| 3047 | 3053 |
| 3048 // Tests whether MTU discovery works correctly when the probes never get | 3054 // Tests whether MTU discovery works correctly when the probes never get |
| 3049 // acknowledged. | 3055 // acknowledged. |
| 3050 TEST_P(QuicConnectionTest, MtuDiscoveryFailed) { | 3056 TEST_P(QuicConnectionTest, MtuDiscoveryFailed) { |
| 3051 EXPECT_TRUE(connection_.connected()); | 3057 EXPECT_TRUE(connection_.connected()); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 3069 // get caught as well. | 3075 // get caught as well. |
| 3070 const QuicPacketCount number_of_packets = | 3076 const QuicPacketCount number_of_packets = |
| 3071 packets_between_probes_base * (1 << (kMtuDiscoveryAttempts + 1)); | 3077 packets_between_probes_base * (1 << (kMtuDiscoveryAttempts + 1)); |
| 3072 std::vector<QuicPacketNumber> mtu_discovery_packets; | 3078 std::vector<QuicPacketNumber> mtu_discovery_packets; |
| 3073 // Called by the first ack. | 3079 // Called by the first ack. |
| 3074 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3080 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 3075 // Called on many acks. | 3081 // Called on many acks. |
| 3076 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)) | 3082 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)) |
| 3077 .Times(AnyNumber()); | 3083 .Times(AnyNumber()); |
| 3078 for (QuicPacketCount i = 0; i < number_of_packets; i++) { | 3084 for (QuicPacketCount i = 0; i < number_of_packets; i++) { |
| 3079 SendStreamDataToPeer(3, "!", i, /*fin=*/false, nullptr); | 3085 SendStreamDataToPeer(3, "!", i, NO_FIN, nullptr); |
| 3080 clock_.AdvanceTime(rtt); | 3086 clock_.AdvanceTime(rtt); |
| 3081 | 3087 |
| 3082 // Receive an ACK, which marks all data packets as received, and all MTU | 3088 // Receive an ACK, which marks all data packets as received, and all MTU |
| 3083 // discovery packets as missing. | 3089 // discovery packets as missing. |
| 3084 QuicAckFrame ack = InitAckFrame(creator_->packet_number()); | 3090 QuicAckFrame ack = InitAckFrame(creator_->packet_number()); |
| 3085 for (QuicPacketNumber& packet : mtu_discovery_packets) { | 3091 for (QuicPacketNumber& packet : mtu_discovery_packets) { |
| 3086 NackPacket(packet, &ack); | 3092 NackPacket(packet, &ack); |
| 3087 } | 3093 } |
| 3088 ProcessAckPacket(&ack); | 3094 ProcessAckPacket(&ack); |
| 3089 | 3095 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 3120 // packet can be. | 3126 // packet can be. |
| 3121 TEST_P(QuicConnectionTest, MtuDiscoveryWriterLimited) { | 3127 TEST_P(QuicConnectionTest, MtuDiscoveryWriterLimited) { |
| 3122 EXPECT_TRUE(connection_.connected()); | 3128 EXPECT_TRUE(connection_.connected()); |
| 3123 | 3129 |
| 3124 const QuicByteCount mtu_limit = kMtuDiscoveryTargetPacketSizeHigh - 1; | 3130 const QuicByteCount mtu_limit = kMtuDiscoveryTargetPacketSizeHigh - 1; |
| 3125 writer_->set_max_packet_size(mtu_limit); | 3131 writer_->set_max_packet_size(mtu_limit); |
| 3126 connection_.EnablePathMtuDiscovery(send_algorithm_); | 3132 connection_.EnablePathMtuDiscovery(send_algorithm_); |
| 3127 | 3133 |
| 3128 // Send enough packets so that the next one triggers path MTU discovery. | 3134 // Send enough packets so that the next one triggers path MTU discovery. |
| 3129 for (QuicPacketCount i = 0; i < kPacketsBetweenMtuProbesBase - 1; i++) { | 3135 for (QuicPacketCount i = 0; i < kPacketsBetweenMtuProbesBase - 1; i++) { |
| 3130 SendStreamDataToPeer(3, ".", i, /*fin=*/false, nullptr); | 3136 SendStreamDataToPeer(3, ".", i, NO_FIN, nullptr); |
| 3131 ASSERT_FALSE(connection_.GetMtuDiscoveryAlarm()->IsSet()); | 3137 ASSERT_FALSE(connection_.GetMtuDiscoveryAlarm()->IsSet()); |
| 3132 } | 3138 } |
| 3133 | 3139 |
| 3134 // Trigger the probe. | 3140 // Trigger the probe. |
| 3135 SendStreamDataToPeer(3, "!", kPacketsBetweenMtuProbesBase, | 3141 SendStreamDataToPeer(3, "!", kPacketsBetweenMtuProbesBase, NO_FIN, nullptr); |
| 3136 /*fin=*/false, nullptr); | |
| 3137 ASSERT_TRUE(connection_.GetMtuDiscoveryAlarm()->IsSet()); | 3142 ASSERT_TRUE(connection_.GetMtuDiscoveryAlarm()->IsSet()); |
| 3138 QuicByteCount probe_size; | 3143 QuicByteCount probe_size; |
| 3139 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 3144 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
| 3140 .WillOnce(DoAll(SaveArg<3>(&probe_size), Return(true))); | 3145 .WillOnce(DoAll(SaveArg<3>(&probe_size), Return(true))); |
| 3141 connection_.GetMtuDiscoveryAlarm()->Fire(); | 3146 connection_.GetMtuDiscoveryAlarm()->Fire(); |
| 3142 EXPECT_EQ(mtu_limit, probe_size); | 3147 EXPECT_EQ(mtu_limit, probe_size); |
| 3143 | 3148 |
| 3144 const QuicPacketCount probe_sequence_number = | 3149 const QuicPacketCount probe_sequence_number = |
| 3145 kPacketsBetweenMtuProbesBase + 1; | 3150 kPacketsBetweenMtuProbesBase + 1; |
| 3146 ASSERT_EQ(probe_sequence_number, creator_->packet_number()); | 3151 ASSERT_EQ(probe_sequence_number, creator_->packet_number()); |
| 3147 | 3152 |
| 3148 // Acknowledge all packets sent so far. | 3153 // Acknowledge all packets sent so far. |
| 3149 QuicAckFrame probe_ack = InitAckFrame(probe_sequence_number); | 3154 QuicAckFrame probe_ack = InitAckFrame(probe_sequence_number); |
| 3150 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3155 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 3151 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 3156 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 3152 ProcessAckPacket(&probe_ack); | 3157 ProcessAckPacket(&probe_ack); |
| 3153 EXPECT_EQ(mtu_limit, connection_.max_packet_length()); | 3158 EXPECT_EQ(mtu_limit, connection_.max_packet_length()); |
| 3154 EXPECT_EQ(0u, connection_.GetBytesInFlight()); | 3159 EXPECT_EQ(0u, connection_.GetBytesInFlight()); |
| 3155 | 3160 |
| 3156 // Send more packets, and ensure that none of them sets the alarm. | 3161 // Send more packets, and ensure that none of them sets the alarm. |
| 3157 for (QuicPacketCount i = 0; i < 4 * kPacketsBetweenMtuProbesBase; i++) { | 3162 for (QuicPacketCount i = 0; i < 4 * kPacketsBetweenMtuProbesBase; i++) { |
| 3158 SendStreamDataToPeer(3, ".", i, /*fin=*/false, nullptr); | 3163 SendStreamDataToPeer(3, ".", i, NO_FIN, nullptr); |
| 3159 ASSERT_FALSE(connection_.GetMtuDiscoveryAlarm()->IsSet()); | 3164 ASSERT_FALSE(connection_.GetMtuDiscoveryAlarm()->IsSet()); |
| 3160 } | 3165 } |
| 3161 | 3166 |
| 3162 EXPECT_EQ(1u, connection_.mtu_probe_count()); | 3167 EXPECT_EQ(1u, connection_.mtu_probe_count()); |
| 3163 } | 3168 } |
| 3164 | 3169 |
| 3165 // Tests whether MTU discovery works when the writer returns an error despite | 3170 // Tests whether MTU discovery works when the writer returns an error despite |
| 3166 // advertising higher packet length. | 3171 // advertising higher packet length. |
| 3167 TEST_P(QuicConnectionTest, MtuDiscoveryWriterFailed) { | 3172 TEST_P(QuicConnectionTest, MtuDiscoveryWriterFailed) { |
| 3168 EXPECT_TRUE(connection_.connected()); | 3173 EXPECT_TRUE(connection_.connected()); |
| 3169 | 3174 |
| 3170 const QuicByteCount mtu_limit = kMtuDiscoveryTargetPacketSizeHigh - 1; | 3175 const QuicByteCount mtu_limit = kMtuDiscoveryTargetPacketSizeHigh - 1; |
| 3171 const QuicByteCount initial_mtu = connection_.max_packet_length(); | 3176 const QuicByteCount initial_mtu = connection_.max_packet_length(); |
| 3172 EXPECT_LT(initial_mtu, mtu_limit); | 3177 EXPECT_LT(initial_mtu, mtu_limit); |
| 3173 writer_->set_max_packet_size(mtu_limit); | 3178 writer_->set_max_packet_size(mtu_limit); |
| 3174 connection_.EnablePathMtuDiscovery(send_algorithm_); | 3179 connection_.EnablePathMtuDiscovery(send_algorithm_); |
| 3175 | 3180 |
| 3176 // Send enough packets so that the next one triggers path MTU discovery. | 3181 // Send enough packets so that the next one triggers path MTU discovery. |
| 3177 for (QuicPacketCount i = 0; i < kPacketsBetweenMtuProbesBase - 1; i++) { | 3182 for (QuicPacketCount i = 0; i < kPacketsBetweenMtuProbesBase - 1; i++) { |
| 3178 SendStreamDataToPeer(3, ".", i, /*fin=*/false, nullptr); | 3183 SendStreamDataToPeer(3, ".", i, NO_FIN, nullptr); |
| 3179 ASSERT_FALSE(connection_.GetMtuDiscoveryAlarm()->IsSet()); | 3184 ASSERT_FALSE(connection_.GetMtuDiscoveryAlarm()->IsSet()); |
| 3180 } | 3185 } |
| 3181 | 3186 |
| 3182 // Trigger the probe. | 3187 // Trigger the probe. |
| 3183 SendStreamDataToPeer(3, "!", kPacketsBetweenMtuProbesBase, | 3188 SendStreamDataToPeer(3, "!", kPacketsBetweenMtuProbesBase, NO_FIN, nullptr); |
| 3184 /*fin=*/false, nullptr); | |
| 3185 ASSERT_TRUE(connection_.GetMtuDiscoveryAlarm()->IsSet()); | 3189 ASSERT_TRUE(connection_.GetMtuDiscoveryAlarm()->IsSet()); |
| 3186 writer_->SimulateNextPacketTooLarge(); | 3190 writer_->SimulateNextPacketTooLarge(); |
| 3187 connection_.GetMtuDiscoveryAlarm()->Fire(); | 3191 connection_.GetMtuDiscoveryAlarm()->Fire(); |
| 3188 ASSERT_TRUE(connection_.connected()); | 3192 ASSERT_TRUE(connection_.connected()); |
| 3189 | 3193 |
| 3190 // Send more data. | 3194 // Send more data. |
| 3191 QuicPacketNumber probe_number = creator_->packet_number(); | 3195 QuicPacketNumber probe_number = creator_->packet_number(); |
| 3192 QuicPacketCount extra_packets = kPacketsBetweenMtuProbesBase * 3; | 3196 QuicPacketCount extra_packets = kPacketsBetweenMtuProbesBase * 3; |
| 3193 for (QuicPacketCount i = 0; i < extra_packets; i++) { | 3197 for (QuicPacketCount i = 0; i < extra_packets; i++) { |
| 3194 connection_.EnsureWritableAndSendStreamData5(); | 3198 connection_.EnsureWritableAndSendStreamData5(); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 3213 EXPECT_EQ(1u, connection_.mtu_probe_count()); | 3217 EXPECT_EQ(1u, connection_.mtu_probe_count()); |
| 3214 } | 3218 } |
| 3215 | 3219 |
| 3216 TEST_P(QuicConnectionTest, NoMtuDiscoveryAfterConnectionClosed) { | 3220 TEST_P(QuicConnectionTest, NoMtuDiscoveryAfterConnectionClosed) { |
| 3217 EXPECT_TRUE(connection_.connected()); | 3221 EXPECT_TRUE(connection_.connected()); |
| 3218 | 3222 |
| 3219 connection_.EnablePathMtuDiscovery(send_algorithm_); | 3223 connection_.EnablePathMtuDiscovery(send_algorithm_); |
| 3220 | 3224 |
| 3221 // Send enough packets so that the next one triggers path MTU discovery. | 3225 // Send enough packets so that the next one triggers path MTU discovery. |
| 3222 for (QuicPacketCount i = 0; i < kPacketsBetweenMtuProbesBase - 1; i++) { | 3226 for (QuicPacketCount i = 0; i < kPacketsBetweenMtuProbesBase - 1; i++) { |
| 3223 SendStreamDataToPeer(3, ".", i, /*fin=*/false, nullptr); | 3227 SendStreamDataToPeer(3, ".", i, NO_FIN, nullptr); |
| 3224 ASSERT_FALSE(connection_.GetMtuDiscoveryAlarm()->IsSet()); | 3228 ASSERT_FALSE(connection_.GetMtuDiscoveryAlarm()->IsSet()); |
| 3225 } | 3229 } |
| 3226 | 3230 |
| 3227 SendStreamDataToPeer(3, "!", kPacketsBetweenMtuProbesBase, | 3231 SendStreamDataToPeer(3, "!", kPacketsBetweenMtuProbesBase, NO_FIN, nullptr); |
| 3228 /*fin=*/false, nullptr); | |
| 3229 EXPECT_TRUE(connection_.GetMtuDiscoveryAlarm()->IsSet()); | 3232 EXPECT_TRUE(connection_.GetMtuDiscoveryAlarm()->IsSet()); |
| 3230 | 3233 |
| 3231 EXPECT_CALL(visitor_, OnConnectionClosed(_, _, _)); | 3234 EXPECT_CALL(visitor_, OnConnectionClosed(_, _, _)); |
| 3232 connection_.CloseConnection(QUIC_PEER_GOING_AWAY, "no reason", | 3235 connection_.CloseConnection(QUIC_PEER_GOING_AWAY, "no reason", |
| 3233 ConnectionCloseBehavior::SILENT_CLOSE); | 3236 ConnectionCloseBehavior::SILENT_CLOSE); |
| 3234 EXPECT_FALSE(connection_.GetMtuDiscoveryAlarm()->IsSet()); | 3237 EXPECT_FALSE(connection_.GetMtuDiscoveryAlarm()->IsSet()); |
| 3235 } | 3238 } |
| 3236 | 3239 |
| 3237 TEST_P(QuicConnectionTest, TimeoutAfterSend) { | 3240 TEST_P(QuicConnectionTest, TimeoutAfterSend) { |
| 3238 EXPECT_TRUE(connection_.connected()); | 3241 EXPECT_TRUE(connection_.connected()); |
| 3239 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | 3242 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); |
| 3240 QuicConfig config; | 3243 QuicConfig config; |
| 3241 connection_.SetFromConfig(config); | 3244 connection_.SetFromConfig(config); |
| 3242 EXPECT_FALSE(QuicConnectionPeer::IsSilentCloseEnabled(&connection_)); | 3245 EXPECT_FALSE(QuicConnectionPeer::IsSilentCloseEnabled(&connection_)); |
| 3243 | 3246 |
| 3244 const QuicTime::Delta initial_idle_timeout = | 3247 const QuicTime::Delta initial_idle_timeout = |
| 3245 QuicTime::Delta::FromSeconds(kInitialIdleTimeoutSecs - 1); | 3248 QuicTime::Delta::FromSeconds(kInitialIdleTimeoutSecs - 1); |
| 3246 const QuicTime::Delta five_ms = QuicTime::Delta::FromMilliseconds(5); | 3249 const QuicTime::Delta five_ms = QuicTime::Delta::FromMilliseconds(5); |
| 3247 QuicTime default_timeout = clock_.ApproximateNow() + initial_idle_timeout; | 3250 QuicTime default_timeout = clock_.ApproximateNow() + initial_idle_timeout; |
| 3248 | 3251 |
| 3249 // When we send a packet, the timeout will change to 5ms + | 3252 // When we send a packet, the timeout will change to 5ms + |
| 3250 // kInitialIdleTimeoutSecs. | 3253 // kInitialIdleTimeoutSecs. |
| 3251 clock_.AdvanceTime(five_ms); | 3254 clock_.AdvanceTime(five_ms); |
| 3252 SendStreamDataToPeer(kClientDataStreamId1, "foo", 0, kFin, nullptr); | 3255 SendStreamDataToPeer(kClientDataStreamId1, "foo", 0, FIN, nullptr); |
| 3253 EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline()); | 3256 EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline()); |
| 3254 | 3257 |
| 3255 // Now send more data. This will not move the timeout becase | 3258 // Now send more data. This will not move the timeout becase |
| 3256 // no data has been recieved since the previous write. | 3259 // no data has been recieved since the previous write. |
| 3257 clock_.AdvanceTime(five_ms); | 3260 clock_.AdvanceTime(five_ms); |
| 3258 SendStreamDataToPeer(kClientDataStreamId1, "foo", 0, kFin, nullptr); | 3261 SendStreamDataToPeer(kClientDataStreamId1, "foo", 0, FIN, nullptr); |
| 3259 EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline()); | 3262 EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline()); |
| 3260 | 3263 |
| 3261 // The original alarm will fire. We should not time out because we had a | 3264 // The original alarm will fire. We should not time out because we had a |
| 3262 // network event at t=5ms. The alarm will reregister. | 3265 // network event at t=5ms. The alarm will reregister. |
| 3263 clock_.AdvanceTime(initial_idle_timeout - five_ms - five_ms); | 3266 clock_.AdvanceTime(initial_idle_timeout - five_ms - five_ms); |
| 3264 EXPECT_EQ(default_timeout, clock_.ApproximateNow()); | 3267 EXPECT_EQ(default_timeout, clock_.ApproximateNow()); |
| 3265 connection_.GetTimeoutAlarm()->Fire(); | 3268 connection_.GetTimeoutAlarm()->Fire(); |
| 3266 EXPECT_TRUE(connection_.GetTimeoutAlarm()->IsSet()); | 3269 EXPECT_TRUE(connection_.GetTimeoutAlarm()->IsSet()); |
| 3267 EXPECT_TRUE(connection_.connected()); | 3270 EXPECT_TRUE(connection_.connected()); |
| 3268 EXPECT_EQ(default_timeout + five_ms, | 3271 EXPECT_EQ(default_timeout + five_ms, |
| (...skipping 28 matching lines...) Expand all Loading... |
| 3297 start_time + DefaultRetransmissionTime(); | 3300 start_time + DefaultRetransmissionTime(); |
| 3298 | 3301 |
| 3299 ASSERT_LT(default_retransmission_time, default_timeout); | 3302 ASSERT_LT(default_retransmission_time, default_timeout); |
| 3300 | 3303 |
| 3301 // When we send a packet, the timeout will change to 5 ms + | 3304 // When we send a packet, the timeout will change to 5 ms + |
| 3302 // kInitialIdleTimeoutSecs (but it will not reschedule the alarm). | 3305 // kInitialIdleTimeoutSecs (but it will not reschedule the alarm). |
| 3303 const QuicTime::Delta five_ms = QuicTime::Delta::FromMilliseconds(5); | 3306 const QuicTime::Delta five_ms = QuicTime::Delta::FromMilliseconds(5); |
| 3304 const QuicTime send_time = start_time + five_ms; | 3307 const QuicTime send_time = start_time + five_ms; |
| 3305 clock_.AdvanceTime(five_ms); | 3308 clock_.AdvanceTime(five_ms); |
| 3306 ASSERT_EQ(send_time, clock_.Now()); | 3309 ASSERT_EQ(send_time, clock_.Now()); |
| 3307 SendStreamDataToPeer(kClientDataStreamId1, "foo", 0, kFin, nullptr); | 3310 SendStreamDataToPeer(kClientDataStreamId1, "foo", 0, FIN, nullptr); |
| 3308 EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline()); | 3311 EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline()); |
| 3309 | 3312 |
| 3310 // Move forward 5 ms and receive a packet, which will move the timeout | 3313 // Move forward 5 ms and receive a packet, which will move the timeout |
| 3311 // forward 5 ms more (but will not reschedule the alarm). | 3314 // forward 5 ms more (but will not reschedule the alarm). |
| 3312 const QuicTime receive_time = send_time + five_ms; | 3315 const QuicTime receive_time = send_time + five_ms; |
| 3313 clock_.AdvanceTime(receive_time - clock_.Now()); | 3316 clock_.AdvanceTime(receive_time - clock_.Now()); |
| 3314 ASSERT_EQ(receive_time, clock_.Now()); | 3317 ASSERT_EQ(receive_time, clock_.Now()); |
| 3315 ProcessPacket(1); | 3318 ProcessPacket(1); |
| 3316 | 3319 |
| 3317 // Now move forward to the retransmission time and retransmit the | 3320 // Now move forward to the retransmission time and retransmit the |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3379 EXPECT_TRUE(QuicConnectionPeer::IsSilentCloseEnabled(&connection_)); | 3382 EXPECT_TRUE(QuicConnectionPeer::IsSilentCloseEnabled(&connection_)); |
| 3380 | 3383 |
| 3381 const QuicTime::Delta default_idle_timeout = | 3384 const QuicTime::Delta default_idle_timeout = |
| 3382 QuicTime::Delta::FromSeconds(kDefaultIdleTimeoutSecs - 1); | 3385 QuicTime::Delta::FromSeconds(kDefaultIdleTimeoutSecs - 1); |
| 3383 const QuicTime::Delta five_ms = QuicTime::Delta::FromMilliseconds(5); | 3386 const QuicTime::Delta five_ms = QuicTime::Delta::FromMilliseconds(5); |
| 3384 QuicTime default_timeout = clock_.ApproximateNow() + default_idle_timeout; | 3387 QuicTime default_timeout = clock_.ApproximateNow() + default_idle_timeout; |
| 3385 | 3388 |
| 3386 // When we send a packet, the timeout will change to 5ms + | 3389 // When we send a packet, the timeout will change to 5ms + |
| 3387 // kInitialIdleTimeoutSecs. | 3390 // kInitialIdleTimeoutSecs. |
| 3388 clock_.AdvanceTime(five_ms); | 3391 clock_.AdvanceTime(five_ms); |
| 3389 SendStreamDataToPeer(kClientDataStreamId1, "foo", 0, kFin, nullptr); | 3392 SendStreamDataToPeer(kClientDataStreamId1, "foo", 0, FIN, nullptr); |
| 3390 EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline()); | 3393 EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline()); |
| 3391 | 3394 |
| 3392 // Now send more data. This will not move the timeout becase | 3395 // Now send more data. This will not move the timeout becase |
| 3393 // no data has been recieved since the previous write. | 3396 // no data has been recieved since the previous write. |
| 3394 clock_.AdvanceTime(five_ms); | 3397 clock_.AdvanceTime(five_ms); |
| 3395 SendStreamDataToPeer(kClientDataStreamId1, "foo", 0, kFin, nullptr); | 3398 SendStreamDataToPeer(kClientDataStreamId1, "foo", 0, FIN, nullptr); |
| 3396 EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline()); | 3399 EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline()); |
| 3397 | 3400 |
| 3398 // The original alarm will fire. We should not time out because we had a | 3401 // The original alarm will fire. We should not time out because we had a |
| 3399 // network event at t=5ms. The alarm will reregister. | 3402 // network event at t=5ms. The alarm will reregister. |
| 3400 clock_.AdvanceTime(default_idle_timeout - five_ms - five_ms); | 3403 clock_.AdvanceTime(default_idle_timeout - five_ms - five_ms); |
| 3401 EXPECT_EQ(default_timeout, clock_.ApproximateNow()); | 3404 EXPECT_EQ(default_timeout, clock_.ApproximateNow()); |
| 3402 connection_.GetTimeoutAlarm()->Fire(); | 3405 connection_.GetTimeoutAlarm()->Fire(); |
| 3403 EXPECT_TRUE(connection_.GetTimeoutAlarm()->IsSet()); | 3406 EXPECT_TRUE(connection_.GetTimeoutAlarm()->IsSet()); |
| 3404 EXPECT_TRUE(connection_.connected()); | 3407 EXPECT_TRUE(connection_.connected()); |
| 3405 EXPECT_EQ(default_timeout + five_ms, | 3408 EXPECT_EQ(default_timeout + five_ms, |
| (...skipping 15 matching lines...) Expand all Loading... |
| 3421 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | 3424 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); |
| 3422 QuicConfig config; | 3425 QuicConfig config; |
| 3423 connection_.SetFromConfig(config); | 3426 connection_.SetFromConfig(config); |
| 3424 EXPECT_FALSE(QuicConnectionPeer::IsSilentCloseEnabled(&connection_)); | 3427 EXPECT_FALSE(QuicConnectionPeer::IsSilentCloseEnabled(&connection_)); |
| 3425 | 3428 |
| 3426 const QuicTime::Delta initial_idle_timeout = | 3429 const QuicTime::Delta initial_idle_timeout = |
| 3427 QuicTime::Delta::FromSeconds(kInitialIdleTimeoutSecs - 1); | 3430 QuicTime::Delta::FromSeconds(kInitialIdleTimeoutSecs - 1); |
| 3428 const QuicTime::Delta five_ms = QuicTime::Delta::FromMilliseconds(5); | 3431 const QuicTime::Delta five_ms = QuicTime::Delta::FromMilliseconds(5); |
| 3429 QuicTime default_timeout = clock_.ApproximateNow() + initial_idle_timeout; | 3432 QuicTime default_timeout = clock_.ApproximateNow() + initial_idle_timeout; |
| 3430 | 3433 |
| 3431 connection_.SendStreamDataWithString(kClientDataStreamId1, "foo", 0, !kFin, | 3434 connection_.SendStreamDataWithString(kClientDataStreamId1, "foo", 0, NO_FIN, |
| 3432 nullptr); | 3435 nullptr); |
| 3433 connection_.SendStreamDataWithString(kClientDataStreamId1, "foo", 3, !kFin, | 3436 connection_.SendStreamDataWithString(kClientDataStreamId1, "foo", 3, NO_FIN, |
| 3434 nullptr); | 3437 nullptr); |
| 3435 | 3438 |
| 3436 EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline()); | 3439 EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline()); |
| 3437 clock_.AdvanceTime(five_ms); | 3440 clock_.AdvanceTime(five_ms); |
| 3438 | 3441 |
| 3439 // When we receive a packet, the timeout will change to 5ms + | 3442 // When we receive a packet, the timeout will change to 5ms + |
| 3440 // kInitialIdleTimeoutSecs. | 3443 // kInitialIdleTimeoutSecs. |
| 3441 QuicAckFrame ack = InitAckFrame(2); | 3444 QuicAckFrame ack = InitAckFrame(2); |
| 3442 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 3445 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 3443 ProcessAckPacket(&ack); | 3446 ProcessAckPacket(&ack); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 3473 | 3476 |
| 3474 const QuicTime::Delta initial_idle_timeout = | 3477 const QuicTime::Delta initial_idle_timeout = |
| 3475 QuicTime::Delta::FromSeconds(kInitialIdleTimeoutSecs - 1); | 3478 QuicTime::Delta::FromSeconds(kInitialIdleTimeoutSecs - 1); |
| 3476 connection_.SetNetworkTimeouts( | 3479 connection_.SetNetworkTimeouts( |
| 3477 QuicTime::Delta::Infinite(), | 3480 QuicTime::Delta::Infinite(), |
| 3478 initial_idle_timeout + QuicTime::Delta::FromSeconds(1)); | 3481 initial_idle_timeout + QuicTime::Delta::FromSeconds(1)); |
| 3479 const QuicTime::Delta five_ms = QuicTime::Delta::FromMilliseconds(5); | 3482 const QuicTime::Delta five_ms = QuicTime::Delta::FromMilliseconds(5); |
| 3480 QuicTime default_timeout = clock_.ApproximateNow() + initial_idle_timeout; | 3483 QuicTime default_timeout = clock_.ApproximateNow() + initial_idle_timeout; |
| 3481 | 3484 |
| 3482 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); | 3485 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); |
| 3483 connection_.SendStreamDataWithString(kClientDataStreamId1, "foo", 0, !kFin, | 3486 connection_.SendStreamDataWithString(kClientDataStreamId1, "foo", 0, NO_FIN, |
| 3484 nullptr); | 3487 nullptr); |
| 3485 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); | 3488 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); |
| 3486 connection_.SendStreamDataWithString(kClientDataStreamId1, "foo", 3, !kFin, | 3489 connection_.SendStreamDataWithString(kClientDataStreamId1, "foo", 3, NO_FIN, |
| 3487 nullptr); | 3490 nullptr); |
| 3488 | 3491 |
| 3489 EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline()); | 3492 EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline()); |
| 3490 | 3493 |
| 3491 clock_.AdvanceTime(five_ms); | 3494 clock_.AdvanceTime(five_ms); |
| 3492 | 3495 |
| 3493 // When we receive a packet, the timeout will change to 5ms + | 3496 // When we receive a packet, the timeout will change to 5ms + |
| 3494 // kInitialIdleTimeoutSecs. | 3497 // kInitialIdleTimeoutSecs. |
| 3495 QuicAckFrame ack = InitAckFrame(2); | 3498 QuicAckFrame ack = InitAckFrame(2); |
| 3496 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 3499 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 3497 ProcessAckPacket(&ack); | 3500 ProcessAckPacket(&ack); |
| 3498 | 3501 |
| 3499 // The original alarm will fire. We should not time out because we had a | 3502 // The original alarm will fire. We should not time out because we had a |
| 3500 // network event at t=5ms. The alarm will reregister. | 3503 // network event at t=5ms. The alarm will reregister. |
| 3501 clock_.AdvanceTime(initial_idle_timeout - five_ms); | 3504 clock_.AdvanceTime(initial_idle_timeout - five_ms); |
| 3502 EXPECT_EQ(default_timeout, clock_.ApproximateNow()); | 3505 EXPECT_EQ(default_timeout, clock_.ApproximateNow()); |
| 3503 connection_.GetTimeoutAlarm()->Fire(); | 3506 connection_.GetTimeoutAlarm()->Fire(); |
| 3504 EXPECT_TRUE(connection_.connected()); | 3507 EXPECT_TRUE(connection_.connected()); |
| 3505 EXPECT_TRUE(connection_.GetTimeoutAlarm()->IsSet()); | 3508 EXPECT_TRUE(connection_.GetTimeoutAlarm()->IsSet()); |
| 3506 EXPECT_EQ(default_timeout + five_ms, | 3509 EXPECT_EQ(default_timeout + five_ms, |
| 3507 connection_.GetTimeoutAlarm()->deadline()); | 3510 connection_.GetTimeoutAlarm()->deadline()); |
| 3508 | 3511 |
| 3509 // Now, send packets while advancing the time and verify that the connection | 3512 // Now, send packets while advancing the time and verify that the connection |
| 3510 // eventually times out. | 3513 // eventually times out. |
| 3511 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_NETWORK_IDLE_TIMEOUT, _, | 3514 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_NETWORK_IDLE_TIMEOUT, _, |
| 3512 ConnectionCloseSource::FROM_SELF)); | 3515 ConnectionCloseSource::FROM_SELF)); |
| 3513 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(AnyNumber()); | 3516 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(AnyNumber()); |
| 3514 for (int i = 0; i < 100 && connection_.connected(); ++i) { | 3517 for (int i = 0; i < 100 && connection_.connected(); ++i) { |
| 3515 QUIC_LOG(INFO) << "sending data packet"; | 3518 QUIC_LOG(INFO) << "sending data packet"; |
| 3516 connection_.SendStreamDataWithString(kClientDataStreamId1, "foo", 0, !kFin, | 3519 connection_.SendStreamDataWithString(kClientDataStreamId1, "foo", 0, NO_FIN, |
| 3517 nullptr); | 3520 nullptr); |
| 3518 connection_.GetTimeoutAlarm()->Fire(); | 3521 connection_.GetTimeoutAlarm()->Fire(); |
| 3519 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); | 3522 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1)); |
| 3520 } | 3523 } |
| 3521 EXPECT_FALSE(connection_.connected()); | 3524 EXPECT_FALSE(connection_.connected()); |
| 3522 EXPECT_FALSE(connection_.GetTimeoutAlarm()->IsSet()); | 3525 EXPECT_FALSE(connection_.GetTimeoutAlarm()->IsSet()); |
| 3523 } | 3526 } |
| 3524 | 3527 |
| 3525 TEST_P(QuicConnectionTest, TimeoutAfter5ClientRTOs) { | 3528 TEST_P(QuicConnectionTest, TimeoutAfter5ClientRTOs) { |
| 3526 connection_.SetMaxTailLossProbes(2); | 3529 connection_.SetMaxTailLossProbes(2); |
| 3527 EXPECT_TRUE(connection_.connected()); | 3530 EXPECT_TRUE(connection_.connected()); |
| 3528 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | 3531 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); |
| 3529 QuicConfig config; | 3532 QuicConfig config; |
| 3530 QuicTagVector connection_options; | 3533 QuicTagVector connection_options; |
| 3531 connection_options.push_back(k5RTO); | 3534 connection_options.push_back(k5RTO); |
| 3532 config.SetConnectionOptionsToSend(connection_options); | 3535 config.SetConnectionOptionsToSend(connection_options); |
| 3533 connection_.SetFromConfig(config); | 3536 connection_.SetFromConfig(config); |
| 3534 | 3537 |
| 3535 // Send stream data. | 3538 // Send stream data. |
| 3536 SendStreamDataToPeer(kClientDataStreamId1, "foo", 0, kFin, nullptr); | 3539 SendStreamDataToPeer(kClientDataStreamId1, "foo", 0, FIN, nullptr); |
| 3537 | 3540 |
| 3538 EXPECT_CALL(visitor_, OnPathDegrading()); | 3541 EXPECT_CALL(visitor_, OnPathDegrading()); |
| 3539 // Fire the retransmission alarm 6 times, twice for TLP and 4 times for RTO. | 3542 // Fire the retransmission alarm 6 times, twice for TLP and 4 times for RTO. |
| 3540 for (int i = 0; i < 6; ++i) { | 3543 for (int i = 0; i < 6; ++i) { |
| 3541 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); | 3544 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); |
| 3542 connection_.GetRetransmissionAlarm()->Fire(); | 3545 connection_.GetRetransmissionAlarm()->Fire(); |
| 3543 EXPECT_TRUE(connection_.GetTimeoutAlarm()->IsSet()); | 3546 EXPECT_TRUE(connection_.GetTimeoutAlarm()->IsSet()); |
| 3544 EXPECT_TRUE(connection_.connected()); | 3547 EXPECT_TRUE(connection_.connected()); |
| 3545 } | 3548 } |
| 3546 | 3549 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3589 size_t length = GetPacketLengthForOneStream( | 3592 size_t length = GetPacketLengthForOneStream( |
| 3590 connection_.version(), kIncludeVersion, !kIncludeDiversificationNonce, | 3593 connection_.version(), kIncludeVersion, !kIncludeDiversificationNonce, |
| 3591 PACKET_8BYTE_CONNECTION_ID, PACKET_1BYTE_PACKET_NUMBER, &payload_length); | 3594 PACKET_8BYTE_CONNECTION_ID, PACKET_1BYTE_PACKET_NUMBER, &payload_length); |
| 3592 connection_.SetMaxPacketLength(length); | 3595 connection_.SetMaxPacketLength(length); |
| 3593 | 3596 |
| 3594 // Queue the first packet. | 3597 // Queue the first packet. |
| 3595 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _)) | 3598 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _)) |
| 3596 .WillOnce(testing::Return(QuicTime::Delta::FromMicroseconds(10))); | 3599 .WillOnce(testing::Return(QuicTime::Delta::FromMicroseconds(10))); |
| 3597 const string payload(payload_length, 'a'); | 3600 const string payload(payload_length, 'a'); |
| 3598 EXPECT_EQ(0u, | 3601 EXPECT_EQ(0u, |
| 3599 connection_.SendStreamDataWithString(3, payload, 0, !kFin, nullptr) | 3602 connection_.SendStreamDataWithString(3, payload, 0, NO_FIN, nullptr) |
| 3600 .bytes_consumed); | 3603 .bytes_consumed); |
| 3601 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 3604 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 3602 } | 3605 } |
| 3603 | 3606 |
| 3604 TEST_P(QuicConnectionTest, LoopThroughSendingPackets) { | 3607 TEST_P(QuicConnectionTest, LoopThroughSendingPackets) { |
| 3605 // All packets carry version info till version is negotiated. | 3608 // All packets carry version info till version is negotiated. |
| 3606 size_t payload_length; | 3609 size_t payload_length; |
| 3607 // GetPacketLengthForOneStream() assumes a stream offset of 0 in determining | 3610 // GetPacketLengthForOneStream() assumes a stream offset of 0 in determining |
| 3608 // packet length. The size of the offset field in a stream frame is 0 for | 3611 // packet length. The size of the offset field in a stream frame is 0 for |
| 3609 // offset 0, and 2 for non-zero offsets up through 16K. Increase | 3612 // offset 0, and 2 for non-zero offsets up through 16K. Increase |
| 3610 // max_packet_length by 2 so that subsequent packets containing subsequent | 3613 // max_packet_length by 2 so that subsequent packets containing subsequent |
| 3611 // stream frames with non-zero offets will fit within the packet length. | 3614 // stream frames with non-zero offets will fit within the packet length. |
| 3612 size_t length = | 3615 size_t length = |
| 3613 2 + GetPacketLengthForOneStream( | 3616 2 + GetPacketLengthForOneStream( |
| 3614 connection_.version(), kIncludeVersion, | 3617 connection_.version(), kIncludeVersion, |
| 3615 !kIncludeDiversificationNonce, PACKET_8BYTE_CONNECTION_ID, | 3618 !kIncludeDiversificationNonce, PACKET_8BYTE_CONNECTION_ID, |
| 3616 PACKET_1BYTE_PACKET_NUMBER, &payload_length); | 3619 PACKET_1BYTE_PACKET_NUMBER, &payload_length); |
| 3617 connection_.SetMaxPacketLength(length); | 3620 connection_.SetMaxPacketLength(length); |
| 3618 | 3621 |
| 3619 // Queue the first packet. | 3622 // Queue the first packet. |
| 3620 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(7); | 3623 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(7); |
| 3621 // The first stream frame will have 2 fewer overhead bytes than the other six. | 3624 // The first stream frame will have 2 fewer overhead bytes than the other six. |
| 3622 const string payload(payload_length * 7 + 2, 'a'); | 3625 const string payload(payload_length * 7 + 2, 'a'); |
| 3623 EXPECT_EQ(payload.size(), | 3626 EXPECT_EQ(payload.size(), |
| 3624 connection_.SendStreamDataWithString(1, payload, 0, !kFin, nullptr) | 3627 connection_.SendStreamDataWithString(1, payload, 0, NO_FIN, nullptr) |
| 3625 .bytes_consumed); | 3628 .bytes_consumed); |
| 3626 } | 3629 } |
| 3627 | 3630 |
| 3628 TEST_P(QuicConnectionTest, LoopThroughSendingPacketsWithTruncation) { | 3631 TEST_P(QuicConnectionTest, LoopThroughSendingPacketsWithTruncation) { |
| 3629 // Set up a larger payload than will fit in one packet. | 3632 // Set up a larger payload than will fit in one packet. |
| 3630 const string payload(connection_.max_packet_length(), 'a'); | 3633 const string payload(connection_.max_packet_length(), 'a'); |
| 3631 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)).Times(AnyNumber()); | 3634 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)).Times(AnyNumber()); |
| 3632 | 3635 |
| 3633 // Now send some packets with no truncation. | 3636 // Now send some packets with no truncation. |
| 3634 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); | 3637 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); |
| 3635 EXPECT_EQ(payload.size(), | 3638 EXPECT_EQ(payload.size(), |
| 3636 connection_.SendStreamDataWithString(3, payload, 0, !kFin, nullptr) | 3639 connection_.SendStreamDataWithString(3, payload, 0, NO_FIN, nullptr) |
| 3637 .bytes_consumed); | 3640 .bytes_consumed); |
| 3638 // Track the size of the second packet here. The overhead will be the largest | 3641 // Track the size of the second packet here. The overhead will be the largest |
| 3639 // we see in this test, due to the non-truncated connection id. | 3642 // we see in this test, due to the non-truncated connection id. |
| 3640 size_t non_truncated_packet_size = writer_->last_packet_size(); | 3643 size_t non_truncated_packet_size = writer_->last_packet_size(); |
| 3641 | 3644 |
| 3642 // Change to a 0 byte connection id. | 3645 // Change to a 0 byte connection id. |
| 3643 QuicConfig config; | 3646 QuicConfig config; |
| 3644 QuicConfigPeer::SetReceivedBytesForConnectionId(&config, 0); | 3647 QuicConfigPeer::SetReceivedBytesForConnectionId(&config, 0); |
| 3645 connection_.SetFromConfig(config); | 3648 connection_.SetFromConfig(config); |
| 3646 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); | 3649 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); |
| 3647 EXPECT_EQ(payload.size(), | 3650 EXPECT_EQ(payload.size(), |
| 3648 connection_.SendStreamDataWithString(3, payload, 0, !kFin, nullptr) | 3651 connection_.SendStreamDataWithString(3, payload, 0, NO_FIN, nullptr) |
| 3649 .bytes_consumed); | 3652 .bytes_consumed); |
| 3650 // Just like above, we save 8 bytes on payload, and 8 on truncation. | 3653 // Just like above, we save 8 bytes on payload, and 8 on truncation. |
| 3651 EXPECT_EQ(non_truncated_packet_size, writer_->last_packet_size() + 8 * 2); | 3654 EXPECT_EQ(non_truncated_packet_size, writer_->last_packet_size() + 8 * 2); |
| 3652 } | 3655 } |
| 3653 | 3656 |
| 3654 TEST_P(QuicConnectionTest, SendDelayedAck) { | 3657 TEST_P(QuicConnectionTest, SendDelayedAck) { |
| 3655 QuicTime ack_time = clock_.ApproximateNow() + DefaultDelayedAckTime(); | 3658 QuicTime ack_time = clock_.ApproximateNow() + DefaultDelayedAckTime(); |
| 3656 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3659 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 3657 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); | 3660 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); |
| 3658 const uint8_t tag = 0x07; | 3661 const uint8_t tag = 0x07; |
| (...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4146 writer_->Reset(); | 4149 writer_->Reset(); |
| 4147 // Now only set the timer on the 6th packet, instead of sending another ack. | 4150 // Now only set the timer on the 6th packet, instead of sending another ack. |
| 4148 ProcessPacket(6); | 4151 ProcessPacket(6); |
| 4149 EXPECT_EQ(0u, writer_->frame_count()); | 4152 EXPECT_EQ(0u, writer_->frame_count()); |
| 4150 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet()); | 4153 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet()); |
| 4151 } | 4154 } |
| 4152 | 4155 |
| 4153 TEST_P(QuicConnectionTest, SendDelayedAckOnOutgoingPacket) { | 4156 TEST_P(QuicConnectionTest, SendDelayedAckOnOutgoingPacket) { |
| 4154 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 4157 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 4155 ProcessPacket(1); | 4158 ProcessPacket(1); |
| 4156 connection_.SendStreamDataWithString(kClientDataStreamId1, "foo", 0, !kFin, | 4159 connection_.SendStreamDataWithString(kClientDataStreamId1, "foo", 0, NO_FIN, |
| 4157 nullptr); | 4160 nullptr); |
| 4158 // Check that ack is bundled with outgoing data and that delayed ack | 4161 // Check that ack is bundled with outgoing data and that delayed ack |
| 4159 // alarm is reset. | 4162 // alarm is reset. |
| 4160 if (GetParam().no_stop_waiting) { | 4163 if (GetParam().no_stop_waiting) { |
| 4161 EXPECT_EQ(2u, writer_->frame_count()); | 4164 EXPECT_EQ(2u, writer_->frame_count()); |
| 4162 EXPECT_TRUE(writer_->stop_waiting_frames().empty()); | 4165 EXPECT_TRUE(writer_->stop_waiting_frames().empty()); |
| 4163 } else { | 4166 } else { |
| 4164 EXPECT_EQ(3u, writer_->frame_count()); | 4167 EXPECT_EQ(3u, writer_->frame_count()); |
| 4165 EXPECT_FALSE(writer_->stop_waiting_frames().empty()); | 4168 EXPECT_FALSE(writer_->stop_waiting_frames().empty()); |
| 4166 } | 4169 } |
| 4167 EXPECT_FALSE(writer_->ack_frames().empty()); | 4170 EXPECT_FALSE(writer_->ack_frames().empty()); |
| 4168 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); | 4171 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); |
| 4169 } | 4172 } |
| 4170 | 4173 |
| 4171 TEST_P(QuicConnectionTest, SendDelayedAckOnOutgoingCryptoPacket) { | 4174 TEST_P(QuicConnectionTest, SendDelayedAckOnOutgoingCryptoPacket) { |
| 4172 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 4175 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 4173 ProcessPacket(1); | 4176 ProcessPacket(1); |
| 4174 connection_.SendStreamDataWithString(kCryptoStreamId, "foo", 0, !kFin, | 4177 connection_.SendStreamDataWithString(kCryptoStreamId, "foo", 0, NO_FIN, |
| 4175 nullptr); | 4178 nullptr); |
| 4176 // Check that ack is bundled with outgoing crypto data. | 4179 // Check that ack is bundled with outgoing crypto data. |
| 4177 if (GetParam().no_stop_waiting) { | 4180 if (GetParam().no_stop_waiting) { |
| 4178 EXPECT_EQ(2u, writer_->frame_count()); | 4181 EXPECT_EQ(3u, writer_->frame_count()); |
| 4179 EXPECT_TRUE(writer_->stop_waiting_frames().empty()); | 4182 EXPECT_TRUE(writer_->stop_waiting_frames().empty()); |
| 4180 } else { | 4183 } else { |
| 4181 EXPECT_EQ(3u, writer_->frame_count()); | 4184 EXPECT_EQ(4u, writer_->frame_count()); |
| 4182 EXPECT_FALSE(writer_->stop_waiting_frames().empty()); | 4185 EXPECT_FALSE(writer_->stop_waiting_frames().empty()); |
| 4183 } | 4186 } |
| 4184 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); | 4187 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); |
| 4185 } | 4188 } |
| 4186 | 4189 |
| 4187 TEST_P(QuicConnectionTest, BlockAndBufferOnFirstCHLOPacketOfTwo) { | 4190 TEST_P(QuicConnectionTest, BlockAndBufferOnFirstCHLOPacketOfTwo) { |
| 4188 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 4191 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 4189 ProcessPacket(1); | 4192 ProcessPacket(1); |
| 4190 BlockOnNextWrite(); | 4193 BlockOnNextWrite(); |
| 4191 writer_->set_is_write_blocked_data_buffered(true); | 4194 writer_->set_is_write_blocked_data_buffered(true); |
| 4192 connection_.SendStreamDataWithString(kCryptoStreamId, "foo", 0, !kFin, | 4195 connection_.SendStreamDataWithString(kCryptoStreamId, "foo", 0, NO_FIN, |
| 4193 nullptr); | 4196 nullptr); |
| 4194 EXPECT_TRUE(writer_->IsWriteBlocked()); | 4197 EXPECT_TRUE(writer_->IsWriteBlocked()); |
| 4195 EXPECT_FALSE(connection_.HasQueuedData()); | 4198 EXPECT_FALSE(connection_.HasQueuedData()); |
| 4196 connection_.SendStreamDataWithString(kCryptoStreamId, "bar", 3, !kFin, | 4199 connection_.SendStreamDataWithString(kCryptoStreamId, "bar", 3, NO_FIN, |
| 4197 nullptr); | 4200 nullptr); |
| 4198 EXPECT_TRUE(writer_->IsWriteBlocked()); | 4201 EXPECT_TRUE(writer_->IsWriteBlocked()); |
| 4199 EXPECT_TRUE(connection_.HasQueuedData()); | 4202 EXPECT_TRUE(connection_.HasQueuedData()); |
| 4200 } | 4203 } |
| 4201 | 4204 |
| 4202 TEST_P(QuicConnectionTest, BundleAckForSecondCHLO) { | 4205 TEST_P(QuicConnectionTest, BundleAckForSecondCHLO) { |
| 4203 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 4206 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 4204 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); | 4207 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); |
| 4205 EXPECT_CALL(visitor_, OnCanWrite()) | 4208 EXPECT_CALL(visitor_, OnCanWrite()) |
| 4206 .WillOnce(IgnoreResult(InvokeWithoutArgs( | 4209 .WillOnce(IgnoreResult(InvokeWithoutArgs( |
| 4207 &connection_, &TestConnection::SendCryptoStreamData))); | 4210 &connection_, &TestConnection::SendCryptoStreamData))); |
| 4208 // Process a packet from the crypto stream, which is frame1_'s default. | 4211 // Process a packet from the crypto stream, which is frame1_'s default. |
| 4209 // Receiving the CHLO as packet 2 first will cause the connection to | 4212 // Receiving the CHLO as packet 2 first will cause the connection to |
| 4210 // immediately send an ack, due to the packet gap. | 4213 // immediately send an ack, due to the packet gap. |
| 4211 ProcessPacket(2); | 4214 ProcessPacket(2); |
| 4212 // Check that ack is sent and that delayed ack alarm is reset. | 4215 // Check that ack is sent and that delayed ack alarm is reset. |
| 4213 if (GetParam().no_stop_waiting) { | 4216 if (GetParam().no_stop_waiting) { |
| 4214 EXPECT_EQ(2u, writer_->frame_count()); | 4217 EXPECT_EQ(3u, writer_->frame_count()); |
| 4215 EXPECT_TRUE(writer_->stop_waiting_frames().empty()); | 4218 EXPECT_TRUE(writer_->stop_waiting_frames().empty()); |
| 4216 } else { | 4219 } else { |
| 4217 EXPECT_EQ(3u, writer_->frame_count()); | 4220 EXPECT_EQ(4u, writer_->frame_count()); |
| 4218 EXPECT_FALSE(writer_->stop_waiting_frames().empty()); | 4221 EXPECT_FALSE(writer_->stop_waiting_frames().empty()); |
| 4219 } | 4222 } |
| 4220 EXPECT_EQ(1u, writer_->stream_frames().size()); | 4223 EXPECT_EQ(1u, writer_->stream_frames().size()); |
| 4224 EXPECT_EQ(1u, writer_->padding_frames().size()); |
| 4221 EXPECT_FALSE(writer_->ack_frames().empty()); | 4225 EXPECT_FALSE(writer_->ack_frames().empty()); |
| 4222 EXPECT_EQ(2u, writer_->ack_frames().front().largest_observed); | 4226 EXPECT_EQ(2u, writer_->ack_frames().front().largest_observed); |
| 4223 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); | 4227 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); |
| 4224 } | 4228 } |
| 4225 | 4229 |
| 4226 TEST_P(QuicConnectionTest, BundleAckForSecondCHLOTwoPacketReject) { | 4230 TEST_P(QuicConnectionTest, BundleAckForSecondCHLOTwoPacketReject) { |
| 4227 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 4231 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 4228 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); | 4232 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); |
| 4229 | 4233 |
| 4230 // Process two packets from the crypto stream, which is frame1_'s default, | 4234 // Process two packets from the crypto stream, which is frame1_'s default, |
| 4231 // simulating a 2 packet reject. | 4235 // simulating a 2 packet reject. |
| 4232 { | 4236 { |
| 4233 ProcessPacket(1); | 4237 ProcessPacket(1); |
| 4234 // Send the new CHLO when the REJ is processed. | 4238 // Send the new CHLO when the REJ is processed. |
| 4235 EXPECT_CALL(visitor_, OnStreamFrame(_)) | 4239 EXPECT_CALL(visitor_, OnStreamFrame(_)) |
| 4236 .WillOnce(IgnoreResult(InvokeWithoutArgs( | 4240 .WillOnce(IgnoreResult(InvokeWithoutArgs( |
| 4237 &connection_, &TestConnection::SendCryptoStreamData))); | 4241 &connection_, &TestConnection::SendCryptoStreamData))); |
| 4238 ProcessDataPacket(2); | 4242 ProcessDataPacket(2); |
| 4239 } | 4243 } |
| 4240 // Check that ack is sent and that delayed ack alarm is reset. | 4244 // Check that ack is sent and that delayed ack alarm is reset. |
| 4241 if (GetParam().no_stop_waiting) { | 4245 if (GetParam().no_stop_waiting) { |
| 4242 EXPECT_EQ(2u, writer_->frame_count()); | 4246 EXPECT_EQ(3u, writer_->frame_count()); |
| 4243 EXPECT_TRUE(writer_->stop_waiting_frames().empty()); | 4247 EXPECT_TRUE(writer_->stop_waiting_frames().empty()); |
| 4244 } else { | 4248 } else { |
| 4245 EXPECT_EQ(3u, writer_->frame_count()); | 4249 EXPECT_EQ(4u, writer_->frame_count()); |
| 4246 EXPECT_FALSE(writer_->stop_waiting_frames().empty()); | 4250 EXPECT_FALSE(writer_->stop_waiting_frames().empty()); |
| 4247 } | 4251 } |
| 4248 EXPECT_EQ(1u, writer_->stream_frames().size()); | 4252 EXPECT_EQ(1u, writer_->stream_frames().size()); |
| 4253 EXPECT_EQ(1u, writer_->padding_frames().size()); |
| 4249 EXPECT_FALSE(writer_->ack_frames().empty()); | 4254 EXPECT_FALSE(writer_->ack_frames().empty()); |
| 4250 EXPECT_EQ(2u, writer_->ack_frames().front().largest_observed); | 4255 EXPECT_EQ(2u, writer_->ack_frames().front().largest_observed); |
| 4251 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); | 4256 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet()); |
| 4252 } | 4257 } |
| 4253 | 4258 |
| 4254 TEST_P(QuicConnectionTest, BundleAckWithDataOnIncomingAck) { | 4259 TEST_P(QuicConnectionTest, BundleAckWithDataOnIncomingAck) { |
| 4255 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 4260 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 4256 connection_.SendStreamDataWithString(kClientDataStreamId1, "foo", 0, !kFin, | 4261 connection_.SendStreamDataWithString(kClientDataStreamId1, "foo", 0, NO_FIN, |
| 4257 nullptr); | 4262 nullptr); |
| 4258 connection_.SendStreamDataWithString(kClientDataStreamId1, "foo", 3, !kFin, | 4263 connection_.SendStreamDataWithString(kClientDataStreamId1, "foo", 3, NO_FIN, |
| 4259 nullptr); | 4264 nullptr); |
| 4260 // Ack the second packet, which will retransmit the first packet. | 4265 // Ack the second packet, which will retransmit the first packet. |
| 4261 QuicAckFrame ack = InitAckFrame(2); | 4266 QuicAckFrame ack = InitAckFrame(2); |
| 4262 NackPacket(1, &ack); | 4267 NackPacket(1, &ack); |
| 4263 SendAlgorithmInterface::CongestionVector lost_packets; | 4268 SendAlgorithmInterface::CongestionVector lost_packets; |
| 4264 lost_packets.push_back(std::make_pair(1, kMaxPacketSize)); | 4269 lost_packets.push_back(std::make_pair(1, kMaxPacketSize)); |
| 4265 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) | 4270 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) |
| 4266 .WillOnce(SetArgPointee<4>(lost_packets)); | 4271 .WillOnce(SetArgPointee<4>(lost_packets)); |
| 4267 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 4272 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 4268 ProcessAckPacket(&ack); | 4273 ProcessAckPacket(&ack); |
| (...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4550 GetPeerInMemoryConnectionId(connection_id_), AllSupportedVersions())); | 4555 GetPeerInMemoryConnectionId(connection_id_), AllSupportedVersions())); |
| 4551 std::unique_ptr<QuicReceivedPacket> received( | 4556 std::unique_ptr<QuicReceivedPacket> received( |
| 4552 ConstructReceivedPacket(*encrypted, QuicTime::Zero())); | 4557 ConstructReceivedPacket(*encrypted, QuicTime::Zero())); |
| 4553 connection_.ProcessUdpPacket(kSelfAddress, kPeerAddress, *received); | 4558 connection_.ProcessUdpPacket(kSelfAddress, kPeerAddress, *received); |
| 4554 } | 4559 } |
| 4555 | 4560 |
| 4556 TEST_P(QuicConnectionTest, CheckSendStats) { | 4561 TEST_P(QuicConnectionTest, CheckSendStats) { |
| 4557 connection_.SetMaxTailLossProbes(0); | 4562 connection_.SetMaxTailLossProbes(0); |
| 4558 | 4563 |
| 4559 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); | 4564 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); |
| 4560 connection_.SendStreamDataWithString(3, "first", 0, !kFin, nullptr); | 4565 connection_.SendStreamDataWithString(3, "first", 0, NO_FIN, nullptr); |
| 4561 size_t first_packet_size = writer_->last_packet_size(); | 4566 size_t first_packet_size = writer_->last_packet_size(); |
| 4562 | 4567 |
| 4563 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); | 4568 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); |
| 4564 connection_.SendStreamDataWithString(5, "second", 0, !kFin, nullptr); | 4569 connection_.SendStreamDataWithString(5, "second", 0, NO_FIN, nullptr); |
| 4565 size_t second_packet_size = writer_->last_packet_size(); | 4570 size_t second_packet_size = writer_->last_packet_size(); |
| 4566 | 4571 |
| 4567 // 2 retransmissions due to rto, 1 due to explicit nack. | 4572 // 2 retransmissions due to rto, 1 due to explicit nack. |
| 4568 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | 4573 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
| 4569 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(3); | 4574 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(3); |
| 4570 | 4575 |
| 4571 // Retransmit due to RTO. | 4576 // Retransmit due to RTO. |
| 4572 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(10)); | 4577 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(10)); |
| 4573 connection_.GetRetransmissionAlarm()->Fire(); | 4578 connection_.GetRetransmissionAlarm()->Fire(); |
| 4574 | 4579 |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4657 // Shouldn't be able to find a mutually supported version. | 4662 // Shouldn't be able to find a mutually supported version. |
| 4658 QuicVersionVector unsupported_version; | 4663 QuicVersionVector unsupported_version; |
| 4659 unsupported_version.push_back(QUIC_VERSION_UNSUPPORTED); | 4664 unsupported_version.push_back(QUIC_VERSION_UNSUPPORTED); |
| 4660 EXPECT_FALSE(connection_.SelectMutualVersion(unsupported_version)); | 4665 EXPECT_FALSE(connection_.SelectMutualVersion(unsupported_version)); |
| 4661 } | 4666 } |
| 4662 | 4667 |
| 4663 TEST_P(QuicConnectionTest, ConnectionCloseWhenWritable) { | 4668 TEST_P(QuicConnectionTest, ConnectionCloseWhenWritable) { |
| 4664 EXPECT_FALSE(writer_->IsWriteBlocked()); | 4669 EXPECT_FALSE(writer_->IsWriteBlocked()); |
| 4665 | 4670 |
| 4666 // Send a packet. | 4671 // Send a packet. |
| 4667 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, nullptr); | 4672 connection_.SendStreamDataWithString(1, "foo", 0, NO_FIN, nullptr); |
| 4668 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 4673 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 4669 EXPECT_EQ(1u, writer_->packets_write_attempts()); | 4674 EXPECT_EQ(1u, writer_->packets_write_attempts()); |
| 4670 | 4675 |
| 4671 TriggerConnectionClose(); | 4676 TriggerConnectionClose(); |
| 4672 EXPECT_EQ(2u, writer_->packets_write_attempts()); | 4677 EXPECT_EQ(2u, writer_->packets_write_attempts()); |
| 4673 } | 4678 } |
| 4674 | 4679 |
| 4675 TEST_P(QuicConnectionTest, ConnectionCloseGettingWriteBlocked) { | 4680 TEST_P(QuicConnectionTest, ConnectionCloseGettingWriteBlocked) { |
| 4676 BlockOnNextWrite(); | 4681 BlockOnNextWrite(); |
| 4677 TriggerConnectionClose(); | 4682 TriggerConnectionClose(); |
| 4678 EXPECT_EQ(1u, writer_->packets_write_attempts()); | 4683 EXPECT_EQ(1u, writer_->packets_write_attempts()); |
| 4679 EXPECT_TRUE(writer_->IsWriteBlocked()); | 4684 EXPECT_TRUE(writer_->IsWriteBlocked()); |
| 4680 } | 4685 } |
| 4681 | 4686 |
| 4682 TEST_P(QuicConnectionTest, ConnectionCloseWhenWriteBlocked) { | 4687 TEST_P(QuicConnectionTest, ConnectionCloseWhenWriteBlocked) { |
| 4683 BlockOnNextWrite(); | 4688 BlockOnNextWrite(); |
| 4684 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, nullptr); | 4689 connection_.SendStreamDataWithString(1, "foo", 0, NO_FIN, nullptr); |
| 4685 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | 4690 EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
| 4686 EXPECT_EQ(1u, writer_->packets_write_attempts()); | 4691 EXPECT_EQ(1u, writer_->packets_write_attempts()); |
| 4687 EXPECT_TRUE(writer_->IsWriteBlocked()); | 4692 EXPECT_TRUE(writer_->IsWriteBlocked()); |
| 4688 TriggerConnectionClose(); | 4693 TriggerConnectionClose(); |
| 4689 EXPECT_EQ(1u, writer_->packets_write_attempts()); | 4694 EXPECT_EQ(1u, writer_->packets_write_attempts()); |
| 4690 } | 4695 } |
| 4691 | 4696 |
| 4692 TEST_P(QuicConnectionTest, AckNotifierTriggerCallback) { | 4697 TEST_P(QuicConnectionTest, AckNotifierTriggerCallback) { |
| 4693 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 4698 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 4694 | 4699 |
| 4695 // Create a listener which we expect to be called. | 4700 // Create a listener which we expect to be called. |
| 4696 QuicReferenceCountedPointer<MockAckListener> listener(new MockAckListener); | 4701 QuicReferenceCountedPointer<MockAckListener> listener(new MockAckListener); |
| 4697 EXPECT_CALL(*listener, OnPacketAcked(_, _)).Times(1); | 4702 EXPECT_CALL(*listener, OnPacketAcked(_, _)).Times(1); |
| 4698 | 4703 |
| 4699 // Send some data, which will register the listener to be notified. | 4704 // Send some data, which will register the listener to be notified. |
| 4700 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, listener); | 4705 connection_.SendStreamDataWithString(1, "foo", 0, NO_FIN, listener); |
| 4701 | 4706 |
| 4702 // Process an ACK from the server which should trigger the callback. | 4707 // Process an ACK from the server which should trigger the callback. |
| 4703 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 4708 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 4704 QuicAckFrame frame = InitAckFrame(1); | 4709 QuicAckFrame frame = InitAckFrame(1); |
| 4705 ProcessAckPacket(&frame); | 4710 ProcessAckPacket(&frame); |
| 4706 } | 4711 } |
| 4707 | 4712 |
| 4708 TEST_P(QuicConnectionTest, AckNotifierFailToTriggerCallback) { | 4713 TEST_P(QuicConnectionTest, AckNotifierFailToTriggerCallback) { |
| 4709 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 4714 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 4710 | 4715 |
| 4711 // Create a listener which we don't expect to be called. | 4716 // Create a listener which we don't expect to be called. |
| 4712 QuicReferenceCountedPointer<MockAckListener> listener(new MockAckListener); | 4717 QuicReferenceCountedPointer<MockAckListener> listener(new MockAckListener); |
| 4713 EXPECT_CALL(*listener, OnPacketAcked(_, _)).Times(0); | 4718 EXPECT_CALL(*listener, OnPacketAcked(_, _)).Times(0); |
| 4714 | 4719 |
| 4715 // Send some data, which will register the listener to be notified. This will | 4720 // Send some data, which will register the listener to be notified. This will |
| 4716 // not be ACKed and so the listener should never be called. | 4721 // not be ACKed and so the listener should never be called. |
| 4717 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, listener); | 4722 connection_.SendStreamDataWithString(1, "foo", 0, NO_FIN, listener); |
| 4718 | 4723 |
| 4719 // Send some other data which we will ACK. | 4724 // Send some other data which we will ACK. |
| 4720 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, nullptr); | 4725 connection_.SendStreamDataWithString(1, "foo", 0, NO_FIN, nullptr); |
| 4721 connection_.SendStreamDataWithString(1, "bar", 0, !kFin, nullptr); | 4726 connection_.SendStreamDataWithString(1, "bar", 0, NO_FIN, nullptr); |
| 4722 | 4727 |
| 4723 // Now we receive ACK for packets 2 and 3, but importantly missing packet 1 | 4728 // Now we receive ACK for packets 2 and 3, but importantly missing packet 1 |
| 4724 // which we registered to be notified about. | 4729 // which we registered to be notified about. |
| 4725 QuicAckFrame frame = InitAckFrame(3); | 4730 QuicAckFrame frame = InitAckFrame(3); |
| 4726 NackPacket(1, &frame); | 4731 NackPacket(1, &frame); |
| 4727 SendAlgorithmInterface::CongestionVector lost_packets; | 4732 SendAlgorithmInterface::CongestionVector lost_packets; |
| 4728 lost_packets.push_back(std::make_pair(1, kMaxPacketSize)); | 4733 lost_packets.push_back(std::make_pair(1, kMaxPacketSize)); |
| 4729 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) | 4734 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) |
| 4730 .WillOnce(SetArgPointee<4>(lost_packets)); | 4735 .WillOnce(SetArgPointee<4>(lost_packets)); |
| 4731 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 4736 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 4732 ProcessAckPacket(&frame); | 4737 ProcessAckPacket(&frame); |
| 4733 } | 4738 } |
| 4734 | 4739 |
| 4735 TEST_P(QuicConnectionTest, AckNotifierCallbackAfterRetransmission) { | 4740 TEST_P(QuicConnectionTest, AckNotifierCallbackAfterRetransmission) { |
| 4736 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 4741 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 4737 | 4742 |
| 4738 // Create a listener which we expect to be called. | 4743 // Create a listener which we expect to be called. |
| 4739 QuicReferenceCountedPointer<MockAckListener> listener(new MockAckListener); | 4744 QuicReferenceCountedPointer<MockAckListener> listener(new MockAckListener); |
| 4740 EXPECT_CALL(*listener, OnPacketRetransmitted(3)).Times(1); | 4745 EXPECT_CALL(*listener, OnPacketRetransmitted(3)).Times(1); |
| 4741 EXPECT_CALL(*listener, OnPacketAcked(3, _)).Times(1); | 4746 EXPECT_CALL(*listener, OnPacketAcked(3, _)).Times(1); |
| 4742 | 4747 |
| 4743 // Send four packets, and register to be notified on ACK of packet 2. | 4748 // Send four packets, and register to be notified on ACK of packet 2. |
| 4744 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, nullptr); | 4749 connection_.SendStreamDataWithString(3, "foo", 0, NO_FIN, nullptr); |
| 4745 connection_.SendStreamDataWithString(3, "bar", 0, !kFin, listener); | 4750 connection_.SendStreamDataWithString(3, "bar", 0, NO_FIN, listener); |
| 4746 connection_.SendStreamDataWithString(3, "baz", 0, !kFin, nullptr); | 4751 connection_.SendStreamDataWithString(3, "baz", 0, NO_FIN, nullptr); |
| 4747 connection_.SendStreamDataWithString(3, "qux", 0, !kFin, nullptr); | 4752 connection_.SendStreamDataWithString(3, "qux", 0, NO_FIN, nullptr); |
| 4748 | 4753 |
| 4749 // Now we receive ACK for packets 1, 3, and 4 and lose 2. | 4754 // Now we receive ACK for packets 1, 3, and 4 and lose 2. |
| 4750 QuicAckFrame frame = InitAckFrame(4); | 4755 QuicAckFrame frame = InitAckFrame(4); |
| 4751 NackPacket(2, &frame); | 4756 NackPacket(2, &frame); |
| 4752 SendAlgorithmInterface::CongestionVector lost_packets; | 4757 SendAlgorithmInterface::CongestionVector lost_packets; |
| 4753 lost_packets.push_back(std::make_pair(2, kMaxPacketSize)); | 4758 lost_packets.push_back(std::make_pair(2, kMaxPacketSize)); |
| 4754 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) | 4759 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) |
| 4755 .WillOnce(SetArgPointee<4>(lost_packets)); | 4760 .WillOnce(SetArgPointee<4>(lost_packets)); |
| 4756 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); | 4761 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _, _)); |
| 4757 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); | 4762 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 4770 // different packet number. | 4775 // different packet number. |
| 4771 TEST_P(QuicConnectionTest, AckNotifierCallbackForAckAfterRTO) { | 4776 TEST_P(QuicConnectionTest, AckNotifierCallbackForAckAfterRTO) { |
| 4772 connection_.SetMaxTailLossProbes(0); | 4777 connection_.SetMaxTailLossProbes(0); |
| 4773 | 4778 |
| 4774 // Create a listener which we expect to be called. | 4779 // Create a listener which we expect to be called. |
| 4775 QuicReferenceCountedPointer<MockAckListener> listener( | 4780 QuicReferenceCountedPointer<MockAckListener> listener( |
| 4776 new StrictMock<MockAckListener>); | 4781 new StrictMock<MockAckListener>); |
| 4777 | 4782 |
| 4778 QuicTime default_retransmission_time = | 4783 QuicTime default_retransmission_time = |
| 4779 clock_.ApproximateNow() + DefaultRetransmissionTime(); | 4784 clock_.ApproximateNow() + DefaultRetransmissionTime(); |
| 4780 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, listener); | 4785 connection_.SendStreamDataWithString(3, "foo", 0, NO_FIN, listener); |
| 4781 EXPECT_EQ(1u, stop_waiting()->least_unacked); | 4786 EXPECT_EQ(1u, stop_waiting()->least_unacked); |
| 4782 | 4787 |
| 4783 EXPECT_EQ(1u, writer_->header().packet_number); | 4788 EXPECT_EQ(1u, writer_->header().packet_number); |
| 4784 EXPECT_EQ(default_retransmission_time, | 4789 EXPECT_EQ(default_retransmission_time, |
| 4785 connection_.GetRetransmissionAlarm()->deadline()); | 4790 connection_.GetRetransmissionAlarm()->deadline()); |
| 4786 // Simulate the retransmission alarm firing. | 4791 // Simulate the retransmission alarm firing. |
| 4787 clock_.AdvanceTime(DefaultRetransmissionTime()); | 4792 clock_.AdvanceTime(DefaultRetransmissionTime()); |
| 4788 EXPECT_CALL(*listener, OnPacketRetransmitted(3)); | 4793 EXPECT_CALL(*listener, OnPacketRetransmitted(3)); |
| 4789 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 2u, _, _)); | 4794 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 2u, _, _)); |
| 4790 connection_.GetRetransmissionAlarm()->Fire(); | 4795 connection_.GetRetransmissionAlarm()->Fire(); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 4807 | 4812 |
| 4808 // AckNotifierCallback is triggered by the ack of a packet that was | 4813 // AckNotifierCallback is triggered by the ack of a packet that was |
| 4809 // previously nacked, even though the retransmission has a different | 4814 // previously nacked, even though the retransmission has a different |
| 4810 // packet number. | 4815 // packet number. |
| 4811 TEST_P(QuicConnectionTest, AckNotifierCallbackForAckOfNackedPacket) { | 4816 TEST_P(QuicConnectionTest, AckNotifierCallbackForAckOfNackedPacket) { |
| 4812 // Create a listener which we expect to be called. | 4817 // Create a listener which we expect to be called. |
| 4813 QuicReferenceCountedPointer<MockAckListener> listener( | 4818 QuicReferenceCountedPointer<MockAckListener> listener( |
| 4814 new StrictMock<MockAckListener>()); | 4819 new StrictMock<MockAckListener>()); |
| 4815 | 4820 |
| 4816 // Send four packets, and register to be notified on ACK of packet 2. | 4821 // Send four packets, and register to be notified on ACK of packet 2. |
| 4817 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, nullptr); | 4822 connection_.SendStreamDataWithString(3, "foo", 0, NO_FIN, nullptr); |
| 4818 connection_.SendStreamDataWithString(3, "bar", 0, !kFin, listener); | 4823 connection_.SendStreamDataWithString(3, "bar", 0, NO_FIN, listener); |
| 4819 connection_.SendStreamDataWithString(3, "baz", 0, !kFin, nullptr); | 4824 connection_.SendStreamDataWithString(3, "baz", 0, NO_FIN, nullptr); |
| 4820 connection_.SendStreamDataWithString(3, "qux", 0, !kFin, nullptr); | 4825 connection_.SendStreamDataWithString(3, "qux", 0, NO_FIN, nullptr); |
| 4821 | 4826 |
| 4822 // Now we receive ACK for packets 1, 3, and 4 and lose 2. | 4827 // Now we receive ACK for packets 1, 3, and 4 and lose 2. |
| 4823 QuicAckFrame frame = InitAckFrame(4); | 4828 QuicAckFrame frame = InitAckFrame(4); |
| 4824 NackPacket(2, &frame); | 4829 NackPacket(2, &frame); |
| 4825 EXPECT_CALL(*listener, OnPacketRetransmitted(_)); | 4830 EXPECT_CALL(*listener, OnPacketRetransmitted(_)); |
| 4826 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 4831 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 4827 SendAlgorithmInterface::CongestionVector lost_packets; | 4832 SendAlgorithmInterface::CongestionVector lost_packets; |
| 4828 lost_packets.push_back(std::make_pair(2, kMaxPacketSize)); | 4833 lost_packets.push_back(std::make_pair(2, kMaxPacketSize)); |
| 4829 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) | 4834 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) |
| 4830 .WillOnce(SetArgPointee<4>(lost_packets)); | 4835 .WillOnce(SetArgPointee<4>(lost_packets)); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4901 QuicAlarm* ack_alarm = QuicConnectionPeer::GetAckAlarm(&connection_); | 4906 QuicAlarm* ack_alarm = QuicConnectionPeer::GetAckAlarm(&connection_); |
| 4902 EXPECT_TRUE(ack_alarm->IsSet()); | 4907 EXPECT_TRUE(ack_alarm->IsSet()); |
| 4903 } | 4908 } |
| 4904 | 4909 |
| 4905 TEST_P(QuicConnectionTest, NoDataNoFin) { | 4910 TEST_P(QuicConnectionTest, NoDataNoFin) { |
| 4906 // Make sure that a call to SendStreamWithData, with no data and no FIN, does | 4911 // Make sure that a call to SendStreamWithData, with no data and no FIN, does |
| 4907 // not result in a QuicAckNotifier being used-after-free (fail under ASAN). | 4912 // not result in a QuicAckNotifier being used-after-free (fail under ASAN). |
| 4908 // Regression test for b/18594622 | 4913 // Regression test for b/18594622 |
| 4909 QuicReferenceCountedPointer<MockAckListener> listener(new MockAckListener); | 4914 QuicReferenceCountedPointer<MockAckListener> listener(new MockAckListener); |
| 4910 EXPECT_QUIC_BUG( | 4915 EXPECT_QUIC_BUG( |
| 4911 connection_.SendStreamDataWithString(3, "", 0, !kFin, listener), | 4916 connection_.SendStreamDataWithString(3, "", 0, NO_FIN, listener), |
| 4912 "Attempt to send empty stream frame"); | 4917 "Attempt to send empty stream frame"); |
| 4913 } | 4918 } |
| 4914 | 4919 |
| 4915 TEST_P(QuicConnectionTest, DoNotSendGoAwayTwice) { | 4920 TEST_P(QuicConnectionTest, DoNotSendGoAwayTwice) { |
| 4916 EXPECT_FALSE(connection_.goaway_sent()); | 4921 EXPECT_FALSE(connection_.goaway_sent()); |
| 4917 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); | 4922 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
| 4918 connection_.SendGoAway(QUIC_PEER_GOING_AWAY, kHeadersStreamId, "Going Away."); | 4923 connection_.SendGoAway(QUIC_PEER_GOING_AWAY, kHeadersStreamId, "Going Away."); |
| 4919 EXPECT_TRUE(connection_.goaway_sent()); | 4924 EXPECT_TRUE(connection_.goaway_sent()); |
| 4920 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0); | 4925 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0); |
| 4921 connection_.SendGoAway(QUIC_PEER_GOING_AWAY, kHeadersStreamId, "Going Away."); | 4926 connection_.SendGoAway(QUIC_PEER_GOING_AWAY, kHeadersStreamId, "Going Away."); |
| 4922 } | 4927 } |
| 4923 | 4928 |
| 4924 TEST_P(QuicConnectionTest, ReevaluateTimeUntilSendOnAck) { | 4929 TEST_P(QuicConnectionTest, ReevaluateTimeUntilSendOnAck) { |
| 4925 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 4930 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 4926 connection_.SendStreamDataWithString(kClientDataStreamId1, "foo", 0, !kFin, | 4931 connection_.SendStreamDataWithString(kClientDataStreamId1, "foo", 0, NO_FIN, |
| 4927 nullptr); | 4932 nullptr); |
| 4928 | 4933 |
| 4929 // Evaluate CanWrite, and have it return a non-Zero value. | 4934 // Evaluate CanWrite, and have it return a non-Zero value. |
| 4930 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _)) | 4935 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _)) |
| 4931 .WillRepeatedly(Return(QuicTime::Delta::FromMilliseconds(1))); | 4936 .WillRepeatedly(Return(QuicTime::Delta::FromMilliseconds(1))); |
| 4932 connection_.OnCanWrite(); | 4937 connection_.OnCanWrite(); |
| 4933 EXPECT_TRUE(connection_.GetSendAlarm()->IsSet()); | 4938 EXPECT_TRUE(connection_.GetSendAlarm()->IsSet()); |
| 4934 EXPECT_EQ(clock_.Now() + QuicTime::Delta::FromMilliseconds(1), | 4939 EXPECT_EQ(clock_.Now() + QuicTime::Delta::FromMilliseconds(1), |
| 4935 connection_.GetSendAlarm()->deadline()); | 4940 connection_.GetSendAlarm()->deadline()); |
| 4936 | 4941 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4977 EXPECT_EQ(1u, connection_.GetStats().blocked_frames_sent); | 4982 EXPECT_EQ(1u, connection_.GetStats().blocked_frames_sent); |
| 4978 EXPECT_FALSE(connection_.HasQueuedData()); | 4983 EXPECT_FALSE(connection_.HasQueuedData()); |
| 4979 } | 4984 } |
| 4980 | 4985 |
| 4981 TEST_P(QuicConnectionTest, SendingUnencryptedStreamDataFails) { | 4986 TEST_P(QuicConnectionTest, SendingUnencryptedStreamDataFails) { |
| 4982 EXPECT_CALL(visitor_, | 4987 EXPECT_CALL(visitor_, |
| 4983 OnConnectionClosed(QUIC_ATTEMPT_TO_SEND_UNENCRYPTED_STREAM_DATA, | 4988 OnConnectionClosed(QUIC_ATTEMPT_TO_SEND_UNENCRYPTED_STREAM_DATA, |
| 4984 _, ConnectionCloseSource::FROM_SELF)); | 4989 _, ConnectionCloseSource::FROM_SELF)); |
| 4985 struct iovec iov; | 4990 struct iovec iov; |
| 4986 QuicIOVector data_iov(MakeIOVector("", &iov)); | 4991 QuicIOVector data_iov(MakeIOVector("", &iov)); |
| 4987 EXPECT_QUIC_BUG(connection_.SendStreamData(3, data_iov, 0, kFin, nullptr), | 4992 EXPECT_QUIC_BUG(connection_.SendStreamData(3, data_iov, 0, FIN, nullptr), |
| 4988 "Cannot send stream data without encryption."); | 4993 "Cannot send stream data without encryption."); |
| 4989 EXPECT_FALSE(connection_.connected()); | 4994 EXPECT_FALSE(connection_.connected()); |
| 4990 } | 4995 } |
| 4991 | 4996 |
| 4992 TEST_P(QuicConnectionTest, OnPathDegrading) { | 4997 TEST_P(QuicConnectionTest, OnPathDegrading) { |
| 4993 QuicByteCount packet_size; | 4998 QuicByteCount packet_size; |
| 4994 const size_t kMinTimeoutsBeforePathDegrading = 2; | 4999 const size_t kMinTimeoutsBeforePathDegrading = 2; |
| 4995 | 5000 |
| 4996 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 5001 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
| 4997 .WillOnce(DoAll(SaveArg<3>(&packet_size), Return(true))); | 5002 .WillOnce(DoAll(SaveArg<3>(&packet_size), Return(true))); |
| 4998 connection_.SendStreamDataWithString(3, "packet", 0, !kFin, nullptr); | 5003 connection_.SendStreamDataWithString(3, "packet", 0, NO_FIN, nullptr); |
| 4999 size_t num_timeouts = | 5004 size_t num_timeouts = |
| 5000 kMinTimeoutsBeforePathDegrading + | 5005 kMinTimeoutsBeforePathDegrading + |
| 5001 QuicSentPacketManagerPeer::GetMaxTailLossProbes( | 5006 QuicSentPacketManagerPeer::GetMaxTailLossProbes( |
| 5002 QuicConnectionPeer::GetSentPacketManager(&connection_)); | 5007 QuicConnectionPeer::GetSentPacketManager(&connection_)); |
| 5003 for (size_t i = 1; i < num_timeouts; ++i) { | 5008 for (size_t i = 1; i < num_timeouts; ++i) { |
| 5004 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(10 * i)); | 5009 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(10 * i)); |
| 5005 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, packet_size, _)); | 5010 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, packet_size, _)); |
| 5006 connection_.GetRetransmissionAlarm()->Fire(); | 5011 connection_.GetRetransmissionAlarm()->Fire(); |
| 5007 } | 5012 } |
| 5008 // Next RTO should cause OnPathDegrading to be called before the | 5013 // Next RTO should cause OnPathDegrading to be called before the |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5064 ConnectionCloseSource::FROM_SELF)); | 5069 ConnectionCloseSource::FROM_SELF)); |
| 5065 ForceProcessFramePacket(QuicFrame(&frame1_)); | 5070 ForceProcessFramePacket(QuicFrame(&frame1_)); |
| 5066 } | 5071 } |
| 5067 | 5072 |
| 5068 TEST_P(QuicConnectionTest, CloseConnectionOnPacketTooLarge) { | 5073 TEST_P(QuicConnectionTest, CloseConnectionOnPacketTooLarge) { |
| 5069 SimulateNextPacketTooLarge(); | 5074 SimulateNextPacketTooLarge(); |
| 5070 // A connection close packet is sent | 5075 // A connection close packet is sent |
| 5071 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_PACKET_WRITE_ERROR, _, | 5076 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_PACKET_WRITE_ERROR, _, |
| 5072 ConnectionCloseSource::FROM_SELF)) | 5077 ConnectionCloseSource::FROM_SELF)) |
| 5073 .Times(1); | 5078 .Times(1); |
| 5074 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, nullptr); | 5079 connection_.SendStreamDataWithString(3, "foo", 0, NO_FIN, nullptr); |
| 5075 } | 5080 } |
| 5076 | 5081 |
| 5077 TEST_P(QuicConnectionTest, AlwaysGetPacketTooLarge) { | 5082 TEST_P(QuicConnectionTest, AlwaysGetPacketTooLarge) { |
| 5078 // Test even we always get packet too large, we do not infinitely try to send | 5083 // Test even we always get packet too large, we do not infinitely try to send |
| 5079 // close packet. | 5084 // close packet. |
| 5080 AlwaysGetPacketTooLarge(); | 5085 AlwaysGetPacketTooLarge(); |
| 5081 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_PACKET_WRITE_ERROR, _, | 5086 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_PACKET_WRITE_ERROR, _, |
| 5082 ConnectionCloseSource::FROM_SELF)) | 5087 ConnectionCloseSource::FROM_SELF)) |
| 5083 .Times(1); | 5088 .Times(1); |
| 5084 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, nullptr); | 5089 connection_.SendStreamDataWithString(3, "foo", 0, NO_FIN, nullptr); |
| 5085 } | 5090 } |
| 5086 | 5091 |
| 5087 // Verify that if connection has no outstanding data, it notifies the send | 5092 // Verify that if connection has no outstanding data, it notifies the send |
| 5088 // algorithm after the write. | 5093 // algorithm after the write. |
| 5089 TEST_P(QuicConnectionTest, SendDataAndBecomeApplicationLimited) { | 5094 TEST_P(QuicConnectionTest, SendDataAndBecomeApplicationLimited) { |
| 5090 EXPECT_CALL(*send_algorithm_, OnApplicationLimited(_)).Times(1); | 5095 EXPECT_CALL(*send_algorithm_, OnApplicationLimited(_)).Times(1); |
| 5091 { | 5096 { |
| 5092 InSequence seq; | 5097 InSequence seq; |
| 5093 EXPECT_CALL(visitor_, WillingAndAbleToWrite()).WillRepeatedly(Return(true)); | 5098 EXPECT_CALL(visitor_, WillingAndAbleToWrite()).WillRepeatedly(Return(true)); |
| 5094 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 5099 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5127 TEST_P(QuicConnectionTest, DonotForceSendingAckOnPacketTooLarge) { | 5132 TEST_P(QuicConnectionTest, DonotForceSendingAckOnPacketTooLarge) { |
| 5128 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 5133 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 5129 // Send an ack by simulating delayed ack alarm firing. | 5134 // Send an ack by simulating delayed ack alarm firing. |
| 5130 ProcessPacket(1); | 5135 ProcessPacket(1); |
| 5131 QuicAlarm* ack_alarm = QuicConnectionPeer::GetAckAlarm(&connection_); | 5136 QuicAlarm* ack_alarm = QuicConnectionPeer::GetAckAlarm(&connection_); |
| 5132 EXPECT_TRUE(ack_alarm->IsSet()); | 5137 EXPECT_TRUE(ack_alarm->IsSet()); |
| 5133 connection_.GetAckAlarm()->Fire(); | 5138 connection_.GetAckAlarm()->Fire(); |
| 5134 // Simulate data packet causes write error. | 5139 // Simulate data packet causes write error. |
| 5135 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_PACKET_WRITE_ERROR, _, _)); | 5140 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_PACKET_WRITE_ERROR, _, _)); |
| 5136 SimulateNextPacketTooLarge(); | 5141 SimulateNextPacketTooLarge(); |
| 5137 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, nullptr); | 5142 connection_.SendStreamDataWithString(3, "foo", 0, NO_FIN, nullptr); |
| 5138 EXPECT_EQ(1u, writer_->frame_count()); | 5143 EXPECT_EQ(1u, writer_->frame_count()); |
| 5139 EXPECT_FALSE(writer_->connection_close_frames().empty()); | 5144 EXPECT_FALSE(writer_->connection_close_frames().empty()); |
| 5140 // Ack frame is not bundled in connection close packet. | 5145 // Ack frame is not bundled in connection close packet. |
| 5141 EXPECT_TRUE(writer_->ack_frames().empty()); | 5146 EXPECT_TRUE(writer_->ack_frames().empty()); |
| 5142 } | 5147 } |
| 5143 | 5148 |
| 5144 TEST_P(QuicConnectionTest, CloseConnectionForStatelessReject) { | 5149 TEST_P(QuicConnectionTest, CloseConnectionForStatelessReject) { |
| 5145 string error_details("stateless reject"); | 5150 string error_details("stateless reject"); |
| 5146 EXPECT_CALL(visitor_, OnConnectionClosed( | 5151 EXPECT_CALL(visitor_, OnConnectionClosed( |
| 5147 QUIC_CRYPTO_HANDSHAKE_STATELESS_REJECT, | 5152 QUIC_CRYPTO_HANDSHAKE_STATELESS_REJECT, |
| 5148 error_details, ConnectionCloseSource::FROM_PEER)); | 5153 error_details, ConnectionCloseSource::FROM_PEER)); |
| 5149 connection_.set_perspective(Perspective::IS_CLIENT); | 5154 connection_.set_perspective(Perspective::IS_CLIENT); |
| 5150 connection_.CloseConnection(QUIC_CRYPTO_HANDSHAKE_STATELESS_REJECT, | 5155 connection_.CloseConnection(QUIC_CRYPTO_HANDSHAKE_STATELESS_REJECT, |
| 5151 error_details, | 5156 error_details, |
| 5152 ConnectionCloseBehavior::SILENT_CLOSE); | 5157 ConnectionCloseBehavior::SILENT_CLOSE); |
| 5153 } | 5158 } |
| 5154 | 5159 |
| 5155 } // namespace | 5160 } // namespace |
| 5156 } // namespace test | 5161 } // namespace test |
| 5157 } // namespace net | 5162 } // namespace net |
| OLD | NEW |