Index: net/quic/quic_connection_test.cc |
diff --git a/net/quic/quic_connection_test.cc b/net/quic/quic_connection_test.cc |
index d55850b62f05878495024945a9873fd266966b24..6cb5dea342dea9f481fcd3e76c61f4aa7b09afa0 100644 |
--- a/net/quic/quic_connection_test.cc |
+++ b/net/quic/quic_connection_test.cc |
@@ -15,6 +15,8 @@ |
#include "net/quic/test_tools/mock_clock.h" |
#include "net/quic/test_tools/mock_random.h" |
#include "net/quic/test_tools/quic_connection_peer.h" |
+#include "net/quic/test_tools/quic_framer_peer.h" |
+#include "net/quic/test_tools/quic_packet_creator_peer.h" |
#include "net/quic/test_tools/quic_test_utils.h" |
#include "net/quic/quic_utils.h" |
#include "testing/gmock/include/gmock/gmock.h" |
@@ -81,7 +83,8 @@ class TestConnectionHelper : public QuicConnectionHelperInterface { |
retransmission_alarm_(QuicTime::Zero()), |
send_alarm_(QuicTime::FromMilliseconds(-1)), |
timeout_alarm_(QuicTime::Zero()), |
- blocked_(false) { |
+ blocked_(false), |
+ is_server_(true) { |
} |
// QuicConnectionHelperInterface |
@@ -99,7 +102,8 @@ class TestConnectionHelper : public QuicConnectionHelperInterface { |
int* error) OVERRIDE { |
QuicFramer framer(kQuicVersion1, |
QuicDecrypter::Create(kNULL), |
- QuicEncrypter::Create(kNULL)); |
+ QuicEncrypter::Create(kNULL), |
+ is_server_); |
FramerVisitorCapturingFrames visitor; |
framer.set_visitor(&visitor); |
EXPECT_TRUE(framer.ProcessPacket(packet)); |
@@ -114,12 +118,17 @@ class TestConnectionHelper : public QuicConnectionHelperInterface { |
if (visitor.stream_frames() != NULL && !visitor.stream_frames()->empty()) { |
stream_frames_ = *visitor.stream_frames(); |
} |
+ if (visitor.version_negotiation_packet() != NULL) { |
+ version_negotiation_packet_.reset(new QuicVersionNegotiationPacket( |
+ *visitor.version_negotiation_packet())); |
+ } |
if (blocked_) { |
*error = ERR_IO_PENDING; |
return -1; |
} |
*error = 0; |
- return packet.length(); |
+ last_packet_size_ = packet.length(); |
+ return last_packet_size_; |
} |
virtual void SetRetransmissionAlarm(QuicTime::Delta delay) OVERRIDE { |
@@ -163,8 +172,18 @@ class TestConnectionHelper : public QuicConnectionHelperInterface { |
return &stream_frames_; |
} |
+ size_t last_packet_size() { |
+ return last_packet_size_; |
+ } |
+ |
+ QuicVersionNegotiationPacket* version_negotiation_packet() { |
+ return version_negotiation_packet_.get(); |
+ } |
+ |
void set_blocked(bool blocked) { blocked_ = blocked; } |
+ void set_is_server(bool is_server) { is_server_ = is_server; } |
+ |
private: |
MockClock* clock_; |
MockRandom* random_generator_; |
@@ -176,7 +195,10 @@ class TestConnectionHelper : public QuicConnectionHelperInterface { |
scoped_ptr<QuicAckFrame> ack_; |
scoped_ptr<QuicCongestionFeedbackFrame> feedback_; |
vector<QuicStreamFrame> stream_frames_; |
+ scoped_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_; |
+ size_t last_packet_size_; |
bool blocked_; |
+ bool is_server_; |
DISALLOW_COPY_AND_ASSIGN(TestConnectionHelper); |
}; |
@@ -185,8 +207,11 @@ class TestConnection : public QuicConnection { |
public: |
TestConnection(QuicGuid guid, |
IPEndPoint address, |
- TestConnectionHelper* helper) |
- : QuicConnection(guid, address, helper) { |
+ TestConnectionHelper* helper, |
+ bool is_server) |
+ : QuicConnection(guid, address, helper, is_server), |
+ helper_(helper) { |
+ helper_->set_is_server(!is_server); |
} |
void SendAck() { |
@@ -209,10 +234,21 @@ class TestConnection : public QuicConnection { |
return SendStreamData(2u, "food2", 0, !kFin); |
} |
+ bool is_server() { |
+ return QuicConnectionPeer::IsServer(this); |
+ } |
+ |
+ void set_is_server(bool is_server) { |
+ helper_->set_is_server(!is_server); |
+ QuicConnectionPeer::SetIsServer(this, is_server); |
+ } |
+ |
using QuicConnection::SendOrQueuePacket; |
using QuicConnection::DontWaitForPacketsBefore; |
private: |
+ TestConnectionHelper* helper_; |
+ |
DISALLOW_COPY_AND_ASSIGN(TestConnection); |
}; |
@@ -222,11 +258,12 @@ class QuicConnectionTest : public ::testing::Test { |
: guid_(42), |
framer_(kQuicVersion1, |
QuicDecrypter::Create(kNULL), |
- QuicEncrypter::Create(kNULL)), |
- creator_(guid_, &framer_, QuicRandom::GetInstance()), |
+ QuicEncrypter::Create(kNULL), |
+ false), |
+ creator_(guid_, &framer_, QuicRandom::GetInstance(), false), |
send_algorithm_(new StrictMock<MockSendAlgorithm>), |
helper_(new TestConnectionHelper(&clock_, &random_generator_)), |
- connection_(guid_, IPEndPoint(), helper_.get()), |
+ connection_(guid_, IPEndPoint(), helper_.get(), false), |
frame1_(1, false, 0, data1), |
frame2_(1, false, 3, data2), |
accept_packet_(true) { |
@@ -234,11 +271,11 @@ class QuicConnectionTest : public ::testing::Test { |
connection_.SetSendAlgorithm(send_algorithm_); |
// Simplify tests by not sending feedback unless specifically configured. |
SetFeedback(NULL); |
- EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _)).WillRepeatedly(Return( |
+ EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)).WillRepeatedly(Return( |
QuicTime::Delta::Zero())); |
EXPECT_CALL(*receive_algorithm_, |
RecordIncomingPacket(_, _, _, _)).Times(AnyNumber()); |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _, _)).Times(AnyNumber()); |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(AnyNumber()); |
} |
QuicAckFrame* outgoing_ack() { |
@@ -257,6 +294,10 @@ class QuicConnectionTest : public ::testing::Test { |
return helper_->header(); |
} |
+ size_t last_sent_packet_size() { |
+ return helper_->last_packet_size(); |
+ } |
+ |
void ProcessPacket(QuicPacketSequenceNumber number) { |
EXPECT_CALL(visitor_, OnPacket(_, _, _, _)) |
.WillOnce(Return(accept_packet_)); |
@@ -266,6 +307,8 @@ class QuicConnectionTest : public ::testing::Test { |
QuicPacketEntropyHash ProcessFramePacket(QuicFrame frame) { |
QuicFrames frames; |
frames.push_back(QuicFrame(frame)); |
+ QuicPacketCreatorPeer::SetSendVersionInPacket(&creator_, |
+ connection_.is_server()); |
SerializedPacket serialized_packet = creator_.SerializeAllFrames(frames); |
scoped_ptr<QuicPacket> packet(serialized_packet.packet); |
scoped_ptr<QuicEncryptedPacket> encrypted( |
@@ -274,7 +317,7 @@ class QuicConnectionTest : public ::testing::Test { |
return serialized_packet.entropy_hash; |
} |
- void ProcessFecProtectedPacket(QuicPacketSequenceNumber number, |
+ size_t ProcessFecProtectedPacket(QuicPacketSequenceNumber number, |
bool expect_revival) { |
if (expect_revival) { |
EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).Times(2).WillRepeatedly( |
@@ -283,10 +326,10 @@ class QuicConnectionTest : public ::testing::Test { |
EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).WillOnce( |
Return(accept_packet_)); |
} |
- ProcessDataPacket(number, 1, !kEntropyFlag); |
+ return ProcessDataPacket(number, 1, !kEntropyFlag); |
} |
- void ProcessDataPacket(QuicPacketSequenceNumber number, |
+ size_t ProcessDataPacket(QuicPacketSequenceNumber number, |
QuicFecGroupNumber fec_group, |
bool entropy_flag) { |
scoped_ptr<QuicPacket> packet(ConstructDataPacket(number, fec_group, |
@@ -294,6 +337,7 @@ class QuicConnectionTest : public ::testing::Test { |
scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket(number, |
*packet)); |
connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
+ return encrypted->length(); |
} |
void ProcessClosePacket(QuicPacketSequenceNumber number, |
@@ -304,7 +348,7 @@ class QuicConnectionTest : public ::testing::Test { |
connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
} |
- void ProcessFecProtectedPacket(QuicPacketSequenceNumber number, |
+ size_t ProcessFecProtectedPacket(QuicPacketSequenceNumber number, |
bool expect_revival, bool entropy_flag) { |
if (expect_revival) { |
EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).WillOnce(DoAll( |
@@ -312,11 +356,11 @@ class QuicConnectionTest : public ::testing::Test { |
} |
EXPECT_CALL(visitor_, OnPacket(_, _, _, _)).WillOnce(Return(accept_packet_)) |
.RetiresOnSaturation(); |
- ProcessDataPacket(number, 1, entropy_flag); |
+ return ProcessDataPacket(number, 1, entropy_flag); |
} |
// Sends an FEC packet that covers the packets that would have been sent. |
- void ProcessFecPacket(QuicPacketSequenceNumber number, |
+ size_t ProcessFecPacket(QuicPacketSequenceNumber number, |
QuicPacketSequenceNumber min_protected_packet, |
bool expect_revival, |
bool fec_entropy_flag) { |
@@ -357,24 +401,28 @@ class QuicConnectionTest : public ::testing::Test { |
framer_.EncryptPacket(number, *fec_packet)); |
connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
+ return encrypted->length(); |
} |
- void SendStreamDataToPeer(QuicStreamId id, StringPiece data, |
- QuicStreamOffset offset, bool fin, |
- QuicPacketSequenceNumber* last_packet) { |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _, kHasData)); |
+ QuicByteCount SendStreamDataToPeer(QuicStreamId id, StringPiece data, |
+ QuicStreamOffset offset, bool fin, |
+ QuicPacketSequenceNumber* last_packet) { |
+ QuicByteCount packet_size; |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).WillOnce( |
+ SaveArg<2>(&packet_size)); |
connection_.SendStreamData(id, data, offset, fin); |
if (last_packet != NULL) { |
*last_packet = |
QuicConnectionPeer::GetPacketCreator(&connection_)->sequence_number(); |
} |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _, _)).Times(AnyNumber()); |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(AnyNumber()); |
+ return packet_size; |
} |
void SendAckPacketToPeer() { |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _, !kHasData)).Times(1); |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(1); |
connection_.SendAck(); |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _, _)).Times(AnyNumber()); |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(AnyNumber()); |
} |
QuicPacketEntropyHash ProcessAckPacket(QuicAckFrame* frame) { |
@@ -423,7 +471,7 @@ class QuicConnectionTest : public ::testing::Test { |
QuicConnectionCloseFrame qccf; |
qccf.error_code = QUIC_PEER_GOING_AWAY; |
- qccf.ack_frame = QuicAckFrame(0, 1); |
+ qccf.ack_frame = QuicAckFrame(0, QuicTime::Zero(), 1); |
QuicFrames frames; |
QuicFrame frame(&qccf); |
@@ -538,7 +586,7 @@ TEST_F(QuicConnectionTest, PacketsOutOfOrderWithAdditionsAndLeastAwaiting) { |
// awaiting' is 4. The connection should then realize 1 will not be |
// retransmitted, and will remove it from the missing list. |
creator_.set_sequence_number(5); |
- QuicAckFrame frame(0, 4); |
+ QuicAckFrame frame(0, QuicTime::Zero(), 4); |
ProcessAckPacket(&frame); |
// Force an ack to be sent. |
@@ -563,7 +611,7 @@ TEST_F(QuicConnectionTest, TruncatedAck) { |
SendStreamDataToPeer(1, "foo", i * 3, !kFin, NULL); |
} |
- QuicAckFrame frame(0, 1); |
+ QuicAckFrame frame(0, QuicTime::Zero(), 1); |
frame.received_info.largest_observed = 192; |
InsertMissingPacketsBetween(&frame.received_info, 1, 192); |
frame.received_info.entropy_hash = |
@@ -590,20 +638,20 @@ TEST_F(QuicConnectionTest, LeastUnackedLower) { |
// Start out saying the least unacked is 2 |
creator_.set_sequence_number(5); |
- QuicAckFrame frame(0, 2); |
+ QuicAckFrame frame(0, QuicTime::Zero(), 2); |
ProcessAckPacket(&frame); |
// Change it to 1, but lower the sequence number to fake out-of-order packets. |
// This should be fine. |
creator_.set_sequence_number(1); |
- QuicAckFrame frame2(0, 1); |
+ QuicAckFrame frame2(0, QuicTime::Zero(), 1); |
// The scheduler will not process out of order acks. |
ProcessAckPacket(&frame2); |
// Now claim it's one, but set the ordering so it was sent "after" the first |
// one. This should cause a connection error. |
EXPECT_CALL(visitor_, ConnectionClose(QUIC_INVALID_ACK_DATA, false)); |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _, !kHasData)); |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)); |
creator_.set_sequence_number(7); |
ProcessAckPacket(&frame2); |
} |
@@ -615,24 +663,24 @@ TEST_F(QuicConnectionTest, LargestObservedLower) { |
EXPECT_CALL(*send_algorithm_, OnIncomingAck(_, _, _)).Times(2); |
// Start out saying the largest observed is 2. |
- QuicAckFrame frame(2, 0); |
+ QuicAckFrame frame(2, QuicTime::Zero(), 0); |
frame.received_info.entropy_hash = QuicConnectionPeer::GetSentEntropyHash( |
&connection_, 2); |
EXPECT_CALL(visitor_, OnAck(_)); |
ProcessAckPacket(&frame); |
// Now change it to 1, and it should cause a connection error. |
- QuicAckFrame frame2(1, 0); |
+ QuicAckFrame frame2(1, QuicTime::Zero(), 0); |
EXPECT_CALL(visitor_, ConnectionClose(QUIC_INVALID_ACK_DATA, false)); |
ProcessAckPacket(&frame2); |
} |
TEST_F(QuicConnectionTest, LeastUnackedGreaterThanPacketSequenceNumber) { |
EXPECT_CALL(visitor_, ConnectionClose(QUIC_INVALID_ACK_DATA, false)); |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _, !kHasData)); |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)); |
// Create an ack with least_unacked is 2 in packet number 1. |
creator_.set_sequence_number(0); |
- QuicAckFrame frame(0, 2); |
+ QuicAckFrame frame(0, QuicTime::Zero(), 2); |
ProcessAckPacket(&frame); |
} |
@@ -643,8 +691,8 @@ TEST_F(QuicConnectionTest, |
SendStreamDataToPeer(1, "eep", 6, !kFin, NULL); |
EXPECT_CALL(visitor_, ConnectionClose(QUIC_INVALID_ACK_DATA, false)); |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _, !kHasData)); |
- QuicAckFrame frame(0, 1); |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)); |
+ QuicAckFrame frame(0, QuicTime::Zero(), 1); |
frame.received_info.missing_packets.insert(3); |
ProcessAckPacket(&frame); |
} |
@@ -652,8 +700,8 @@ TEST_F(QuicConnectionTest, |
TEST_F(QuicConnectionTest, AckUnsentData) { |
// Ack a packet which has not been sent. |
EXPECT_CALL(visitor_, ConnectionClose(QUIC_INVALID_ACK_DATA, false)); |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _, !kHasData)); |
- QuicAckFrame frame(1, 0); |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)); |
+ QuicAckFrame frame(1, QuicTime::Zero(), 0); |
ProcessAckPacket(&frame); |
} |
@@ -661,7 +709,7 @@ TEST_F(QuicConnectionTest, AckAll) { |
ProcessPacket(1); |
creator_.set_sequence_number(1); |
- QuicAckFrame frame1(0, 1); |
+ QuicAckFrame frame1(0, QuicTime::Zero(), 1); |
ProcessAckPacket(&frame1); |
} |
@@ -694,7 +742,7 @@ TEST_F(QuicConnectionTest, BasicSending) { |
// Client acks up to packet 3 |
EXPECT_CALL(visitor_, OnAck(ContainerEq(expected_acks))); |
- QuicAckFrame frame(3, 0); |
+ QuicAckFrame frame(3, QuicTime::Zero(), 0); |
frame.received_info.entropy_hash = |
QuicConnectionPeer::GetSentEntropyHash(&connection_, 3); |
ProcessAckPacket(&frame); |
@@ -709,7 +757,7 @@ TEST_F(QuicConnectionTest, BasicSending) { |
// Client acks up to packet 4, the last packet |
EXPECT_CALL(visitor_, OnAck(ContainerEq(expected_acks))); |
- QuicAckFrame frame2(6, 0); |
+ QuicAckFrame frame2(6, QuicTime::Zero(), 0); |
frame2.received_info.entropy_hash = |
QuicConnectionPeer::GetSentEntropyHash(&connection_, 6); |
ProcessAckPacket(&frame2); // Even parity triggers ack packet 7 |
@@ -730,14 +778,14 @@ TEST_F(QuicConnectionTest, BasicSending) { |
TEST_F(QuicConnectionTest, FECSending) { |
// Limit to one byte per packet. |
+ // All packets carry version info till version is negotiated. |
connection_.options()->max_packet_length = |
- GetPacketLengthForOneStream(!kIncludeVersion, 1); |
+ GetPacketLengthForOneStream(kIncludeVersion, 1); |
// And send FEC every two packets. |
connection_.options()->max_packets_per_fec_group = 2; |
// Send 4 data packets and 2 FEC packets. |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _, kHasData)).Times(4); |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _, !kHasData)).Times(2); |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(6); |
connection_.SendStreamData(1, "food", 0, !kFin); |
// Expect the FEC group to be closed after SendStreamData. |
EXPECT_FALSE(creator_.ShouldSendFec(true)); |
@@ -745,8 +793,9 @@ TEST_F(QuicConnectionTest, FECSending) { |
TEST_F(QuicConnectionTest, FECQueueing) { |
// Limit to one byte per packet. |
+ // All packets carry version info till version is negotiated. |
connection_.options()->max_packet_length = |
- GetPacketLengthForOneStream(!kIncludeVersion, 1); |
+ GetPacketLengthForOneStream(kIncludeVersion, 1); |
// And send FEC every two packets. |
connection_.options()->max_packets_per_fec_group = 2; |
@@ -774,7 +823,7 @@ TEST_F(QuicConnectionTest, FramePacking) { |
// Unblock the connection. |
helper_->UnregisterSendAlarmIfRegistered(); |
EXPECT_CALL(*send_algorithm_, |
- SentPacket(_, _, _, !kIsRetransmission, kHasData)) |
+ SentPacket(_, _, _, !kIsRetransmission)) |
.Times(1); |
connection_.OnCanWrite(); |
EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
@@ -807,9 +856,7 @@ TEST_F(QuicConnectionTest, FramePackingFEC) { |
// Unblock the connection. |
helper_->UnregisterSendAlarmIfRegistered(); |
EXPECT_CALL(*send_algorithm_, |
- SentPacket(_, _, _, !kIsRetransmission, kHasData)); |
- EXPECT_CALL(*send_algorithm_, |
- SentPacket(_, _, _, !kIsRetransmission, !kHasData)); |
+ SentPacket(_, _, _, !kIsRetransmission)).Times(2); |
connection_.OnCanWrite(); |
EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
EXPECT_FALSE(connection_.HasQueuedData()); |
@@ -829,7 +876,7 @@ TEST_F(QuicConnectionTest, OnCanWrite) { |
Return(false))); |
EXPECT_CALL(*send_algorithm_, |
- TimeUntilSend(_, !kIsRetransmission)).WillRepeatedly( |
+ TimeUntilSend(_, !kIsRetransmission, _)).WillRepeatedly( |
testing::Return(QuicTime::Delta::Zero())); |
// Unblock the connection. |
@@ -845,9 +892,12 @@ TEST_F(QuicConnectionTest, OnCanWrite) { |
TEST_F(QuicConnectionTest, RetransmitOnNack) { |
EXPECT_CALL(*send_algorithm_, OnIncomingAck(_, _, _)).Times(2); |
EXPECT_CALL(*send_algorithm_, OnIncomingLoss(_)).Times(1); |
+ EXPECT_CALL(*send_algorithm_, AbandoningPacket(2, _)).Times(1); |
QuicPacketSequenceNumber last_packet; |
+ QuicByteCount second_packet_size; |
SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet); // Packet 1 |
- SendStreamDataToPeer(1, "foos", 3, !kFin, &last_packet); // Packet 2 |
+ second_packet_size = |
+ SendStreamDataToPeer(1, "foos", 3, !kFin, &last_packet); // Packet 2 |
SendStreamDataToPeer(1, "fooos", 7, !kFin, &last_packet); // Packet 3 |
SequenceNumberSet expected_acks; |
@@ -856,7 +906,7 @@ TEST_F(QuicConnectionTest, RetransmitOnNack) { |
// Client acks one but not two or three. Right now we only retransmit on |
// explicit nack, so it should not trigger a retransimission. |
- QuicAckFrame ack_one(1, 0); |
+ QuicAckFrame ack_one(1, QuicTime::Zero(), 0); |
ack_one.received_info.entropy_hash = |
QuicConnectionPeer::GetSentEntropyHash(&connection_, 1); |
ProcessAckPacket(&ack_one); |
@@ -869,7 +919,7 @@ TEST_F(QuicConnectionTest, RetransmitOnNack) { |
// Client acks up to 3 with two explicitly missing. Two nacks should cause no |
// change. |
- QuicAckFrame nack_two(3, 0); |
+ QuicAckFrame nack_two(3, QuicTime::Zero(), 0); |
nack_two.received_info.missing_packets.insert(2); |
nack_two.received_info.entropy_hash = |
QuicConnectionPeer::GetSentEntropyHash(&connection_, 3) ^ |
@@ -880,8 +930,8 @@ TEST_F(QuicConnectionTest, RetransmitOnNack) { |
// The third nack should trigger a retransimission. |
EXPECT_CALL(*send_algorithm_, |
- SentPacket(_, _, 37, kIsRetransmission, kHasData)) |
- .Times(1); |
+ SentPacket(_, _, second_packet_size - kQuicVersionSize, |
+ kIsRetransmission)).Times(1); |
ProcessAckPacket(&nack_two); |
} |
@@ -889,29 +939,29 @@ TEST_F(QuicConnectionTest, RetransmitNackedLargestObserved) { |
EXPECT_CALL(*send_algorithm_, OnIncomingLoss(_)).Times(1); |
QuicPacketSequenceNumber largest_observed; |
QuicByteCount packet_size; |
- EXPECT_CALL(*send_algorithm_, |
- SentPacket(_, _, _, !kIsRetransmission, kHasData)) |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, !kIsRetransmission)) |
.WillOnce(DoAll(SaveArg<1>(&largest_observed), SaveArg<2>(&packet_size))); |
+ EXPECT_CALL(*send_algorithm_, AbandoningPacket(1, _)).Times(1); |
connection_.SendStreamData(1, "foo", 0, !kFin); |
- QuicAckFrame frame(1, largest_observed); |
+ QuicAckFrame frame(1, QuicTime::Zero(), largest_observed); |
frame.received_info.missing_packets.insert(largest_observed); |
frame.received_info.entropy_hash = QuicConnectionPeer::GetSentEntropyHash( |
&connection_, largest_observed - 1); |
ProcessAckPacket(&frame); |
// Second udp packet will force an ack frame. |
EXPECT_CALL(*send_algorithm_, |
- SentPacket(_, _, _, !kIsRetransmission, !kHasData)); |
+ SentPacket(_, _, _, !kIsRetransmission)); |
ProcessAckPacket(&frame); |
// Third nack should retransmit the largest observed packet. |
- EXPECT_CALL(*send_algorithm_, |
- SentPacket(_, _, packet_size, kIsRetransmission, kHasData)); |
- |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, _, packet_size - kQuicVersionSize, |
+ kIsRetransmission)); |
ProcessAckPacket(&frame); |
} |
TEST_F(QuicConnectionTest, LimitPacketsPerNack) { |
EXPECT_CALL(*send_algorithm_, OnIncomingAck(12, _, _)).Times(1); |
EXPECT_CALL(*send_algorithm_, OnIncomingLoss(_)).Times(1); |
+ EXPECT_CALL(*send_algorithm_, AbandoningPacket(_, _)).Times(11); |
int offset = 0; |
// Send packets 1 to 12 |
for (int i = 0; i < 12; ++i) { |
@@ -920,7 +970,7 @@ TEST_F(QuicConnectionTest, LimitPacketsPerNack) { |
} |
// Ack 12, nack 1-11 |
- QuicAckFrame nack(12, 0); |
+ QuicAckFrame nack(12, QuicTime::Zero(), 0); |
for (int i = 1; i < 12; ++i) { |
nack.received_info.missing_packets.insert(i); |
} |
@@ -935,15 +985,14 @@ TEST_F(QuicConnectionTest, LimitPacketsPerNack) { |
// Nack three times. |
ProcessAckPacket(&nack); |
// The second call will trigger an ack. |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _, !kHasData)).Times(1); |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(1); |
ProcessAckPacket(&nack); |
// The third call should trigger retransmitting 10 packets. |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _, kHasData)).Times(10); |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(10); |
ProcessAckPacket(&nack); |
// The fourth call should trigger retransmitting the 11th packet and an ack. |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _, kHasData)).Times(1); |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _, !kHasData)).Times(1); |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(2); |
ProcessAckPacket(&nack); |
} |
@@ -965,7 +1014,7 @@ TEST_F(QuicConnectionTest, MultipleAcks) { |
EXPECT_EQ(6u, last_packet); |
// Client will ack packets 1, [!2], 3, 4, 5 |
- QuicAckFrame frame1(5, 0); |
+ QuicAckFrame frame1(5, QuicTime::Zero(), 0); |
frame1.received_info.missing_packets.insert(2); |
frame1.received_info.entropy_hash = |
QuicConnectionPeer::GetSentEntropyHash(&connection_, 5) ^ |
@@ -983,7 +1032,7 @@ TEST_F(QuicConnectionTest, MultipleAcks) { |
ProcessAckPacket(&frame1); |
// Now the client implicitly acks 2, and explicitly acks 6 |
- QuicAckFrame frame2(6, 0); |
+ QuicAckFrame frame2(6, QuicTime::Zero(), 0); |
frame2.received_info.entropy_hash = |
QuicConnectionPeer::GetSentEntropyHash(&connection_, 6); |
expected_acks.clear(); |
@@ -1006,7 +1055,7 @@ TEST_F(QuicConnectionTest, DontLatchUnackedPacket) { |
expected_acks.insert(1); |
// Client acks packet 1 |
EXPECT_CALL(visitor_, OnAck(ContainerEq(expected_acks))); |
- QuicAckFrame frame(1, 0); |
+ QuicAckFrame frame(1, QuicTime::Zero(), 0); |
frame.received_info.entropy_hash = QuicConnectionPeer::GetSentEntropyHash( |
&connection_, 1); |
ProcessAckPacket(&frame); |
@@ -1081,7 +1130,8 @@ TEST_F(QuicConnectionTest, TestRetransmit) { |
EXPECT_EQ(default_retransmission_time, helper_->retransmission_alarm()); |
// Simulate the retransimission alarm firing |
clock_.AdvanceTime(kDefaultRetransmissionTime); |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _, kHasData)); |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)); |
+ EXPECT_CALL(*send_algorithm_, AbandoningPacket(1, _)).Times(1); |
connection_.RetransmitPacket(1); |
EXPECT_EQ(2u, last_header()->packet_sequence_number); |
EXPECT_EQ(2u, outgoing_ack()->sent_info.least_unacked); |
@@ -1089,11 +1139,13 @@ TEST_F(QuicConnectionTest, TestRetransmit) { |
TEST_F(QuicConnectionTest, TestRetransmitOrder) { |
QuicByteCount first_packet_size; |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _, kHasData)).WillOnce( |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).WillOnce( |
SaveArg<2>(&first_packet_size)); |
+ EXPECT_CALL(*send_algorithm_, AbandoningPacket(_, _)).Times(2); |
+ |
connection_.SendStreamData(1, "first_packet", 0, !kFin); |
QuicByteCount second_packet_size; |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _, kHasData)).WillOnce( |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).WillOnce( |
SaveArg<2>(&second_packet_size)); |
connection_.SendStreamData(1, "second_packet", 12, !kFin); |
EXPECT_NE(first_packet_size, second_packet_size); |
@@ -1102,18 +1154,19 @@ TEST_F(QuicConnectionTest, TestRetransmitOrder) { |
{ |
InSequence s; |
EXPECT_CALL(*send_algorithm_, |
- SentPacket(_, _, first_packet_size, _, kHasData)); |
+ SentPacket(_, _, first_packet_size, _)); |
EXPECT_CALL(*send_algorithm_, |
- SentPacket(_, _, second_packet_size, _, kHasData)); |
+ SentPacket(_, _, second_packet_size, _)); |
} |
connection_.OnRetransmissionTimeout(); |
} |
TEST_F(QuicConnectionTest, TestRetransmissionCountCalculation) { |
EXPECT_CALL(*send_algorithm_, OnIncomingLoss(_)).Times(1); |
+ EXPECT_CALL(*send_algorithm_, AbandoningPacket(_, _)).Times(2); |
QuicPacketSequenceNumber original_sequence_number; |
EXPECT_CALL(*send_algorithm_, |
- SentPacket(_, _, _, !kIsRetransmission, kHasData)) |
+ SentPacket(_, _, _, !kIsRetransmission)) |
.WillOnce(SaveArg<1>(&original_sequence_number)); |
connection_.SendStreamData(1, "foo", 0, !kFin); |
EXPECT_TRUE(QuicConnectionPeer::IsSavedForRetransmission( |
@@ -1124,7 +1177,7 @@ TEST_F(QuicConnectionTest, TestRetransmissionCountCalculation) { |
clock_.AdvanceTime(QuicTime::Delta::FromSeconds(10)); |
QuicPacketSequenceNumber rto_sequence_number; |
EXPECT_CALL(*send_algorithm_, |
- SentPacket(_, _, _, kIsRetransmission, kHasData)) |
+ SentPacket(_, _, _, kIsRetransmission)) |
.WillOnce(SaveArg<1>(&rto_sequence_number)); |
connection_.OnRetransmissionTimeout(); |
EXPECT_FALSE(QuicConnectionPeer::IsSavedForRetransmission( |
@@ -1137,13 +1190,12 @@ TEST_F(QuicConnectionTest, TestRetransmissionCountCalculation) { |
QuicPacketSequenceNumber nack_sequence_number; |
// Ack packets might generate some other packets, which are not |
// retransmissions. (More ack packets). |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, !kIsRetransmission, _)) |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, !kIsRetransmission)) |
.Times(AnyNumber()); |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, kIsRetransmission, _)) |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, kIsRetransmission)) |
.WillOnce(SaveArg<1>(&nack_sequence_number)); |
- QuicAckFrame ack(rto_sequence_number, 0); |
+ QuicAckFrame ack(rto_sequence_number, QuicTime::Zero(), 0); |
// Ack the retransmitted packet. |
- EXPECT_CALL(*send_algorithm_, OnIncomingAck(_, _, _)).Times(1); |
ack.received_info.missing_packets.insert(rto_sequence_number); |
ack.received_info.entropy_hash = QuicConnectionPeer::GetSentEntropyHash( |
&connection_, rto_sequence_number - 1); |
@@ -1197,7 +1249,7 @@ TEST_F(QuicConnectionTest, CloseFecGroup) { |
ASSERT_EQ(1u, connection_.NumFecGroups()); |
// Now send non-fec protected ack packet and close the group |
- QuicAckFrame frame(0, 5); |
+ QuicAckFrame frame(0, QuicTime::Zero(), 5); |
creator_.set_sequence_number(4); |
ProcessAckPacket(&frame); |
ASSERT_EQ(0u, connection_.NumFecGroups()); |
@@ -1236,7 +1288,7 @@ TEST_F(QuicConnectionTest, DontUpdateQuicCongestionFeedbackFrameForRevived) { |
TEST_F(QuicConnectionTest, InitialTimeout) { |
EXPECT_TRUE(connection_.connected()); |
EXPECT_CALL(visitor_, ConnectionClose(QUIC_CONNECTION_TIMED_OUT, false)); |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _, !kHasData)); |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)); |
QuicTime default_timeout = clock_.ApproximateNow().Add( |
QuicTime::Delta::FromMicroseconds(kDefaultTimeoutUs)); |
@@ -1273,7 +1325,7 @@ TEST_F(QuicConnectionTest, TimeoutAfterSend) { |
// This time, we should time out. |
EXPECT_CALL(visitor_, ConnectionClose(QUIC_CONNECTION_TIMED_OUT, false)); |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _, !kHasData)); |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)); |
clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5)); |
EXPECT_EQ(default_timeout.Add(QuicTime::Delta::FromMilliseconds(5)), |
clock_.ApproximateNow()); |
@@ -1285,9 +1337,10 @@ TEST_F(QuicConnectionTest, TimeoutAfterSend) { |
TEST_F(QuicConnectionTest, SendScheduler) { |
// Test that if we send a packet without delay, it is not queued. |
QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
- EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, !kIsRetransmission)).WillOnce( |
- testing::Return(QuicTime::Delta::Zero())); |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _, kHasData)); |
+ EXPECT_CALL(*send_algorithm_, |
+ TimeUntilSend(_, !kIsRetransmission, _)).WillOnce( |
+ testing::Return(QuicTime::Delta::Zero())); |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)); |
connection_.SendOrQueuePacket(1, packet, kTestEntropyHash, true); |
EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
} |
@@ -1295,9 +1348,10 @@ TEST_F(QuicConnectionTest, SendScheduler) { |
TEST_F(QuicConnectionTest, SendSchedulerDelay) { |
// Test that if we send a packet with a delay, it ends up queued. |
QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
- EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, !kIsRetransmission)).WillOnce( |
- testing::Return(QuicTime::Delta::FromMicroseconds(1))); |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, _, kHasData)).Times(0); |
+ EXPECT_CALL(*send_algorithm_, |
+ TimeUntilSend(_, !kIsRetransmission, _)).WillOnce( |
+ testing::Return(QuicTime::Delta::FromMicroseconds(1))); |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, _)).Times(0); |
connection_.SendOrQueuePacket(1, packet, kTestEntropyHash, true); |
EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
} |
@@ -1305,8 +1359,9 @@ TEST_F(QuicConnectionTest, SendSchedulerDelay) { |
TEST_F(QuicConnectionTest, SendSchedulerForce) { |
// Test that if we force send a packet, it is not queued. |
QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
- EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, kIsRetransmission)).Times(0); |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _, kHasData)); |
+ EXPECT_CALL(*send_algorithm_, |
+ TimeUntilSend(_, kIsRetransmission, _)).Times(0); |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)); |
connection_.SendOrQueuePacket(1, packet, kTestEntropyHash, true); |
// XXX: fixme. was: connection_.SendOrQueuePacket(1, packet, kForce); |
EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
@@ -1315,9 +1370,10 @@ TEST_F(QuicConnectionTest, SendSchedulerForce) { |
TEST_F(QuicConnectionTest, SendSchedulerEAGAIN) { |
QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
helper_->set_blocked(true); |
- EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, !kIsRetransmission)).WillOnce( |
- testing::Return(QuicTime::Delta::Zero())); |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, _, kHasData)).Times(0); |
+ EXPECT_CALL(*send_algorithm_, |
+ TimeUntilSend(_, !kIsRetransmission, _)).WillOnce( |
+ testing::Return(QuicTime::Delta::Zero())); |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, _)).Times(0); |
connection_.SendOrQueuePacket(1, packet, kTestEntropyHash, true); |
EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
} |
@@ -1325,46 +1381,51 @@ TEST_F(QuicConnectionTest, SendSchedulerEAGAIN) { |
TEST_F(QuicConnectionTest, SendSchedulerDelayThenSend) { |
// Test that if we send a packet with a delay, it ends up queued. |
QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
- EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, !kIsRetransmission)).WillOnce( |
- testing::Return(QuicTime::Delta::FromMicroseconds(1))); |
+ EXPECT_CALL(*send_algorithm_, |
+ TimeUntilSend(_, !kIsRetransmission, _)).WillOnce( |
+ testing::Return(QuicTime::Delta::FromMicroseconds(1))); |
connection_.SendOrQueuePacket(1, packet, kTestEntropyHash, true); |
EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
// Advance the clock to fire the alarm, and configure the scheduler |
// to permit the packet to be sent. |
- EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, !kIsRetransmission)).WillOnce( |
- testing::Return(QuicTime::Delta::Zero())); |
+ EXPECT_CALL(*send_algorithm_, |
+ TimeUntilSend(_, !kIsRetransmission, _)).WillRepeatedly( |
+ testing::Return(QuicTime::Delta::Zero())); |
clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(1)); |
helper_->UnregisterSendAlarmIfRegistered(); |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _, kHasData)); |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)); |
EXPECT_CALL(visitor_, OnCanWrite()); |
connection_.OnCanWrite(); |
EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
} |
TEST_F(QuicConnectionTest, SendSchedulerDelayThenRetransmit) { |
- EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, !kIsRetransmission)) |
+ EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, !kIsRetransmission, _)) |
.WillRepeatedly(testing::Return(QuicTime::Delta::Zero())); |
+ EXPECT_CALL(*send_algorithm_, AbandoningPacket(1, _)).Times(1); |
EXPECT_CALL(*send_algorithm_, |
- SentPacket(_, 1, _, !kIsRetransmission, kHasData)); |
+ SentPacket(_, 1, _, !kIsRetransmission)); |
connection_.SendStreamData(1, "foo", 0, !kFin); |
EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
// Advance the time for retransmission of lost packet. |
clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(501)); |
// Test that if we send a retransmit with a delay, it ends up queued. |
- EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, kIsRetransmission)).WillOnce( |
- testing::Return(QuicTime::Delta::FromMicroseconds(1))); |
+ EXPECT_CALL(*send_algorithm_, |
+ TimeUntilSend(_, kIsRetransmission, _)).WillOnce( |
+ testing::Return(QuicTime::Delta::FromMicroseconds(1))); |
connection_.OnRetransmissionTimeout(); |
EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
// Advance the clock to fire the alarm, and configure the scheduler |
// to permit the packet to be sent. |
- EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, kIsRetransmission)).WillOnce( |
- testing::Return(QuicTime::Delta::Zero())); |
+ EXPECT_CALL(*send_algorithm_, |
+ TimeUntilSend(_, kIsRetransmission, _)).WillOnce( |
+ testing::Return(QuicTime::Delta::Zero())); |
// Ensure the scheduler is notified this is a retransmit. |
EXPECT_CALL(*send_algorithm_, |
- SentPacket(_, _, _, kIsRetransmission, kHasData)); |
+ SentPacket(_, _, _, kIsRetransmission)); |
clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(1)); |
helper_->UnregisterSendAlarmIfRegistered(); |
EXPECT_CALL(visitor_, OnCanWrite()); |
@@ -1374,8 +1435,9 @@ TEST_F(QuicConnectionTest, SendSchedulerDelayThenRetransmit) { |
TEST_F(QuicConnectionTest, SendSchedulerDelayAndQueue) { |
QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
- EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, !kIsRetransmission)).WillOnce( |
- testing::Return(QuicTime::Delta::FromMicroseconds(1))); |
+ EXPECT_CALL(*send_algorithm_, |
+ TimeUntilSend(_, !kIsRetransmission, _)).WillOnce( |
+ testing::Return(QuicTime::Delta::FromMicroseconds(1))); |
connection_.SendOrQueuePacket(1, packet, kTestEntropyHash, true); |
EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
@@ -1387,19 +1449,20 @@ TEST_F(QuicConnectionTest, SendSchedulerDelayAndQueue) { |
TEST_F(QuicConnectionTest, SendSchedulerDelayThenAckAndSend) { |
QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
- EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, !kIsRetransmission)).WillOnce( |
- testing::Return(QuicTime::Delta::FromMicroseconds(10))); |
+ EXPECT_CALL(*send_algorithm_, |
+ TimeUntilSend(_, !kIsRetransmission, _)).WillOnce( |
+ testing::Return(QuicTime::Delta::FromMicroseconds(10))); |
connection_.SendOrQueuePacket(1, packet, kTestEntropyHash, true); |
EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
// Now send non-retransmitting information, that we're not going to |
// retransmit 3. The far end should stop waiting for it. |
- QuicAckFrame frame(0, 1); |
+ QuicAckFrame frame(0, QuicTime::Zero(), 1); |
EXPECT_CALL(*send_algorithm_, |
- TimeUntilSend(_, !kIsRetransmission)).WillRepeatedly( |
+ TimeUntilSend(_, !kIsRetransmission, _)).WillRepeatedly( |
testing::Return(QuicTime::Delta::Zero())); |
EXPECT_CALL(*send_algorithm_, |
- SentPacket(_, _, _, _, kHasData)); |
+ SentPacket(_, _, _, _)); |
EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(Return(true)); |
ProcessAckPacket(&frame); |
@@ -1410,16 +1473,18 @@ TEST_F(QuicConnectionTest, SendSchedulerDelayThenAckAndSend) { |
TEST_F(QuicConnectionTest, SendSchedulerDelayThenAckAndHold) { |
QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
- EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, !kIsRetransmission)).WillOnce( |
- testing::Return(QuicTime::Delta::FromMicroseconds(10))); |
+ EXPECT_CALL(*send_algorithm_, |
+ TimeUntilSend(_, !kIsRetransmission, _)).WillOnce( |
+ testing::Return(QuicTime::Delta::FromMicroseconds(10))); |
connection_.SendOrQueuePacket(1, packet, kTestEntropyHash, kHasData); |
EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
// Now send non-retransmitting information, that we're not going to |
// retransmit 3. The far end should stop waiting for it. |
- QuicAckFrame frame(0, 1); |
- EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, !kIsRetransmission)).WillOnce( |
- testing::Return(QuicTime::Delta::FromMicroseconds(1))); |
+ QuicAckFrame frame(0, QuicTime::Zero(), 1); |
+ EXPECT_CALL(*send_algorithm_, |
+ TimeUntilSend(_, !kIsRetransmission, _)).WillOnce( |
+ testing::Return(QuicTime::Delta::FromMicroseconds(1))); |
ProcessAckPacket(&frame); |
EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
@@ -1427,26 +1492,28 @@ TEST_F(QuicConnectionTest, SendSchedulerDelayThenAckAndHold) { |
TEST_F(QuicConnectionTest, SendSchedulerDelayThenOnCanWrite) { |
QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
- EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, !kIsRetransmission)).WillOnce( |
- testing::Return(QuicTime::Delta::FromMicroseconds(10))); |
+ EXPECT_CALL(*send_algorithm_, |
+ TimeUntilSend(_, !kIsRetransmission, _)).WillOnce( |
+ testing::Return(QuicTime::Delta::FromMicroseconds(10))); |
connection_.SendOrQueuePacket(1, packet, kTestEntropyHash, kHasData); |
EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
// OnCanWrite should not send the packet (because of the delay) |
// but should still return true. |
- EXPECT_CALL(visitor_, OnCanWrite()); |
EXPECT_TRUE(connection_.OnCanWrite()); |
EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
} |
TEST_F(QuicConnectionTest, TestQueueLimitsOnSendStreamData) { |
// Limit to one byte per packet. |
+ // All packets carry version info till version is negotiated. |
connection_.options()->max_packet_length = |
- GetPacketLengthForOneStream(!kIncludeVersion, 1); |
+ GetPacketLengthForOneStream(kIncludeVersion, 1); |
// Queue the first packet. |
- EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, !kIsRetransmission)).WillOnce( |
- testing::Return(QuicTime::Delta::FromMicroseconds(10))); |
+ EXPECT_CALL(*send_algorithm_, |
+ TimeUntilSend(_, !kIsRetransmission, _)).WillOnce( |
+ testing::Return(QuicTime::Delta::FromMicroseconds(10))); |
EXPECT_EQ(0u, connection_.SendStreamData( |
1, "EnoughDataToQueue", 0, !kFin).bytes_consumed); |
EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
@@ -1454,11 +1521,12 @@ TEST_F(QuicConnectionTest, TestQueueLimitsOnSendStreamData) { |
TEST_F(QuicConnectionTest, LoopThroughSendingPackets) { |
// Limit to one byte per packet. |
+ // All packets carry version info till version is negotiated. |
connection_.options()->max_packet_length = |
- GetPacketLengthForOneStream(!kIncludeVersion, 1); |
+ GetPacketLengthForOneStream(kIncludeVersion, 1); |
// Queue the first packet. |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _, kHasData)).Times(17); |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(17); |
EXPECT_EQ(17u, connection_.SendStreamData( |
1, "EnoughDataToQueue", 0, !kFin).bytes_consumed); |
} |
@@ -1467,7 +1535,7 @@ TEST_F(QuicConnectionTest, NoAckForClose) { |
ProcessPacket(1); |
EXPECT_CALL(*send_algorithm_, OnIncomingAck(_, _, _)).Times(0); |
EXPECT_CALL(visitor_, ConnectionClose(QUIC_PEER_GOING_AWAY, true)); |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _, kHasData)).Times(0); |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, _, _, _)).Times(0); |
ProcessClosePacket(2, 0); |
} |
@@ -1477,7 +1545,7 @@ TEST_F(QuicConnectionTest, SendWhenDisconnected) { |
connection_.CloseConnection(QUIC_PEER_GOING_AWAY, false); |
EXPECT_FALSE(connection_.connected()); |
QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
- EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, _, kHasData)).Times(0); |
+ EXPECT_CALL(*send_algorithm_, SentPacket(_, 1, _, _)).Times(0); |
connection_.SendOrQueuePacket(1, packet, kTestEntropyHash, kHasData); |
} |
@@ -1503,7 +1571,7 @@ TEST_F(QuicConnectionTest, GoAway) { |
} |
TEST_F(QuicConnectionTest, MissingPacketsBeforeLeastUnacked) { |
- QuicAckFrame ack(0, 4); |
+ QuicAckFrame ack(0, QuicTime::Zero(), 4); |
// Set the sequence number of the ack packet to be least unacked (4) |
creator_.set_sequence_number(3); |
ProcessAckPacket(&ack); |
@@ -1526,7 +1594,7 @@ TEST_F(QuicConnectionTest, UpdateEntropyForReceivedPackets) { |
ProcessDataPacket(4, 1, !kEntropyFlag); |
EXPECT_EQ(34u, outgoing_ack()->received_info.entropy_hash); |
// Make 4th packet my least unacked, and update entropy for 2, 3 packets. |
- QuicAckFrame ack(0, 4); |
+ QuicAckFrame ack(0, QuicTime::Zero(), 4); |
QuicPacketEntropyHash kRandomEntropyHash = 129u; |
ack.sent_info.entropy_hash = kRandomEntropyHash; |
creator_.set_sequence_number(5); |
@@ -1548,7 +1616,7 @@ TEST_F(QuicConnectionTest, UpdateEntropyHashUptoCurrentPacket) { |
creator_.set_sequence_number(22); |
QuicPacketEntropyHash kRandomEntropyHash = 85u; |
// Current packet is the least unacked packet. |
- QuicAckFrame ack(0, 23); |
+ QuicAckFrame ack(0, QuicTime::Zero(), 23); |
ack.sent_info.entropy_hash = kRandomEntropyHash; |
QuicPacketEntropyHash ack_entropy_hash = ProcessAckPacket(&ack); |
EXPECT_EQ((kRandomEntropyHash + ack_entropy_hash), |
@@ -1610,6 +1678,111 @@ TEST_F(QuicConnectionTest, CheckSentEntropyHash) { |
<< ""; |
} |
+// TODO(satyamsehkhar): Add more test when we start supporting more versions. |
+TEST_F(QuicConnectionTest, SendVersionNegotiationPacket) { |
+ QuicVersionTag kRandomVersion = 143; |
+ QuicFramerPeer::SetVersion(&framer_, kRandomVersion); |
+ |
+ QuicPacketHeader header; |
+ header.public_header.guid = guid_; |
+ header.public_header.reset_flag = false; |
+ header.public_header.version_flag = true; |
+ header.entropy_flag = false; |
+ header.fec_flag = false; |
+ header.fec_entropy_flag = false; |
+ header.packet_sequence_number = 12; |
+ header.fec_group = 0; |
+ |
+ QuicFrames frames; |
+ QuicFrame frame(&frame1_); |
+ frames.push_back(frame); |
+ scoped_ptr<QuicPacket> packet( |
+ framer_.ConstructFrameDataPacket(header, frames).packet); |
+ scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket(12, *packet)); |
+ |
+ QuicFramerPeer::SetVersion(&framer_, kQuicVersion1); |
+ connection_.set_is_server(true); |
+ connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
+ EXPECT_TRUE(helper_->version_negotiation_packet() != NULL); |
+ EXPECT_EQ(1u, |
+ helper_->version_negotiation_packet()->versions.size()); |
+ EXPECT_EQ(kQuicVersion1, |
+ helper_->version_negotiation_packet()->versions[0]); |
+} |
+ |
+TEST_F(QuicConnectionTest, CheckSendStats) { |
+ EXPECT_CALL(*send_algorithm_, AbandoningPacket(_, _)).Times(3); |
+ EXPECT_CALL(*send_algorithm_, |
+ SentPacket(_, _, _, !kIsRetransmission)); |
+ connection_.SendStreamData(1u, "first", 0, !kFin); |
+ size_t first_packet_size = last_sent_packet_size(); |
+ |
+ EXPECT_CALL(*send_algorithm_, |
+ SentPacket(_, _, _, !kIsRetransmission)).Times(2); |
+ connection_.SendStreamData(1u, "second", 0, !kFin); |
+ size_t second_packet_size = last_sent_packet_size(); |
+ |
+ // 2 retransmissions due to rto, 1 due to explicit nack. |
+ EXPECT_CALL(*send_algorithm_, |
+ SentPacket(_, _, _, kIsRetransmission)).Times(3); |
+ |
+ // Retransmit due to RTO. |
+ clock_.AdvanceTime(QuicTime::Delta::FromSeconds(10)); |
+ connection_.OnRetransmissionTimeout(); |
+ |
+ // Retransmit due to explicit nacks |
+ QuicAckFrame nack_three(4, QuicTime::Zero(), 0); |
+ nack_three.received_info.missing_packets.insert(3); |
+ nack_three.received_info.entropy_hash = |
+ QuicConnectionPeer::GetSentEntropyHash(&connection_, 4) ^ |
+ QuicConnectionPeer::GetSentEntropyHash(&connection_, 3) ^ |
+ QuicConnectionPeer::GetSentEntropyHash(&connection_, 2); |
+ QuicFrame frame(&nack_three); |
+ EXPECT_CALL(visitor_, OnAck(_)); |
+ EXPECT_CALL(*send_algorithm_, OnIncomingAck(_, _, _)).Times(1); |
+ EXPECT_CALL(*send_algorithm_, OnIncomingLoss(_)).Times(1); |
+ |
+ ProcessFramePacket(frame); |
+ ProcessFramePacket(frame); |
+ size_t ack_packet_size = last_sent_packet_size(); |
+ ProcessFramePacket(frame); |
+ |
+ EXPECT_CALL(*send_algorithm_, SmoothedRtt()).WillOnce( |
+ Return(QuicTime::Delta::Zero())); |
+ EXPECT_CALL(*send_algorithm_, BandwidthEstimate()).WillOnce( |
+ Return(QuicBandwidth::Zero())); |
+ |
+ const QuicConnectionStats& stats = connection_.GetStats(); |
+ EXPECT_EQ(3 * first_packet_size + 2 * second_packet_size + ack_packet_size - |
+ kQuicVersionSize, stats.bytes_sent); |
+ EXPECT_EQ(6u, stats.packets_sent); |
+ EXPECT_EQ(2 * first_packet_size + second_packet_size - kQuicVersionSize, |
+ stats.bytes_retransmitted); |
+ EXPECT_EQ(3u, stats.packets_retransmitted); |
+ EXPECT_EQ(2u, stats.rto_count); |
+} |
+ |
+TEST_F(QuicConnectionTest, CheckReceiveStats) { |
+ size_t received_bytes = 0; |
+ received_bytes += ProcessFecProtectedPacket(1, false, !kEntropyFlag); |
+ received_bytes += ProcessFecProtectedPacket(3, false, !kEntropyFlag); |
+ // Should be counted against dropped packets. |
+ received_bytes += ProcessDataPacket(3, 1, !kEntropyFlag); |
+ received_bytes += ProcessFecPacket(4, 1, true, !kEntropyFlag); // Fec packet |
+ |
+ EXPECT_CALL(*send_algorithm_, SmoothedRtt()).WillOnce( |
+ Return(QuicTime::Delta::Zero())); |
+ EXPECT_CALL(*send_algorithm_, BandwidthEstimate()).WillOnce( |
+ Return(QuicBandwidth::Zero())); |
+ |
+ const QuicConnectionStats& stats = connection_.GetStats(); |
+ EXPECT_EQ(received_bytes, stats.bytes_received); |
+ EXPECT_EQ(4u, stats.packets_received); |
+ |
+ EXPECT_EQ(1u, stats.packets_revived); |
+ EXPECT_EQ(1u, stats.packets_dropped); |
+} |
+ |
} // namespace |
} // namespace test |
} // namespace net |