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

Side by Side Diff: net/quic/quic_connection_test.cc

Issue 335533002: API changes to Write path Session on down for FEC protection. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/quic/quic_connection.cc ('k') | net/quic/quic_data_stream_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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"
11 #include "net/quic/congestion_control/loss_detection_interface.h" 11 #include "net/quic/congestion_control/loss_detection_interface.h"
12 #include "net/quic/congestion_control/receive_algorithm_interface.h" 12 #include "net/quic/congestion_control/receive_algorithm_interface.h"
13 #include "net/quic/congestion_control/send_algorithm_interface.h" 13 #include "net/quic/congestion_control/send_algorithm_interface.h"
14 #include "net/quic/crypto/null_encrypter.h" 14 #include "net/quic/crypto/null_encrypter.h"
15 #include "net/quic/crypto/quic_decrypter.h" 15 #include "net/quic/crypto/quic_decrypter.h"
16 #include "net/quic/crypto/quic_encrypter.h" 16 #include "net/quic/crypto/quic_encrypter.h"
17 #include "net/quic/quic_flags.h" 17 #include "net/quic/quic_flags.h"
18 #include "net/quic/quic_protocol.h" 18 #include "net/quic/quic_protocol.h"
19 #include "net/quic/quic_utils.h" 19 #include "net/quic/quic_utils.h"
20 #include "net/quic/test_tools/mock_clock.h" 20 #include "net/quic/test_tools/mock_clock.h"
21 #include "net/quic/test_tools/mock_random.h" 21 #include "net/quic/test_tools/mock_random.h"
22 #include "net/quic/test_tools/quic_connection_peer.h" 22 #include "net/quic/test_tools/quic_connection_peer.h"
23 #include "net/quic/test_tools/quic_framer_peer.h" 23 #include "net/quic/test_tools/quic_framer_peer.h"
24 #include "net/quic/test_tools/quic_packet_creator_peer.h" 24 #include "net/quic/test_tools/quic_packet_creator_peer.h"
25 #include "net/quic/test_tools/quic_packet_generator_peer.h"
26 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h" 25 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h"
27 #include "net/quic/test_tools/quic_test_utils.h" 26 #include "net/quic/test_tools/quic_test_utils.h"
28 #include "net/quic/test_tools/simple_quic_framer.h" 27 #include "net/quic/test_tools/simple_quic_framer.h"
29 #include "testing/gmock/include/gmock/gmock.h" 28 #include "testing/gmock/include/gmock/gmock.h"
30 #include "testing/gtest/include/gtest/gtest.h" 29 #include "testing/gtest/include/gtest/gtest.h"
31 30
32 using base::StringPiece; 31 using base::StringPiece;
33 using std::map; 32 using std::map;
34 using std::vector; 33 using std::vector;
35 using testing::AnyNumber; 34 using testing::AnyNumber;
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 SerializedPacket(sequence_number, PACKET_6BYTE_SEQUENCE_NUMBER, 453 SerializedPacket(sequence_number, PACKET_6BYTE_SEQUENCE_NUMBER,
455 packet, entropy_hash, retransmittable_frames)); 454 packet, entropy_hash, retransmittable_frames));
456 } 455 }
457 456
458 QuicConsumedData SendStreamDataWithString( 457 QuicConsumedData SendStreamDataWithString(
459 QuicStreamId id, 458 QuicStreamId id,
460 StringPiece data, 459 StringPiece data,
461 QuicStreamOffset offset, 460 QuicStreamOffset offset,
462 bool fin, 461 bool fin,
463 QuicAckNotifier::DelegateInterface* delegate) { 462 QuicAckNotifier::DelegateInterface* delegate) {
463 return SendStreamDataWithStringHelper(id, data, offset, fin,
464 MAY_FEC_PROTECT, delegate);
465 }
466
467 QuicConsumedData SendStreamDataWithStringWithFec(
468 QuicStreamId id,
469 StringPiece data,
470 QuicStreamOffset offset,
471 bool fin,
472 QuicAckNotifier::DelegateInterface* delegate) {
473 return SendStreamDataWithStringHelper(id, data, offset, fin,
474 MUST_FEC_PROTECT, delegate);
475 }
476
477 QuicConsumedData SendStreamDataWithStringHelper(
478 QuicStreamId id,
479 StringPiece data,
480 QuicStreamOffset offset,
481 bool fin,
482 FecProtection fec_protection,
483 QuicAckNotifier::DelegateInterface* delegate) {
464 IOVector data_iov; 484 IOVector data_iov;
465 if (!data.empty()) { 485 if (!data.empty()) {
466 data_iov.Append(const_cast<char*>(data.data()), data.size()); 486 data_iov.Append(const_cast<char*>(data.data()), data.size());
467 } 487 }
468 return QuicConnection::SendStreamData(id, data_iov, offset, fin, delegate); 488 return QuicConnection::SendStreamData(id, data_iov, offset, fin,
489 fec_protection, delegate);
469 } 490 }
470 491
471 QuicConsumedData SendStreamData3() { 492 QuicConsumedData SendStreamData3() {
472 return SendStreamDataWithString(kClientDataStreamId1, "food", 0, !kFin, 493 return SendStreamDataWithString(kClientDataStreamId1, "food", 0, !kFin,
473 NULL); 494 NULL);
474 } 495 }
475 496
497 QuicConsumedData SendStreamData3WithFec() {
498 return SendStreamDataWithStringWithFec(kClientDataStreamId1, "food", 0,
499 !kFin, NULL);
500 }
501
476 QuicConsumedData SendStreamData5() { 502 QuicConsumedData SendStreamData5() {
477 return SendStreamDataWithString(kClientDataStreamId2, "food2", 0, 503 return SendStreamDataWithString(kClientDataStreamId2, "food2", 0,
478 !kFin, NULL); 504 !kFin, NULL);
479 } 505 }
480 506
507 QuicConsumedData SendStreamData5WithFec() {
508 return SendStreamDataWithStringWithFec(kClientDataStreamId2, "food2", 0,
509 !kFin, NULL);
510 }
481 // Ensures the connection can write stream data before writing. 511 // Ensures the connection can write stream data before writing.
482 QuicConsumedData EnsureWritableAndSendStreamData5() { 512 QuicConsumedData EnsureWritableAndSendStreamData5() {
483 EXPECT_TRUE(CanWriteStreamData()); 513 EXPECT_TRUE(CanWriteStreamData());
484 return SendStreamData5(); 514 return SendStreamData5();
485 } 515 }
486 516
487 // The crypto stream has special semantics so that it is not blocked by a 517 // The crypto stream has special semantics so that it is not blocked by a
488 // congestion window limitation, and also so that it gets put into a separate 518 // congestion window limitation, and also so that it gets put into a separate
489 // packet (so that it is easier to reason about a crypto frame not being 519 // packet (so that it is easier to reason about a crypto frame not being
490 // split needlessly across packet boundaries). As a result, we have separate 520 // split needlessly across packet boundaries). As a result, we have separate
(...skipping 962 matching lines...) Expand 10 before | Expand all | Expand 10 after
1453 // GetPacketLengthForOneStream() assumes a stream offset of 0 in determining 1483 // GetPacketLengthForOneStream() assumes a stream offset of 0 in determining
1454 // packet length. The size of the offset field in a stream frame is 0 for 1484 // packet length. The size of the offset field in a stream frame is 0 for
1455 // offset 0, and 2 for non-zero offsets up through 64K. Increase 1485 // offset 0, and 2 for non-zero offsets up through 64K. Increase
1456 // max_packet_length by 2 so that subsequent packets containing subsequent 1486 // max_packet_length by 2 so that subsequent packets containing subsequent
1457 // stream frames with non-zero offets will fit within the packet length. 1487 // stream frames with non-zero offets will fit within the packet length.
1458 size_t length = 2 + GetPacketLengthForOneStream( 1488 size_t length = 2 + GetPacketLengthForOneStream(
1459 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER, 1489 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER,
1460 IN_FEC_GROUP, &payload_length); 1490 IN_FEC_GROUP, &payload_length);
1461 creator->set_max_packet_length(length); 1491 creator->set_max_packet_length(length);
1462 1492
1463 // And send FEC every two packets. 1493 // Enable FEC.
1464 QuicPacketGeneratorPeer::SwitchFecProtectionOn( 1494 creator->set_max_packets_per_fec_group(2);
1465 QuicConnectionPeer::GetPacketGenerator(&connection_), 2);
1466 1495
1467 // Send 4 data packets and 2 FEC packets. 1496 // Send 4 protected data packets, which will also trigger 2 FEC packets.
1468 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(6); 1497 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(6);
1469 // The first stream frame will have 2 fewer overhead bytes than the other 3. 1498 // The first stream frame will have 2 fewer overhead bytes than the other 3.
1470 const string payload(payload_length * 4 + 2, 'a'); 1499 const string payload(payload_length * 4 + 2, 'a');
1471 connection_.SendStreamDataWithString(1, payload, 0, !kFin, NULL); 1500 connection_.SendStreamDataWithStringWithFec(1, payload, 0, !kFin, NULL);
1472 // Expect the FEC group to be closed after SendStreamDataWithString. 1501 // Expect the FEC group to be closed after SendStreamDataWithString.
1473 EXPECT_FALSE(creator->ShouldSendFec(true)); 1502 EXPECT_FALSE(creator->IsFecGroupOpen());
1474 EXPECT_TRUE(creator->IsFecProtected()); 1503 EXPECT_FALSE(creator->IsFecProtected());
1475 } 1504 }
1476 1505
1477 TEST_P(QuicConnectionTest, FECQueueing) { 1506 TEST_P(QuicConnectionTest, FECQueueing) {
1478 // All packets carry version info till version is negotiated. 1507 // All packets carry version info till version is negotiated.
1479 size_t payload_length; 1508 size_t payload_length;
1480 QuicPacketCreator* creator = 1509 QuicPacketCreator* creator =
1481 QuicConnectionPeer::GetPacketCreator(&connection_); 1510 QuicConnectionPeer::GetPacketCreator(&connection_);
1482 size_t length = GetPacketLengthForOneStream( 1511 size_t length = GetPacketLengthForOneStream(
1483 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER, 1512 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER,
1484 IN_FEC_GROUP, &payload_length); 1513 IN_FEC_GROUP, &payload_length);
1485 creator->set_max_packet_length(length); 1514 creator->set_max_packet_length(length);
1486 // And send FEC every two packets. 1515 // Enable FEC.
1487 QuicPacketGeneratorPeer::SwitchFecProtectionOn( 1516 creator->set_max_packets_per_fec_group(1);
1488 QuicConnectionPeer::GetPacketGenerator(&connection_), 1);
1489 1517
1490 EXPECT_EQ(0u, connection_.NumQueuedPackets()); 1518 EXPECT_EQ(0u, connection_.NumQueuedPackets());
1491 BlockOnNextWrite(); 1519 BlockOnNextWrite();
1492 const string payload(payload_length, 'a'); 1520 const string payload(payload_length, 'a');
1493 connection_.SendStreamDataWithString(1, payload, 0, !kFin, NULL); 1521 connection_.SendStreamDataWithStringWithFec(1, payload, 0, !kFin, NULL);
1494 EXPECT_FALSE(creator->ShouldSendFec(true)); 1522 EXPECT_FALSE(creator->IsFecGroupOpen());
1495 EXPECT_TRUE(creator->IsFecProtected()); 1523 EXPECT_FALSE(creator->IsFecProtected());
1496 // Expect the first data packet and the fec packet to be queued. 1524 // Expect the first data packet and the fec packet to be queued.
1497 EXPECT_EQ(2u, connection_.NumQueuedPackets()); 1525 EXPECT_EQ(2u, connection_.NumQueuedPackets());
1498 } 1526 }
1499 1527
1500 TEST_P(QuicConnectionTest, AbandonFECFromCongestionWindow) { 1528 TEST_P(QuicConnectionTest, AbandonFECFromCongestionWindow) {
1501 QuicPacketGeneratorPeer::SwitchFecProtectionOn( 1529 // Enable FEC.
1502 QuicConnectionPeer::GetPacketGenerator(&connection_), 1); 1530 QuicConnectionPeer::GetPacketCreator(
1531 &connection_)->set_max_packets_per_fec_group(1);
1503 1532
1504 // 1 Data and 1 FEC packet. 1533 // 1 Data and 1 FEC packet.
1505 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); 1534 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2);
1506 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL); 1535 connection_.SendStreamDataWithStringWithFec(3, "foo", 0, !kFin, NULL);
1507 1536
1508 const QuicTime::Delta retransmission_time = 1537 const QuicTime::Delta retransmission_time =
1509 QuicTime::Delta::FromMilliseconds(5000); 1538 QuicTime::Delta::FromMilliseconds(5000);
1510 clock_.AdvanceTime(retransmission_time); 1539 clock_.AdvanceTime(retransmission_time);
1511 1540
1512 // Abandon FEC packet and data packet. 1541 // Abandon FEC packet and data packet.
1513 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); 1542 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1514 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); 1543 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
1515 EXPECT_CALL(visitor_, OnCanWrite()); 1544 EXPECT_CALL(visitor_, OnCanWrite());
1516 connection_.OnRetransmissionTimeout(); 1545 connection_.OnRetransmissionTimeout();
1517 } 1546 }
1518 1547
1519 TEST_P(QuicConnectionTest, DontAbandonAckedFEC) { 1548 TEST_P(QuicConnectionTest, DontAbandonAckedFEC) {
1520 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 1549 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1521 QuicPacketGeneratorPeer::SwitchFecProtectionOn( 1550 // Enable FEC.
1522 QuicConnectionPeer::GetPacketGenerator(&connection_), 1); 1551 QuicConnectionPeer::GetPacketCreator(
1552 &connection_)->set_max_packets_per_fec_group(1);
1523 1553
1524 // 1 Data and 1 FEC packet. 1554 // 1 Data and 1 FEC packet.
1525 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(6); 1555 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(6);
1526 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL); 1556 connection_.SendStreamDataWithStringWithFec(3, "foo", 0, !kFin, NULL);
1527 // Send some more data afterwards to ensure early retransmit doesn't trigger. 1557 // Send some more data afterwards to ensure early retransmit doesn't trigger.
1528 connection_.SendStreamDataWithString(3, "foo", 3, !kFin, NULL); 1558 connection_.SendStreamDataWithStringWithFec(3, "foo", 3, !kFin, NULL);
1529 connection_.SendStreamDataWithString(3, "foo", 6, !kFin, NULL); 1559 connection_.SendStreamDataWithStringWithFec(3, "foo", 6, !kFin, NULL);
1530 1560
1531 QuicAckFrame ack_fec = InitAckFrame(2, 1); 1561 QuicAckFrame ack_fec = InitAckFrame(2, 1);
1532 // Data packet missing. 1562 // Data packet missing.
1533 // TODO(ianswett): Note that this is not a sensible ack, since if the FEC was 1563 // TODO(ianswett): Note that this is not a sensible ack, since if the FEC was
1534 // received, it would cause the covered packet to be acked as well. 1564 // received, it would cause the covered packet to be acked as well.
1535 NackPacket(1, &ack_fec); 1565 NackPacket(1, &ack_fec);
1536 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); 1566 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
1537 ProcessAckPacket(&ack_fec); 1567 ProcessAckPacket(&ack_fec);
1538 clock_.AdvanceTime(DefaultRetransmissionTime()); 1568 clock_.AdvanceTime(DefaultRetransmissionTime());
1539 1569
1540 // Don't abandon the acked FEC packet, but it will abandon 2 the subsequent 1570 // Don't abandon the acked FEC packet, but it will abandon 2 the subsequent
1541 // FEC packets. 1571 // FEC packets.
1542 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); 1572 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1543 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(3); 1573 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(3);
1544 connection_.GetRetransmissionAlarm()->Fire(); 1574 connection_.GetRetransmissionAlarm()->Fire();
1545 } 1575 }
1546 1576
1547 TEST_P(QuicConnectionTest, AbandonAllFEC) { 1577 TEST_P(QuicConnectionTest, AbandonAllFEC) {
1548 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 1578 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1549 QuicPacketGeneratorPeer::SwitchFecProtectionOn( 1579 // Enable FEC.
1550 QuicConnectionPeer::GetPacketGenerator(&connection_), 1); 1580 QuicConnectionPeer::GetPacketCreator(
1581 &connection_)->set_max_packets_per_fec_group(1);
1551 1582
1552 // 1 Data and 1 FEC packet. 1583 // 1 Data and 1 FEC packet.
1553 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(6); 1584 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(6);
1554 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL); 1585 connection_.SendStreamDataWithStringWithFec(3, "foo", 0, !kFin, NULL);
1555 // Send some more data afterwards to ensure early retransmit doesn't trigger. 1586 // Send some more data afterwards to ensure early retransmit doesn't trigger.
1556 connection_.SendStreamDataWithString(3, "foo", 3, !kFin, NULL); 1587 connection_.SendStreamDataWithStringWithFec(3, "foo", 3, !kFin, NULL);
1557 // Advance the time so not all the FEC packets are abandoned. 1588 // Advance the time so not all the FEC packets are abandoned.
1558 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); 1589 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
1559 connection_.SendStreamDataWithString(3, "foo", 6, !kFin, NULL); 1590 connection_.SendStreamDataWithStringWithFec(3, "foo", 6, !kFin, NULL);
1560 1591
1561 QuicAckFrame ack_fec = InitAckFrame(5, 1); 1592 QuicAckFrame ack_fec = InitAckFrame(5, 1);
1562 // Ack all data packets, but no fec packets. 1593 // Ack all data packets, but no fec packets.
1563 NackPacket(2, &ack_fec); 1594 NackPacket(2, &ack_fec);
1564 NackPacket(4, &ack_fec); 1595 NackPacket(4, &ack_fec);
1565 1596
1566 // Lose the first FEC packet and ack the three data packets. 1597 // Lose the first FEC packet and ack the three data packets.
1567 SequenceNumberSet lost_packets; 1598 SequenceNumberSet lost_packets;
1568 lost_packets.insert(2); 1599 lost_packets.insert(2);
1569 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _)) 1600 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
1655 EXPECT_EQ(0u, connection_.NumQueuedPackets()); 1686 EXPECT_EQ(0u, connection_.NumQueuedPackets());
1656 EXPECT_FALSE(connection_.HasQueuedData()); 1687 EXPECT_FALSE(connection_.HasQueuedData());
1657 1688
1658 // Parse the last packet and ensure it's the stream frame from stream 3. 1689 // Parse the last packet and ensure it's the stream frame from stream 3.
1659 EXPECT_EQ(1u, writer_->frame_count()); 1690 EXPECT_EQ(1u, writer_->frame_count());
1660 ASSERT_EQ(1u, writer_->stream_frames().size()); 1691 ASSERT_EQ(1u, writer_->stream_frames().size());
1661 EXPECT_EQ(kClientDataStreamId1, writer_->stream_frames()[0].stream_id); 1692 EXPECT_EQ(kClientDataStreamId1, writer_->stream_frames()[0].stream_id);
1662 } 1693 }
1663 1694
1664 TEST_P(QuicConnectionTest, FramePackingFEC) { 1695 TEST_P(QuicConnectionTest, FramePackingFEC) {
1665 // Enable fec. 1696 // Enable FEC.
1666 QuicPacketGeneratorPeer::SwitchFecProtectionOn( 1697 QuicConnectionPeer::GetPacketCreator(
1667 QuicConnectionPeer::GetPacketGenerator(&connection_), 6); 1698 &connection_)->set_max_packets_per_fec_group(6);
1668 1699
1669 CongestionBlockWrites(); 1700 CongestionBlockWrites();
1670 1701
1671 // Send an ack and two stream frames in 1 packet by queueing them. 1702 // Queue an ack and two stream frames. Ack gets flushed when FEC is turned on
1703 // for sending protected data; two stream frames are packing in 1 packet.
1704 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll(
1705 IgnoreResult(InvokeWithoutArgs(
1706 &connection_, &TestConnection::SendStreamData3WithFec)),
1707 IgnoreResult(InvokeWithoutArgs(
1708 &connection_, &TestConnection::SendStreamData5WithFec))));
1672 connection_.SendAck(); 1709 connection_.SendAck();
1673 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll(
1674 IgnoreResult(InvokeWithoutArgs(&connection_,
1675 &TestConnection::SendStreamData3)),
1676 IgnoreResult(InvokeWithoutArgs(&connection_,
1677 &TestConnection::SendStreamData5))));
1678 1710
1679 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); 1711 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(3);
1680 CongestionUnblockWrites(); 1712 CongestionUnblockWrites();
1681 connection_.GetSendAlarm()->Fire(); 1713 connection_.GetSendAlarm()->Fire();
1682 EXPECT_EQ(0u, connection_.NumQueuedPackets()); 1714 EXPECT_EQ(0u, connection_.NumQueuedPackets());
1683 EXPECT_FALSE(connection_.HasQueuedData()); 1715 EXPECT_FALSE(connection_.HasQueuedData());
1684 1716
1685 // Parse the last packet and ensure it's in an fec group. 1717 // Parse the last packet and ensure it's in an fec group.
1686 EXPECT_EQ(1u, writer_->header().fec_group); 1718 EXPECT_EQ(2u, writer_->header().fec_group);
1687 EXPECT_EQ(0u, writer_->frame_count()); 1719 EXPECT_EQ(0u, writer_->frame_count());
1688 } 1720 }
1689 1721
1690 TEST_P(QuicConnectionTest, FramePackingAckResponse) { 1722 TEST_P(QuicConnectionTest, FramePackingAckResponse) {
1691 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 1723 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1692 // Process a data packet to queue up a pending ack. 1724 // Process a data packet to queue up a pending ack.
1693 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1); 1725 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1);
1694 ProcessDataPacket(1, 1, kEntropyFlag); 1726 ProcessDataPacket(1, 1, kEntropyFlag);
1695 1727
1696 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll( 1728 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll(
(...skipping 28 matching lines...) Expand all
1725 1757
1726 TEST_P(QuicConnectionTest, FramePackingSendv) { 1758 TEST_P(QuicConnectionTest, FramePackingSendv) {
1727 // Send data in 1 packet by writing multiple blocks in a single iovector 1759 // Send data in 1 packet by writing multiple blocks in a single iovector
1728 // using writev. 1760 // using writev.
1729 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); 1761 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
1730 1762
1731 char data[] = "ABCD"; 1763 char data[] = "ABCD";
1732 IOVector data_iov; 1764 IOVector data_iov;
1733 data_iov.AppendNoCoalesce(data, 2); 1765 data_iov.AppendNoCoalesce(data, 2);
1734 data_iov.AppendNoCoalesce(data + 2, 2); 1766 data_iov.AppendNoCoalesce(data + 2, 2);
1735 connection_.SendStreamData(1, data_iov, 0, !kFin, NULL); 1767 connection_.SendStreamData(1, data_iov, 0, !kFin, MAY_FEC_PROTECT, NULL);
1736 1768
1737 EXPECT_EQ(0u, connection_.NumQueuedPackets()); 1769 EXPECT_EQ(0u, connection_.NumQueuedPackets());
1738 EXPECT_FALSE(connection_.HasQueuedData()); 1770 EXPECT_FALSE(connection_.HasQueuedData());
1739 1771
1740 // Parse the last packet and ensure multiple iovector blocks have 1772 // Parse the last packet and ensure multiple iovector blocks have
1741 // been packed into a single stream frame from one stream. 1773 // been packed into a single stream frame from one stream.
1742 EXPECT_EQ(1u, writer_->frame_count()); 1774 EXPECT_EQ(1u, writer_->frame_count());
1743 EXPECT_EQ(1u, writer_->stream_frames().size()); 1775 EXPECT_EQ(1u, writer_->stream_frames().size());
1744 QuicStreamFrame frame = writer_->stream_frames()[0]; 1776 QuicStreamFrame frame = writer_->stream_frames()[0];
1745 EXPECT_EQ(1u, frame.stream_id); 1777 EXPECT_EQ(1u, frame.stream_id);
1746 EXPECT_EQ("ABCD", string(static_cast<char*> 1778 EXPECT_EQ("ABCD", string(static_cast<char*>
1747 (frame.data.iovec()[0].iov_base), 1779 (frame.data.iovec()[0].iov_base),
1748 (frame.data.iovec()[0].iov_len))); 1780 (frame.data.iovec()[0].iov_len)));
1749 } 1781 }
1750 1782
1751 TEST_P(QuicConnectionTest, FramePackingSendvQueued) { 1783 TEST_P(QuicConnectionTest, FramePackingSendvQueued) {
1752 // Try to send two stream frames in 1 packet by using writev. 1784 // Try to send two stream frames in 1 packet by using writev.
1753 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); 1785 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
1754 1786
1755 BlockOnNextWrite(); 1787 BlockOnNextWrite();
1756 char data[] = "ABCD"; 1788 char data[] = "ABCD";
1757 IOVector data_iov; 1789 IOVector data_iov;
1758 data_iov.AppendNoCoalesce(data, 2); 1790 data_iov.AppendNoCoalesce(data, 2);
1759 data_iov.AppendNoCoalesce(data + 2, 2); 1791 data_iov.AppendNoCoalesce(data + 2, 2);
1760 connection_.SendStreamData(1, data_iov, 0, !kFin, NULL); 1792 connection_.SendStreamData(1, data_iov, 0, !kFin, MAY_FEC_PROTECT, NULL);
1761 1793
1762 EXPECT_EQ(1u, connection_.NumQueuedPackets()); 1794 EXPECT_EQ(1u, connection_.NumQueuedPackets());
1763 EXPECT_TRUE(connection_.HasQueuedData()); 1795 EXPECT_TRUE(connection_.HasQueuedData());
1764 1796
1765 // Unblock the writes and actually send. 1797 // Unblock the writes and actually send.
1766 writer_->SetWritable(); 1798 writer_->SetWritable();
1767 connection_.OnCanWrite(); 1799 connection_.OnCanWrite();
1768 EXPECT_EQ(0u, connection_.NumQueuedPackets()); 1800 EXPECT_EQ(0u, connection_.NumQueuedPackets());
1769 1801
1770 // Parse the last packet and ensure it's one stream frame from one stream. 1802 // Parse the last packet and ensure it's one stream frame from one stream.
1771 EXPECT_EQ(1u, writer_->frame_count()); 1803 EXPECT_EQ(1u, writer_->frame_count());
1772 EXPECT_EQ(1u, writer_->stream_frames().size()); 1804 EXPECT_EQ(1u, writer_->stream_frames().size());
1773 EXPECT_EQ(1u, writer_->stream_frames()[0].stream_id); 1805 EXPECT_EQ(1u, writer_->stream_frames()[0].stream_id);
1774 } 1806 }
1775 1807
1776 TEST_P(QuicConnectionTest, SendingZeroBytes) { 1808 TEST_P(QuicConnectionTest, SendingZeroBytes) {
1777 // Send a zero byte write with a fin using writev. 1809 // Send a zero byte write with a fin using writev.
1778 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); 1810 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
1779 IOVector empty_iov; 1811 IOVector empty_iov;
1780 connection_.SendStreamData(1, empty_iov, 0, kFin, NULL); 1812 connection_.SendStreamData(1, empty_iov, 0, kFin, MAY_FEC_PROTECT, NULL);
1781 1813
1782 EXPECT_EQ(0u, connection_.NumQueuedPackets()); 1814 EXPECT_EQ(0u, connection_.NumQueuedPackets());
1783 EXPECT_FALSE(connection_.HasQueuedData()); 1815 EXPECT_FALSE(connection_.HasQueuedData());
1784 1816
1785 // Parse the last packet and ensure it's one stream frame from one stream. 1817 // Parse the last packet and ensure it's one stream frame from one stream.
1786 EXPECT_EQ(1u, writer_->frame_count()); 1818 EXPECT_EQ(1u, writer_->frame_count());
1787 EXPECT_EQ(1u, writer_->stream_frames().size()); 1819 EXPECT_EQ(1u, writer_->stream_frames().size());
1788 EXPECT_EQ(1u, writer_->stream_frames()[0].stream_id); 1820 EXPECT_EQ(1u, writer_->stream_frames()[0].stream_id);
1789 EXPECT_TRUE(writer_->stream_frames()[0].fin); 1821 EXPECT_TRUE(writer_->stream_frames()[0].fin);
1790 } 1822 }
(...skipping 2197 matching lines...) Expand 10 before | Expand all | Expand 10 after
3988 QuicBlockedFrame blocked; 4020 QuicBlockedFrame blocked;
3989 blocked.stream_id = 3; 4021 blocked.stream_id = 3;
3990 EXPECT_CALL(visitor_, OnBlockedFrames(_)); 4022 EXPECT_CALL(visitor_, OnBlockedFrames(_));
3991 ProcessFramePacket(QuicFrame(&blocked)); 4023 ProcessFramePacket(QuicFrame(&blocked));
3992 EXPECT_TRUE(ack_alarm->IsSet()); 4024 EXPECT_TRUE(ack_alarm->IsSet());
3993 } 4025 }
3994 4026
3995 } // namespace 4027 } // namespace
3996 } // namespace test 4028 } // namespace test
3997 } // namespace net 4029 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_connection.cc ('k') | net/quic/quic_data_stream_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698