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/quic_connection.h" | 5 #include "net/quic/quic_connection.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
10 #include "net/base/net_errors.h" | 10 #include "net/base/net_errors.h" |
(...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
412 DISALLOW_COPY_AND_ASSIGN(TestPacketWriter); | 412 DISALLOW_COPY_AND_ASSIGN(TestPacketWriter); |
413 }; | 413 }; |
414 | 414 |
415 class TestConnection : public QuicConnection { | 415 class TestConnection : public QuicConnection { |
416 public: | 416 public: |
417 TestConnection(QuicConnectionId connection_id, | 417 TestConnection(QuicConnectionId connection_id, |
418 IPEndPoint address, | 418 IPEndPoint address, |
419 TestConnectionHelper* helper, | 419 TestConnectionHelper* helper, |
420 TestPacketWriter* writer, | 420 TestPacketWriter* writer, |
421 bool is_server, | 421 bool is_server, |
422 QuicVersion version, | 422 QuicVersion version) |
423 uint32 flow_control_send_window) | |
424 : QuicConnection(connection_id, address, helper, writer, is_server, | 423 : QuicConnection(connection_id, address, helper, writer, is_server, |
425 SupportedVersions(version), | 424 SupportedVersions(version)), |
426 flow_control_send_window), | |
427 writer_(writer) { | 425 writer_(writer) { |
428 // Disable tail loss probes for most tests. | 426 // Disable tail loss probes for most tests. |
429 QuicSentPacketManagerPeer::SetMaxTailLossProbes( | 427 QuicSentPacketManagerPeer::SetMaxTailLossProbes( |
430 QuicConnectionPeer::GetSentPacketManager(this), 0); | 428 QuicConnectionPeer::GetSentPacketManager(this), 0); |
431 writer_->set_is_server(is_server); | 429 writer_->set_is_server(is_server); |
432 } | 430 } |
433 | 431 |
434 void SendAck() { | 432 void SendAck() { |
435 QuicConnectionPeer::SendAck(this); | 433 QuicConnectionPeer::SendAck(this); |
436 } | 434 } |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
581 protected: | 579 protected: |
582 QuicConnectionTest() | 580 QuicConnectionTest() |
583 : connection_id_(42), | 581 : connection_id_(42), |
584 framer_(SupportedVersions(version()), QuicTime::Zero(), false), | 582 framer_(SupportedVersions(version()), QuicTime::Zero(), false), |
585 creator_(connection_id_, &framer_, &random_generator_, false), | 583 creator_(connection_id_, &framer_, &random_generator_, false), |
586 send_algorithm_(new StrictMock<MockSendAlgorithm>), | 584 send_algorithm_(new StrictMock<MockSendAlgorithm>), |
587 loss_algorithm_(new MockLossAlgorithm()), | 585 loss_algorithm_(new MockLossAlgorithm()), |
588 helper_(new TestConnectionHelper(&clock_, &random_generator_)), | 586 helper_(new TestConnectionHelper(&clock_, &random_generator_)), |
589 writer_(new TestPacketWriter(version())), | 587 writer_(new TestPacketWriter(version())), |
590 connection_(connection_id_, IPEndPoint(), helper_.get(), | 588 connection_(connection_id_, IPEndPoint(), helper_.get(), |
591 writer_.get(), false, version(), | 589 writer_.get(), false, version()), |
592 kDefaultFlowControlSendWindow), | |
593 frame1_(1, false, 0, MakeIOVector(data1)), | 590 frame1_(1, false, 0, MakeIOVector(data1)), |
594 frame2_(1, false, 3, MakeIOVector(data2)), | 591 frame2_(1, false, 3, MakeIOVector(data2)), |
595 sequence_number_length_(PACKET_6BYTE_SEQUENCE_NUMBER), | 592 sequence_number_length_(PACKET_6BYTE_SEQUENCE_NUMBER), |
596 connection_id_length_(PACKET_8BYTE_CONNECTION_ID) { | 593 connection_id_length_(PACKET_8BYTE_CONNECTION_ID) { |
597 connection_.set_visitor(&visitor_); | 594 connection_.set_visitor(&visitor_); |
598 connection_.SetSendAlgorithm(send_algorithm_); | 595 connection_.SetSendAlgorithm(send_algorithm_); |
599 connection_.SetLossAlgorithm(loss_algorithm_); | 596 connection_.SetLossAlgorithm(loss_algorithm_); |
600 framer_.set_received_entropy_calculator(&entropy_calculator_); | 597 framer_.set_received_entropy_calculator(&entropy_calculator_); |
601 // Simplify tests by not sending feedback unless specifically configured. | 598 // Simplify tests by not sending feedback unless specifically configured. |
602 SetFeedback(NULL); | 599 SetFeedback(NULL); |
603 EXPECT_CALL( | 600 EXPECT_CALL( |
604 *send_algorithm_, TimeUntilSend(_, _, _)).WillRepeatedly(Return( | 601 *send_algorithm_, TimeUntilSend(_, _, _)).WillRepeatedly(Return( |
605 QuicTime::Delta::Zero())); | 602 QuicTime::Delta::Zero())); |
606 EXPECT_CALL(*receive_algorithm_, | 603 EXPECT_CALL(*receive_algorithm_, |
607 RecordIncomingPacket(_, _, _)).Times(AnyNumber()); | 604 RecordIncomingPacket(_, _, _)).Times(AnyNumber()); |
608 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 605 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
609 .Times(AnyNumber()); | 606 .Times(AnyNumber()); |
610 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()).WillRepeatedly( | 607 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()).WillRepeatedly( |
611 Return(QuicTime::Delta::Zero())); | 608 Return(QuicTime::Delta::Zero())); |
612 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()).WillRepeatedly( | 609 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()).WillRepeatedly( |
613 Return(kMaxPacketSize)); | 610 Return(kMaxPacketSize)); |
614 ON_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 611 ON_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
615 .WillByDefault(Return(true)); | 612 .WillByDefault(Return(true)); |
616 EXPECT_CALL(visitor_, HasPendingWrites()).Times(AnyNumber()); | 613 EXPECT_CALL(visitor_, WillingAndAbleToWrite()).Times(AnyNumber()); |
617 EXPECT_CALL(visitor_, HasPendingHandshake()).Times(AnyNumber()); | 614 EXPECT_CALL(visitor_, HasPendingHandshake()).Times(AnyNumber()); |
618 EXPECT_CALL(visitor_, OnCanWrite()).Times(AnyNumber()); | 615 EXPECT_CALL(visitor_, OnCanWrite()).Times(AnyNumber()); |
619 EXPECT_CALL(visitor_, HasOpenDataStreams()).WillRepeatedly(Return(false)); | 616 EXPECT_CALL(visitor_, HasOpenDataStreams()).WillRepeatedly(Return(false)); |
620 | 617 |
621 EXPECT_CALL(*loss_algorithm_, GetLossTimeout()) | 618 EXPECT_CALL(*loss_algorithm_, GetLossTimeout()) |
622 .WillRepeatedly(Return(QuicTime::Zero())); | 619 .WillRepeatedly(Return(QuicTime::Zero())); |
623 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _)) | 620 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _)) |
624 .WillRepeatedly(Return(SequenceNumberSet())); | 621 .WillRepeatedly(Return(SequenceNumberSet())); |
625 } | 622 } |
626 | 623 |
(...skipping 810 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1437 } | 1434 } |
1438 | 1435 |
1439 TEST_P(QuicConnectionTest, FECSending) { | 1436 TEST_P(QuicConnectionTest, FECSending) { |
1440 // All packets carry version info till version is negotiated. | 1437 // All packets carry version info till version is negotiated. |
1441 size_t payload_length; | 1438 size_t payload_length; |
1442 connection_.options()->max_packet_length = | 1439 connection_.options()->max_packet_length = |
1443 GetPacketLengthForOneStream( | 1440 GetPacketLengthForOneStream( |
1444 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER, | 1441 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER, |
1445 IN_FEC_GROUP, &payload_length); | 1442 IN_FEC_GROUP, &payload_length); |
1446 // And send FEC every two packets. | 1443 // And send FEC every two packets. |
1447 connection_.options()->max_packets_per_fec_group = 2; | 1444 EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn( |
| 1445 QuicConnectionPeer::GetPacketCreator(&connection_), 2)); |
1448 | 1446 |
1449 // Send 4 data packets and 2 FEC packets. | 1447 // Send 4 data packets and 2 FEC packets. |
1450 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(6); | 1448 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(6); |
1451 // The first stream frame will consume 2 fewer bytes than the other three. | 1449 // The first stream frame will consume 2 fewer bytes than the other three. |
1452 const string payload(payload_length * 4 - 6, 'a'); | 1450 const string payload(payload_length * 4 - 6, 'a'); |
1453 connection_.SendStreamDataWithString(1, payload, 0, !kFin, NULL); | 1451 connection_.SendStreamDataWithString(1, payload, 0, !kFin, NULL); |
1454 // Expect the FEC group to be closed after SendStreamDataWithString. | 1452 // Expect the FEC group to be closed after SendStreamDataWithString. |
1455 EXPECT_FALSE(creator_.ShouldSendFec(true)); | 1453 EXPECT_FALSE(creator_.ShouldSendFec(true)); |
1456 } | 1454 } |
1457 | 1455 |
1458 TEST_P(QuicConnectionTest, FECQueueing) { | 1456 TEST_P(QuicConnectionTest, FECQueueing) { |
1459 // All packets carry version info till version is negotiated. | 1457 // All packets carry version info till version is negotiated. |
1460 size_t payload_length; | 1458 size_t payload_length; |
1461 connection_.options()->max_packet_length = | 1459 connection_.options()->max_packet_length = |
1462 GetPacketLengthForOneStream( | 1460 GetPacketLengthForOneStream( |
1463 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER, | 1461 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER, |
1464 IN_FEC_GROUP, &payload_length); | 1462 IN_FEC_GROUP, &payload_length); |
1465 // And send FEC every two packets. | 1463 // And send FEC every two packets. |
1466 connection_.options()->max_packets_per_fec_group = 2; | 1464 EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn( |
| 1465 QuicConnectionPeer::GetPacketCreator(&connection_), 2)); |
1467 | 1466 |
1468 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 1467 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
1469 BlockOnNextWrite(); | 1468 BlockOnNextWrite(); |
1470 const string payload(payload_length, 'a'); | 1469 const string payload(payload_length, 'a'); |
1471 connection_.SendStreamDataWithString(1, payload, 0, !kFin, NULL); | 1470 connection_.SendStreamDataWithString(1, payload, 0, !kFin, NULL); |
1472 EXPECT_FALSE(creator_.ShouldSendFec(true)); | 1471 EXPECT_FALSE(creator_.ShouldSendFec(true)); |
1473 // Expect the first data packet and the fec packet to be queued. | 1472 // Expect the first data packet and the fec packet to be queued. |
1474 EXPECT_EQ(2u, connection_.NumQueuedPackets()); | 1473 EXPECT_EQ(2u, connection_.NumQueuedPackets()); |
1475 } | 1474 } |
1476 | 1475 |
1477 TEST_P(QuicConnectionTest, AbandonFECFromCongestionWindow) { | 1476 TEST_P(QuicConnectionTest, AbandonFECFromCongestionWindow) { |
1478 connection_.options()->max_packets_per_fec_group = 1; | 1477 EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn( |
| 1478 QuicConnectionPeer::GetPacketCreator(&connection_), 1)); |
| 1479 |
1479 // 1 Data and 1 FEC packet. | 1480 // 1 Data and 1 FEC packet. |
1480 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); | 1481 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); |
1481 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL); | 1482 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL); |
1482 | 1483 |
1483 const QuicTime::Delta retransmission_time = | 1484 const QuicTime::Delta retransmission_time = |
1484 QuicTime::Delta::FromMilliseconds(5000); | 1485 QuicTime::Delta::FromMilliseconds(5000); |
1485 clock_.AdvanceTime(retransmission_time); | 1486 clock_.AdvanceTime(retransmission_time); |
1486 | 1487 |
1487 // Abandon FEC packet and data packet. | 1488 // Abandon FEC packet and data packet. |
1488 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | 1489 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
1489 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); | 1490 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
1490 EXPECT_CALL(visitor_, OnCanWrite()); | 1491 EXPECT_CALL(visitor_, OnCanWrite()); |
1491 connection_.OnRetransmissionTimeout(); | 1492 connection_.OnRetransmissionTimeout(); |
1492 } | 1493 } |
1493 | 1494 |
1494 TEST_P(QuicConnectionTest, DontAbandonAckedFEC) { | 1495 TEST_P(QuicConnectionTest, DontAbandonAckedFEC) { |
1495 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 1496 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
1496 connection_.options()->max_packets_per_fec_group = 1; | 1497 EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn( |
| 1498 QuicConnectionPeer::GetPacketCreator(&connection_), 1)); |
1497 | 1499 |
1498 // 1 Data and 1 FEC packet. | 1500 // 1 Data and 1 FEC packet. |
1499 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(6); | 1501 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(6); |
1500 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL); | 1502 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL); |
1501 // Send some more data afterwards to ensure early retransmit doesn't trigger. | 1503 // Send some more data afterwards to ensure early retransmit doesn't trigger. |
1502 connection_.SendStreamDataWithString(3, "foo", 3, !kFin, NULL); | 1504 connection_.SendStreamDataWithString(3, "foo", 3, !kFin, NULL); |
1503 connection_.SendStreamDataWithString(3, "foo", 6, !kFin, NULL); | 1505 connection_.SendStreamDataWithString(3, "foo", 6, !kFin, NULL); |
1504 | 1506 |
1505 QuicAckFrame ack_fec = InitAckFrame(2, 1); | 1507 QuicAckFrame ack_fec = InitAckFrame(2, 1); |
1506 // Data packet missing. | 1508 // Data packet missing. |
1507 // TODO(ianswett): Note that this is not a sensible ack, since if the FEC was | 1509 // TODO(ianswett): Note that this is not a sensible ack, since if the FEC was |
1508 // received, it would cause the covered packet to be acked as well. | 1510 // received, it would cause the covered packet to be acked as well. |
1509 NackPacket(1, &ack_fec); | 1511 NackPacket(1, &ack_fec); |
1510 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); | 1512 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); |
1511 ProcessAckPacket(&ack_fec); | 1513 ProcessAckPacket(&ack_fec); |
1512 clock_.AdvanceTime(DefaultRetransmissionTime()); | 1514 clock_.AdvanceTime(DefaultRetransmissionTime()); |
1513 | 1515 |
1514 // Don't abandon the acked FEC packet, but it will abandon 2 the subsequent | 1516 // Don't abandon the acked FEC packet, but it will abandon 2 the subsequent |
1515 // FEC packets. | 1517 // FEC packets. |
1516 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); | 1518 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
1517 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(3); | 1519 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(3); |
1518 connection_.GetRetransmissionAlarm()->Fire(); | 1520 connection_.GetRetransmissionAlarm()->Fire(); |
1519 } | 1521 } |
1520 | 1522 |
1521 TEST_P(QuicConnectionTest, AbandonAllFEC) { | 1523 TEST_P(QuicConnectionTest, AbandonAllFEC) { |
1522 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 1524 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
1523 connection_.options()->max_packets_per_fec_group = 1; | 1525 EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn( |
| 1526 QuicConnectionPeer::GetPacketCreator(&connection_), 1)); |
1524 | 1527 |
1525 // 1 Data and 1 FEC packet. | 1528 // 1 Data and 1 FEC packet. |
1526 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(6); | 1529 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(6); |
1527 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL); | 1530 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL); |
1528 // Send some more data afterwards to ensure early retransmit doesn't trigger. | 1531 // Send some more data afterwards to ensure early retransmit doesn't trigger. |
1529 connection_.SendStreamDataWithString(3, "foo", 3, !kFin, NULL); | 1532 connection_.SendStreamDataWithString(3, "foo", 3, !kFin, NULL); |
1530 // Advance the time so not all the FEC packets are abandoned. | 1533 // Advance the time so not all the FEC packets are abandoned. |
1531 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); | 1534 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); |
1532 connection_.SendStreamDataWithString(3, "foo", 6, !kFin, NULL); | 1535 connection_.SendStreamDataWithString(3, "foo", 6, !kFin, NULL); |
1533 | 1536 |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1638 EXPECT_EQ(1u, writer_->frame_count()); | 1641 EXPECT_EQ(1u, writer_->frame_count()); |
1639 EXPECT_EQ(1u, writer_->stream_frames().size()); | 1642 EXPECT_EQ(1u, writer_->stream_frames().size()); |
1640 EXPECT_EQ(kStreamId3, writer_->stream_frames()[0].stream_id); | 1643 EXPECT_EQ(kStreamId3, writer_->stream_frames()[0].stream_id); |
1641 } | 1644 } |
1642 | 1645 |
1643 TEST_P(QuicConnectionTest, FramePackingFEC) { | 1646 TEST_P(QuicConnectionTest, FramePackingFEC) { |
1644 if (version() < QUIC_VERSION_15) { | 1647 if (version() < QUIC_VERSION_15) { |
1645 return; | 1648 return; |
1646 } | 1649 } |
1647 // Enable fec. | 1650 // Enable fec. |
1648 connection_.options()->max_packets_per_fec_group = 6; | 1651 EXPECT_TRUE(QuicPacketCreatorPeer::SwitchFecProtectionOn( |
| 1652 QuicConnectionPeer::GetPacketCreator(&connection_), 6)); |
| 1653 |
1649 // Block the connection. | 1654 // Block the connection. |
1650 connection_.GetSendAlarm()->Set( | 1655 connection_.GetSendAlarm()->Set( |
1651 clock_.ApproximateNow().Add(QuicTime::Delta::FromSeconds(1))); | 1656 clock_.ApproximateNow().Add(QuicTime::Delta::FromSeconds(1))); |
1652 | 1657 |
1653 // Send an ack and two stream frames in 1 packet by queueing them. | 1658 // Send an ack and two stream frames in 1 packet by queueing them. |
1654 connection_.SendAck(); | 1659 connection_.SendAck(); |
1655 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll( | 1660 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll( |
1656 IgnoreResult(InvokeWithoutArgs(&connection_, | 1661 IgnoreResult(InvokeWithoutArgs(&connection_, |
1657 &TestConnection::SendStreamData3)), | 1662 &TestConnection::SendStreamData3)), |
1658 IgnoreResult(InvokeWithoutArgs(&connection_, | 1663 IgnoreResult(InvokeWithoutArgs(&connection_, |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1771 EXPECT_TRUE(writer_->stream_frames()[0].fin); | 1776 EXPECT_TRUE(writer_->stream_frames()[0].fin); |
1772 } | 1777 } |
1773 | 1778 |
1774 TEST_P(QuicConnectionTest, OnCanWrite) { | 1779 TEST_P(QuicConnectionTest, OnCanWrite) { |
1775 // Visitor's OnCanWrite will send data, but will have more pending writes. | 1780 // Visitor's OnCanWrite will send data, but will have more pending writes. |
1776 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll( | 1781 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll( |
1777 IgnoreResult(InvokeWithoutArgs(&connection_, | 1782 IgnoreResult(InvokeWithoutArgs(&connection_, |
1778 &TestConnection::SendStreamData3)), | 1783 &TestConnection::SendStreamData3)), |
1779 IgnoreResult(InvokeWithoutArgs(&connection_, | 1784 IgnoreResult(InvokeWithoutArgs(&connection_, |
1780 &TestConnection::SendStreamData5)))); | 1785 &TestConnection::SendStreamData5)))); |
1781 EXPECT_CALL(visitor_, HasPendingWrites()).WillOnce(Return(true)); | 1786 EXPECT_CALL(visitor_, WillingAndAbleToWrite()).WillOnce(Return(true)); |
1782 EXPECT_CALL(*send_algorithm_, | 1787 EXPECT_CALL(*send_algorithm_, |
1783 TimeUntilSend(_, _, _)).WillRepeatedly( | 1788 TimeUntilSend(_, _, _)).WillRepeatedly( |
1784 testing::Return(QuicTime::Delta::Zero())); | 1789 testing::Return(QuicTime::Delta::Zero())); |
1785 | 1790 |
1786 connection_.OnCanWrite(); | 1791 connection_.OnCanWrite(); |
1787 | 1792 |
1788 // Parse the last packet and ensure it's the two stream frames from | 1793 // Parse the last packet and ensure it's the two stream frames from |
1789 // two different streams. | 1794 // two different streams. |
1790 EXPECT_EQ(2u, writer_->frame_count()); | 1795 EXPECT_EQ(2u, writer_->frame_count()); |
1791 EXPECT_EQ(2u, writer_->stream_frames().size()); | 1796 EXPECT_EQ(2u, writer_->stream_frames().size()); |
(...skipping 2149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3941 debug_visitor(new StrictMock<MockQuicConnectionDebugVisitor>); | 3946 debug_visitor(new StrictMock<MockQuicConnectionDebugVisitor>); |
3942 connection_.set_debug_visitor(debug_visitor.get()); | 3947 connection_.set_debug_visitor(debug_visitor.get()); |
3943 EXPECT_CALL(*debug_visitor, OnPacketHeader(Ref(header))).Times(1); | 3948 EXPECT_CALL(*debug_visitor, OnPacketHeader(Ref(header))).Times(1); |
3944 connection_.OnPacketHeader(header); | 3949 connection_.OnPacketHeader(header); |
3945 } | 3950 } |
3946 | 3951 |
3947 TEST_P(QuicConnectionTest, Pacing) { | 3952 TEST_P(QuicConnectionTest, Pacing) { |
3948 ValueRestore<bool> old_flag(&FLAGS_enable_quic_pacing, true); | 3953 ValueRestore<bool> old_flag(&FLAGS_enable_quic_pacing, true); |
3949 | 3954 |
3950 TestConnection server(connection_id_, IPEndPoint(), helper_.get(), | 3955 TestConnection server(connection_id_, IPEndPoint(), helper_.get(), |
3951 writer_.get(), true, version(), | 3956 writer_.get(), true, version()); |
3952 kDefaultFlowControlSendWindow); | |
3953 TestConnection client(connection_id_, IPEndPoint(), helper_.get(), | 3957 TestConnection client(connection_id_, IPEndPoint(), helper_.get(), |
3954 writer_.get(), false, version(), | 3958 writer_.get(), false, version()); |
3955 kDefaultFlowControlSendWindow); | |
3956 EXPECT_TRUE(client.sent_packet_manager().using_pacing()); | 3959 EXPECT_TRUE(client.sent_packet_manager().using_pacing()); |
3957 EXPECT_FALSE(server.sent_packet_manager().using_pacing()); | 3960 EXPECT_FALSE(server.sent_packet_manager().using_pacing()); |
3958 } | 3961 } |
3959 | 3962 |
3960 TEST_P(QuicConnectionTest, ControlFramesInstigateAcks) { | 3963 TEST_P(QuicConnectionTest, ControlFramesInstigateAcks) { |
3961 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 3964 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
3962 | 3965 |
3963 // Send a WINDOW_UPDATE frame. | 3966 // Send a WINDOW_UPDATE frame. |
3964 QuicWindowUpdateFrame window_update; | 3967 QuicWindowUpdateFrame window_update; |
3965 window_update.stream_id = 3; | 3968 window_update.stream_id = 3; |
3966 window_update.byte_offset = 1234; | 3969 window_update.byte_offset = 1234; |
3967 EXPECT_CALL(visitor_, OnWindowUpdateFrames(_)); | 3970 EXPECT_CALL(visitor_, OnWindowUpdateFrames(_)); |
3968 ProcessFramePacket(QuicFrame(&window_update)); | 3971 ProcessFramePacket(QuicFrame(&window_update)); |
3969 | 3972 |
3970 // Ensure that this has caused the ACK alarm to be set. | 3973 // Ensure that this has caused the ACK alarm to be set. |
3971 QuicAlarm* ack_alarm = QuicConnectionPeer::GetAckAlarm(&connection_); | 3974 QuicAlarm* ack_alarm = QuicConnectionPeer::GetAckAlarm(&connection_); |
3972 EXPECT_TRUE(ack_alarm->IsSet()); | 3975 EXPECT_TRUE(ack_alarm->IsSet()); |
3973 | 3976 |
3974 // Cancel alarm, and try again with BLOCKED frame. | 3977 // Cancel alarm, and try again with BLOCKED frame. |
3975 ack_alarm->Cancel(); | 3978 ack_alarm->Cancel(); |
3976 QuicBlockedFrame blocked; | 3979 QuicBlockedFrame blocked; |
3977 blocked.stream_id = 3; | 3980 blocked.stream_id = 3; |
3978 EXPECT_CALL(visitor_, OnBlockedFrames(_)); | 3981 EXPECT_CALL(visitor_, OnBlockedFrames(_)); |
3979 ProcessFramePacket(QuicFrame(&blocked)); | 3982 ProcessFramePacket(QuicFrame(&blocked)); |
3980 EXPECT_TRUE(ack_alarm->IsSet()); | 3983 EXPECT_TRUE(ack_alarm->IsSet()); |
3981 } | 3984 } |
3982 | 3985 |
3983 TEST_P(QuicConnectionTest, InvalidFlowControlWindow) { | |
3984 ValueRestore<bool> old_flag(&FLAGS_enable_quic_pacing, true); | |
3985 | |
3986 const uint32 kSmallerFlowControlWindow = kDefaultFlowControlSendWindow - 1; | |
3987 TestConnection connection(connection_id_, IPEndPoint(), helper_.get(), | |
3988 writer_.get(), true, version(), | |
3989 kSmallerFlowControlWindow); | |
3990 EXPECT_EQ(kDefaultFlowControlSendWindow, | |
3991 connection.max_flow_control_receive_window_bytes()); | |
3992 } | |
3993 | |
3994 } // namespace | 3986 } // namespace |
3995 } // namespace test | 3987 } // namespace test |
3996 } // namespace net | 3988 } // namespace net |
OLD | NEW |