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

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

Issue 103973007: Land Recent QUIC Changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix for android compile error Created 7 years 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_crypto_client_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/receive_algorithm_interface.h" 11 #include "net/quic/congestion_control/receive_algorithm_interface.h"
12 #include "net/quic/congestion_control/send_algorithm_interface.h" 12 #include "net/quic/congestion_control/send_algorithm_interface.h"
13 #include "net/quic/crypto/null_encrypter.h" 13 #include "net/quic/crypto/null_encrypter.h"
14 #include "net/quic/crypto/quic_decrypter.h" 14 #include "net/quic/crypto/quic_decrypter.h"
15 #include "net/quic/crypto/quic_encrypter.h" 15 #include "net/quic/crypto/quic_encrypter.h"
16 #include "net/quic/crypto/quic_random.h"
17 #include "net/quic/quic_protocol.h" 16 #include "net/quic/quic_protocol.h"
18 #include "net/quic/quic_sent_packet_manager.h" 17 #include "net/quic/quic_sent_packet_manager.h"
19 #include "net/quic/quic_utils.h" 18 #include "net/quic/quic_utils.h"
20 #include "net/quic/test_tools/mock_clock.h" 19 #include "net/quic/test_tools/mock_clock.h"
21 #include "net/quic/test_tools/mock_random.h" 20 #include "net/quic/test_tools/mock_random.h"
22 #include "net/quic/test_tools/quic_connection_peer.h" 21 #include "net/quic/test_tools/quic_connection_peer.h"
23 #include "net/quic/test_tools/quic_framer_peer.h" 22 #include "net/quic/test_tools/quic_framer_peer.h"
24 #include "net/quic/test_tools/quic_packet_creator_peer.h" 23 #include "net/quic/test_tools/quic_packet_creator_peer.h"
25 #include "net/quic/test_tools/quic_test_utils.h" 24 #include "net/quic/test_tools/quic_test_utils.h"
26 #include "testing/gmock/include/gmock/gmock.h" 25 #include "testing/gmock/include/gmock/gmock.h"
(...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after
466 TestConnectionHelper::TestAlarm* GetAckAlarm() { 465 TestConnectionHelper::TestAlarm* GetAckAlarm() {
467 return reinterpret_cast<TestConnectionHelper::TestAlarm*>( 466 return reinterpret_cast<TestConnectionHelper::TestAlarm*>(
468 QuicConnectionPeer::GetAckAlarm(this)); 467 QuicConnectionPeer::GetAckAlarm(this));
469 } 468 }
470 469
471 TestConnectionHelper::TestAlarm* GetRetransmissionAlarm() { 470 TestConnectionHelper::TestAlarm* GetRetransmissionAlarm() {
472 return reinterpret_cast<TestConnectionHelper::TestAlarm*>( 471 return reinterpret_cast<TestConnectionHelper::TestAlarm*>(
473 QuicConnectionPeer::GetRetransmissionAlarm(this)); 472 QuicConnectionPeer::GetRetransmissionAlarm(this));
474 } 473 }
475 474
476 TestConnectionHelper::TestAlarm* GetAbandonFecAlarm() {
477 return reinterpret_cast<TestConnectionHelper::TestAlarm*>(
478 QuicConnectionPeer::GetAbandonFecAlarm(this));
479 }
480
481 TestConnectionHelper::TestAlarm* GetSendAlarm() { 475 TestConnectionHelper::TestAlarm* GetSendAlarm() {
482 return reinterpret_cast<TestConnectionHelper::TestAlarm*>( 476 return reinterpret_cast<TestConnectionHelper::TestAlarm*>(
483 QuicConnectionPeer::GetSendAlarm(this)); 477 QuicConnectionPeer::GetSendAlarm(this));
484 } 478 }
485 479
486 TestConnectionHelper::TestAlarm* GetResumeWritesAlarm() { 480 TestConnectionHelper::TestAlarm* GetResumeWritesAlarm() {
487 return reinterpret_cast<TestConnectionHelper::TestAlarm*>( 481 return reinterpret_cast<TestConnectionHelper::TestAlarm*>(
488 QuicConnectionPeer::GetResumeWritesAlarm(this)); 482 QuicConnectionPeer::GetResumeWritesAlarm(this));
489 } 483 }
490 484
491 TestConnectionHelper::TestAlarm* GetTimeoutAlarm() { 485 TestConnectionHelper::TestAlarm* GetTimeoutAlarm() {
492 return reinterpret_cast<TestConnectionHelper::TestAlarm*>( 486 return reinterpret_cast<TestConnectionHelper::TestAlarm*>(
493 QuicConnectionPeer::GetTimeoutAlarm(this)); 487 QuicConnectionPeer::GetTimeoutAlarm(this));
494 } 488 }
495 489
496 using QuicConnection::SelectMutualVersion; 490 using QuicConnection::SelectMutualVersion;
497 491
498 private: 492 private:
499 TestConnectionHelper* helper_; 493 TestConnectionHelper* helper_;
500 TestPacketWriter* writer_; 494 TestPacketWriter* writer_;
501 495
502 DISALLOW_COPY_AND_ASSIGN(TestConnection); 496 DISALLOW_COPY_AND_ASSIGN(TestConnection);
503 }; 497 };
504 498
505 class QuicConnectionTest : public ::testing::TestWithParam<bool> { 499 class QuicConnectionTest : public ::testing::TestWithParam<bool> {
506 protected: 500 protected:
507 QuicConnectionTest() 501 QuicConnectionTest()
508 : guid_(42), 502 : guid_(42),
509 framer_(QuicSupportedVersions(), QuicTime::Zero(), false), 503 framer_(QuicSupportedVersions(), QuicTime::Zero(), false),
510 creator_(guid_, &framer_, QuicRandom::GetInstance(), false), 504 creator_(guid_, &framer_, &random_generator_, false),
511 send_algorithm_(new StrictMock<MockSendAlgorithm>), 505 send_algorithm_(new StrictMock<MockSendAlgorithm>),
512 helper_(new TestConnectionHelper(&clock_, &random_generator_)), 506 helper_(new TestConnectionHelper(&clock_, &random_generator_)),
513 writer_(new TestPacketWriter()), 507 writer_(new TestPacketWriter()),
514 connection_(guid_, IPEndPoint(), helper_.get(), writer_.get(), false), 508 connection_(guid_, IPEndPoint(), helper_.get(), writer_.get(), false),
515 frame1_(1, false, 0, MakeIOVector(data1)), 509 frame1_(1, false, 0, MakeIOVector(data1)),
516 frame2_(1, false, 3, MakeIOVector(data2)), 510 frame2_(1, false, 3, MakeIOVector(data2)),
517 accept_packet_(true) { 511 accept_packet_(true) {
518 connection_.set_visitor(&visitor_); 512 connection_.set_visitor(&visitor_);
519 connection_.SetSendAlgorithm(send_algorithm_); 513 connection_.SetSendAlgorithm(send_algorithm_);
520 framer_.set_received_entropy_calculator(&entropy_calculator_); 514 framer_.set_received_entropy_calculator(&entropy_calculator_);
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after
913 QuicPacketSequenceNumber num_packets = 256 * 2 + 1; 907 QuicPacketSequenceNumber num_packets = 256 * 2 + 1;
914 for (QuicPacketSequenceNumber i = 0; i < num_packets; ++i) { 908 for (QuicPacketSequenceNumber i = 0; i < num_packets; ++i) {
915 SendStreamDataToPeer(1, "foo", i * 3, !kFin, NULL); 909 SendStreamDataToPeer(1, "foo", i * 3, !kFin, NULL);
916 } 910 }
917 911
918 QuicAckFrame frame(num_packets, QuicTime::Zero(), 1); 912 QuicAckFrame frame(num_packets, QuicTime::Zero(), 1);
919 // Create an ack with 256 nacks, none adjacent to one another. 913 // Create an ack with 256 nacks, none adjacent to one another.
920 for (QuicPacketSequenceNumber i = 1; i <= 256; ++i) { 914 for (QuicPacketSequenceNumber i = 1; i <= 256; ++i) {
921 frame.received_info.missing_packets.insert(i * 2); 915 frame.received_info.missing_packets.insert(i * 2);
922 } 916 }
917 frame.received_info.entropy_hash = 0;
923 EXPECT_CALL(entropy_calculator_, 918 EXPECT_CALL(entropy_calculator_,
924 EntropyHash(511)).WillOnce(testing::Return(0)); 919 EntropyHash(511)).WillOnce(testing::Return(0));
925 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(256); 920 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(256);
926 EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(10); 921 EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(10);
927 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(10); 922 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(10);
928 ProcessAckPacket(&frame); 923 ProcessAckPacket(&frame);
929 924
930 QuicReceivedPacketManager* received_packet_manager = 925 QuicReceivedPacketManager* received_packet_manager =
931 QuicConnectionPeer::GetReceivedPacketManager(&connection_); 926 QuicConnectionPeer::GetReceivedPacketManager(&connection_);
932 // A truncated ack will not have the true largest observed. 927 // A truncated ack will not have the true largest observed.
933 EXPECT_GT(num_packets, 928 EXPECT_GT(num_packets,
934 received_packet_manager->peer_largest_observed_packet()); 929 received_packet_manager->peer_largest_observed_packet());
935 930
936 frame.received_info.missing_packets.erase(192); 931 frame.received_info.missing_packets.erase(192);
932 frame.received_info.entropy_hash = 2;
937 933
938 // Removing one missing packet allows us to ack 192 and one more range. 934 // Removing one missing packet allows us to ack 192 and one more range.
939 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(2); 935 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(2);
940 EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(10); 936 EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)).Times(10);
941 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(10); 937 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(10);
942 ProcessAckPacket(&frame); 938 ProcessAckPacket(&frame);
943 EXPECT_EQ(num_packets, 939 EXPECT_EQ(num_packets,
944 received_packet_manager->peer_largest_observed_packet()); 940 received_packet_manager->peer_largest_observed_packet());
945 } 941 }
946 942
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
1017 1013
1018 ProcessAckPacket(&frame2); 1014 ProcessAckPacket(&frame2);
1019 // Now if the peer sends an ack which still reports the retransmitted packet 1015 // Now if the peer sends an ack which still reports the retransmitted packet
1020 // as missing, then that will count as a packet which instigates an ack. 1016 // as missing, then that will count as a packet which instigates an ack.
1021 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NOT_RETRANSMISSION, _)); 1017 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NOT_RETRANSMISSION, _));
1022 ProcessAckPacket(&frame2); 1018 ProcessAckPacket(&frame2);
1023 ProcessAckPacket(&frame2); 1019 ProcessAckPacket(&frame2);
1024 1020
1025 // But an ack with no missing packets will not send an ack. 1021 // But an ack with no missing packets will not send an ack.
1026 frame2.received_info.missing_packets.clear(); 1022 frame2.received_info.missing_packets.clear();
1023 frame2.received_info.entropy_hash =
1024 QuicConnectionPeer::GetSentEntropyHash(&connection_, retransmission);
1027 ProcessAckPacket(&frame2); 1025 ProcessAckPacket(&frame2);
1028 ProcessAckPacket(&frame2); 1026 ProcessAckPacket(&frame2);
1029 } 1027 }
1030 1028
1031 TEST_F(QuicConnectionTest, LeastUnackedLower) { 1029 TEST_F(QuicConnectionTest, LeastUnackedLower) {
1032 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 1030 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1033 1031
1034 SendStreamDataToPeer(1, "foo", 0, !kFin, NULL); 1032 SendStreamDataToPeer(1, "foo", 0, !kFin, NULL);
1035 SendStreamDataToPeer(1, "bar", 3, !kFin, NULL); 1033 SendStreamDataToPeer(1, "bar", 3, !kFin, NULL);
1036 SendStreamDataToPeer(1, "eep", 6, !kFin, NULL); 1034 SendStreamDataToPeer(1, "eep", 6, !kFin, NULL);
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
1289 TEST_F(QuicConnectionTest, AbandonFECFromCongestionWindow) { 1287 TEST_F(QuicConnectionTest, AbandonFECFromCongestionWindow) {
1290 connection_.options()->max_packets_per_fec_group = 1; 1288 connection_.options()->max_packets_per_fec_group = 1;
1291 // 1 Data and 1 FEC packet. 1289 // 1 Data and 1 FEC packet.
1292 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2); 1290 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2);
1293 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL); 1291 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
1294 1292
1295 const QuicTime::Delta retransmission_time = 1293 const QuicTime::Delta retransmission_time =
1296 QuicTime::Delta::FromMilliseconds(5000); 1294 QuicTime::Delta::FromMilliseconds(5000);
1297 clock_.AdvanceTime(retransmission_time); 1295 clock_.AdvanceTime(retransmission_time);
1298 1296
1299 // Abandon FEC packet. 1297 // Abandon FEC packet and data packet.
1300 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(1); 1298 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(2);
1299 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout());
1300 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
1301 EXPECT_CALL(visitor_, OnCanWrite()); 1301 EXPECT_CALL(visitor_, OnCanWrite());
1302 connection_.OnAbandonFecTimeout(); 1302 connection_.OnRetransmissionTimeout();
1303 } 1303 }
1304 1304
1305 TEST_F(QuicConnectionTest, DontAbandonAckedFEC) { 1305 TEST_F(QuicConnectionTest, DontAbandonAckedFEC) {
1306 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 1306 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1307 connection_.options()->max_packets_per_fec_group = 1; 1307 connection_.options()->max_packets_per_fec_group = 1;
1308 1308
1309 // 1 Data and 1 FEC packet. 1309 // 1 Data and 1 FEC packet.
1310 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(6); 1310 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(6);
1311 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL); 1311 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
1312 // Send some more data afterwards to ensure early retransmit doesn't trigger. 1312 // Send some more data afterwards to ensure early retransmit doesn't trigger.
(...skipping 10 matching lines...) Expand all
1323 QuicConnectionPeer::GetSentEntropyHash(&connection_, 1); 1323 QuicConnectionPeer::GetSentEntropyHash(&connection_, 1);
1324 1324
1325 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(1); 1325 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(1);
1326 1326
1327 ProcessAckPacket(&ack_fec); 1327 ProcessAckPacket(&ack_fec);
1328 1328
1329 clock_.AdvanceTime(DefaultRetransmissionTime()); 1329 clock_.AdvanceTime(DefaultRetransmissionTime());
1330 1330
1331 // Don't abandon the acked FEC packet, but it will abandon 2 the subsequent 1331 // Don't abandon the acked FEC packet, but it will abandon 2 the subsequent
1332 // FEC packets. 1332 // FEC packets.
1333 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(2); 1333 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)).Times(5);
1334 connection_.GetAbandonFecAlarm()->Fire(); 1334 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout());
1335 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(3);
1336 connection_.GetRetransmissionAlarm()->Fire();
1337 }
1338
1339 TEST_F(QuicConnectionTest, DontAbandonAllFEC) {
1340 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1341 connection_.options()->max_packets_per_fec_group = 1;
1342
1343 // 1 Data and 1 FEC packet.
1344 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(6);
1345 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
1346 // Send some more data afterwards to ensure early retransmit doesn't trigger.
1347 connection_.SendStreamDataWithString(1, "foo", 3, !kFin, NULL);
1348 // Advance the time so not all the FEC packets are abandoned.
1349 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
1350 connection_.SendStreamDataWithString(1, "foo", 6, !kFin, NULL);
1351
1352 QuicAckFrame ack_fec(5, QuicTime::Zero(), 1);
1353 // Ack all data packets, but no fec packets.
1354 ack_fec.received_info.missing_packets.insert(2);
1355 ack_fec.received_info.missing_packets.insert(4);
1356 ack_fec.received_info.entropy_hash =
1357 QuicConnectionPeer::GetSentEntropyHash(&connection_, 5) ^
1358 QuicConnectionPeer::GetSentEntropyHash(&connection_, 4) ^
1359 QuicConnectionPeer::GetSentEntropyHash(&connection_, 3) ^
1360 QuicConnectionPeer::GetSentEntropyHash(&connection_, 2) ^
1361 QuicConnectionPeer::GetSentEntropyHash(&connection_, 1);
1362
1363 // Lose the first FEC packet and ack the three data packets.
1364 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(3);
1365 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(2, _));
1366 EXPECT_CALL(*send_algorithm_, OnPacketLost(2, _));
1367 ProcessAckPacket(&ack_fec);
1368
1369 clock_.AdvanceTime(DefaultRetransmissionTime().Subtract(
1370 QuicTime::Delta::FromMilliseconds(1)));
1371
1372 // Don't abandon the acked FEC packet, but it will abandon 1 of the subsequent
1373 // FEC packets.
1374 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(4, _));
1375 connection_.GetRetransmissionAlarm()->Fire();
1376
1377 // Ensure the connection's alarm is still set, in order to abandon the third
1378 // FEC packet.
1379 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet());
1335 } 1380 }
1336 1381
1337 TEST_F(QuicConnectionTest, FramePacking) { 1382 TEST_F(QuicConnectionTest, FramePacking) {
1338 // Block the connection. 1383 // Block the connection.
1339 connection_.GetSendAlarm()->Set( 1384 connection_.GetSendAlarm()->Set(
1340 clock_.ApproximateNow().Add(QuicTime::Delta::FromSeconds(1))); 1385 clock_.ApproximateNow().Add(QuicTime::Delta::FromSeconds(1)));
1341 1386
1342 // Send an ack and two stream frames in 1 packet by queueing them. 1387 // Send an ack and two stream frames in 1 packet by queueing them.
1343 connection_.SendAck(); 1388 connection_.SendAck();
1344 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll( 1389 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll(
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after
1646 QuicConnectionPeer::GetSentEntropyHash(&connection_, 1); 1691 QuicConnectionPeer::GetSentEntropyHash(&connection_, 1);
1647 // The first nack should trigger a fast retransmission, but we'll be 1692 // The first nack should trigger a fast retransmission, but we'll be
1648 // write blocked, so the packet will be queued. 1693 // write blocked, so the packet will be queued.
1649 writer_->set_blocked(true); 1694 writer_->set_blocked(true);
1650 1695
1651 ProcessAckPacket(&nack_two); 1696 ProcessAckPacket(&nack_two);
1652 EXPECT_EQ(1u, connection_.NumQueuedPackets()); 1697 EXPECT_EQ(1u, connection_.NumQueuedPackets());
1653 1698
1654 // Now, ack the previous transmission. 1699 // Now, ack the previous transmission.
1655 QuicAckFrame ack_all(3, QuicTime::Zero(), 0); 1700 QuicAckFrame ack_all(3, QuicTime::Zero(), 0);
1656 nack_two.received_info.entropy_hash = 1701 ack_all.received_info.entropy_hash =
1657 QuicConnectionPeer::GetSentEntropyHash(&connection_, 3); 1702 QuicConnectionPeer::GetSentEntropyHash(&connection_, 3);
1658 ProcessAckPacket(&ack_all); 1703 ProcessAckPacket(&ack_all);
1659 1704
1660 // Unblock the socket and attempt to send the queued packets. However, 1705 // Unblock the socket and attempt to send the queued packets. However,
1661 // since the previous transmission has been acked, we will not 1706 // since the previous transmission has been acked, we will not
1662 // send the retransmission. 1707 // send the retransmission.
1663 EXPECT_CALL(*send_algorithm_, 1708 EXPECT_CALL(*send_algorithm_,
1664 OnPacketSent(_, _, _, _, _)).Times(0); 1709 OnPacketSent(_, _, _, _, _)).Times(0);
1665 1710
1666 writer_->set_blocked(false); 1711 writer_->set_blocked(false);
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
1788 EXPECT_EQ(5u, last_packet); 1833 EXPECT_EQ(5u, last_packet);
1789 SendStreamDataToPeer(3, "foo", 3, !kFin, &last_packet); // Packet 6 1834 SendStreamDataToPeer(3, "foo", 3, !kFin, &last_packet); // Packet 6
1790 EXPECT_EQ(6u, last_packet); 1835 EXPECT_EQ(6u, last_packet);
1791 1836
1792 // Client will ack packets 1, 2, [!3], 4, 5. 1837 // Client will ack packets 1, 2, [!3], 4, 5.
1793 QuicAckFrame frame1(5, QuicTime::Zero(), 0); 1838 QuicAckFrame frame1(5, QuicTime::Zero(), 0);
1794 frame1.received_info.missing_packets.insert(3); 1839 frame1.received_info.missing_packets.insert(3);
1795 frame1.received_info.entropy_hash = 1840 frame1.received_info.entropy_hash =
1796 QuicConnectionPeer::GetSentEntropyHash(&connection_, 5) ^ 1841 QuicConnectionPeer::GetSentEntropyHash(&connection_, 5) ^
1797 QuicConnectionPeer::GetSentEntropyHash(&connection_, 3) ^ 1842 QuicConnectionPeer::GetSentEntropyHash(&connection_, 3) ^
1798 QuicConnectionPeer::GetSentEntropyHash(&connection_, 1); 1843 QuicConnectionPeer::GetSentEntropyHash(&connection_, 2);
1799 1844
1800 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 1845 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1801 1846
1802 ProcessAckPacket(&frame1); 1847 ProcessAckPacket(&frame1);
1803 1848
1804 // Now the client implicitly acks 3, and explicitly acks 6. 1849 // Now the client implicitly acks 3, and explicitly acks 6.
1805 QuicAckFrame frame2(6, QuicTime::Zero(), 0); 1850 QuicAckFrame frame2(6, QuicTime::Zero(), 0);
1806 frame2.received_info.entropy_hash = 1851 frame2.received_info.entropy_hash =
1807 QuicConnectionPeer::GetSentEntropyHash(&connection_, 6); 1852 QuicConnectionPeer::GetSentEntropyHash(&connection_, 6);
1808 1853
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
1925 1970
1926 connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(0x02)); 1971 connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(0x02));
1927 connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL); 1972 connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL);
1928 SendStreamDataToPeer(1, "foo", 0, !kFin, NULL); 1973 SendStreamDataToPeer(1, "foo", 0, !kFin, NULL);
1929 EXPECT_EQ(0x02020202u, final_bytes_of_last_packet()); 1974 EXPECT_EQ(0x02020202u, final_bytes_of_last_packet());
1930 1975
1931 EXPECT_EQ(default_retransmission_time, 1976 EXPECT_EQ(default_retransmission_time,
1932 connection_.GetRetransmissionAlarm()->deadline()); 1977 connection_.GetRetransmissionAlarm()->deadline());
1933 { 1978 {
1934 InSequence s; 1979 InSequence s;
1935 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout());
1936 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _)); 1980 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, _));
1937 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(2, _)); 1981 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(2, _));
1982 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout());
1938 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, 3, _, RTO_RETRANSMISSION, _)); 1983 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, 3, _, RTO_RETRANSMISSION, _));
1939 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, 4, _, RTO_RETRANSMISSION, _)); 1984 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, 4, _, RTO_RETRANSMISSION, _));
1940 } 1985 }
1941 1986
1942 // Simulate the retransmission alarm firing. 1987 // Simulate the retransmission alarm firing.
1943 clock_.AdvanceTime(DefaultRetransmissionTime()); 1988 clock_.AdvanceTime(DefaultRetransmissionTime());
1944 connection_.GetRetransmissionAlarm()->Fire(); 1989 connection_.GetRetransmissionAlarm()->Fire();
1945 1990
1946 // Packet should have been sent with ENCRYPTION_NONE. 1991 // Packet should have been sent with ENCRYPTION_NONE.
1947 EXPECT_EQ(0x01010101u, final_bytes_of_previous_packet()); 1992 EXPECT_EQ(0x01010101u, final_bytes_of_previous_packet());
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
2123 // Ack packets might generate some other packets, which are not 2168 // Ack packets might generate some other packets, which are not
2124 // retransmissions. (More ack packets). 2169 // retransmissions. (More ack packets).
2125 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NOT_RETRANSMISSION, _)) 2170 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NOT_RETRANSMISSION, _))
2126 .Times(AnyNumber()); 2171 .Times(AnyNumber());
2127 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NACK_RETRANSMISSION, _)) 2172 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NACK_RETRANSMISSION, _))
2128 .WillOnce(DoAll(SaveArg<1>(&nack_sequence_number), Return(true))); 2173 .WillOnce(DoAll(SaveArg<1>(&nack_sequence_number), Return(true)));
2129 QuicAckFrame ack(rto_sequence_number, QuicTime::Zero(), 0); 2174 QuicAckFrame ack(rto_sequence_number, QuicTime::Zero(), 0);
2130 // Ack the retransmitted packet. 2175 // Ack the retransmitted packet.
2131 ack.received_info.missing_packets.insert(original_sequence_number); 2176 ack.received_info.missing_packets.insert(original_sequence_number);
2132 ack.received_info.missing_packets.insert(rto_sequence_number); 2177 ack.received_info.missing_packets.insert(rto_sequence_number);
2133 ack.received_info.entropy_hash = QuicConnectionPeer::GetSentEntropyHash( 2178 ack.received_info.entropy_hash =
2134 &connection_, rto_sequence_number - 1); 2179 QuicConnectionPeer::GetSentEntropyHash(&connection_,
2180 rto_sequence_number - 1) ^
2181 QuicConnectionPeer::GetSentEntropyHash(&connection_,
2182 original_sequence_number);
2135 for (int i = 0; i < 3; i++) { 2183 for (int i = 0; i < 3; i++) {
2136 ProcessAckPacket(&ack); 2184 ProcessAckPacket(&ack);
2137 } 2185 }
2138 ASSERT_NE(0u, nack_sequence_number); 2186 ASSERT_NE(0u, nack_sequence_number);
2139 EXPECT_FALSE(QuicConnectionPeer::IsSavedForRetransmission( 2187 EXPECT_FALSE(QuicConnectionPeer::IsSavedForRetransmission(
2140 &connection_, rto_sequence_number)); 2188 &connection_, rto_sequence_number));
2141 ASSERT_TRUE(QuicConnectionPeer::IsSavedForRetransmission( 2189 ASSERT_TRUE(QuicConnectionPeer::IsSavedForRetransmission(
2142 &connection_, nack_sequence_number)); 2190 &connection_, nack_sequence_number));
2143 EXPECT_TRUE(QuicConnectionPeer::IsRetransmission( 2191 EXPECT_TRUE(QuicConnectionPeer::IsRetransmission(
2144 &connection_, nack_sequence_number)); 2192 &connection_, nack_sequence_number));
(...skipping 18 matching lines...) Expand all
2163 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL); 2211 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
2164 connection_.SendStreamDataWithString(2, "bar", 0, !kFin, NULL); 2212 connection_.SendStreamDataWithString(2, "bar", 0, !kFin, NULL);
2165 QuicAlarm* retransmission_alarm = connection_.GetRetransmissionAlarm(); 2213 QuicAlarm* retransmission_alarm = connection_.GetRetransmissionAlarm();
2166 EXPECT_TRUE(retransmission_alarm->IsSet()); 2214 EXPECT_TRUE(retransmission_alarm->IsSet());
2167 2215
2168 // Advance the time right before the RTO, then receive an ack for the first 2216 // Advance the time right before the RTO, then receive an ack for the first
2169 // packet to delay the RTO. 2217 // packet to delay the RTO.
2170 clock_.AdvanceTime(DefaultRetransmissionTime()); 2218 clock_.AdvanceTime(DefaultRetransmissionTime());
2171 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(1); 2219 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(1);
2172 QuicAckFrame ack(1, QuicTime::Zero(), 0); 2220 QuicAckFrame ack(1, QuicTime::Zero(), 0);
2221 ack.received_info.entropy_hash =
2222 QuicConnectionPeer::GetSentEntropyHash(&connection_, 1);
2173 ProcessAckPacket(&ack); 2223 ProcessAckPacket(&ack);
2174 EXPECT_TRUE(retransmission_alarm->IsSet()); 2224 EXPECT_TRUE(retransmission_alarm->IsSet());
2175 2225
2176 // Move forward past the original RTO and ensure the RTO is still pending. 2226 // Move forward past the original RTO and ensure the RTO is still pending.
2177 clock_.AdvanceTime(DefaultRetransmissionTime()); 2227 clock_.AdvanceTime(DefaultRetransmissionTime());
2178 2228
2179 // Ensure the second packet gets retransmitted when it finally fires. 2229 // Ensure the second packet gets retransmitted when it finally fires.
2180 EXPECT_TRUE(retransmission_alarm->IsSet()); 2230 EXPECT_TRUE(retransmission_alarm->IsSet());
2181 EXPECT_GE(retransmission_alarm->deadline(), clock_.ApproximateNow()); 2231 EXPECT_GE(retransmission_alarm->deadline(), clock_.ApproximateNow());
2182 clock_.AdvanceTime(DefaultRetransmissionTime()); 2232 clock_.AdvanceTime(DefaultRetransmissionTime());
(...skipping 954 matching lines...) Expand 10 before | Expand all | Expand 10 after
3137 // Create a delegate which we expect to be called. 3187 // Create a delegate which we expect to be called.
3138 MockAckNotifierDelegate delegate; 3188 MockAckNotifierDelegate delegate;
3139 EXPECT_CALL(delegate, OnAckNotification()).Times(1);; 3189 EXPECT_CALL(delegate, OnAckNotification()).Times(1);;
3140 3190
3141 // Send some data, which will register the delegate to be notified. 3191 // Send some data, which will register the delegate to be notified.
3142 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, &delegate); 3192 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, &delegate);
3143 3193
3144 // Process an ACK from the server which should trigger the callback. 3194 // Process an ACK from the server which should trigger the callback.
3145 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(1); 3195 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(1);
3146 QuicAckFrame frame(1, QuicTime::Zero(), 0); 3196 QuicAckFrame frame(1, QuicTime::Zero(), 0);
3197 frame.received_info.entropy_hash =
3198 QuicConnectionPeer::GetSentEntropyHash(&connection_, 1);
3147 ProcessAckPacket(&frame); 3199 ProcessAckPacket(&frame);
3148 } 3200 }
3149 3201
3150 TEST_F(QuicConnectionTest, AckNotifierFailToTriggerCallback) { 3202 TEST_F(QuicConnectionTest, AckNotifierFailToTriggerCallback) {
3151 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 3203 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3152 3204
3153 // Create a delegate which we don't expect to be called. 3205 // Create a delegate which we don't expect to be called.
3154 MockAckNotifierDelegate delegate; 3206 MockAckNotifierDelegate delegate;
3155 EXPECT_CALL(delegate, OnAckNotification()).Times(0);; 3207 EXPECT_CALL(delegate, OnAckNotification()).Times(0);;
3156 3208
3157 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(2); 3209 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(2);
3158 3210
3159 // Send some data, which will register the delegate to be notified. This will 3211 // Send some data, which will register the delegate to be notified. This will
3160 // not be ACKed and so the delegate should never be called. 3212 // not be ACKed and so the delegate should never be called.
3161 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, &delegate); 3213 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, &delegate);
3162 3214
3163 // Send some other data which we will ACK. 3215 // Send some other data which we will ACK.
3164 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL); 3216 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
3165 connection_.SendStreamDataWithString(1, "bar", 0, !kFin, NULL); 3217 connection_.SendStreamDataWithString(1, "bar", 0, !kFin, NULL);
3166 3218
3167 // Now we receive ACK for packets 2 and 3, but importantly missing packet 1 3219 // Now we receive ACK for packets 2 and 3, but importantly missing packet 1
3168 // which we registered to be notified about. 3220 // which we registered to be notified about.
3169 QuicAckFrame frame(3, QuicTime::Zero(), 0); 3221 QuicAckFrame frame(3, QuicTime::Zero(), 0);
3170 frame.received_info.missing_packets.insert(1); 3222 frame.received_info.missing_packets.insert(1);
3223 frame.received_info.entropy_hash =
3224 QuicConnectionPeer::GetSentEntropyHash(&connection_, 3) ^
3225 QuicConnectionPeer::GetSentEntropyHash(&connection_, 1);
3171 EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _)); 3226 EXPECT_CALL(*send_algorithm_, OnPacketLost(_, _));
3172 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _)); 3227 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(_, _));
3173 ProcessAckPacket(&frame); 3228 ProcessAckPacket(&frame);
3174 } 3229 }
3175 3230
3176 TEST_F(QuicConnectionTest, AckNotifierCallbackAfterRetransmission) { 3231 TEST_F(QuicConnectionTest, AckNotifierCallbackAfterRetransmission) {
3177 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 3232 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3178 3233
3179 // Create a delegate which we expect to be called. 3234 // Create a delegate which we expect to be called.
3180 MockAckNotifierDelegate delegate; 3235 MockAckNotifierDelegate delegate;
3181 EXPECT_CALL(delegate, OnAckNotification()).Times(1);; 3236 EXPECT_CALL(delegate, OnAckNotification()).Times(1);;
3182 3237
3183 // In total expect ACKs for all 4 packets. 3238 // In total expect ACKs for all 4 packets.
3184 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(4); 3239 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(4);
3185 3240
3186 // Send four packets, and register to be notified on ACK of packet 2. 3241 // Send four packets, and register to be notified on ACK of packet 2.
3187 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL); 3242 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
3188 connection_.SendStreamDataWithString(1, "bar", 0, !kFin, &delegate); 3243 connection_.SendStreamDataWithString(1, "bar", 0, !kFin, &delegate);
3189 connection_.SendStreamDataWithString(1, "baz", 0, !kFin, NULL); 3244 connection_.SendStreamDataWithString(1, "baz", 0, !kFin, NULL);
3190 connection_.SendStreamDataWithString(1, "qux", 0, !kFin, NULL); 3245 connection_.SendStreamDataWithString(1, "qux", 0, !kFin, NULL);
3191 3246
3192 // Now we receive ACK for packets 1, 3, and 4, which invokes fast retransmit. 3247 // Now we receive ACK for packets 1, 3, and 4, which invokes fast retransmit.
3193 QuicAckFrame frame(4, QuicTime::Zero(), 0); 3248 QuicAckFrame frame(4, QuicTime::Zero(), 0);
3194 frame.received_info.missing_packets.insert(2); 3249 frame.received_info.missing_packets.insert(2);
3250 frame.received_info.entropy_hash =
3251 QuicConnectionPeer::GetSentEntropyHash(&connection_, 4) ^
3252 QuicConnectionPeer::GetSentEntropyHash(&connection_, 2) ^
3253 QuicConnectionPeer::GetSentEntropyHash(&connection_, 1);
3195 EXPECT_CALL(*send_algorithm_, OnPacketLost(2, _)); 3254 EXPECT_CALL(*send_algorithm_, OnPacketLost(2, _));
3196 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(2, _)); 3255 EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(2, _));
3197 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)); 3256 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
3198 ProcessAckPacket(&frame); 3257 ProcessAckPacket(&frame);
3199 3258
3200 // Now we get an ACK for packet 5 (retransmitted packet 2), which should 3259 // Now we get an ACK for packet 5 (retransmitted packet 2), which should
3201 // trigger the callback. 3260 // trigger the callback.
3202 QuicAckFrame second_ack_frame(5, QuicTime::Zero(), 0); 3261 QuicAckFrame second_ack_frame(5, QuicTime::Zero(), 0);
3262 second_ack_frame.received_info.entropy_hash =
3263 QuicConnectionPeer::GetSentEntropyHash(&connection_, 5);
3203 ProcessAckPacket(&second_ack_frame); 3264 ProcessAckPacket(&second_ack_frame);
3204 } 3265 }
3205 3266
3206 // TODO(rjshade): Add a similar test that FEC recovery on peer (and resulting 3267 // TODO(rjshade): Add a similar test that FEC recovery on peer (and resulting
3207 // ACK) triggers notification on our end. 3268 // ACK) triggers notification on our end.
3208 TEST_F(QuicConnectionTest, AckNotifierCallbackAfterFECRecovery) { 3269 TEST_F(QuicConnectionTest, AckNotifierCallbackAfterFECRecovery) {
3209 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); 3270 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3210 EXPECT_CALL(visitor_, OnCanWrite()).Times(1).WillOnce(Return(true)); 3271 EXPECT_CALL(visitor_, OnCanWrite()).Times(1).WillOnce(Return(true));
3211 3272
3212 // Create a delegate which we expect to be called. 3273 // Create a delegate which we expect to be called.
3213 MockAckNotifierDelegate delegate; 3274 MockAckNotifierDelegate delegate;
3214 EXPECT_CALL(delegate, OnAckNotification()).Times(1);; 3275 EXPECT_CALL(delegate, OnAckNotification()).Times(1);;
3215 3276
3216 // Expect ACKs for 1 packet. 3277 // Expect ACKs for 1 packet.
3217 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(1); 3278 EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _, _)).Times(1);
3218 3279
3219 // Send one packet, and register to be notified on ACK. 3280 // Send one packet, and register to be notified on ACK.
3220 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, &delegate); 3281 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, &delegate);
3221 3282
3222 // Ack packet gets dropped, but we receive an FEC packet that covers it. 3283 // Ack packet gets dropped, but we receive an FEC packet that covers it.
3223 // Should recover the Ack packet and trigger the notification callback. 3284 // Should recover the Ack packet and trigger the notification callback.
3224 QuicFrames frames; 3285 QuicFrames frames;
3225 3286
3226 QuicAckFrame ack_frame(1, QuicTime::Zero(), 0); 3287 QuicAckFrame ack_frame(1, QuicTime::Zero(), 0);
3288 ack_frame.received_info.entropy_hash =
3289 QuicConnectionPeer::GetSentEntropyHash(&connection_, 1);
3227 frames.push_back(QuicFrame(&ack_frame)); 3290 frames.push_back(QuicFrame(&ack_frame));
3228 3291
3229 // Dummy stream frame to satisfy expectations set elsewhere. 3292 // Dummy stream frame to satisfy expectations set elsewhere.
3230 frames.push_back(QuicFrame(&frame1_)); 3293 frames.push_back(QuicFrame(&frame1_));
3231 3294
3232 QuicPacketHeader ack_header; 3295 QuicPacketHeader ack_header;
3233 ack_header.public_header.guid = guid_; 3296 ack_header.public_header.guid = guid_;
3234 ack_header.public_header.reset_flag = false; 3297 ack_header.public_header.reset_flag = false;
3235 ack_header.public_header.version_flag = false; 3298 ack_header.public_header.version_flag = false;
3236 ack_header.entropy_flag = !kEntropyFlag; 3299 ack_header.entropy_flag = !kEntropyFlag;
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
3316 true); 3379 true);
3317 TestConnection client(guid_, IPEndPoint(), helper_.get(), writer_.get(), 3380 TestConnection client(guid_, IPEndPoint(), helper_.get(), writer_.get(),
3318 false); 3381 false);
3319 EXPECT_TRUE(client.sent_packet_manager().using_pacing()); 3382 EXPECT_TRUE(client.sent_packet_manager().using_pacing());
3320 EXPECT_FALSE(server.sent_packet_manager().using_pacing()); 3383 EXPECT_FALSE(server.sent_packet_manager().using_pacing());
3321 } 3384 }
3322 3385
3323 } // namespace 3386 } // namespace
3324 } // namespace test 3387 } // namespace test
3325 } // namespace net 3388 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_connection.cc ('k') | net/quic/quic_crypto_client_stream_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698