diff options
author | rch@chromium.org <rch@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-08 23:48:06 +0000 |
---|---|---|
committer | rch@chromium.org <rch@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-08 23:48:06 +0000 |
commit | 2bc11d74250d67238c9c7c5ea74c89ed0636601c (patch) | |
tree | e5dad2c6195ee80331bccc972b68a76fc63732a4 /net/quic | |
parent | bb82b85e757c66c34f3f12e83dd461055ebadfde (diff) | |
download | chromium_src-2bc11d74250d67238c9c7c5ea74c89ed0636601c.zip chromium_src-2bc11d74250d67238c9c7c5ea74c89ed0636601c.tar.gz chromium_src-2bc11d74250d67238c9c7c5ea74c89ed0636601c.tar.bz2 |
Fix bug in QuicConnectionHelper
which effectively prevented packets from being resent more than once.
Review URL: https://chromiumcodereview.appspot.com/18826003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@210459 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/quic')
-rw-r--r-- | net/quic/quic_connection_helper.cc | 6 | ||||
-rw-r--r-- | net/quic/quic_connection_helper_test.cc | 34 |
2 files changed, 38 insertions, 2 deletions
diff --git a/net/quic/quic_connection_helper.cc b/net/quic/quic_connection_helper.cc index 4a35d82..2dd5f68 100644 --- a/net/quic/quic_connection_helper.cc +++ b/net/quic/quic_connection_helper.cc @@ -140,8 +140,10 @@ void QuicConnectionHelper::UnregisterSendAlarmIfRegistered() { void QuicConnectionHelper::OnRetransmissionAlarm() { QuicTime when = connection_->OnRetransmissionTimeout(); - if (!when.IsInitialized()) { - SetRetransmissionAlarm(clock_->Now().Subtract(when)); + if (when.IsInitialized()) { + QuicTime now = clock_->Now(); + DCHECK_LE(now.ToDebuggingValue(), when.ToDebuggingValue()); + SetRetransmissionAlarm(when.Subtract(now)); } } diff --git a/net/quic/quic_connection_helper_test.cc b/net/quic/quic_connection_helper_test.cc index 677044c..c9c7ba5 100644 --- a/net/quic/quic_connection_helper_test.cc +++ b/net/quic/quic_connection_helper_test.cc @@ -322,6 +322,40 @@ TEST_F(QuicConnectionHelperTest, TestRetransmission) { EXPECT_TRUE(AtEof()); } +TEST_F(QuicConnectionHelperTest, TestMultipleRetransmission) { + AddWrite(SYNCHRONOUS, ConstructDataPacket(1)); + AddWrite(SYNCHRONOUS, ConstructDataPacket(2)); + AddWrite(SYNCHRONOUS, ConstructDataPacket(3)); + Initialize(); + + QuicTime::Delta kDefaultRetransmissionTime = + QuicTime::Delta::FromMilliseconds(500); + QuicTime start = clock_.ApproximateNow(); + + EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, NOT_RETRANSMISSION)); + EXPECT_CALL(*send_algorithm_, AbandoningPacket(1, _)); + // Send a packet. + connection_->SendStreamData(1, kData, 0, false); + EXPECT_CALL(*send_algorithm_, SentPacket(_, 2, _, IS_RETRANSMISSION)); + // Since no ack was received, the retransmission alarm will fire and + // retransmit it. + runner_->RunNextTask(); + + EXPECT_EQ(kDefaultRetransmissionTime, + clock_.ApproximateNow().Subtract(start)); + + // Since no ack was received, the retransmission alarm will fire and + // retransmit it. + EXPECT_CALL(*send_algorithm_, SentPacket(_, 3, _, IS_RETRANSMISSION)); + EXPECT_CALL(*send_algorithm_, AbandoningPacket(2, _)); + runner_->RunNextTask(); + + EXPECT_EQ(kDefaultRetransmissionTime.Add(kDefaultRetransmissionTime), + clock_.ApproximateNow().Subtract(start)); + + EXPECT_TRUE(AtEof()); +} + TEST_F(QuicConnectionHelperTest, InitialTimeout) { AddWrite(SYNCHRONOUS, ConstructClosePacket(1, 0)); Initialize(); |