summaryrefslogtreecommitdiffstats
path: root/net/quic
diff options
context:
space:
mode:
authorrch@chromium.org <rch@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-08 23:48:06 +0000
committerrch@chromium.org <rch@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-08 23:48:06 +0000
commit2bc11d74250d67238c9c7c5ea74c89ed0636601c (patch)
treee5dad2c6195ee80331bccc972b68a76fc63732a4 /net/quic
parentbb82b85e757c66c34f3f12e83dd461055ebadfde (diff)
downloadchromium_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.cc6
-rw-r--r--net/quic/quic_connection_helper_test.cc34
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();