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
3 // found in the LICENSE file.
4
5 #include "net/quic/quic_connection.h"
6
7 #include "base/basictypes.h"
8 #include "base/bind.h"
9 #include "base/stl_util.h"
10 #include "net/base/net_errors.h"
11 #include "net/quic/congestion_control/loss_detection_interface.h"
12 #include "net/quic/congestion_control/receive_algorithm_interface.h"
13 #include "net/quic/congestion_control/send_algorithm_interface.h"
14 #include "net/quic/crypto/null_encrypter.h"
15 #include "net/quic/crypto/quic_decrypter.h"
16 #include "net/quic/crypto/quic_encrypter.h"
17 #include "net/quic/quic_flags.h"
18 #include "net/quic/quic_protocol.h"
19 #include "net/quic/quic_utils.h"
20 #include "net/quic/test_tools/mock_clock.h"
21 #include "net/quic/test_tools/mock_random.h"
22 #include "net/quic/test_tools/quic_connection_peer.h"
23 #include "net/quic/test_tools/quic_framer_peer.h"
24 #include "net/quic/test_tools/quic_packet_creator_peer.h"
25 #include "net/quic/test_tools/quic_sent_packet_manager_peer.h"
26 #include "net/quic/test_tools/quic_test_utils.h"
27 #include "net/quic/test_tools/simple_quic_framer.h"
28 #include "testing/gmock/include/gmock/gmock.h"
29 #include "testing/gtest/include/gtest/gtest.h"
30
31 using base::StringPiece;
32 using std::map;
33 using std::vector;
34 using testing::AnyNumber;
35 using testing::AtLeast;
36 using testing::ContainerEq;
37 using testing::Contains;
38 using testing::DoAll;
39 using testing::InSequence;
40 using testing::InvokeWithoutArgs;
41 using testing::NiceMock;
42 using testing::Ref;
43 using testing::Return;
44 using testing::SaveArg;
45 using testing::StrictMock;
46 using testing::_;
47
48 namespace net {
49 namespace test {
50 namespace {
51
52 const char data1[] = "foo";
53 const char data2[] = "bar";
54
55 const bool kFin = true;
56 const bool kEntropyFlag = true;
57
58 const QuicPacketEntropyHash kTestEntropyHash = 76;
59
60 const int kDefaultRetransmissionTimeMs = 500;
61
62 class TestReceiveAlgorithm : public ReceiveAlgorithmInterface {
63 public:
TestReceiveAlgorithm(QuicCongestionFeedbackFrame * feedback)64 explicit TestReceiveAlgorithm(QuicCongestionFeedbackFrame* feedback)
65 : feedback_(feedback) {
66 }
67
GenerateCongestionFeedback(QuicCongestionFeedbackFrame * congestion_feedback)68 bool GenerateCongestionFeedback(
69 QuicCongestionFeedbackFrame* congestion_feedback) {
70 if (feedback_ == NULL) {
71 return false;
72 }
73 *congestion_feedback = *feedback_;
74 return true;
75 }
76
77 MOCK_METHOD3(RecordIncomingPacket,
78 void(QuicByteCount, QuicPacketSequenceNumber, QuicTime));
79
80 private:
81 QuicCongestionFeedbackFrame* feedback_;
82
83 DISALLOW_COPY_AND_ASSIGN(TestReceiveAlgorithm);
84 };
85
86 // TaggingEncrypter appends kTagSize bytes of |tag| to the end of each message.
87 class TaggingEncrypter : public QuicEncrypter {
88 public:
TaggingEncrypter(uint8 tag)89 explicit TaggingEncrypter(uint8 tag)
90 : tag_(tag) {
91 }
92
~TaggingEncrypter()93 virtual ~TaggingEncrypter() {}
94
95 // QuicEncrypter interface.
SetKey(StringPiece key)96 virtual bool SetKey(StringPiece key) OVERRIDE { return true; }
SetNoncePrefix(StringPiece nonce_prefix)97 virtual bool SetNoncePrefix(StringPiece nonce_prefix) OVERRIDE {
98 return true;
99 }
100
Encrypt(StringPiece nonce,StringPiece associated_data,StringPiece plaintext,unsigned char * output)101 virtual bool Encrypt(StringPiece nonce,
102 StringPiece associated_data,
103 StringPiece plaintext,
104 unsigned char* output) OVERRIDE {
105 memcpy(output, plaintext.data(), plaintext.size());
106 output += plaintext.size();
107 memset(output, tag_, kTagSize);
108 return true;
109 }
110
EncryptPacket(QuicPacketSequenceNumber sequence_number,StringPiece associated_data,StringPiece plaintext)111 virtual QuicData* EncryptPacket(QuicPacketSequenceNumber sequence_number,
112 StringPiece associated_data,
113 StringPiece plaintext) OVERRIDE {
114 const size_t len = plaintext.size() + kTagSize;
115 uint8* buffer = new uint8[len];
116 Encrypt(StringPiece(), associated_data, plaintext, buffer);
117 return new QuicData(reinterpret_cast<char*>(buffer), len, true);
118 }
119
GetKeySize() const120 virtual size_t GetKeySize() const OVERRIDE { return 0; }
GetNoncePrefixSize() const121 virtual size_t GetNoncePrefixSize() const OVERRIDE { return 0; }
122
GetMaxPlaintextSize(size_t ciphertext_size) const123 virtual size_t GetMaxPlaintextSize(size_t ciphertext_size) const OVERRIDE {
124 return ciphertext_size - kTagSize;
125 }
126
GetCiphertextSize(size_t plaintext_size) const127 virtual size_t GetCiphertextSize(size_t plaintext_size) const OVERRIDE {
128 return plaintext_size + kTagSize;
129 }
130
GetKey() const131 virtual StringPiece GetKey() const OVERRIDE {
132 return StringPiece();
133 }
134
GetNoncePrefix() const135 virtual StringPiece GetNoncePrefix() const OVERRIDE {
136 return StringPiece();
137 }
138
139 private:
140 enum {
141 kTagSize = 12,
142 };
143
144 const uint8 tag_;
145
146 DISALLOW_COPY_AND_ASSIGN(TaggingEncrypter);
147 };
148
149 // TaggingDecrypter ensures that the final kTagSize bytes of the message all
150 // have the same value and then removes them.
151 class TaggingDecrypter : public QuicDecrypter {
152 public:
~TaggingDecrypter()153 virtual ~TaggingDecrypter() {}
154
155 // QuicDecrypter interface
SetKey(StringPiece key)156 virtual bool SetKey(StringPiece key) OVERRIDE { return true; }
SetNoncePrefix(StringPiece nonce_prefix)157 virtual bool SetNoncePrefix(StringPiece nonce_prefix) OVERRIDE {
158 return true;
159 }
160
Decrypt(StringPiece nonce,StringPiece associated_data,StringPiece ciphertext,unsigned char * output,size_t * output_length)161 virtual bool Decrypt(StringPiece nonce,
162 StringPiece associated_data,
163 StringPiece ciphertext,
164 unsigned char* output,
165 size_t* output_length) OVERRIDE {
166 if (ciphertext.size() < kTagSize) {
167 return false;
168 }
169 if (!CheckTag(ciphertext, GetTag(ciphertext))) {
170 return false;
171 }
172 *output_length = ciphertext.size() - kTagSize;
173 memcpy(output, ciphertext.data(), *output_length);
174 return true;
175 }
176
DecryptPacket(QuicPacketSequenceNumber sequence_number,StringPiece associated_data,StringPiece ciphertext)177 virtual QuicData* DecryptPacket(QuicPacketSequenceNumber sequence_number,
178 StringPiece associated_data,
179 StringPiece ciphertext) OVERRIDE {
180 if (ciphertext.size() < kTagSize) {
181 return NULL;
182 }
183 if (!CheckTag(ciphertext, GetTag(ciphertext))) {
184 return NULL;
185 }
186 const size_t len = ciphertext.size() - kTagSize;
187 uint8* buf = new uint8[len];
188 memcpy(buf, ciphertext.data(), len);
189 return new QuicData(reinterpret_cast<char*>(buf), len,
190 true /* owns buffer */);
191 }
192
GetKey() const193 virtual StringPiece GetKey() const OVERRIDE { return StringPiece(); }
GetNoncePrefix() const194 virtual StringPiece GetNoncePrefix() const OVERRIDE { return StringPiece(); }
195
196 protected:
GetTag(StringPiece ciphertext)197 virtual uint8 GetTag(StringPiece ciphertext) {
198 return ciphertext.data()[ciphertext.size()-1];
199 }
200
201 private:
202 enum {
203 kTagSize = 12,
204 };
205
CheckTag(StringPiece ciphertext,uint8 tag)206 bool CheckTag(StringPiece ciphertext, uint8 tag) {
207 for (size_t i = ciphertext.size() - kTagSize; i < ciphertext.size(); i++) {
208 if (ciphertext.data()[i] != tag) {
209 return false;
210 }
211 }
212
213 return true;
214 }
215 };
216
217 // StringTaggingDecrypter ensures that the final kTagSize bytes of the message
218 // match the expected value.
219 class StrictTaggingDecrypter : public TaggingDecrypter {
220 public:
StrictTaggingDecrypter(uint8 tag)221 explicit StrictTaggingDecrypter(uint8 tag) : tag_(tag) {}
~StrictTaggingDecrypter()222 virtual ~StrictTaggingDecrypter() {}
223
224 // TaggingQuicDecrypter
GetTag(StringPiece ciphertext)225 virtual uint8 GetTag(StringPiece ciphertext) OVERRIDE {
226 return tag_;
227 }
228
229 private:
230 const uint8 tag_;
231 };
232
233 class TestConnectionHelper : public QuicConnectionHelperInterface {
234 public:
235 class TestAlarm : public QuicAlarm {
236 public:
TestAlarm(QuicAlarm::Delegate * delegate)237 explicit TestAlarm(QuicAlarm::Delegate* delegate)
238 : QuicAlarm(delegate) {
239 }
240
SetImpl()241 virtual void SetImpl() OVERRIDE {}
CancelImpl()242 virtual void CancelImpl() OVERRIDE {}
243 using QuicAlarm::Fire;
244 };
245
TestConnectionHelper(MockClock * clock,MockRandom * random_generator)246 TestConnectionHelper(MockClock* clock, MockRandom* random_generator)
247 : clock_(clock),
248 random_generator_(random_generator) {
249 clock_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
250 }
251
252 // QuicConnectionHelperInterface
GetClock() const253 virtual const QuicClock* GetClock() const OVERRIDE {
254 return clock_;
255 }
256
GetRandomGenerator()257 virtual QuicRandom* GetRandomGenerator() OVERRIDE {
258 return random_generator_;
259 }
260
CreateAlarm(QuicAlarm::Delegate * delegate)261 virtual QuicAlarm* CreateAlarm(QuicAlarm::Delegate* delegate) OVERRIDE {
262 return new TestAlarm(delegate);
263 }
264
265 private:
266 MockClock* clock_;
267 MockRandom* random_generator_;
268
269 DISALLOW_COPY_AND_ASSIGN(TestConnectionHelper);
270 };
271
272 class TestPacketWriter : public QuicPacketWriter {
273 public:
TestPacketWriter(QuicVersion version)274 explicit TestPacketWriter(QuicVersion version)
275 : version_(version),
276 framer_(SupportedVersions(version_)),
277 last_packet_size_(0),
278 write_blocked_(false),
279 block_on_next_write_(false),
280 is_write_blocked_data_buffered_(false),
281 final_bytes_of_last_packet_(0),
282 final_bytes_of_previous_packet_(0),
283 use_tagging_decrypter_(false),
284 packets_write_attempts_(0) {
285 }
286
287 // QuicPacketWriter interface
WritePacket(const char * buffer,size_t buf_len,const IPAddressNumber & self_address,const IPEndPoint & peer_address)288 virtual WriteResult WritePacket(
289 const char* buffer, size_t buf_len,
290 const IPAddressNumber& self_address,
291 const IPEndPoint& peer_address) OVERRIDE {
292 QuicEncryptedPacket packet(buffer, buf_len);
293 ++packets_write_attempts_;
294
295 if (packet.length() >= sizeof(final_bytes_of_last_packet_)) {
296 final_bytes_of_previous_packet_ = final_bytes_of_last_packet_;
297 memcpy(&final_bytes_of_last_packet_, packet.data() + packet.length() - 4,
298 sizeof(final_bytes_of_last_packet_));
299 }
300
301 if (use_tagging_decrypter_) {
302 framer_.framer()->SetDecrypter(new TaggingDecrypter, ENCRYPTION_NONE);
303 }
304 EXPECT_TRUE(framer_.ProcessPacket(packet));
305 if (block_on_next_write_) {
306 write_blocked_ = true;
307 block_on_next_write_ = false;
308 }
309 if (IsWriteBlocked()) {
310 return WriteResult(WRITE_STATUS_BLOCKED, -1);
311 }
312 last_packet_size_ = packet.length();
313 return WriteResult(WRITE_STATUS_OK, last_packet_size_);
314 }
315
IsWriteBlockedDataBuffered() const316 virtual bool IsWriteBlockedDataBuffered() const OVERRIDE {
317 return is_write_blocked_data_buffered_;
318 }
319
IsWriteBlocked() const320 virtual bool IsWriteBlocked() const OVERRIDE { return write_blocked_; }
321
SetWritable()322 virtual void SetWritable() OVERRIDE { write_blocked_ = false; }
323
BlockOnNextWrite()324 void BlockOnNextWrite() { block_on_next_write_ = true; }
325
header()326 const QuicPacketHeader& header() { return framer_.header(); }
327
frame_count() const328 size_t frame_count() const { return framer_.num_frames(); }
329
ack_frames() const330 const vector<QuicAckFrame>& ack_frames() const {
331 return framer_.ack_frames();
332 }
333
feedback_frames() const334 const vector<QuicCongestionFeedbackFrame>& feedback_frames() const {
335 return framer_.feedback_frames();
336 }
337
stop_waiting_frames() const338 const vector<QuicStopWaitingFrame>& stop_waiting_frames() const {
339 return framer_.stop_waiting_frames();
340 }
341
connection_close_frames() const342 const vector<QuicConnectionCloseFrame>& connection_close_frames() const {
343 return framer_.connection_close_frames();
344 }
345
stream_frames() const346 const vector<QuicStreamFrame>& stream_frames() const {
347 return framer_.stream_frames();
348 }
349
ping_frames() const350 const vector<QuicPingFrame>& ping_frames() const {
351 return framer_.ping_frames();
352 }
353
last_packet_size()354 size_t last_packet_size() {
355 return last_packet_size_;
356 }
357
version_negotiation_packet()358 const QuicVersionNegotiationPacket* version_negotiation_packet() {
359 return framer_.version_negotiation_packet();
360 }
361
set_is_write_blocked_data_buffered(bool buffered)362 void set_is_write_blocked_data_buffered(bool buffered) {
363 is_write_blocked_data_buffered_ = buffered;
364 }
365
set_is_server(bool is_server)366 void set_is_server(bool is_server) {
367 // We invert is_server here, because the framer needs to parse packets
368 // we send.
369 QuicFramerPeer::SetIsServer(framer_.framer(), !is_server);
370 }
371
372 // final_bytes_of_last_packet_ returns the last four bytes of the previous
373 // packet as a little-endian, uint32. This is intended to be used with a
374 // TaggingEncrypter so that tests can determine which encrypter was used for
375 // a given packet.
final_bytes_of_last_packet()376 uint32 final_bytes_of_last_packet() { return final_bytes_of_last_packet_; }
377
378 // Returns the final bytes of the second to last packet.
final_bytes_of_previous_packet()379 uint32 final_bytes_of_previous_packet() {
380 return final_bytes_of_previous_packet_;
381 }
382
use_tagging_decrypter()383 void use_tagging_decrypter() {
384 use_tagging_decrypter_ = true;
385 }
386
packets_write_attempts()387 uint32 packets_write_attempts() { return packets_write_attempts_; }
388
Reset()389 void Reset() { framer_.Reset(); }
390
SetSupportedVersions(const QuicVersionVector & versions)391 void SetSupportedVersions(const QuicVersionVector& versions) {
392 framer_.SetSupportedVersions(versions);
393 }
394
395 private:
396 QuicVersion version_;
397 SimpleQuicFramer framer_;
398 size_t last_packet_size_;
399 bool write_blocked_;
400 bool block_on_next_write_;
401 bool is_write_blocked_data_buffered_;
402 uint32 final_bytes_of_last_packet_;
403 uint32 final_bytes_of_previous_packet_;
404 bool use_tagging_decrypter_;
405 uint32 packets_write_attempts_;
406
407 DISALLOW_COPY_AND_ASSIGN(TestPacketWriter);
408 };
409
410 class TestConnection : public QuicConnection {
411 public:
TestConnection(QuicConnectionId connection_id,IPEndPoint address,TestConnectionHelper * helper,const PacketWriterFactory & factory,bool is_server,QuicVersion version)412 TestConnection(QuicConnectionId connection_id,
413 IPEndPoint address,
414 TestConnectionHelper* helper,
415 const PacketWriterFactory& factory,
416 bool is_server,
417 QuicVersion version)
418 : QuicConnection(connection_id,
419 address,
420 helper,
421 factory,
422 /* owns_writer= */ false,
423 is_server,
424 SupportedVersions(version)) {
425 // Disable tail loss probes for most tests.
426 QuicSentPacketManagerPeer::SetMaxTailLossProbes(
427 QuicConnectionPeer::GetSentPacketManager(this), 0);
428 writer()->set_is_server(is_server);
429 }
430
SendAck()431 void SendAck() {
432 QuicConnectionPeer::SendAck(this);
433 }
434
SetReceiveAlgorithm(TestReceiveAlgorithm * receive_algorithm)435 void SetReceiveAlgorithm(TestReceiveAlgorithm* receive_algorithm) {
436 QuicConnectionPeer::SetReceiveAlgorithm(this, receive_algorithm);
437 }
438
SetSendAlgorithm(SendAlgorithmInterface * send_algorithm)439 void SetSendAlgorithm(SendAlgorithmInterface* send_algorithm) {
440 QuicConnectionPeer::SetSendAlgorithm(this, send_algorithm);
441 }
442
SetLossAlgorithm(LossDetectionInterface * loss_algorithm)443 void SetLossAlgorithm(LossDetectionInterface* loss_algorithm) {
444 QuicSentPacketManagerPeer::SetLossAlgorithm(
445 QuicConnectionPeer::GetSentPacketManager(this), loss_algorithm);
446 }
447
SendPacket(EncryptionLevel level,QuicPacketSequenceNumber sequence_number,QuicPacket * packet,QuicPacketEntropyHash entropy_hash,HasRetransmittableData retransmittable)448 void SendPacket(EncryptionLevel level,
449 QuicPacketSequenceNumber sequence_number,
450 QuicPacket* packet,
451 QuicPacketEntropyHash entropy_hash,
452 HasRetransmittableData retransmittable) {
453 RetransmittableFrames* retransmittable_frames =
454 retransmittable == HAS_RETRANSMITTABLE_DATA ?
455 new RetransmittableFrames() : NULL;
456 OnSerializedPacket(
457 SerializedPacket(sequence_number, PACKET_6BYTE_SEQUENCE_NUMBER,
458 packet, entropy_hash, retransmittable_frames));
459 }
460
SendStreamDataWithString(QuicStreamId id,StringPiece data,QuicStreamOffset offset,bool fin,QuicAckNotifier::DelegateInterface * delegate)461 QuicConsumedData SendStreamDataWithString(
462 QuicStreamId id,
463 StringPiece data,
464 QuicStreamOffset offset,
465 bool fin,
466 QuicAckNotifier::DelegateInterface* delegate) {
467 return SendStreamDataWithStringHelper(id, data, offset, fin,
468 MAY_FEC_PROTECT, delegate);
469 }
470
SendStreamDataWithStringWithFec(QuicStreamId id,StringPiece data,QuicStreamOffset offset,bool fin,QuicAckNotifier::DelegateInterface * delegate)471 QuicConsumedData SendStreamDataWithStringWithFec(
472 QuicStreamId id,
473 StringPiece data,
474 QuicStreamOffset offset,
475 bool fin,
476 QuicAckNotifier::DelegateInterface* delegate) {
477 return SendStreamDataWithStringHelper(id, data, offset, fin,
478 MUST_FEC_PROTECT, delegate);
479 }
480
SendStreamDataWithStringHelper(QuicStreamId id,StringPiece data,QuicStreamOffset offset,bool fin,FecProtection fec_protection,QuicAckNotifier::DelegateInterface * delegate)481 QuicConsumedData SendStreamDataWithStringHelper(
482 QuicStreamId id,
483 StringPiece data,
484 QuicStreamOffset offset,
485 bool fin,
486 FecProtection fec_protection,
487 QuicAckNotifier::DelegateInterface* delegate) {
488 IOVector data_iov;
489 if (!data.empty()) {
490 data_iov.Append(const_cast<char*>(data.data()), data.size());
491 }
492 return QuicConnection::SendStreamData(id, data_iov, offset, fin,
493 fec_protection, delegate);
494 }
495
SendStreamData3()496 QuicConsumedData SendStreamData3() {
497 return SendStreamDataWithString(kClientDataStreamId1, "food", 0, !kFin,
498 NULL);
499 }
500
SendStreamData3WithFec()501 QuicConsumedData SendStreamData3WithFec() {
502 return SendStreamDataWithStringWithFec(kClientDataStreamId1, "food", 0,
503 !kFin, NULL);
504 }
505
SendStreamData5()506 QuicConsumedData SendStreamData5() {
507 return SendStreamDataWithString(kClientDataStreamId2, "food2", 0,
508 !kFin, NULL);
509 }
510
SendStreamData5WithFec()511 QuicConsumedData SendStreamData5WithFec() {
512 return SendStreamDataWithStringWithFec(kClientDataStreamId2, "food2", 0,
513 !kFin, NULL);
514 }
515 // Ensures the connection can write stream data before writing.
EnsureWritableAndSendStreamData5()516 QuicConsumedData EnsureWritableAndSendStreamData5() {
517 EXPECT_TRUE(CanWriteStreamData());
518 return SendStreamData5();
519 }
520
521 // The crypto stream has special semantics so that it is not blocked by a
522 // congestion window limitation, and also so that it gets put into a separate
523 // packet (so that it is easier to reason about a crypto frame not being
524 // split needlessly across packet boundaries). As a result, we have separate
525 // tests for some cases for this stream.
SendCryptoStreamData()526 QuicConsumedData SendCryptoStreamData() {
527 return SendStreamDataWithString(kCryptoStreamId, "chlo", 0, !kFin, NULL);
528 }
529
is_server()530 bool is_server() {
531 return QuicConnectionPeer::IsServer(this);
532 }
533
set_version(QuicVersion version)534 void set_version(QuicVersion version) {
535 QuicConnectionPeer::GetFramer(this)->set_version(version);
536 }
537
SetSupportedVersions(const QuicVersionVector & versions)538 void SetSupportedVersions(const QuicVersionVector& versions) {
539 QuicConnectionPeer::GetFramer(this)->SetSupportedVersions(versions);
540 writer()->SetSupportedVersions(versions);
541 }
542
set_is_server(bool is_server)543 void set_is_server(bool is_server) {
544 writer()->set_is_server(is_server);
545 QuicConnectionPeer::SetIsServer(this, is_server);
546 }
547
GetAckAlarm()548 TestConnectionHelper::TestAlarm* GetAckAlarm() {
549 return reinterpret_cast<TestConnectionHelper::TestAlarm*>(
550 QuicConnectionPeer::GetAckAlarm(this));
551 }
552
GetPingAlarm()553 TestConnectionHelper::TestAlarm* GetPingAlarm() {
554 return reinterpret_cast<TestConnectionHelper::TestAlarm*>(
555 QuicConnectionPeer::GetPingAlarm(this));
556 }
557
GetResumeWritesAlarm()558 TestConnectionHelper::TestAlarm* GetResumeWritesAlarm() {
559 return reinterpret_cast<TestConnectionHelper::TestAlarm*>(
560 QuicConnectionPeer::GetResumeWritesAlarm(this));
561 }
562
GetRetransmissionAlarm()563 TestConnectionHelper::TestAlarm* GetRetransmissionAlarm() {
564 return reinterpret_cast<TestConnectionHelper::TestAlarm*>(
565 QuicConnectionPeer::GetRetransmissionAlarm(this));
566 }
567
GetSendAlarm()568 TestConnectionHelper::TestAlarm* GetSendAlarm() {
569 return reinterpret_cast<TestConnectionHelper::TestAlarm*>(
570 QuicConnectionPeer::GetSendAlarm(this));
571 }
572
GetTimeoutAlarm()573 TestConnectionHelper::TestAlarm* GetTimeoutAlarm() {
574 return reinterpret_cast<TestConnectionHelper::TestAlarm*>(
575 QuicConnectionPeer::GetTimeoutAlarm(this));
576 }
577
578 using QuicConnection::SelectMutualVersion;
579
580 private:
writer()581 TestPacketWriter* writer() {
582 return static_cast<TestPacketWriter*>(QuicConnection::writer());
583 }
584
585 DISALLOW_COPY_AND_ASSIGN(TestConnection);
586 };
587
588 // Used for testing packets revived from FEC packets.
589 class FecQuicConnectionDebugVisitor
590 : public QuicConnectionDebugVisitor {
591 public:
OnRevivedPacket(const QuicPacketHeader & header,StringPiece data)592 virtual void OnRevivedPacket(const QuicPacketHeader& header,
593 StringPiece data) OVERRIDE {
594 revived_header_ = header;
595 }
596
597 // Public accessor method.
revived_header() const598 QuicPacketHeader revived_header() const {
599 return revived_header_;
600 }
601
602 private:
603 QuicPacketHeader revived_header_;
604 };
605
606 class MockPacketWriterFactory : public QuicConnection::PacketWriterFactory {
607 public:
MockPacketWriterFactory(QuicPacketWriter * writer)608 MockPacketWriterFactory(QuicPacketWriter* writer) {
609 ON_CALL(*this, Create(_)).WillByDefault(Return(writer));
610 }
~MockPacketWriterFactory()611 virtual ~MockPacketWriterFactory() {}
612
613 MOCK_CONST_METHOD1(Create, QuicPacketWriter*(QuicConnection* connection));
614 };
615
616 class QuicConnectionTest : public ::testing::TestWithParam<QuicVersion> {
617 protected:
QuicConnectionTest()618 QuicConnectionTest()
619 : connection_id_(42),
620 framer_(SupportedVersions(version()), QuicTime::Zero(), false),
621 peer_creator_(connection_id_, &framer_, &random_generator_),
622 send_algorithm_(new StrictMock<MockSendAlgorithm>),
623 loss_algorithm_(new MockLossAlgorithm()),
624 helper_(new TestConnectionHelper(&clock_, &random_generator_)),
625 writer_(new TestPacketWriter(version())),
626 factory_(writer_.get()),
627 connection_(connection_id_, IPEndPoint(), helper_.get(),
628 factory_, false, version()),
629 frame1_(1, false, 0, MakeIOVector(data1)),
630 frame2_(1, false, 3, MakeIOVector(data2)),
631 sequence_number_length_(PACKET_6BYTE_SEQUENCE_NUMBER),
632 connection_id_length_(PACKET_8BYTE_CONNECTION_ID) {
633 connection_.set_visitor(&visitor_);
634 connection_.SetSendAlgorithm(send_algorithm_);
635 connection_.SetLossAlgorithm(loss_algorithm_);
636 framer_.set_received_entropy_calculator(&entropy_calculator_);
637 // Simplify tests by not sending feedback unless specifically configured.
638 SetFeedback(NULL);
639 EXPECT_CALL(
640 *send_algorithm_, TimeUntilSend(_, _, _)).WillRepeatedly(Return(
641 QuicTime::Delta::Zero()));
642 EXPECT_CALL(*receive_algorithm_,
643 RecordIncomingPacket(_, _, _)).Times(AnyNumber());
644 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
645 .Times(AnyNumber());
646 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()).WillRepeatedly(
647 Return(QuicTime::Delta::Zero()));
648 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()).WillRepeatedly(
649 Return(kMaxPacketSize));
650 ON_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
651 .WillByDefault(Return(true));
652 EXPECT_CALL(*send_algorithm_, HasReliableBandwidthEstimate())
653 .Times(AnyNumber());
654 EXPECT_CALL(*send_algorithm_, BandwidthEstimate())
655 .Times(AnyNumber())
656 .WillRepeatedly(Return(QuicBandwidth::Zero()));
657 EXPECT_CALL(*send_algorithm_, InSlowStart()).Times(AnyNumber());
658 EXPECT_CALL(*send_algorithm_, InRecovery()).Times(AnyNumber());
659 EXPECT_CALL(visitor_, WillingAndAbleToWrite()).Times(AnyNumber());
660 EXPECT_CALL(visitor_, HasPendingHandshake()).Times(AnyNumber());
661 EXPECT_CALL(visitor_, OnCanWrite()).Times(AnyNumber());
662 EXPECT_CALL(visitor_, HasOpenDataStreams()).WillRepeatedly(Return(false));
663 EXPECT_CALL(visitor_, OnCongestionWindowChange(_)).Times(AnyNumber());
664
665 EXPECT_CALL(*loss_algorithm_, GetLossTimeout())
666 .WillRepeatedly(Return(QuicTime::Zero()));
667 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
668 .WillRepeatedly(Return(SequenceNumberSet()));
669 }
670
version()671 QuicVersion version() {
672 return GetParam();
673 }
674
outgoing_ack()675 QuicAckFrame* outgoing_ack() {
676 outgoing_ack_.reset(QuicConnectionPeer::CreateAckFrame(&connection_));
677 return outgoing_ack_.get();
678 }
679
stop_waiting()680 QuicStopWaitingFrame* stop_waiting() {
681 stop_waiting_.reset(
682 QuicConnectionPeer::CreateStopWaitingFrame(&connection_));
683 return stop_waiting_.get();
684 }
685
least_unacked()686 QuicPacketSequenceNumber least_unacked() {
687 if (writer_->stop_waiting_frames().empty()) {
688 return 0;
689 }
690 return writer_->stop_waiting_frames()[0].least_unacked;
691 }
692
use_tagging_decrypter()693 void use_tagging_decrypter() {
694 writer_->use_tagging_decrypter();
695 }
696
ProcessPacket(QuicPacketSequenceNumber number)697 void ProcessPacket(QuicPacketSequenceNumber number) {
698 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1);
699 ProcessDataPacket(number, 0, !kEntropyFlag);
700 }
701
ProcessFramePacket(QuicFrame frame)702 QuicPacketEntropyHash ProcessFramePacket(QuicFrame frame) {
703 QuicFrames frames;
704 frames.push_back(QuicFrame(frame));
705 QuicPacketCreatorPeer::SetSendVersionInPacket(&peer_creator_,
706 connection_.is_server());
707 SerializedPacket serialized_packet =
708 peer_creator_.SerializeAllFrames(frames);
709 scoped_ptr<QuicPacket> packet(serialized_packet.packet);
710 scoped_ptr<QuicEncryptedPacket> encrypted(
711 framer_.EncryptPacket(ENCRYPTION_NONE,
712 serialized_packet.sequence_number, *packet));
713 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
714 return serialized_packet.entropy_hash;
715 }
716
ProcessDataPacket(QuicPacketSequenceNumber number,QuicFecGroupNumber fec_group,bool entropy_flag)717 size_t ProcessDataPacket(QuicPacketSequenceNumber number,
718 QuicFecGroupNumber fec_group,
719 bool entropy_flag) {
720 return ProcessDataPacketAtLevel(number, fec_group, entropy_flag,
721 ENCRYPTION_NONE);
722 }
723
ProcessDataPacketAtLevel(QuicPacketSequenceNumber number,QuicFecGroupNumber fec_group,bool entropy_flag,EncryptionLevel level)724 size_t ProcessDataPacketAtLevel(QuicPacketSequenceNumber number,
725 QuicFecGroupNumber fec_group,
726 bool entropy_flag,
727 EncryptionLevel level) {
728 scoped_ptr<QuicPacket> packet(ConstructDataPacket(number, fec_group,
729 entropy_flag));
730 scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket(
731 level, number, *packet));
732 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
733 return encrypted->length();
734 }
735
ProcessPingPacket(QuicPacketSequenceNumber number)736 void ProcessPingPacket(QuicPacketSequenceNumber number) {
737 scoped_ptr<QuicPacket> packet(ConstructPingPacket(number));
738 scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket(
739 ENCRYPTION_NONE, number, *packet));
740 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
741 }
742
ProcessClosePacket(QuicPacketSequenceNumber number,QuicFecGroupNumber fec_group)743 void ProcessClosePacket(QuicPacketSequenceNumber number,
744 QuicFecGroupNumber fec_group) {
745 scoped_ptr<QuicPacket> packet(ConstructClosePacket(number, fec_group));
746 scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket(
747 ENCRYPTION_NONE, number, *packet));
748 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
749 }
750
ProcessFecProtectedPacket(QuicPacketSequenceNumber number,bool expect_revival,bool entropy_flag)751 size_t ProcessFecProtectedPacket(QuicPacketSequenceNumber number,
752 bool expect_revival, bool entropy_flag) {
753 if (expect_revival) {
754 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1);
755 }
756 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1).
757 RetiresOnSaturation();
758 return ProcessDataPacket(number, 1, entropy_flag);
759 }
760
761 // Processes an FEC packet that covers the packets that would have been
762 // received.
ProcessFecPacket(QuicPacketSequenceNumber number,QuicPacketSequenceNumber min_protected_packet,bool expect_revival,bool entropy_flag,QuicPacket * packet)763 size_t ProcessFecPacket(QuicPacketSequenceNumber number,
764 QuicPacketSequenceNumber min_protected_packet,
765 bool expect_revival,
766 bool entropy_flag,
767 QuicPacket* packet) {
768 if (expect_revival) {
769 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1);
770 }
771
772 // Construct the decrypted data packet so we can compute the correct
773 // redundancy. If |packet| has been provided then use that, otherwise
774 // construct a default data packet.
775 scoped_ptr<QuicPacket> data_packet;
776 if (packet) {
777 data_packet.reset(packet);
778 } else {
779 data_packet.reset(ConstructDataPacket(number, 1, !kEntropyFlag));
780 }
781
782 header_.public_header.connection_id = connection_id_;
783 header_.public_header.reset_flag = false;
784 header_.public_header.version_flag = false;
785 header_.public_header.sequence_number_length = sequence_number_length_;
786 header_.public_header.connection_id_length = connection_id_length_;
787 header_.packet_sequence_number = number;
788 header_.entropy_flag = entropy_flag;
789 header_.fec_flag = true;
790 header_.is_in_fec_group = IN_FEC_GROUP;
791 header_.fec_group = min_protected_packet;
792 QuicFecData fec_data;
793 fec_data.fec_group = header_.fec_group;
794
795 // Since all data packets in this test have the same payload, the
796 // redundancy is either equal to that payload or the xor of that payload
797 // with itself, depending on the number of packets.
798 if (((number - min_protected_packet) % 2) == 0) {
799 for (size_t i = GetStartOfFecProtectedData(
800 header_.public_header.connection_id_length,
801 header_.public_header.version_flag,
802 header_.public_header.sequence_number_length);
803 i < data_packet->length(); ++i) {
804 data_packet->mutable_data()[i] ^= data_packet->data()[i];
805 }
806 }
807 fec_data.redundancy = data_packet->FecProtectedData();
808
809 scoped_ptr<QuicPacket> fec_packet(
810 framer_.BuildFecPacket(header_, fec_data).packet);
811 scoped_ptr<QuicEncryptedPacket> encrypted(
812 framer_.EncryptPacket(ENCRYPTION_NONE, number, *fec_packet));
813
814 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
815 return encrypted->length();
816 }
817
SendStreamDataToPeer(QuicStreamId id,StringPiece data,QuicStreamOffset offset,bool fin,QuicPacketSequenceNumber * last_packet)818 QuicByteCount SendStreamDataToPeer(QuicStreamId id,
819 StringPiece data,
820 QuicStreamOffset offset,
821 bool fin,
822 QuicPacketSequenceNumber* last_packet) {
823 QuicByteCount packet_size;
824 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
825 .WillOnce(DoAll(SaveArg<3>(&packet_size), Return(true)));
826 connection_.SendStreamDataWithString(id, data, offset, fin, NULL);
827 if (last_packet != NULL) {
828 *last_packet =
829 QuicConnectionPeer::GetPacketCreator(&connection_)->sequence_number();
830 }
831 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
832 .Times(AnyNumber());
833 return packet_size;
834 }
835
SendAckPacketToPeer()836 void SendAckPacketToPeer() {
837 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
838 connection_.SendAck();
839 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
840 .Times(AnyNumber());
841 }
842
ProcessAckPacket(QuicAckFrame * frame)843 QuicPacketEntropyHash ProcessAckPacket(QuicAckFrame* frame) {
844 return ProcessFramePacket(QuicFrame(frame));
845 }
846
ProcessStopWaitingPacket(QuicStopWaitingFrame * frame)847 QuicPacketEntropyHash ProcessStopWaitingPacket(QuicStopWaitingFrame* frame) {
848 return ProcessFramePacket(QuicFrame(frame));
849 }
850
ProcessGoAwayPacket(QuicGoAwayFrame * frame)851 QuicPacketEntropyHash ProcessGoAwayPacket(QuicGoAwayFrame* frame) {
852 return ProcessFramePacket(QuicFrame(frame));
853 }
854
IsMissing(QuicPacketSequenceNumber number)855 bool IsMissing(QuicPacketSequenceNumber number) {
856 return IsAwaitingPacket(*outgoing_ack(), number);
857 }
858
ConstructDataPacket(QuicPacketSequenceNumber number,QuicFecGroupNumber fec_group,bool entropy_flag)859 QuicPacket* ConstructDataPacket(QuicPacketSequenceNumber number,
860 QuicFecGroupNumber fec_group,
861 bool entropy_flag) {
862 header_.public_header.connection_id = connection_id_;
863 header_.public_header.reset_flag = false;
864 header_.public_header.version_flag = false;
865 header_.public_header.sequence_number_length = sequence_number_length_;
866 header_.public_header.connection_id_length = connection_id_length_;
867 header_.entropy_flag = entropy_flag;
868 header_.fec_flag = false;
869 header_.packet_sequence_number = number;
870 header_.is_in_fec_group = fec_group == 0u ? NOT_IN_FEC_GROUP : IN_FEC_GROUP;
871 header_.fec_group = fec_group;
872
873 QuicFrames frames;
874 QuicFrame frame(&frame1_);
875 frames.push_back(frame);
876 QuicPacket* packet =
877 BuildUnsizedDataPacket(&framer_, header_, frames).packet;
878 EXPECT_TRUE(packet != NULL);
879 return packet;
880 }
881
ConstructPingPacket(QuicPacketSequenceNumber number)882 QuicPacket* ConstructPingPacket(QuicPacketSequenceNumber number) {
883 header_.public_header.connection_id = connection_id_;
884 header_.packet_sequence_number = number;
885 header_.public_header.reset_flag = false;
886 header_.public_header.version_flag = false;
887 header_.entropy_flag = false;
888 header_.fec_flag = false;
889 header_.is_in_fec_group = NOT_IN_FEC_GROUP;
890 header_.fec_group = 0;
891
892 QuicPingFrame ping;
893
894 QuicFrames frames;
895 QuicFrame frame(&ping);
896 frames.push_back(frame);
897 QuicPacket* packet =
898 BuildUnsizedDataPacket(&framer_, header_, frames).packet;
899 EXPECT_TRUE(packet != NULL);
900 return packet;
901 }
902
ConstructClosePacket(QuicPacketSequenceNumber number,QuicFecGroupNumber fec_group)903 QuicPacket* ConstructClosePacket(QuicPacketSequenceNumber number,
904 QuicFecGroupNumber fec_group) {
905 header_.public_header.connection_id = connection_id_;
906 header_.packet_sequence_number = number;
907 header_.public_header.reset_flag = false;
908 header_.public_header.version_flag = false;
909 header_.entropy_flag = false;
910 header_.fec_flag = false;
911 header_.is_in_fec_group = fec_group == 0u ? NOT_IN_FEC_GROUP : IN_FEC_GROUP;
912 header_.fec_group = fec_group;
913
914 QuicConnectionCloseFrame qccf;
915 qccf.error_code = QUIC_PEER_GOING_AWAY;
916
917 QuicFrames frames;
918 QuicFrame frame(&qccf);
919 frames.push_back(frame);
920 QuicPacket* packet =
921 BuildUnsizedDataPacket(&framer_, header_, frames).packet;
922 EXPECT_TRUE(packet != NULL);
923 return packet;
924 }
925
SetFeedback(QuicCongestionFeedbackFrame * feedback)926 void SetFeedback(QuicCongestionFeedbackFrame* feedback) {
927 receive_algorithm_ = new TestReceiveAlgorithm(feedback);
928 connection_.SetReceiveAlgorithm(receive_algorithm_);
929 }
930
DefaultRetransmissionTime()931 QuicTime::Delta DefaultRetransmissionTime() {
932 return QuicTime::Delta::FromMilliseconds(kDefaultRetransmissionTimeMs);
933 }
934
DefaultDelayedAckTime()935 QuicTime::Delta DefaultDelayedAckTime() {
936 return QuicTime::Delta::FromMilliseconds(kMaxDelayedAckTimeMs);
937 }
938
939 // Initialize a frame acknowledging all packets up to largest_observed.
InitAckFrame(QuicPacketSequenceNumber largest_observed)940 const QuicAckFrame InitAckFrame(QuicPacketSequenceNumber largest_observed) {
941 QuicAckFrame frame(MakeAckFrame(largest_observed));
942 if (largest_observed > 0) {
943 frame.entropy_hash =
944 QuicConnectionPeer::GetSentEntropyHash(&connection_,
945 largest_observed);
946 }
947 return frame;
948 }
949
InitStopWaitingFrame(QuicPacketSequenceNumber least_unacked)950 const QuicStopWaitingFrame InitStopWaitingFrame(
951 QuicPacketSequenceNumber least_unacked) {
952 QuicStopWaitingFrame frame;
953 frame.least_unacked = least_unacked;
954 return frame;
955 }
956
957 // Explicitly nack a packet.
NackPacket(QuicPacketSequenceNumber missing,QuicAckFrame * frame)958 void NackPacket(QuicPacketSequenceNumber missing, QuicAckFrame* frame) {
959 frame->missing_packets.insert(missing);
960 frame->entropy_hash ^=
961 QuicConnectionPeer::PacketEntropy(&connection_, missing);
962 }
963
964 // Undo nacking a packet within the frame.
AckPacket(QuicPacketSequenceNumber arrived,QuicAckFrame * frame)965 void AckPacket(QuicPacketSequenceNumber arrived, QuicAckFrame* frame) {
966 EXPECT_THAT(frame->missing_packets, Contains(arrived));
967 frame->missing_packets.erase(arrived);
968 frame->entropy_hash ^=
969 QuicConnectionPeer::PacketEntropy(&connection_, arrived);
970 }
971
TriggerConnectionClose()972 void TriggerConnectionClose() {
973 // Send an erroneous packet to close the connection.
974 EXPECT_CALL(visitor_,
975 OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, false));
976 // Call ProcessDataPacket rather than ProcessPacket, as we should not get a
977 // packet call to the visitor.
978 ProcessDataPacket(6000, 0, !kEntropyFlag);
979 EXPECT_FALSE(
980 QuicConnectionPeer::GetConnectionClosePacket(&connection_) == NULL);
981 }
982
BlockOnNextWrite()983 void BlockOnNextWrite() {
984 writer_->BlockOnNextWrite();
985 EXPECT_CALL(visitor_, OnWriteBlocked()).Times(AtLeast(1));
986 }
987
CongestionBlockWrites()988 void CongestionBlockWrites() {
989 EXPECT_CALL(*send_algorithm_,
990 TimeUntilSend(_, _, _)).WillRepeatedly(
991 testing::Return(QuicTime::Delta::FromSeconds(1)));
992 }
993
CongestionUnblockWrites()994 void CongestionUnblockWrites() {
995 EXPECT_CALL(*send_algorithm_,
996 TimeUntilSend(_, _, _)).WillRepeatedly(
997 testing::Return(QuicTime::Delta::Zero()));
998 }
999
1000 QuicConnectionId connection_id_;
1001 QuicFramer framer_;
1002 QuicPacketCreator peer_creator_;
1003 MockEntropyCalculator entropy_calculator_;
1004
1005 MockSendAlgorithm* send_algorithm_;
1006 MockLossAlgorithm* loss_algorithm_;
1007 TestReceiveAlgorithm* receive_algorithm_;
1008 MockClock clock_;
1009 MockRandom random_generator_;
1010 scoped_ptr<TestConnectionHelper> helper_;
1011 scoped_ptr<TestPacketWriter> writer_;
1012 NiceMock<MockPacketWriterFactory> factory_;
1013 TestConnection connection_;
1014 StrictMock<MockConnectionVisitor> visitor_;
1015
1016 QuicPacketHeader header_;
1017 QuicStreamFrame frame1_;
1018 QuicStreamFrame frame2_;
1019 scoped_ptr<QuicAckFrame> outgoing_ack_;
1020 scoped_ptr<QuicStopWaitingFrame> stop_waiting_;
1021 QuicSequenceNumberLength sequence_number_length_;
1022 QuicConnectionIdLength connection_id_length_;
1023
1024 private:
1025 DISALLOW_COPY_AND_ASSIGN(QuicConnectionTest);
1026 };
1027
1028 // Run all end to end tests with all supported versions.
1029 INSTANTIATE_TEST_CASE_P(SupportedVersion,
1030 QuicConnectionTest,
1031 ::testing::ValuesIn(QuicSupportedVersions()));
1032
TEST_P(QuicConnectionTest,PacketsInOrder)1033 TEST_P(QuicConnectionTest, PacketsInOrder) {
1034 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1035
1036 ProcessPacket(1);
1037 EXPECT_EQ(1u, outgoing_ack()->largest_observed);
1038 EXPECT_EQ(0u, outgoing_ack()->missing_packets.size());
1039
1040 ProcessPacket(2);
1041 EXPECT_EQ(2u, outgoing_ack()->largest_observed);
1042 EXPECT_EQ(0u, outgoing_ack()->missing_packets.size());
1043
1044 ProcessPacket(3);
1045 EXPECT_EQ(3u, outgoing_ack()->largest_observed);
1046 EXPECT_EQ(0u, outgoing_ack()->missing_packets.size());
1047 }
1048
TEST_P(QuicConnectionTest,PacketsOutOfOrder)1049 TEST_P(QuicConnectionTest, PacketsOutOfOrder) {
1050 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1051
1052 ProcessPacket(3);
1053 EXPECT_EQ(3u, outgoing_ack()->largest_observed);
1054 EXPECT_TRUE(IsMissing(2));
1055 EXPECT_TRUE(IsMissing(1));
1056
1057 ProcessPacket(2);
1058 EXPECT_EQ(3u, outgoing_ack()->largest_observed);
1059 EXPECT_FALSE(IsMissing(2));
1060 EXPECT_TRUE(IsMissing(1));
1061
1062 ProcessPacket(1);
1063 EXPECT_EQ(3u, outgoing_ack()->largest_observed);
1064 EXPECT_FALSE(IsMissing(2));
1065 EXPECT_FALSE(IsMissing(1));
1066 }
1067
TEST_P(QuicConnectionTest,DuplicatePacket)1068 TEST_P(QuicConnectionTest, DuplicatePacket) {
1069 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1070
1071 ProcessPacket(3);
1072 EXPECT_EQ(3u, outgoing_ack()->largest_observed);
1073 EXPECT_TRUE(IsMissing(2));
1074 EXPECT_TRUE(IsMissing(1));
1075
1076 // Send packet 3 again, but do not set the expectation that
1077 // the visitor OnStreamFrames() will be called.
1078 ProcessDataPacket(3, 0, !kEntropyFlag);
1079 EXPECT_EQ(3u, outgoing_ack()->largest_observed);
1080 EXPECT_TRUE(IsMissing(2));
1081 EXPECT_TRUE(IsMissing(1));
1082 }
1083
TEST_P(QuicConnectionTest,PacketsOutOfOrderWithAdditionsAndLeastAwaiting)1084 TEST_P(QuicConnectionTest, PacketsOutOfOrderWithAdditionsAndLeastAwaiting) {
1085 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1086
1087 ProcessPacket(3);
1088 EXPECT_EQ(3u, outgoing_ack()->largest_observed);
1089 EXPECT_TRUE(IsMissing(2));
1090 EXPECT_TRUE(IsMissing(1));
1091
1092 ProcessPacket(2);
1093 EXPECT_EQ(3u, outgoing_ack()->largest_observed);
1094 EXPECT_TRUE(IsMissing(1));
1095
1096 ProcessPacket(5);
1097 EXPECT_EQ(5u, outgoing_ack()->largest_observed);
1098 EXPECT_TRUE(IsMissing(1));
1099 EXPECT_TRUE(IsMissing(4));
1100
1101 // Pretend at this point the client has gotten acks for 2 and 3 and 1 is a
1102 // packet the peer will not retransmit. It indicates this by sending 'least
1103 // awaiting' is 4. The connection should then realize 1 will not be
1104 // retransmitted, and will remove it from the missing list.
1105 peer_creator_.set_sequence_number(5);
1106 QuicAckFrame frame = InitAckFrame(1);
1107 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(_, _, _, _));
1108 ProcessAckPacket(&frame);
1109
1110 // Force an ack to be sent.
1111 SendAckPacketToPeer();
1112 EXPECT_TRUE(IsMissing(4));
1113 }
1114
TEST_P(QuicConnectionTest,RejectPacketTooFarOut)1115 TEST_P(QuicConnectionTest, RejectPacketTooFarOut) {
1116 EXPECT_CALL(visitor_,
1117 OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, false));
1118 // Call ProcessDataPacket rather than ProcessPacket, as we should not get a
1119 // packet call to the visitor.
1120 ProcessDataPacket(6000, 0, !kEntropyFlag);
1121 EXPECT_FALSE(
1122 QuicConnectionPeer::GetConnectionClosePacket(&connection_) == NULL);
1123 }
1124
TEST_P(QuicConnectionTest,RejectUnencryptedStreamData)1125 TEST_P(QuicConnectionTest, RejectUnencryptedStreamData) {
1126 // Process an unencrypted packet from the non-crypto stream.
1127 frame1_.stream_id = 3;
1128 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1129 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_UNENCRYPTED_STREAM_DATA,
1130 false));
1131 ProcessDataPacket(1, 0, !kEntropyFlag);
1132 EXPECT_FALSE(
1133 QuicConnectionPeer::GetConnectionClosePacket(&connection_) == NULL);
1134 const vector<QuicConnectionCloseFrame>& connection_close_frames =
1135 writer_->connection_close_frames();
1136 EXPECT_EQ(1u, connection_close_frames.size());
1137 EXPECT_EQ(QUIC_UNENCRYPTED_STREAM_DATA,
1138 connection_close_frames[0].error_code);
1139 }
1140
TEST_P(QuicConnectionTest,TruncatedAck)1141 TEST_P(QuicConnectionTest, TruncatedAck) {
1142 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1143 QuicPacketSequenceNumber num_packets = 256 * 2 + 1;
1144 for (QuicPacketSequenceNumber i = 0; i < num_packets; ++i) {
1145 SendStreamDataToPeer(3, "foo", i * 3, !kFin, NULL);
1146 }
1147
1148 QuicAckFrame frame = InitAckFrame(num_packets);
1149 SequenceNumberSet lost_packets;
1150 // Create an ack with 256 nacks, none adjacent to one another.
1151 for (QuicPacketSequenceNumber i = 1; i <= 256; ++i) {
1152 NackPacket(i * 2, &frame);
1153 if (i < 256) { // Last packet is nacked, but not lost.
1154 lost_packets.insert(i * 2);
1155 }
1156 }
1157 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
1158 .WillOnce(Return(lost_packets));
1159 EXPECT_CALL(entropy_calculator_,
1160 EntropyHash(511)).WillOnce(testing::Return(0));
1161 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
1162 ProcessAckPacket(&frame);
1163
1164 const QuicSentPacketManager& sent_packet_manager =
1165 connection_.sent_packet_manager();
1166 // A truncated ack will not have the true largest observed.
1167 EXPECT_GT(num_packets, sent_packet_manager.largest_observed());
1168
1169 AckPacket(192, &frame);
1170
1171 // Removing one missing packet allows us to ack 192 and one more range, but
1172 // 192 has already been declared lost, so it doesn't register as an ack.
1173 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
1174 .WillOnce(Return(SequenceNumberSet()));
1175 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
1176 ProcessAckPacket(&frame);
1177 EXPECT_EQ(num_packets, sent_packet_manager.largest_observed());
1178 }
1179
TEST_P(QuicConnectionTest,AckReceiptCausesAckSendBadEntropy)1180 TEST_P(QuicConnectionTest, AckReceiptCausesAckSendBadEntropy) {
1181 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1182
1183 ProcessPacket(1);
1184 // Delay sending, then queue up an ack.
1185 EXPECT_CALL(*send_algorithm_,
1186 TimeUntilSend(_, _, _)).WillOnce(
1187 testing::Return(QuicTime::Delta::FromMicroseconds(1)));
1188 QuicConnectionPeer::SendAck(&connection_);
1189
1190 // Process an ack with a least unacked of the received ack.
1191 // This causes an ack to be sent when TimeUntilSend returns 0.
1192 EXPECT_CALL(*send_algorithm_,
1193 TimeUntilSend(_, _, _)).WillRepeatedly(
1194 testing::Return(QuicTime::Delta::Zero()));
1195 // Skip a packet and then record an ack.
1196 peer_creator_.set_sequence_number(2);
1197 QuicAckFrame frame = InitAckFrame(0);
1198 ProcessAckPacket(&frame);
1199 }
1200
TEST_P(QuicConnectionTest,OutOfOrderReceiptCausesAckSend)1201 TEST_P(QuicConnectionTest, OutOfOrderReceiptCausesAckSend) {
1202 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1203
1204 ProcessPacket(3);
1205 // Should ack immediately since we have missing packets.
1206 EXPECT_EQ(1u, writer_->packets_write_attempts());
1207
1208 ProcessPacket(2);
1209 // Should ack immediately since we have missing packets.
1210 EXPECT_EQ(2u, writer_->packets_write_attempts());
1211
1212 ProcessPacket(1);
1213 // Should ack immediately, since this fills the last hole.
1214 EXPECT_EQ(3u, writer_->packets_write_attempts());
1215
1216 ProcessPacket(4);
1217 // Should not cause an ack.
1218 EXPECT_EQ(3u, writer_->packets_write_attempts());
1219 }
1220
TEST_P(QuicConnectionTest,AckReceiptCausesAckSend)1221 TEST_P(QuicConnectionTest, AckReceiptCausesAckSend) {
1222 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1223
1224 QuicPacketSequenceNumber original;
1225 QuicByteCount packet_size;
1226 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
1227 .WillOnce(DoAll(SaveArg<2>(&original), SaveArg<3>(&packet_size),
1228 Return(true)));
1229 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL);
1230 QuicAckFrame frame = InitAckFrame(original);
1231 NackPacket(original, &frame);
1232 // First nack triggers early retransmit.
1233 SequenceNumberSet lost_packets;
1234 lost_packets.insert(1);
1235 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
1236 .WillOnce(Return(lost_packets));
1237 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
1238 QuicPacketSequenceNumber retransmission;
1239 EXPECT_CALL(*send_algorithm_,
1240 OnPacketSent(_, _, _, packet_size - kQuicVersionSize, _))
1241 .WillOnce(DoAll(SaveArg<2>(&retransmission), Return(true)));
1242
1243 ProcessAckPacket(&frame);
1244
1245 QuicAckFrame frame2 = InitAckFrame(retransmission);
1246 NackPacket(original, &frame2);
1247 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
1248 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
1249 .WillOnce(Return(SequenceNumberSet()));
1250 ProcessAckPacket(&frame2);
1251
1252 // Now if the peer sends an ack which still reports the retransmitted packet
1253 // as missing, that will bundle an ack with data after two acks in a row
1254 // indicate the high water mark needs to be raised.
1255 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _,
1256 HAS_RETRANSMITTABLE_DATA));
1257 connection_.SendStreamDataWithString(3, "foo", 3, !kFin, NULL);
1258 // No ack sent.
1259 EXPECT_EQ(1u, writer_->frame_count());
1260 EXPECT_EQ(1u, writer_->stream_frames().size());
1261
1262 // No more packet loss for the rest of the test.
1263 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
1264 .WillRepeatedly(Return(SequenceNumberSet()));
1265 ProcessAckPacket(&frame2);
1266 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _,
1267 HAS_RETRANSMITTABLE_DATA));
1268 connection_.SendStreamDataWithString(3, "foo", 3, !kFin, NULL);
1269 // Ack bundled.
1270 EXPECT_EQ(3u, writer_->frame_count());
1271 EXPECT_EQ(1u, writer_->stream_frames().size());
1272 EXPECT_FALSE(writer_->ack_frames().empty());
1273
1274 // But an ack with no missing packets will not send an ack.
1275 AckPacket(original, &frame2);
1276 ProcessAckPacket(&frame2);
1277 ProcessAckPacket(&frame2);
1278 }
1279
1280 TEST_P(QuicConnectionTest, 20AcksCausesAckSend) {
1281 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1282
1283 SendStreamDataToPeer(1, "foo", 0, !kFin, NULL);
1284
1285 QuicAlarm* ack_alarm = QuicConnectionPeer::GetAckAlarm(&connection_);
1286 // But an ack with no missing packets will not send an ack.
1287 QuicAckFrame frame = InitAckFrame(1);
1288 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
1289 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
1290 .WillRepeatedly(Return(SequenceNumberSet()));
1291 for (int i = 0; i < 20; ++i) {
1292 EXPECT_FALSE(ack_alarm->IsSet());
1293 ProcessAckPacket(&frame);
1294 }
1295 EXPECT_TRUE(ack_alarm->IsSet());
1296 }
1297
TEST_P(QuicConnectionTest,LeastUnackedLower)1298 TEST_P(QuicConnectionTest, LeastUnackedLower) {
1299 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1300
1301 SendStreamDataToPeer(1, "foo", 0, !kFin, NULL);
1302 SendStreamDataToPeer(1, "bar", 3, !kFin, NULL);
1303 SendStreamDataToPeer(1, "eep", 6, !kFin, NULL);
1304
1305 // Start out saying the least unacked is 2.
1306 peer_creator_.set_sequence_number(5);
1307 QuicStopWaitingFrame frame = InitStopWaitingFrame(2);
1308 ProcessStopWaitingPacket(&frame);
1309
1310 // Change it to 1, but lower the sequence number to fake out-of-order packets.
1311 // This should be fine.
1312 peer_creator_.set_sequence_number(1);
1313 // The scheduler will not process out of order acks, but all packet processing
1314 // causes the connection to try to write.
1315 EXPECT_CALL(visitor_, OnCanWrite());
1316 QuicStopWaitingFrame frame2 = InitStopWaitingFrame(1);
1317 ProcessStopWaitingPacket(&frame2);
1318
1319 // Now claim it's one, but set the ordering so it was sent "after" the first
1320 // one. This should cause a connection error.
1321 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
1322 peer_creator_.set_sequence_number(7);
1323 EXPECT_CALL(visitor_,
1324 OnConnectionClosed(QUIC_INVALID_STOP_WAITING_DATA, false));
1325 QuicStopWaitingFrame frame3 = InitStopWaitingFrame(1);
1326 ProcessStopWaitingPacket(&frame3);
1327 }
1328
TEST_P(QuicConnectionTest,LargestObservedLower)1329 TEST_P(QuicConnectionTest, LargestObservedLower) {
1330 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1331
1332 SendStreamDataToPeer(1, "foo", 0, !kFin, NULL);
1333 SendStreamDataToPeer(1, "bar", 3, !kFin, NULL);
1334 SendStreamDataToPeer(1, "eep", 6, !kFin, NULL);
1335 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
1336
1337 // Start out saying the largest observed is 2.
1338 QuicAckFrame frame1 = InitAckFrame(1);
1339 QuicAckFrame frame2 = InitAckFrame(2);
1340 ProcessAckPacket(&frame2);
1341
1342 // Now change it to 1, and it should cause a connection error.
1343 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_ACK_DATA, false));
1344 EXPECT_CALL(visitor_, OnCanWrite()).Times(0);
1345 ProcessAckPacket(&frame1);
1346 }
1347
TEST_P(QuicConnectionTest,AckUnsentData)1348 TEST_P(QuicConnectionTest, AckUnsentData) {
1349 // Ack a packet which has not been sent.
1350 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_ACK_DATA, false));
1351 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1352 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
1353 QuicAckFrame frame(MakeAckFrame(1));
1354 EXPECT_CALL(visitor_, OnCanWrite()).Times(0);
1355 ProcessAckPacket(&frame);
1356 }
1357
TEST_P(QuicConnectionTest,AckAll)1358 TEST_P(QuicConnectionTest, AckAll) {
1359 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1360 ProcessPacket(1);
1361
1362 peer_creator_.set_sequence_number(1);
1363 QuicAckFrame frame1 = InitAckFrame(0);
1364 ProcessAckPacket(&frame1);
1365 }
1366
TEST_P(QuicConnectionTest,SendingDifferentSequenceNumberLengthsBandwidth)1367 TEST_P(QuicConnectionTest, SendingDifferentSequenceNumberLengthsBandwidth) {
1368 QuicPacketSequenceNumber last_packet;
1369 QuicPacketCreator* creator =
1370 QuicConnectionPeer::GetPacketCreator(&connection_);
1371 SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet);
1372 EXPECT_EQ(1u, last_packet);
1373 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
1374 creator->next_sequence_number_length());
1375 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
1376 writer_->header().public_header.sequence_number_length);
1377
1378 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()).WillRepeatedly(
1379 Return(kMaxPacketSize * 256));
1380
1381 SendStreamDataToPeer(1, "bar", 3, !kFin, &last_packet);
1382 EXPECT_EQ(2u, last_packet);
1383 EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER,
1384 creator->next_sequence_number_length());
1385 // The 1 packet lag is due to the sequence number length being recalculated in
1386 // QuicConnection after a packet is sent.
1387 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
1388 writer_->header().public_header.sequence_number_length);
1389
1390 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()).WillRepeatedly(
1391 Return(kMaxPacketSize * 256 * 256));
1392
1393 SendStreamDataToPeer(1, "foo", 6, !kFin, &last_packet);
1394 EXPECT_EQ(3u, last_packet);
1395 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
1396 creator->next_sequence_number_length());
1397 EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER,
1398 writer_->header().public_header.sequence_number_length);
1399
1400 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()).WillRepeatedly(
1401 Return(kMaxPacketSize * 256 * 256 * 256));
1402
1403 SendStreamDataToPeer(1, "bar", 9, !kFin, &last_packet);
1404 EXPECT_EQ(4u, last_packet);
1405 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
1406 creator->next_sequence_number_length());
1407 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
1408 writer_->header().public_header.sequence_number_length);
1409
1410 EXPECT_CALL(*send_algorithm_, GetCongestionWindow()).WillRepeatedly(
1411 Return(kMaxPacketSize * 256 * 256 * 256 * 256));
1412
1413 SendStreamDataToPeer(1, "foo", 12, !kFin, &last_packet);
1414 EXPECT_EQ(5u, last_packet);
1415 EXPECT_EQ(PACKET_6BYTE_SEQUENCE_NUMBER,
1416 creator->next_sequence_number_length());
1417 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
1418 writer_->header().public_header.sequence_number_length);
1419 }
1420
1421 // TODO(ianswett): Re-enable this test by finding a good way to test different
1422 // sequence number lengths without sending packets with giant gaps.
TEST_P(QuicConnectionTest,DISABLED_SendingDifferentSequenceNumberLengthsUnackedDelta)1423 TEST_P(QuicConnectionTest,
1424 DISABLED_SendingDifferentSequenceNumberLengthsUnackedDelta) {
1425 QuicPacketSequenceNumber last_packet;
1426 QuicPacketCreator* creator =
1427 QuicConnectionPeer::GetPacketCreator(&connection_);
1428 SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet);
1429 EXPECT_EQ(1u, last_packet);
1430 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
1431 creator->next_sequence_number_length());
1432 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
1433 writer_->header().public_header.sequence_number_length);
1434
1435 creator->set_sequence_number(100);
1436
1437 SendStreamDataToPeer(1, "bar", 3, !kFin, &last_packet);
1438 EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER,
1439 creator->next_sequence_number_length());
1440 EXPECT_EQ(PACKET_1BYTE_SEQUENCE_NUMBER,
1441 writer_->header().public_header.sequence_number_length);
1442
1443 creator->set_sequence_number(100 * 256);
1444
1445 SendStreamDataToPeer(1, "foo", 6, !kFin, &last_packet);
1446 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
1447 creator->next_sequence_number_length());
1448 EXPECT_EQ(PACKET_2BYTE_SEQUENCE_NUMBER,
1449 writer_->header().public_header.sequence_number_length);
1450
1451 creator->set_sequence_number(100 * 256 * 256);
1452
1453 SendStreamDataToPeer(1, "bar", 9, !kFin, &last_packet);
1454 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
1455 creator->next_sequence_number_length());
1456 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
1457 writer_->header().public_header.sequence_number_length);
1458
1459 creator->set_sequence_number(100 * 256 * 256 * 256);
1460
1461 SendStreamDataToPeer(1, "foo", 12, !kFin, &last_packet);
1462 EXPECT_EQ(PACKET_6BYTE_SEQUENCE_NUMBER,
1463 creator->next_sequence_number_length());
1464 EXPECT_EQ(PACKET_4BYTE_SEQUENCE_NUMBER,
1465 writer_->header().public_header.sequence_number_length);
1466 }
1467
TEST_P(QuicConnectionTest,BasicSending)1468 TEST_P(QuicConnectionTest, BasicSending) {
1469 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1470 QuicPacketSequenceNumber last_packet;
1471 SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet); // Packet 1
1472 EXPECT_EQ(1u, last_packet);
1473 SendAckPacketToPeer(); // Packet 2
1474
1475 EXPECT_EQ(1u, least_unacked());
1476
1477 SendAckPacketToPeer(); // Packet 3
1478 EXPECT_EQ(1u, least_unacked());
1479
1480 SendStreamDataToPeer(1, "bar", 3, !kFin, &last_packet); // Packet 4
1481 EXPECT_EQ(4u, last_packet);
1482 SendAckPacketToPeer(); // Packet 5
1483 EXPECT_EQ(1u, least_unacked());
1484
1485 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
1486
1487 // Peer acks up to packet 3.
1488 QuicAckFrame frame = InitAckFrame(3);
1489 ProcessAckPacket(&frame);
1490 SendAckPacketToPeer(); // Packet 6
1491
1492 // As soon as we've acked one, we skip ack packets 2 and 3 and note lack of
1493 // ack for 4.
1494 EXPECT_EQ(4u, least_unacked());
1495
1496 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
1497
1498 // Peer acks up to packet 4, the last packet.
1499 QuicAckFrame frame2 = InitAckFrame(6);
1500 ProcessAckPacket(&frame2); // Acks don't instigate acks.
1501
1502 // Verify that we did not send an ack.
1503 EXPECT_EQ(6u, writer_->header().packet_sequence_number);
1504
1505 // So the last ack has not changed.
1506 EXPECT_EQ(4u, least_unacked());
1507
1508 // If we force an ack, we shouldn't change our retransmit state.
1509 SendAckPacketToPeer(); // Packet 7
1510 EXPECT_EQ(7u, least_unacked());
1511
1512 // But if we send more data it should.
1513 SendStreamDataToPeer(1, "eep", 6, !kFin, &last_packet); // Packet 8
1514 EXPECT_EQ(8u, last_packet);
1515 SendAckPacketToPeer(); // Packet 9
1516 EXPECT_EQ(7u, least_unacked());
1517 }
1518
TEST_P(QuicConnectionTest,FECSending)1519 TEST_P(QuicConnectionTest, FECSending) {
1520 // All packets carry version info till version is negotiated.
1521 QuicPacketCreator* creator =
1522 QuicConnectionPeer::GetPacketCreator(&connection_);
1523 size_t payload_length;
1524 // GetPacketLengthForOneStream() assumes a stream offset of 0 in determining
1525 // packet length. The size of the offset field in a stream frame is 0 for
1526 // offset 0, and 2 for non-zero offsets up through 64K. Increase
1527 // max_packet_length by 2 so that subsequent packets containing subsequent
1528 // stream frames with non-zero offets will fit within the packet length.
1529 size_t length = 2 + GetPacketLengthForOneStream(
1530 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER,
1531 IN_FEC_GROUP, &payload_length);
1532 creator->set_max_packet_length(length);
1533
1534 // Send 4 protected data packets, which should also trigger 1 FEC packet.
1535 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(5);
1536 // The first stream frame will have 2 fewer overhead bytes than the other 3.
1537 const string payload(payload_length * 4 + 2, 'a');
1538 connection_.SendStreamDataWithStringWithFec(1, payload, 0, !kFin, NULL);
1539 // Expect the FEC group to be closed after SendStreamDataWithString.
1540 EXPECT_FALSE(creator->IsFecGroupOpen());
1541 EXPECT_FALSE(creator->IsFecProtected());
1542 }
1543
TEST_P(QuicConnectionTest,FECQueueing)1544 TEST_P(QuicConnectionTest, FECQueueing) {
1545 // All packets carry version info till version is negotiated.
1546 size_t payload_length;
1547 QuicPacketCreator* creator =
1548 QuicConnectionPeer::GetPacketCreator(&connection_);
1549 size_t length = GetPacketLengthForOneStream(
1550 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER,
1551 IN_FEC_GROUP, &payload_length);
1552 creator->set_max_packet_length(length);
1553 EXPECT_TRUE(creator->IsFecEnabled());
1554
1555 EXPECT_EQ(0u, connection_.NumQueuedPackets());
1556 BlockOnNextWrite();
1557 const string payload(payload_length, 'a');
1558 connection_.SendStreamDataWithStringWithFec(1, payload, 0, !kFin, NULL);
1559 EXPECT_FALSE(creator->IsFecGroupOpen());
1560 EXPECT_FALSE(creator->IsFecProtected());
1561 // Expect the first data packet and the fec packet to be queued.
1562 EXPECT_EQ(2u, connection_.NumQueuedPackets());
1563 }
1564
TEST_P(QuicConnectionTest,AbandonFECFromCongestionWindow)1565 TEST_P(QuicConnectionTest, AbandonFECFromCongestionWindow) {
1566 EXPECT_TRUE(QuicConnectionPeer::GetPacketCreator(
1567 &connection_)->IsFecEnabled());
1568
1569 // 1 Data and 1 FEC packet.
1570 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2);
1571 connection_.SendStreamDataWithStringWithFec(3, "foo", 0, !kFin, NULL);
1572
1573 const QuicTime::Delta retransmission_time =
1574 QuicTime::Delta::FromMilliseconds(5000);
1575 clock_.AdvanceTime(retransmission_time);
1576
1577 // Abandon FEC packet and data packet.
1578 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1579 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
1580 EXPECT_CALL(visitor_, OnCanWrite());
1581 connection_.OnRetransmissionTimeout();
1582 }
1583
TEST_P(QuicConnectionTest,DontAbandonAckedFEC)1584 TEST_P(QuicConnectionTest, DontAbandonAckedFEC) {
1585 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1586 EXPECT_TRUE(QuicConnectionPeer::GetPacketCreator(
1587 &connection_)->IsFecEnabled());
1588
1589 // 1 Data and 1 FEC packet.
1590 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(6);
1591 connection_.SendStreamDataWithStringWithFec(3, "foo", 0, !kFin, NULL);
1592 // Send some more data afterwards to ensure early retransmit doesn't trigger.
1593 connection_.SendStreamDataWithStringWithFec(3, "foo", 3, !kFin, NULL);
1594 connection_.SendStreamDataWithStringWithFec(3, "foo", 6, !kFin, NULL);
1595
1596 QuicAckFrame ack_fec = InitAckFrame(2);
1597 // Data packet missing.
1598 // TODO(ianswett): Note that this is not a sensible ack, since if the FEC was
1599 // received, it would cause the covered packet to be acked as well.
1600 NackPacket(1, &ack_fec);
1601 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
1602 ProcessAckPacket(&ack_fec);
1603 clock_.AdvanceTime(DefaultRetransmissionTime());
1604
1605 // Don't abandon the acked FEC packet, but it will abandon 2 the subsequent
1606 // FEC packets.
1607 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1608 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(3);
1609 connection_.GetRetransmissionAlarm()->Fire();
1610 }
1611
TEST_P(QuicConnectionTest,AbandonAllFEC)1612 TEST_P(QuicConnectionTest, AbandonAllFEC) {
1613 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1614 EXPECT_TRUE(QuicConnectionPeer::GetPacketCreator(
1615 &connection_)->IsFecEnabled());
1616
1617 // 1 Data and 1 FEC packet.
1618 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(6);
1619 connection_.SendStreamDataWithStringWithFec(3, "foo", 0, !kFin, NULL);
1620 // Send some more data afterwards to ensure early retransmit doesn't trigger.
1621 connection_.SendStreamDataWithStringWithFec(3, "foo", 3, !kFin, NULL);
1622 // Advance the time so not all the FEC packets are abandoned.
1623 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
1624 connection_.SendStreamDataWithStringWithFec(3, "foo", 6, !kFin, NULL);
1625
1626 QuicAckFrame ack_fec = InitAckFrame(5);
1627 // Ack all data packets, but no fec packets.
1628 NackPacket(2, &ack_fec);
1629 NackPacket(4, &ack_fec);
1630
1631 // Lose the first FEC packet and ack the three data packets.
1632 SequenceNumberSet lost_packets;
1633 lost_packets.insert(2);
1634 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
1635 .WillOnce(Return(lost_packets));
1636 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
1637 ProcessAckPacket(&ack_fec);
1638
1639 clock_.AdvanceTime(DefaultRetransmissionTime().Subtract(
1640 QuicTime::Delta::FromMilliseconds(1)));
1641
1642 // Abandon all packets
1643 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(false));
1644 connection_.GetRetransmissionAlarm()->Fire();
1645
1646 // Ensure the alarm is not set since all packets have been abandoned.
1647 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
1648 }
1649
TEST_P(QuicConnectionTest,FramePacking)1650 TEST_P(QuicConnectionTest, FramePacking) {
1651 CongestionBlockWrites();
1652
1653 // Send an ack and two stream frames in 1 packet by queueing them.
1654 connection_.SendAck();
1655 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll(
1656 IgnoreResult(InvokeWithoutArgs(&connection_,
1657 &TestConnection::SendStreamData3)),
1658 IgnoreResult(InvokeWithoutArgs(&connection_,
1659 &TestConnection::SendStreamData5))));
1660
1661 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
1662 CongestionUnblockWrites();
1663 connection_.GetSendAlarm()->Fire();
1664 EXPECT_EQ(0u, connection_.NumQueuedPackets());
1665 EXPECT_FALSE(connection_.HasQueuedData());
1666
1667 // Parse the last packet and ensure it's an ack and two stream frames from
1668 // two different streams.
1669 EXPECT_EQ(4u, writer_->frame_count());
1670 EXPECT_FALSE(writer_->stop_waiting_frames().empty());
1671 EXPECT_FALSE(writer_->ack_frames().empty());
1672 ASSERT_EQ(2u, writer_->stream_frames().size());
1673 EXPECT_EQ(kClientDataStreamId1, writer_->stream_frames()[0].stream_id);
1674 EXPECT_EQ(kClientDataStreamId2, writer_->stream_frames()[1].stream_id);
1675 }
1676
TEST_P(QuicConnectionTest,FramePackingNonCryptoThenCrypto)1677 TEST_P(QuicConnectionTest, FramePackingNonCryptoThenCrypto) {
1678 CongestionBlockWrites();
1679
1680 // Send an ack and two stream frames (one non-crypto, then one crypto) in 2
1681 // packets by queueing them.
1682 connection_.SendAck();
1683 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll(
1684 IgnoreResult(InvokeWithoutArgs(&connection_,
1685 &TestConnection::SendStreamData3)),
1686 IgnoreResult(InvokeWithoutArgs(&connection_,
1687 &TestConnection::SendCryptoStreamData))));
1688
1689 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2);
1690 CongestionUnblockWrites();
1691 connection_.GetSendAlarm()->Fire();
1692 EXPECT_EQ(0u, connection_.NumQueuedPackets());
1693 EXPECT_FALSE(connection_.HasQueuedData());
1694
1695 // Parse the last packet and ensure it's the crypto stream frame.
1696 EXPECT_EQ(1u, writer_->frame_count());
1697 ASSERT_EQ(1u, writer_->stream_frames().size());
1698 EXPECT_EQ(kCryptoStreamId, writer_->stream_frames()[0].stream_id);
1699 }
1700
TEST_P(QuicConnectionTest,FramePackingCryptoThenNonCrypto)1701 TEST_P(QuicConnectionTest, FramePackingCryptoThenNonCrypto) {
1702 CongestionBlockWrites();
1703
1704 // Send an ack and two stream frames (one crypto, then one non-crypto) in 2
1705 // packets by queueing them.
1706 connection_.SendAck();
1707 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll(
1708 IgnoreResult(InvokeWithoutArgs(&connection_,
1709 &TestConnection::SendCryptoStreamData)),
1710 IgnoreResult(InvokeWithoutArgs(&connection_,
1711 &TestConnection::SendStreamData3))));
1712
1713 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(2);
1714 CongestionUnblockWrites();
1715 connection_.GetSendAlarm()->Fire();
1716 EXPECT_EQ(0u, connection_.NumQueuedPackets());
1717 EXPECT_FALSE(connection_.HasQueuedData());
1718
1719 // Parse the last packet and ensure it's the stream frame from stream 3.
1720 EXPECT_EQ(1u, writer_->frame_count());
1721 ASSERT_EQ(1u, writer_->stream_frames().size());
1722 EXPECT_EQ(kClientDataStreamId1, writer_->stream_frames()[0].stream_id);
1723 }
1724
TEST_P(QuicConnectionTest,FramePackingFEC)1725 TEST_P(QuicConnectionTest, FramePackingFEC) {
1726 EXPECT_TRUE(QuicConnectionPeer::GetPacketCreator(
1727 &connection_)->IsFecEnabled());
1728
1729 CongestionBlockWrites();
1730
1731 // Queue an ack and two stream frames. Ack gets flushed when FEC is turned on
1732 // for sending protected data; two stream frames are packing in 1 packet.
1733 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll(
1734 IgnoreResult(InvokeWithoutArgs(
1735 &connection_, &TestConnection::SendStreamData3WithFec)),
1736 IgnoreResult(InvokeWithoutArgs(
1737 &connection_, &TestConnection::SendStreamData5WithFec))));
1738 connection_.SendAck();
1739
1740 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(3);
1741 CongestionUnblockWrites();
1742 connection_.GetSendAlarm()->Fire();
1743 EXPECT_EQ(0u, connection_.NumQueuedPackets());
1744 EXPECT_FALSE(connection_.HasQueuedData());
1745
1746 // Parse the last packet and ensure it's in an fec group.
1747 EXPECT_EQ(2u, writer_->header().fec_group);
1748 EXPECT_EQ(0u, writer_->frame_count());
1749 }
1750
TEST_P(QuicConnectionTest,FramePackingAckResponse)1751 TEST_P(QuicConnectionTest, FramePackingAckResponse) {
1752 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1753 // Process a data packet to queue up a pending ack.
1754 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1);
1755 ProcessDataPacket(1, 1, kEntropyFlag);
1756
1757 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll(
1758 IgnoreResult(InvokeWithoutArgs(&connection_,
1759 &TestConnection::SendStreamData3)),
1760 IgnoreResult(InvokeWithoutArgs(&connection_,
1761 &TestConnection::SendStreamData5))));
1762
1763 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
1764
1765 // Process an ack to cause the visitor's OnCanWrite to be invoked.
1766 peer_creator_.set_sequence_number(2);
1767 QuicAckFrame ack_one = InitAckFrame(0);
1768 ProcessAckPacket(&ack_one);
1769
1770 EXPECT_EQ(0u, connection_.NumQueuedPackets());
1771 EXPECT_FALSE(connection_.HasQueuedData());
1772
1773 // Parse the last packet and ensure it's an ack and two stream frames from
1774 // two different streams.
1775 EXPECT_EQ(4u, writer_->frame_count());
1776 EXPECT_FALSE(writer_->stop_waiting_frames().empty());
1777 EXPECT_FALSE(writer_->ack_frames().empty());
1778 ASSERT_EQ(2u, writer_->stream_frames().size());
1779 EXPECT_EQ(kClientDataStreamId1, writer_->stream_frames()[0].stream_id);
1780 EXPECT_EQ(kClientDataStreamId2, writer_->stream_frames()[1].stream_id);
1781 }
1782
TEST_P(QuicConnectionTest,FramePackingSendv)1783 TEST_P(QuicConnectionTest, FramePackingSendv) {
1784 // Send data in 1 packet by writing multiple blocks in a single iovector
1785 // using writev.
1786 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
1787
1788 char data[] = "ABCD";
1789 IOVector data_iov;
1790 data_iov.AppendNoCoalesce(data, 2);
1791 data_iov.AppendNoCoalesce(data + 2, 2);
1792 connection_.SendStreamData(1, data_iov, 0, !kFin, MAY_FEC_PROTECT, NULL);
1793
1794 EXPECT_EQ(0u, connection_.NumQueuedPackets());
1795 EXPECT_FALSE(connection_.HasQueuedData());
1796
1797 // Parse the last packet and ensure multiple iovector blocks have
1798 // been packed into a single stream frame from one stream.
1799 EXPECT_EQ(1u, writer_->frame_count());
1800 EXPECT_EQ(1u, writer_->stream_frames().size());
1801 QuicStreamFrame frame = writer_->stream_frames()[0];
1802 EXPECT_EQ(1u, frame.stream_id);
1803 EXPECT_EQ("ABCD", string(static_cast<char*>
1804 (frame.data.iovec()[0].iov_base),
1805 (frame.data.iovec()[0].iov_len)));
1806 }
1807
TEST_P(QuicConnectionTest,FramePackingSendvQueued)1808 TEST_P(QuicConnectionTest, FramePackingSendvQueued) {
1809 // Try to send two stream frames in 1 packet by using writev.
1810 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
1811
1812 BlockOnNextWrite();
1813 char data[] = "ABCD";
1814 IOVector data_iov;
1815 data_iov.AppendNoCoalesce(data, 2);
1816 data_iov.AppendNoCoalesce(data + 2, 2);
1817 connection_.SendStreamData(1, data_iov, 0, !kFin, MAY_FEC_PROTECT, NULL);
1818
1819 EXPECT_EQ(1u, connection_.NumQueuedPackets());
1820 EXPECT_TRUE(connection_.HasQueuedData());
1821
1822 // Unblock the writes and actually send.
1823 writer_->SetWritable();
1824 connection_.OnCanWrite();
1825 EXPECT_EQ(0u, connection_.NumQueuedPackets());
1826
1827 // Parse the last packet and ensure it's one stream frame from one stream.
1828 EXPECT_EQ(1u, writer_->frame_count());
1829 EXPECT_EQ(1u, writer_->stream_frames().size());
1830 EXPECT_EQ(1u, writer_->stream_frames()[0].stream_id);
1831 }
1832
TEST_P(QuicConnectionTest,SendingZeroBytes)1833 TEST_P(QuicConnectionTest, SendingZeroBytes) {
1834 // Send a zero byte write with a fin using writev.
1835 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
1836 IOVector empty_iov;
1837 connection_.SendStreamData(1, empty_iov, 0, kFin, MAY_FEC_PROTECT, NULL);
1838
1839 EXPECT_EQ(0u, connection_.NumQueuedPackets());
1840 EXPECT_FALSE(connection_.HasQueuedData());
1841
1842 // Parse the last packet and ensure it's one stream frame from one stream.
1843 EXPECT_EQ(1u, writer_->frame_count());
1844 EXPECT_EQ(1u, writer_->stream_frames().size());
1845 EXPECT_EQ(1u, writer_->stream_frames()[0].stream_id);
1846 EXPECT_TRUE(writer_->stream_frames()[0].fin);
1847 }
1848
TEST_P(QuicConnectionTest,OnCanWrite)1849 TEST_P(QuicConnectionTest, OnCanWrite) {
1850 // Visitor's OnCanWrite will send data, but will have more pending writes.
1851 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(DoAll(
1852 IgnoreResult(InvokeWithoutArgs(&connection_,
1853 &TestConnection::SendStreamData3)),
1854 IgnoreResult(InvokeWithoutArgs(&connection_,
1855 &TestConnection::SendStreamData5))));
1856 EXPECT_CALL(visitor_, WillingAndAbleToWrite()).WillOnce(Return(true));
1857 EXPECT_CALL(*send_algorithm_,
1858 TimeUntilSend(_, _, _)).WillRepeatedly(
1859 testing::Return(QuicTime::Delta::Zero()));
1860
1861 connection_.OnCanWrite();
1862
1863 // Parse the last packet and ensure it's the two stream frames from
1864 // two different streams.
1865 EXPECT_EQ(2u, writer_->frame_count());
1866 EXPECT_EQ(2u, writer_->stream_frames().size());
1867 EXPECT_EQ(kClientDataStreamId1, writer_->stream_frames()[0].stream_id);
1868 EXPECT_EQ(kClientDataStreamId2, writer_->stream_frames()[1].stream_id);
1869 }
1870
TEST_P(QuicConnectionTest,RetransmitOnNack)1871 TEST_P(QuicConnectionTest, RetransmitOnNack) {
1872 QuicPacketSequenceNumber last_packet;
1873 QuicByteCount second_packet_size;
1874 SendStreamDataToPeer(3, "foo", 0, !kFin, &last_packet); // Packet 1
1875 second_packet_size =
1876 SendStreamDataToPeer(3, "foos", 3, !kFin, &last_packet); // Packet 2
1877 SendStreamDataToPeer(3, "fooos", 7, !kFin, &last_packet); // Packet 3
1878
1879 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1880
1881 // Don't lose a packet on an ack, and nothing is retransmitted.
1882 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
1883 QuicAckFrame ack_one = InitAckFrame(1);
1884 ProcessAckPacket(&ack_one);
1885
1886 // Lose a packet and ensure it triggers retransmission.
1887 QuicAckFrame nack_two = InitAckFrame(3);
1888 NackPacket(2, &nack_two);
1889 SequenceNumberSet lost_packets;
1890 lost_packets.insert(2);
1891 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
1892 .WillOnce(Return(lost_packets));
1893 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
1894 EXPECT_CALL(*send_algorithm_,
1895 OnPacketSent(_, _, _, second_packet_size - kQuicVersionSize, _)).
1896 Times(1);
1897 ProcessAckPacket(&nack_two);
1898 }
1899
TEST_P(QuicConnectionTest,DiscardRetransmit)1900 TEST_P(QuicConnectionTest, DiscardRetransmit) {
1901 QuicPacketSequenceNumber last_packet;
1902 SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet); // Packet 1
1903 SendStreamDataToPeer(1, "foos", 3, !kFin, &last_packet); // Packet 2
1904 SendStreamDataToPeer(1, "fooos", 7, !kFin, &last_packet); // Packet 3
1905
1906 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1907
1908 // Instigate a loss with an ack.
1909 QuicAckFrame nack_two = InitAckFrame(3);
1910 NackPacket(2, &nack_two);
1911 // The first nack should trigger a fast retransmission, but we'll be
1912 // write blocked, so the packet will be queued.
1913 BlockOnNextWrite();
1914 SequenceNumberSet lost_packets;
1915 lost_packets.insert(2);
1916 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
1917 .WillOnce(Return(lost_packets));
1918 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
1919 ProcessAckPacket(&nack_two);
1920 EXPECT_EQ(1u, connection_.NumQueuedPackets());
1921
1922 // Now, ack the previous transmission.
1923 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
1924 .WillOnce(Return(SequenceNumberSet()));
1925 QuicAckFrame ack_all = InitAckFrame(3);
1926 ProcessAckPacket(&ack_all);
1927
1928 // Unblock the socket and attempt to send the queued packets. However,
1929 // since the previous transmission has been acked, we will not
1930 // send the retransmission.
1931 EXPECT_CALL(*send_algorithm_,
1932 OnPacketSent(_, _, _, _, _)).Times(0);
1933
1934 writer_->SetWritable();
1935 connection_.OnCanWrite();
1936
1937 EXPECT_EQ(0u, connection_.NumQueuedPackets());
1938 }
1939
TEST_P(QuicConnectionTest,RetransmitNackedLargestObserved)1940 TEST_P(QuicConnectionTest, RetransmitNackedLargestObserved) {
1941 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
1942 QuicPacketSequenceNumber largest_observed;
1943 QuicByteCount packet_size;
1944 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
1945 .WillOnce(DoAll(SaveArg<2>(&largest_observed), SaveArg<3>(&packet_size),
1946 Return(true)));
1947 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL);
1948
1949 QuicAckFrame frame = InitAckFrame(1);
1950 NackPacket(largest_observed, &frame);
1951 // The first nack should retransmit the largest observed packet.
1952 SequenceNumberSet lost_packets;
1953 lost_packets.insert(1);
1954 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
1955 .WillOnce(Return(lost_packets));
1956 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
1957 EXPECT_CALL(*send_algorithm_,
1958 OnPacketSent(_, _, _, packet_size - kQuicVersionSize, _));
1959 ProcessAckPacket(&frame);
1960 }
1961
TEST_P(QuicConnectionTest,QueueAfterTwoRTOs)1962 TEST_P(QuicConnectionTest, QueueAfterTwoRTOs) {
1963 for (int i = 0; i < 10; ++i) {
1964 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
1965 connection_.SendStreamDataWithString(3, "foo", i * 3, !kFin, NULL);
1966 }
1967
1968 // Block the congestion window and ensure they're queued.
1969 BlockOnNextWrite();
1970 clock_.AdvanceTime(DefaultRetransmissionTime());
1971 // Only one packet should be retransmitted.
1972 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
1973 connection_.GetRetransmissionAlarm()->Fire();
1974 EXPECT_TRUE(connection_.HasQueuedData());
1975
1976 // Unblock the congestion window.
1977 writer_->SetWritable();
1978 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(
1979 2 * DefaultRetransmissionTime().ToMicroseconds()));
1980 // Retransmit already retransmitted packets event though the sequence number
1981 // greater than the largest observed.
1982 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(10);
1983 connection_.GetRetransmissionAlarm()->Fire();
1984 connection_.OnCanWrite();
1985 }
1986
TEST_P(QuicConnectionTest,WriteBlockedThenSent)1987 TEST_P(QuicConnectionTest, WriteBlockedThenSent) {
1988 BlockOnNextWrite();
1989 writer_->set_is_write_blocked_data_buffered(true);
1990 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
1991 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
1992 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet());
1993
1994 writer_->SetWritable();
1995 connection_.OnCanWrite();
1996 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet());
1997 }
1998
TEST_P(QuicConnectionTest,RetransmitWriteBlockedAckedOriginalThenSent)1999 TEST_P(QuicConnectionTest, RetransmitWriteBlockedAckedOriginalThenSent) {
2000 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2001 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL);
2002 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet());
2003
2004 BlockOnNextWrite();
2005 writer_->set_is_write_blocked_data_buffered(true);
2006 // Simulate the retransmission alarm firing.
2007 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(_));
2008 clock_.AdvanceTime(DefaultRetransmissionTime());
2009 connection_.GetRetransmissionAlarm()->Fire();
2010
2011 // Ack the sent packet before the callback returns, which happens in
2012 // rare circumstances with write blocked sockets.
2013 QuicAckFrame ack = InitAckFrame(1);
2014 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
2015 EXPECT_CALL(*send_algorithm_, RevertRetransmissionTimeout());
2016 ProcessAckPacket(&ack);
2017
2018 writer_->SetWritable();
2019 connection_.OnCanWrite();
2020 // There is now a pending packet, but with no retransmittable frames.
2021 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet());
2022 EXPECT_FALSE(connection_.sent_packet_manager().HasRetransmittableFrames(2));
2023 }
2024
TEST_P(QuicConnectionTest,AlarmsWhenWriteBlocked)2025 TEST_P(QuicConnectionTest, AlarmsWhenWriteBlocked) {
2026 // Block the connection.
2027 BlockOnNextWrite();
2028 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL);
2029 EXPECT_EQ(1u, writer_->packets_write_attempts());
2030 EXPECT_TRUE(writer_->IsWriteBlocked());
2031
2032 // Set the send and resumption alarms. Fire the alarms and ensure they don't
2033 // attempt to write.
2034 connection_.GetResumeWritesAlarm()->Set(clock_.ApproximateNow());
2035 connection_.GetSendAlarm()->Set(clock_.ApproximateNow());
2036 connection_.GetResumeWritesAlarm()->Fire();
2037 connection_.GetSendAlarm()->Fire();
2038 EXPECT_TRUE(writer_->IsWriteBlocked());
2039 EXPECT_EQ(1u, writer_->packets_write_attempts());
2040 }
2041
TEST_P(QuicConnectionTest,NoLimitPacketsPerNack)2042 TEST_P(QuicConnectionTest, NoLimitPacketsPerNack) {
2043 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2044 int offset = 0;
2045 // Send packets 1 to 15.
2046 for (int i = 0; i < 15; ++i) {
2047 SendStreamDataToPeer(1, "foo", offset, !kFin, NULL);
2048 offset += 3;
2049 }
2050
2051 // Ack 15, nack 1-14.
2052 SequenceNumberSet lost_packets;
2053 QuicAckFrame nack = InitAckFrame(15);
2054 for (int i = 1; i < 15; ++i) {
2055 NackPacket(i, &nack);
2056 lost_packets.insert(i);
2057 }
2058
2059 // 14 packets have been NACK'd and lost. In TCP cubic, PRR limits
2060 // the retransmission rate in the case of burst losses.
2061 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
2062 .WillOnce(Return(lost_packets));
2063 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
2064 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(14);
2065 ProcessAckPacket(&nack);
2066 }
2067
2068 // Test sending multiple acks from the connection to the session.
TEST_P(QuicConnectionTest,MultipleAcks)2069 TEST_P(QuicConnectionTest, MultipleAcks) {
2070 QuicPacketSequenceNumber last_packet;
2071 SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet); // Packet 1
2072 EXPECT_EQ(1u, last_packet);
2073 SendStreamDataToPeer(3, "foo", 0, !kFin, &last_packet); // Packet 2
2074 EXPECT_EQ(2u, last_packet);
2075 SendAckPacketToPeer(); // Packet 3
2076 SendStreamDataToPeer(5, "foo", 0, !kFin, &last_packet); // Packet 4
2077 EXPECT_EQ(4u, last_packet);
2078 SendStreamDataToPeer(1, "foo", 3, !kFin, &last_packet); // Packet 5
2079 EXPECT_EQ(5u, last_packet);
2080 SendStreamDataToPeer(3, "foo", 3, !kFin, &last_packet); // Packet 6
2081 EXPECT_EQ(6u, last_packet);
2082
2083 // Client will ack packets 1, 2, [!3], 4, 5.
2084 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
2085 QuicAckFrame frame1 = InitAckFrame(5);
2086 NackPacket(3, &frame1);
2087 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2088 ProcessAckPacket(&frame1);
2089
2090 // Now the client implicitly acks 3, and explicitly acks 6.
2091 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
2092 QuicAckFrame frame2 = InitAckFrame(6);
2093 ProcessAckPacket(&frame2);
2094 }
2095
TEST_P(QuicConnectionTest,DontLatchUnackedPacket)2096 TEST_P(QuicConnectionTest, DontLatchUnackedPacket) {
2097 SendStreamDataToPeer(1, "foo", 0, !kFin, NULL); // Packet 1;
2098 // From now on, we send acks, so the send algorithm won't mark them pending.
2099 ON_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
2100 .WillByDefault(Return(false));
2101 SendAckPacketToPeer(); // Packet 2
2102
2103 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2104 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
2105 QuicAckFrame frame = InitAckFrame(1);
2106 ProcessAckPacket(&frame);
2107
2108 // Verify that our internal state has least-unacked as 2, because we're still
2109 // waiting for a potential ack for 2.
2110
2111 EXPECT_EQ(2u, stop_waiting()->least_unacked);
2112
2113 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
2114 frame = InitAckFrame(2);
2115 ProcessAckPacket(&frame);
2116 EXPECT_EQ(3u, stop_waiting()->least_unacked);
2117
2118 // When we send an ack, we make sure our least-unacked makes sense. In this
2119 // case since we're not waiting on an ack for 2 and all packets are acked, we
2120 // set it to 3.
2121 SendAckPacketToPeer(); // Packet 3
2122 // Least_unacked remains at 3 until another ack is received.
2123 EXPECT_EQ(3u, stop_waiting()->least_unacked);
2124 // Check that the outgoing ack had its sequence number as least_unacked.
2125 EXPECT_EQ(3u, least_unacked());
2126
2127 // Ack the ack, which updates the rtt and raises the least unacked.
2128 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
2129 frame = InitAckFrame(3);
2130 ProcessAckPacket(&frame);
2131
2132 ON_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
2133 .WillByDefault(Return(true));
2134 SendStreamDataToPeer(1, "bar", 3, false, NULL); // Packet 4
2135 EXPECT_EQ(4u, stop_waiting()->least_unacked);
2136 ON_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
2137 .WillByDefault(Return(false));
2138 SendAckPacketToPeer(); // Packet 5
2139 EXPECT_EQ(4u, least_unacked());
2140
2141 // Send two data packets at the end, and ensure if the last one is acked,
2142 // the least unacked is raised above the ack packets.
2143 ON_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
2144 .WillByDefault(Return(true));
2145 SendStreamDataToPeer(1, "bar", 6, false, NULL); // Packet 6
2146 SendStreamDataToPeer(1, "bar", 9, false, NULL); // Packet 7
2147
2148 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
2149 frame = InitAckFrame(7);
2150 NackPacket(5, &frame);
2151 NackPacket(6, &frame);
2152 ProcessAckPacket(&frame);
2153
2154 EXPECT_EQ(6u, stop_waiting()->least_unacked);
2155 }
2156
TEST_P(QuicConnectionTest,ReviveMissingPacketAfterFecPacket)2157 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterFecPacket) {
2158 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2159
2160 // Don't send missing packet 1.
2161 ProcessFecPacket(2, 1, true, !kEntropyFlag, NULL);
2162 // Entropy flag should be false, so entropy should be 0.
2163 EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2));
2164 }
2165
TEST_P(QuicConnectionTest,ReviveMissingPacketWithVaryingSeqNumLengths)2166 TEST_P(QuicConnectionTest, ReviveMissingPacketWithVaryingSeqNumLengths) {
2167 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2168
2169 // Set up a debug visitor to the connection.
2170 FecQuicConnectionDebugVisitor* fec_visitor =
2171 new FecQuicConnectionDebugVisitor();
2172 connection_.set_debug_visitor(fec_visitor);
2173
2174 QuicPacketSequenceNumber fec_packet = 0;
2175 QuicSequenceNumberLength lengths[] = {PACKET_6BYTE_SEQUENCE_NUMBER,
2176 PACKET_4BYTE_SEQUENCE_NUMBER,
2177 PACKET_2BYTE_SEQUENCE_NUMBER,
2178 PACKET_1BYTE_SEQUENCE_NUMBER};
2179 // For each sequence number length size, revive a packet and check sequence
2180 // number length in the revived packet.
2181 for (size_t i = 0; i < arraysize(lengths); ++i) {
2182 // Set sequence_number_length_ (for data and FEC packets).
2183 sequence_number_length_ = lengths[i];
2184 fec_packet += 2;
2185 // Don't send missing packet, but send fec packet right after it.
2186 ProcessFecPacket(fec_packet, fec_packet - 1, true, !kEntropyFlag, NULL);
2187 // Sequence number length in the revived header should be the same as
2188 // in the original data/fec packet headers.
2189 EXPECT_EQ(sequence_number_length_, fec_visitor->revived_header().
2190 public_header.sequence_number_length);
2191 }
2192 }
2193
TEST_P(QuicConnectionTest,ReviveMissingPacketWithVaryingConnectionIdLengths)2194 TEST_P(QuicConnectionTest, ReviveMissingPacketWithVaryingConnectionIdLengths) {
2195 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2196
2197 // Set up a debug visitor to the connection.
2198 FecQuicConnectionDebugVisitor* fec_visitor =
2199 new FecQuicConnectionDebugVisitor();
2200 connection_.set_debug_visitor(fec_visitor);
2201
2202 QuicPacketSequenceNumber fec_packet = 0;
2203 QuicConnectionIdLength lengths[] = {PACKET_8BYTE_CONNECTION_ID,
2204 PACKET_4BYTE_CONNECTION_ID,
2205 PACKET_1BYTE_CONNECTION_ID,
2206 PACKET_0BYTE_CONNECTION_ID};
2207 // For each connection id length size, revive a packet and check connection
2208 // id length in the revived packet.
2209 for (size_t i = 0; i < arraysize(lengths); ++i) {
2210 // Set connection id length (for data and FEC packets).
2211 connection_id_length_ = lengths[i];
2212 fec_packet += 2;
2213 // Don't send missing packet, but send fec packet right after it.
2214 ProcessFecPacket(fec_packet, fec_packet - 1, true, !kEntropyFlag, NULL);
2215 // Connection id length in the revived header should be the same as
2216 // in the original data/fec packet headers.
2217 EXPECT_EQ(connection_id_length_,
2218 fec_visitor->revived_header().public_header.connection_id_length);
2219 }
2220 }
2221
TEST_P(QuicConnectionTest,ReviveMissingPacketAfterDataPacketThenFecPacket)2222 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterDataPacketThenFecPacket) {
2223 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2224
2225 ProcessFecProtectedPacket(1, false, kEntropyFlag);
2226 // Don't send missing packet 2.
2227 ProcessFecPacket(3, 1, true, !kEntropyFlag, NULL);
2228 // Entropy flag should be true, so entropy should not be 0.
2229 EXPECT_NE(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2));
2230 }
2231
TEST_P(QuicConnectionTest,ReviveMissingPacketAfterDataPacketsThenFecPacket)2232 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterDataPacketsThenFecPacket) {
2233 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2234
2235 ProcessFecProtectedPacket(1, false, !kEntropyFlag);
2236 // Don't send missing packet 2.
2237 ProcessFecProtectedPacket(3, false, !kEntropyFlag);
2238 ProcessFecPacket(4, 1, true, kEntropyFlag, NULL);
2239 // Ensure QUIC no longer revives entropy for lost packets.
2240 EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2));
2241 EXPECT_NE(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 4));
2242 }
2243
TEST_P(QuicConnectionTest,ReviveMissingPacketAfterDataPacket)2244 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterDataPacket) {
2245 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2246
2247 // Don't send missing packet 1.
2248 ProcessFecPacket(3, 1, false, !kEntropyFlag, NULL);
2249 // Out of order.
2250 ProcessFecProtectedPacket(2, true, !kEntropyFlag);
2251 // Entropy flag should be false, so entropy should be 0.
2252 EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2));
2253 }
2254
TEST_P(QuicConnectionTest,ReviveMissingPacketAfterDataPackets)2255 TEST_P(QuicConnectionTest, ReviveMissingPacketAfterDataPackets) {
2256 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2257
2258 ProcessFecProtectedPacket(1, false, !kEntropyFlag);
2259 // Don't send missing packet 2.
2260 ProcessFecPacket(6, 1, false, kEntropyFlag, NULL);
2261 ProcessFecProtectedPacket(3, false, kEntropyFlag);
2262 ProcessFecProtectedPacket(4, false, kEntropyFlag);
2263 ProcessFecProtectedPacket(5, true, !kEntropyFlag);
2264 // Ensure entropy is not revived for the missing packet.
2265 EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2));
2266 EXPECT_NE(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 3));
2267 }
2268
TEST_P(QuicConnectionTest,TLP)2269 TEST_P(QuicConnectionTest, TLP) {
2270 QuicSentPacketManagerPeer::SetMaxTailLossProbes(
2271 QuicConnectionPeer::GetSentPacketManager(&connection_), 1);
2272
2273 SendStreamDataToPeer(3, "foo", 0, !kFin, NULL);
2274 EXPECT_EQ(1u, stop_waiting()->least_unacked);
2275 QuicTime retransmission_time =
2276 connection_.GetRetransmissionAlarm()->deadline();
2277 EXPECT_NE(QuicTime::Zero(), retransmission_time);
2278
2279 EXPECT_EQ(1u, writer_->header().packet_sequence_number);
2280 // Simulate the retransmission alarm firing and sending a tlp,
2281 // so send algorithm's OnRetransmissionTimeout is not called.
2282 clock_.AdvanceTime(retransmission_time.Subtract(clock_.Now()));
2283 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 2u, _, _));
2284 connection_.GetRetransmissionAlarm()->Fire();
2285 EXPECT_EQ(2u, writer_->header().packet_sequence_number);
2286 // We do not raise the high water mark yet.
2287 EXPECT_EQ(1u, stop_waiting()->least_unacked);
2288 }
2289
TEST_P(QuicConnectionTest,RTO)2290 TEST_P(QuicConnectionTest, RTO) {
2291 QuicTime default_retransmission_time = clock_.ApproximateNow().Add(
2292 DefaultRetransmissionTime());
2293 SendStreamDataToPeer(3, "foo", 0, !kFin, NULL);
2294 EXPECT_EQ(1u, stop_waiting()->least_unacked);
2295
2296 EXPECT_EQ(1u, writer_->header().packet_sequence_number);
2297 EXPECT_EQ(default_retransmission_time,
2298 connection_.GetRetransmissionAlarm()->deadline());
2299 // Simulate the retransmission alarm firing.
2300 clock_.AdvanceTime(DefaultRetransmissionTime());
2301 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
2302 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 2u, _, _));
2303 connection_.GetRetransmissionAlarm()->Fire();
2304 EXPECT_EQ(2u, writer_->header().packet_sequence_number);
2305 // We do not raise the high water mark yet.
2306 EXPECT_EQ(1u, stop_waiting()->least_unacked);
2307 }
2308
TEST_P(QuicConnectionTest,RTOWithSameEncryptionLevel)2309 TEST_P(QuicConnectionTest, RTOWithSameEncryptionLevel) {
2310 QuicTime default_retransmission_time = clock_.ApproximateNow().Add(
2311 DefaultRetransmissionTime());
2312 use_tagging_decrypter();
2313
2314 // A TaggingEncrypter puts kTagSize copies of the given byte (0x01 here) at
2315 // the end of the packet. We can test this to check which encrypter was used.
2316 connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01));
2317 SendStreamDataToPeer(3, "foo", 0, !kFin, NULL);
2318 EXPECT_EQ(0x01010101u, writer_->final_bytes_of_last_packet());
2319
2320 connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(0x02));
2321 connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL);
2322 SendStreamDataToPeer(3, "foo", 0, !kFin, NULL);
2323 EXPECT_EQ(0x02020202u, writer_->final_bytes_of_last_packet());
2324
2325 EXPECT_EQ(default_retransmission_time,
2326 connection_.GetRetransmissionAlarm()->deadline());
2327 {
2328 InSequence s;
2329 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
2330 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 3, _, _));
2331 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 4, _, _));
2332 }
2333
2334 // Simulate the retransmission alarm firing.
2335 clock_.AdvanceTime(DefaultRetransmissionTime());
2336 connection_.GetRetransmissionAlarm()->Fire();
2337
2338 // Packet should have been sent with ENCRYPTION_NONE.
2339 EXPECT_EQ(0x01010101u, writer_->final_bytes_of_previous_packet());
2340
2341 // Packet should have been sent with ENCRYPTION_INITIAL.
2342 EXPECT_EQ(0x02020202u, writer_->final_bytes_of_last_packet());
2343 }
2344
TEST_P(QuicConnectionTest,SendHandshakeMessages)2345 TEST_P(QuicConnectionTest, SendHandshakeMessages) {
2346 use_tagging_decrypter();
2347 // A TaggingEncrypter puts kTagSize copies of the given byte (0x01 here) at
2348 // the end of the packet. We can test this to check which encrypter was used.
2349 connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01));
2350
2351 // Attempt to send a handshake message and have the socket block.
2352 EXPECT_CALL(*send_algorithm_,
2353 TimeUntilSend(_, _, _)).WillRepeatedly(
2354 testing::Return(QuicTime::Delta::Zero()));
2355 BlockOnNextWrite();
2356 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
2357 // The packet should be serialized, but not queued.
2358 EXPECT_EQ(1u, connection_.NumQueuedPackets());
2359
2360 // Switch to the new encrypter.
2361 connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(0x02));
2362 connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL);
2363
2364 // Now become writeable and flush the packets.
2365 writer_->SetWritable();
2366 EXPECT_CALL(visitor_, OnCanWrite());
2367 connection_.OnCanWrite();
2368 EXPECT_EQ(0u, connection_.NumQueuedPackets());
2369
2370 // Verify that the handshake packet went out at the null encryption.
2371 EXPECT_EQ(0x01010101u, writer_->final_bytes_of_last_packet());
2372 }
2373
TEST_P(QuicConnectionTest,DropRetransmitsForNullEncryptedPacketAfterForwardSecure)2374 TEST_P(QuicConnectionTest,
2375 DropRetransmitsForNullEncryptedPacketAfterForwardSecure) {
2376 use_tagging_decrypter();
2377 connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01));
2378 QuicPacketSequenceNumber sequence_number;
2379 SendStreamDataToPeer(3, "foo", 0, !kFin, &sequence_number);
2380
2381 // Simulate the retransmission alarm firing and the socket blocking.
2382 BlockOnNextWrite();
2383 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
2384 clock_.AdvanceTime(DefaultRetransmissionTime());
2385 connection_.GetRetransmissionAlarm()->Fire();
2386
2387 // Go forward secure.
2388 connection_.SetEncrypter(ENCRYPTION_FORWARD_SECURE,
2389 new TaggingEncrypter(0x02));
2390 connection_.SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
2391 connection_.NeuterUnencryptedPackets();
2392
2393 EXPECT_EQ(QuicTime::Zero(),
2394 connection_.GetRetransmissionAlarm()->deadline());
2395 // Unblock the socket and ensure that no packets are sent.
2396 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0);
2397 writer_->SetWritable();
2398 connection_.OnCanWrite();
2399 }
2400
TEST_P(QuicConnectionTest,RetransmitPacketsWithInitialEncryption)2401 TEST_P(QuicConnectionTest, RetransmitPacketsWithInitialEncryption) {
2402 use_tagging_decrypter();
2403 connection_.SetEncrypter(ENCRYPTION_NONE, new TaggingEncrypter(0x01));
2404 connection_.SetDefaultEncryptionLevel(ENCRYPTION_NONE);
2405
2406 SendStreamDataToPeer(1, "foo", 0, !kFin, NULL);
2407
2408 connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(0x02));
2409 connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL);
2410
2411 SendStreamDataToPeer(2, "bar", 0, !kFin, NULL);
2412 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
2413
2414 connection_.RetransmitUnackedPackets(ALL_INITIAL_RETRANSMISSION);
2415 }
2416
TEST_P(QuicConnectionTest,BufferNonDecryptablePackets)2417 TEST_P(QuicConnectionTest, BufferNonDecryptablePackets) {
2418 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2419 use_tagging_decrypter();
2420
2421 const uint8 tag = 0x07;
2422 framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag));
2423
2424 // Process an encrypted packet which can not yet be decrypted
2425 // which should result in the packet being buffered.
2426 ProcessDataPacketAtLevel(1, 0, kEntropyFlag, ENCRYPTION_INITIAL);
2427
2428 // Transition to the new encryption state and process another
2429 // encrypted packet which should result in the original packet being
2430 // processed.
2431 connection_.SetDecrypter(new StrictTaggingDecrypter(tag),
2432 ENCRYPTION_INITIAL);
2433 connection_.SetDefaultEncryptionLevel(ENCRYPTION_INITIAL);
2434 connection_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag));
2435 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(2);
2436 ProcessDataPacketAtLevel(2, 0, kEntropyFlag, ENCRYPTION_INITIAL);
2437
2438 // Finally, process a third packet and note that we do not
2439 // reprocess the buffered packet.
2440 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1);
2441 ProcessDataPacketAtLevel(3, 0, kEntropyFlag, ENCRYPTION_INITIAL);
2442 }
2443
TEST_P(QuicConnectionTest,TestRetransmitOrder)2444 TEST_P(QuicConnectionTest, TestRetransmitOrder) {
2445 QuicByteCount first_packet_size;
2446 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).WillOnce(
2447 DoAll(SaveArg<3>(&first_packet_size), Return(true)));
2448
2449 connection_.SendStreamDataWithString(3, "first_packet", 0, !kFin, NULL);
2450 QuicByteCount second_packet_size;
2451 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).WillOnce(
2452 DoAll(SaveArg<3>(&second_packet_size), Return(true)));
2453 connection_.SendStreamDataWithString(3, "second_packet", 12, !kFin, NULL);
2454 EXPECT_NE(first_packet_size, second_packet_size);
2455 // Advance the clock by huge time to make sure packets will be retransmitted.
2456 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(10));
2457 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
2458 {
2459 InSequence s;
2460 EXPECT_CALL(*send_algorithm_,
2461 OnPacketSent(_, _, _, first_packet_size, _));
2462 EXPECT_CALL(*send_algorithm_,
2463 OnPacketSent(_, _, _, second_packet_size, _));
2464 }
2465 connection_.GetRetransmissionAlarm()->Fire();
2466
2467 // Advance again and expect the packets to be sent again in the same order.
2468 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(20));
2469 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
2470 {
2471 InSequence s;
2472 EXPECT_CALL(*send_algorithm_,
2473 OnPacketSent(_, _, _, first_packet_size, _));
2474 EXPECT_CALL(*send_algorithm_,
2475 OnPacketSent(_, _, _, second_packet_size, _));
2476 }
2477 connection_.GetRetransmissionAlarm()->Fire();
2478 }
2479
TEST_P(QuicConnectionTest,RetransmissionCountCalculation)2480 TEST_P(QuicConnectionTest, RetransmissionCountCalculation) {
2481 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2482 QuicPacketSequenceNumber original_sequence_number;
2483 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
2484 .WillOnce(DoAll(SaveArg<2>(&original_sequence_number), Return(true)));
2485 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL);
2486
2487 EXPECT_TRUE(QuicConnectionPeer::IsSavedForRetransmission(
2488 &connection_, original_sequence_number));
2489 EXPECT_FALSE(QuicConnectionPeer::IsRetransmission(
2490 &connection_, original_sequence_number));
2491 // Force retransmission due to RTO.
2492 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(10));
2493 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
2494 QuicPacketSequenceNumber rto_sequence_number;
2495 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
2496 .WillOnce(DoAll(SaveArg<2>(&rto_sequence_number), Return(true)));
2497 connection_.GetRetransmissionAlarm()->Fire();
2498 EXPECT_FALSE(QuicConnectionPeer::IsSavedForRetransmission(
2499 &connection_, original_sequence_number));
2500 ASSERT_TRUE(QuicConnectionPeer::IsSavedForRetransmission(
2501 &connection_, rto_sequence_number));
2502 EXPECT_TRUE(QuicConnectionPeer::IsRetransmission(
2503 &connection_, rto_sequence_number));
2504 // Once by explicit nack.
2505 SequenceNumberSet lost_packets;
2506 lost_packets.insert(rto_sequence_number);
2507 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
2508 .WillOnce(Return(lost_packets));
2509 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
2510 QuicPacketSequenceNumber nack_sequence_number = 0;
2511 // Ack packets might generate some other packets, which are not
2512 // retransmissions. (More ack packets).
2513 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
2514 .Times(AnyNumber());
2515 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
2516 .WillOnce(DoAll(SaveArg<2>(&nack_sequence_number), Return(true)));
2517 QuicAckFrame ack = InitAckFrame(rto_sequence_number);
2518 // Nack the retransmitted packet.
2519 NackPacket(original_sequence_number, &ack);
2520 NackPacket(rto_sequence_number, &ack);
2521 ProcessAckPacket(&ack);
2522
2523 ASSERT_NE(0u, nack_sequence_number);
2524 EXPECT_FALSE(QuicConnectionPeer::IsSavedForRetransmission(
2525 &connection_, rto_sequence_number));
2526 ASSERT_TRUE(QuicConnectionPeer::IsSavedForRetransmission(
2527 &connection_, nack_sequence_number));
2528 EXPECT_TRUE(QuicConnectionPeer::IsRetransmission(
2529 &connection_, nack_sequence_number));
2530 }
2531
TEST_P(QuicConnectionTest,SetRTOAfterWritingToSocket)2532 TEST_P(QuicConnectionTest, SetRTOAfterWritingToSocket) {
2533 BlockOnNextWrite();
2534 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
2535 // Make sure that RTO is not started when the packet is queued.
2536 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
2537
2538 // Test that RTO is started once we write to the socket.
2539 writer_->SetWritable();
2540 connection_.OnCanWrite();
2541 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet());
2542 }
2543
TEST_P(QuicConnectionTest,DelayRTOWithAckReceipt)2544 TEST_P(QuicConnectionTest, DelayRTOWithAckReceipt) {
2545 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2546 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
2547 .Times(2);
2548 connection_.SendStreamDataWithString(2, "foo", 0, !kFin, NULL);
2549 connection_.SendStreamDataWithString(3, "bar", 0, !kFin, NULL);
2550 QuicAlarm* retransmission_alarm = connection_.GetRetransmissionAlarm();
2551 EXPECT_TRUE(retransmission_alarm->IsSet());
2552 EXPECT_EQ(clock_.Now().Add(DefaultRetransmissionTime()),
2553 retransmission_alarm->deadline());
2554
2555 // Advance the time right before the RTO, then receive an ack for the first
2556 // packet to delay the RTO.
2557 clock_.AdvanceTime(DefaultRetransmissionTime());
2558 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
2559 QuicAckFrame ack = InitAckFrame(1);
2560 ProcessAckPacket(&ack);
2561 EXPECT_TRUE(retransmission_alarm->IsSet());
2562 EXPECT_GT(retransmission_alarm->deadline(), clock_.Now());
2563
2564 // Move forward past the original RTO and ensure the RTO is still pending.
2565 clock_.AdvanceTime(DefaultRetransmissionTime().Multiply(2));
2566
2567 // Ensure the second packet gets retransmitted when it finally fires.
2568 EXPECT_TRUE(retransmission_alarm->IsSet());
2569 EXPECT_LT(retransmission_alarm->deadline(), clock_.ApproximateNow());
2570 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
2571 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
2572 // Manually cancel the alarm to simulate a real test.
2573 connection_.GetRetransmissionAlarm()->Fire();
2574
2575 // The new retransmitted sequence number should set the RTO to a larger value
2576 // than previously.
2577 EXPECT_TRUE(retransmission_alarm->IsSet());
2578 QuicTime next_rto_time = retransmission_alarm->deadline();
2579 QuicTime expected_rto_time =
2580 connection_.sent_packet_manager().GetRetransmissionTime();
2581 EXPECT_EQ(next_rto_time, expected_rto_time);
2582 }
2583
TEST_P(QuicConnectionTest,TestQueued)2584 TEST_P(QuicConnectionTest, TestQueued) {
2585 EXPECT_EQ(0u, connection_.NumQueuedPackets());
2586 BlockOnNextWrite();
2587 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
2588 EXPECT_EQ(1u, connection_.NumQueuedPackets());
2589
2590 // Unblock the writes and actually send.
2591 writer_->SetWritable();
2592 connection_.OnCanWrite();
2593 EXPECT_EQ(0u, connection_.NumQueuedPackets());
2594 }
2595
TEST_P(QuicConnectionTest,CloseFecGroup)2596 TEST_P(QuicConnectionTest, CloseFecGroup) {
2597 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2598 // Don't send missing packet 1.
2599 // Don't send missing packet 2.
2600 ProcessFecProtectedPacket(3, false, !kEntropyFlag);
2601 // Don't send missing FEC packet 3.
2602 ASSERT_EQ(1u, connection_.NumFecGroups());
2603
2604 // Now send non-fec protected ack packet and close the group.
2605 peer_creator_.set_sequence_number(4);
2606 QuicStopWaitingFrame frame = InitStopWaitingFrame(5);
2607 ProcessStopWaitingPacket(&frame);
2608 ASSERT_EQ(0u, connection_.NumFecGroups());
2609 }
2610
TEST_P(QuicConnectionTest,NoQuicCongestionFeedbackFrame)2611 TEST_P(QuicConnectionTest, NoQuicCongestionFeedbackFrame) {
2612 SendAckPacketToPeer();
2613 EXPECT_TRUE(writer_->feedback_frames().empty());
2614 }
2615
TEST_P(QuicConnectionTest,WithQuicCongestionFeedbackFrame)2616 TEST_P(QuicConnectionTest, WithQuicCongestionFeedbackFrame) {
2617 QuicCongestionFeedbackFrame info;
2618 info.type = kTCP;
2619 info.tcp.receive_window = 0x4030;
2620
2621 // After QUIC_VERSION_22, do not send TCP Congestion Feedback Frames anymore.
2622 if (version() > QUIC_VERSION_22) {
2623 SendAckPacketToPeer();
2624 ASSERT_TRUE(writer_->feedback_frames().empty());
2625 } else {
2626 // Only SetFeedback in this case because SetFeedback will create a receive
2627 // algorithm which is how the received_packet_manager checks if it should be
2628 // creating TCP Congestion Feedback Frames.
2629 SetFeedback(&info);
2630 SendAckPacketToPeer();
2631 ASSERT_FALSE(writer_->feedback_frames().empty());
2632 ASSERT_EQ(kTCP, writer_->feedback_frames()[0].type);
2633 }
2634 }
2635
TEST_P(QuicConnectionTest,UpdateQuicCongestionFeedbackFrame)2636 TEST_P(QuicConnectionTest, UpdateQuicCongestionFeedbackFrame) {
2637 SendAckPacketToPeer();
2638 EXPECT_CALL(*receive_algorithm_, RecordIncomingPacket(_, _, _));
2639 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2640 ProcessPacket(1);
2641 }
2642
TEST_P(QuicConnectionTest,DontUpdateQuicCongestionFeedbackFrameForRevived)2643 TEST_P(QuicConnectionTest, DontUpdateQuicCongestionFeedbackFrameForRevived) {
2644 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2645 SendAckPacketToPeer();
2646 // Process an FEC packet, and revive the missing data packet
2647 // but only contact the receive_algorithm once.
2648 EXPECT_CALL(*receive_algorithm_, RecordIncomingPacket(_, _, _));
2649 ProcessFecPacket(2, 1, true, !kEntropyFlag, NULL);
2650 }
2651
TEST_P(QuicConnectionTest,InitialTimeout)2652 TEST_P(QuicConnectionTest, InitialTimeout) {
2653 EXPECT_TRUE(connection_.connected());
2654 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_CONNECTION_TIMED_OUT, false));
2655 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(AnyNumber());
2656
2657 QuicTime default_timeout = clock_.ApproximateNow().Add(
2658 QuicTime::Delta::FromSeconds(kDefaultInitialTimeoutSecs));
2659 EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline());
2660
2661 if (FLAGS_quic_timeouts_require_activity) {
2662 // Simulate the timeout alarm firing.
2663 clock_.AdvanceTime(
2664 QuicTime::Delta::FromSeconds(kDefaultInitialTimeoutSecs));
2665 connection_.GetTimeoutAlarm()->Fire();
2666 // We should not actually timeout until a packet is sent.
2667 EXPECT_TRUE(connection_.connected());
2668 SendStreamDataToPeer(1, "GET /", 0, kFin, NULL);
2669 }
2670
2671 // Simulate the timeout alarm firing.
2672 clock_.AdvanceTime(
2673 QuicTime::Delta::FromSeconds(kDefaultInitialTimeoutSecs));
2674 connection_.GetTimeoutAlarm()->Fire();
2675
2676 EXPECT_FALSE(connection_.GetTimeoutAlarm()->IsSet());
2677 EXPECT_FALSE(connection_.connected());
2678
2679 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
2680 EXPECT_FALSE(connection_.GetPingAlarm()->IsSet());
2681 EXPECT_FALSE(connection_.GetResumeWritesAlarm()->IsSet());
2682 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
2683 EXPECT_FALSE(connection_.GetSendAlarm()->IsSet());
2684 }
2685
TEST_P(QuicConnectionTest,OverallTimeout)2686 TEST_P(QuicConnectionTest, OverallTimeout) {
2687 connection_.SetOverallConnectionTimeout(
2688 QuicTime::Delta::FromSeconds(kDefaultMaxTimeForCryptoHandshakeSecs));
2689 EXPECT_TRUE(connection_.connected());
2690 EXPECT_CALL(visitor_,
2691 OnConnectionClosed(QUIC_CONNECTION_OVERALL_TIMED_OUT, false));
2692 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(AnyNumber());
2693
2694 QuicTime overall_timeout = clock_.ApproximateNow().Add(
2695 QuicTime::Delta::FromSeconds(kDefaultMaxTimeForCryptoHandshakeSecs));
2696 EXPECT_EQ(overall_timeout, connection_.GetTimeoutAlarm()->deadline());
2697
2698 EXPECT_TRUE(connection_.connected());
2699 SendStreamDataToPeer(1, "GET /", 0, kFin, NULL);
2700
2701 clock_.AdvanceTime(
2702 QuicTime::Delta::FromSeconds(2 * kDefaultInitialTimeoutSecs));
2703
2704 // Process an ack and see that the connection still times out.
2705 QuicAckFrame frame = InitAckFrame(1);
2706 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2707 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
2708 ProcessAckPacket(&frame);
2709
2710 // Simulate the timeout alarm firing.
2711 connection_.GetTimeoutAlarm()->Fire();
2712
2713 EXPECT_FALSE(connection_.GetTimeoutAlarm()->IsSet());
2714 EXPECT_FALSE(connection_.connected());
2715
2716 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
2717 EXPECT_FALSE(connection_.GetPingAlarm()->IsSet());
2718 EXPECT_FALSE(connection_.GetResumeWritesAlarm()->IsSet());
2719 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
2720 EXPECT_FALSE(connection_.GetSendAlarm()->IsSet());
2721 }
2722
TEST_P(QuicConnectionTest,PingAfterSend)2723 TEST_P(QuicConnectionTest, PingAfterSend) {
2724 EXPECT_TRUE(connection_.connected());
2725 EXPECT_CALL(visitor_, HasOpenDataStreams()).WillRepeatedly(Return(true));
2726 EXPECT_FALSE(connection_.GetPingAlarm()->IsSet());
2727
2728 // Advance to 5ms, and send a packet to the peer, which will set
2729 // the ping alarm.
2730 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5));
2731 EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
2732 SendStreamDataToPeer(1, "GET /", 0, kFin, NULL);
2733 EXPECT_TRUE(connection_.GetPingAlarm()->IsSet());
2734 EXPECT_EQ(clock_.ApproximateNow().Add(QuicTime::Delta::FromSeconds(15)),
2735 connection_.GetPingAlarm()->deadline());
2736
2737 // Now recevie and ACK of the previous packet, which will move the
2738 // ping alarm forward.
2739 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5));
2740 QuicAckFrame frame = InitAckFrame(1);
2741 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2742 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
2743 ProcessAckPacket(&frame);
2744 EXPECT_TRUE(connection_.GetPingAlarm()->IsSet());
2745 // The ping timer is set slightly less than 15 seconds in the future, because
2746 // of the 1s ping timer alarm granularity.
2747 EXPECT_EQ(clock_.ApproximateNow().Add(QuicTime::Delta::FromSeconds(15))
2748 .Subtract(QuicTime::Delta::FromMilliseconds(5)),
2749 connection_.GetPingAlarm()->deadline());
2750
2751 writer_->Reset();
2752 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(15));
2753 connection_.GetPingAlarm()->Fire();
2754 EXPECT_EQ(1u, writer_->frame_count());
2755 if (version() >= QUIC_VERSION_18) {
2756 ASSERT_EQ(1u, writer_->ping_frames().size());
2757 } else {
2758 ASSERT_EQ(1u, writer_->stream_frames().size());
2759 EXPECT_EQ(kCryptoStreamId, writer_->stream_frames()[0].stream_id);
2760 EXPECT_EQ(0u, writer_->stream_frames()[0].offset);
2761 }
2762 writer_->Reset();
2763
2764 EXPECT_CALL(visitor_, HasOpenDataStreams()).WillRepeatedly(Return(false));
2765 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5));
2766 SendAckPacketToPeer();
2767
2768 EXPECT_FALSE(connection_.GetPingAlarm()->IsSet());
2769 }
2770
TEST_P(QuicConnectionTest,TimeoutAfterSend)2771 TEST_P(QuicConnectionTest, TimeoutAfterSend) {
2772 EXPECT_TRUE(connection_.connected());
2773
2774 QuicTime default_timeout = clock_.ApproximateNow().Add(
2775 QuicTime::Delta::FromSeconds(kDefaultInitialTimeoutSecs));
2776
2777 // When we send a packet, the timeout will change to 5000 +
2778 // kDefaultInitialTimeoutSecs.
2779 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5));
2780
2781 // Send an ack so we don't set the retransmission alarm.
2782 SendAckPacketToPeer();
2783 EXPECT_EQ(default_timeout, connection_.GetTimeoutAlarm()->deadline());
2784
2785 // The original alarm will fire. We should not time out because we had a
2786 // network event at t=5000. The alarm will reregister.
2787 clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(
2788 kDefaultInitialTimeoutSecs * 1000000 - 5000));
2789 EXPECT_EQ(default_timeout, clock_.ApproximateNow());
2790 connection_.GetTimeoutAlarm()->Fire();
2791 EXPECT_TRUE(connection_.GetTimeoutAlarm()->IsSet());
2792 EXPECT_TRUE(connection_.connected());
2793 EXPECT_EQ(default_timeout.Add(QuicTime::Delta::FromMilliseconds(5)),
2794 connection_.GetTimeoutAlarm()->deadline());
2795
2796 // This time, we should time out.
2797 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_CONNECTION_TIMED_OUT, false));
2798 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
2799 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5));
2800 EXPECT_EQ(default_timeout.Add(QuicTime::Delta::FromMilliseconds(5)),
2801 clock_.ApproximateNow());
2802 connection_.GetTimeoutAlarm()->Fire();
2803 EXPECT_FALSE(connection_.GetTimeoutAlarm()->IsSet());
2804 EXPECT_FALSE(connection_.connected());
2805 }
2806
TEST_P(QuicConnectionTest,SendScheduler)2807 TEST_P(QuicConnectionTest, SendScheduler) {
2808 // Test that if we send a packet without delay, it is not queued.
2809 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
2810 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
2811 connection_.SendPacket(
2812 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
2813 EXPECT_EQ(0u, connection_.NumQueuedPackets());
2814 }
2815
TEST_P(QuicConnectionTest,SendSchedulerEAGAIN)2816 TEST_P(QuicConnectionTest, SendSchedulerEAGAIN) {
2817 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
2818 BlockOnNextWrite();
2819 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)).Times(0);
2820 connection_.SendPacket(
2821 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
2822 EXPECT_EQ(1u, connection_.NumQueuedPackets());
2823 }
2824
TEST_P(QuicConnectionTest,TestQueueLimitsOnSendStreamData)2825 TEST_P(QuicConnectionTest, TestQueueLimitsOnSendStreamData) {
2826 // All packets carry version info till version is negotiated.
2827 size_t payload_length;
2828 size_t length = GetPacketLengthForOneStream(
2829 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER,
2830 NOT_IN_FEC_GROUP, &payload_length);
2831 QuicConnectionPeer::GetPacketCreator(&connection_)->set_max_packet_length(
2832 length);
2833
2834 // Queue the first packet.
2835 EXPECT_CALL(*send_algorithm_,
2836 TimeUntilSend(_, _, _)).WillOnce(
2837 testing::Return(QuicTime::Delta::FromMicroseconds(10)));
2838 const string payload(payload_length, 'a');
2839 EXPECT_EQ(0u,
2840 connection_.SendStreamDataWithString(3, payload, 0,
2841 !kFin, NULL).bytes_consumed);
2842 EXPECT_EQ(0u, connection_.NumQueuedPackets());
2843 }
2844
TEST_P(QuicConnectionTest,LoopThroughSendingPackets)2845 TEST_P(QuicConnectionTest, LoopThroughSendingPackets) {
2846 // All packets carry version info till version is negotiated.
2847 size_t payload_length;
2848 // GetPacketLengthForOneStream() assumes a stream offset of 0 in determining
2849 // packet length. The size of the offset field in a stream frame is 0 for
2850 // offset 0, and 2 for non-zero offsets up through 16K. Increase
2851 // max_packet_length by 2 so that subsequent packets containing subsequent
2852 // stream frames with non-zero offets will fit within the packet length.
2853 size_t length = 2 + GetPacketLengthForOneStream(
2854 connection_.version(), kIncludeVersion, PACKET_1BYTE_SEQUENCE_NUMBER,
2855 NOT_IN_FEC_GROUP, &payload_length);
2856 QuicConnectionPeer::GetPacketCreator(&connection_)->set_max_packet_length(
2857 length);
2858
2859 // Queue the first packet.
2860 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(7);
2861 // The first stream frame will have 2 fewer overhead bytes than the other six.
2862 const string payload(payload_length * 7 + 2, 'a');
2863 EXPECT_EQ(payload.size(),
2864 connection_.SendStreamDataWithString(1, payload, 0,
2865 !kFin, NULL).bytes_consumed);
2866 }
2867
TEST_P(QuicConnectionTest,SendDelayedAck)2868 TEST_P(QuicConnectionTest, SendDelayedAck) {
2869 QuicTime ack_time = clock_.ApproximateNow().Add(DefaultDelayedAckTime());
2870 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2871 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
2872 const uint8 tag = 0x07;
2873 connection_.SetDecrypter(new StrictTaggingDecrypter(tag),
2874 ENCRYPTION_INITIAL);
2875 framer_.SetEncrypter(ENCRYPTION_INITIAL, new TaggingEncrypter(tag));
2876 // Process a packet from the non-crypto stream.
2877 frame1_.stream_id = 3;
2878
2879 // The same as ProcessPacket(1) except that ENCRYPTION_INITIAL is used
2880 // instead of ENCRYPTION_NONE.
2881 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1);
2882 ProcessDataPacketAtLevel(1, 0, !kEntropyFlag, ENCRYPTION_INITIAL);
2883
2884 // Check if delayed ack timer is running for the expected interval.
2885 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet());
2886 EXPECT_EQ(ack_time, connection_.GetAckAlarm()->deadline());
2887 // Simulate delayed ack alarm firing.
2888 connection_.GetAckAlarm()->Fire();
2889 // Check that ack is sent and that delayed ack alarm is reset.
2890 EXPECT_EQ(2u, writer_->frame_count());
2891 EXPECT_FALSE(writer_->stop_waiting_frames().empty());
2892 EXPECT_FALSE(writer_->ack_frames().empty());
2893 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
2894 }
2895
TEST_P(QuicConnectionTest,SendEarlyDelayedAckForCrypto)2896 TEST_P(QuicConnectionTest, SendEarlyDelayedAckForCrypto) {
2897 QuicTime ack_time = clock_.ApproximateNow();
2898 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2899 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
2900 // Process a packet from the crypto stream, which is frame1_'s default.
2901 ProcessPacket(1);
2902 // Check if delayed ack timer is running for the expected interval.
2903 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet());
2904 EXPECT_EQ(ack_time, connection_.GetAckAlarm()->deadline());
2905 // Simulate delayed ack alarm firing.
2906 connection_.GetAckAlarm()->Fire();
2907 // Check that ack is sent and that delayed ack alarm is reset.
2908 EXPECT_EQ(2u, writer_->frame_count());
2909 EXPECT_FALSE(writer_->stop_waiting_frames().empty());
2910 EXPECT_FALSE(writer_->ack_frames().empty());
2911 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
2912 }
2913
TEST_P(QuicConnectionTest,SendDelayedAckOnSecondPacket)2914 TEST_P(QuicConnectionTest, SendDelayedAckOnSecondPacket) {
2915 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2916 ProcessPacket(1);
2917 ProcessPacket(2);
2918 // Check that ack is sent and that delayed ack alarm is reset.
2919 EXPECT_EQ(2u, writer_->frame_count());
2920 EXPECT_FALSE(writer_->stop_waiting_frames().empty());
2921 EXPECT_FALSE(writer_->ack_frames().empty());
2922 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
2923 }
2924
TEST_P(QuicConnectionTest,SendDelayedAckForPing)2925 TEST_P(QuicConnectionTest, SendDelayedAckForPing) {
2926 if (version() < QUIC_VERSION_18) {
2927 return;
2928 }
2929 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2930 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
2931 ProcessPingPacket(1);
2932 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet());
2933 }
2934
TEST_P(QuicConnectionTest,NoAckOnOldNacks)2935 TEST_P(QuicConnectionTest, NoAckOnOldNacks) {
2936 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2937 // Drop one packet, triggering a sequence of acks.
2938 ProcessPacket(2);
2939 size_t frames_per_ack = 2;
2940 EXPECT_EQ(frames_per_ack, writer_->frame_count());
2941 EXPECT_FALSE(writer_->ack_frames().empty());
2942 writer_->Reset();
2943 ProcessPacket(3);
2944 EXPECT_EQ(frames_per_ack, writer_->frame_count());
2945 EXPECT_FALSE(writer_->ack_frames().empty());
2946 writer_->Reset();
2947 ProcessPacket(4);
2948 EXPECT_EQ(frames_per_ack, writer_->frame_count());
2949 EXPECT_FALSE(writer_->ack_frames().empty());
2950 writer_->Reset();
2951 ProcessPacket(5);
2952 EXPECT_EQ(frames_per_ack, writer_->frame_count());
2953 EXPECT_FALSE(writer_->ack_frames().empty());
2954 writer_->Reset();
2955 // Now only set the timer on the 6th packet, instead of sending another ack.
2956 ProcessPacket(6);
2957 EXPECT_EQ(0u, writer_->frame_count());
2958 EXPECT_TRUE(connection_.GetAckAlarm()->IsSet());
2959 }
2960
TEST_P(QuicConnectionTest,SendDelayedAckOnOutgoingPacket)2961 TEST_P(QuicConnectionTest, SendDelayedAckOnOutgoingPacket) {
2962 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2963 ProcessPacket(1);
2964 connection_.SendStreamDataWithString(kClientDataStreamId1, "foo", 0,
2965 !kFin, NULL);
2966 // Check that ack is bundled with outgoing data and that delayed ack
2967 // alarm is reset.
2968 EXPECT_EQ(3u, writer_->frame_count());
2969 EXPECT_FALSE(writer_->stop_waiting_frames().empty());
2970 EXPECT_FALSE(writer_->ack_frames().empty());
2971 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
2972 }
2973
TEST_P(QuicConnectionTest,SendDelayedAckOnOutgoingCryptoPacket)2974 TEST_P(QuicConnectionTest, SendDelayedAckOnOutgoingCryptoPacket) {
2975 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2976 ProcessPacket(1);
2977 connection_.SendStreamDataWithString(kCryptoStreamId, "foo", 0, !kFin, NULL);
2978 // Check that ack is bundled with outgoing crypto data.
2979 EXPECT_EQ(3u, writer_->frame_count());
2980 EXPECT_FALSE(writer_->ack_frames().empty());
2981 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
2982 }
2983
TEST_P(QuicConnectionTest,BlockAndBufferOnFirstCHLOPacketOfTwo)2984 TEST_P(QuicConnectionTest, BlockAndBufferOnFirstCHLOPacketOfTwo) {
2985 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2986 ProcessPacket(1);
2987 BlockOnNextWrite();
2988 writer_->set_is_write_blocked_data_buffered(true);
2989 connection_.SendStreamDataWithString(kCryptoStreamId, "foo", 0, !kFin, NULL);
2990 EXPECT_TRUE(writer_->IsWriteBlocked());
2991 EXPECT_FALSE(connection_.HasQueuedData());
2992 connection_.SendStreamDataWithString(kCryptoStreamId, "bar", 3, !kFin, NULL);
2993 EXPECT_TRUE(writer_->IsWriteBlocked());
2994 EXPECT_TRUE(connection_.HasQueuedData());
2995 }
2996
TEST_P(QuicConnectionTest,BundleAckForSecondCHLO)2997 TEST_P(QuicConnectionTest, BundleAckForSecondCHLO) {
2998 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
2999 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
3000 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(
3001 IgnoreResult(InvokeWithoutArgs(&connection_,
3002 &TestConnection::SendCryptoStreamData)));
3003 // Process a packet from the crypto stream, which is frame1_'s default.
3004 // Receiving the CHLO as packet 2 first will cause the connection to
3005 // immediately send an ack, due to the packet gap.
3006 ProcessPacket(2);
3007 // Check that ack is sent and that delayed ack alarm is reset.
3008 EXPECT_EQ(3u, writer_->frame_count());
3009 EXPECT_FALSE(writer_->stop_waiting_frames().empty());
3010 EXPECT_EQ(1u, writer_->stream_frames().size());
3011 EXPECT_FALSE(writer_->ack_frames().empty());
3012 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
3013 }
3014
TEST_P(QuicConnectionTest,BundleAckWithDataOnIncomingAck)3015 TEST_P(QuicConnectionTest, BundleAckWithDataOnIncomingAck) {
3016 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3017 connection_.SendStreamDataWithString(kClientDataStreamId1, "foo", 0,
3018 !kFin, NULL);
3019 connection_.SendStreamDataWithString(kClientDataStreamId1, "foo", 3,
3020 !kFin, NULL);
3021 // Ack the second packet, which will retransmit the first packet.
3022 QuicAckFrame ack = InitAckFrame(2);
3023 NackPacket(1, &ack);
3024 SequenceNumberSet lost_packets;
3025 lost_packets.insert(1);
3026 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
3027 .WillOnce(Return(lost_packets));
3028 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
3029 ProcessAckPacket(&ack);
3030 EXPECT_EQ(1u, writer_->frame_count());
3031 EXPECT_EQ(1u, writer_->stream_frames().size());
3032 writer_->Reset();
3033
3034 // Now ack the retransmission, which will both raise the high water mark
3035 // and see if there is more data to send.
3036 ack = InitAckFrame(3);
3037 NackPacket(1, &ack);
3038 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
3039 .WillOnce(Return(SequenceNumberSet()));
3040 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
3041 ProcessAckPacket(&ack);
3042
3043 // Check that no packet is sent and the ack alarm isn't set.
3044 EXPECT_EQ(0u, writer_->frame_count());
3045 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
3046 writer_->Reset();
3047
3048 // Send the same ack, but send both data and an ack together.
3049 ack = InitAckFrame(3);
3050 NackPacket(1, &ack);
3051 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
3052 .WillOnce(Return(SequenceNumberSet()));
3053 EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(
3054 IgnoreResult(InvokeWithoutArgs(
3055 &connection_,
3056 &TestConnection::EnsureWritableAndSendStreamData5)));
3057 ProcessAckPacket(&ack);
3058
3059 // Check that ack is bundled with outgoing data and the delayed ack
3060 // alarm is reset.
3061 EXPECT_EQ(3u, writer_->frame_count());
3062 EXPECT_FALSE(writer_->stop_waiting_frames().empty());
3063 EXPECT_FALSE(writer_->ack_frames().empty());
3064 EXPECT_EQ(1u, writer_->stream_frames().size());
3065 EXPECT_FALSE(connection_.GetAckAlarm()->IsSet());
3066 }
3067
TEST_P(QuicConnectionTest,NoAckSentForClose)3068 TEST_P(QuicConnectionTest, NoAckSentForClose) {
3069 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3070 ProcessPacket(1);
3071 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_PEER_GOING_AWAY, true));
3072 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0);
3073 ProcessClosePacket(2, 0);
3074 }
3075
TEST_P(QuicConnectionTest,SendWhenDisconnected)3076 TEST_P(QuicConnectionTest, SendWhenDisconnected) {
3077 EXPECT_TRUE(connection_.connected());
3078 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_PEER_GOING_AWAY, false));
3079 connection_.CloseConnection(QUIC_PEER_GOING_AWAY, false);
3080 EXPECT_FALSE(connection_.connected());
3081 EXPECT_FALSE(connection_.CanWriteStreamData());
3082 QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
3083 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 1, _, _)).Times(0);
3084 connection_.SendPacket(
3085 ENCRYPTION_NONE, 1, packet, kTestEntropyHash, HAS_RETRANSMITTABLE_DATA);
3086 }
3087
TEST_P(QuicConnectionTest,PublicReset)3088 TEST_P(QuicConnectionTest, PublicReset) {
3089 QuicPublicResetPacket header;
3090 header.public_header.connection_id = connection_id_;
3091 header.public_header.reset_flag = true;
3092 header.public_header.version_flag = false;
3093 header.rejected_sequence_number = 10101;
3094 scoped_ptr<QuicEncryptedPacket> packet(
3095 framer_.BuildPublicResetPacket(header));
3096 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_PUBLIC_RESET, true));
3097 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *packet);
3098 }
3099
TEST_P(QuicConnectionTest,GoAway)3100 TEST_P(QuicConnectionTest, GoAway) {
3101 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3102
3103 QuicGoAwayFrame goaway;
3104 goaway.last_good_stream_id = 1;
3105 goaway.error_code = QUIC_PEER_GOING_AWAY;
3106 goaway.reason_phrase = "Going away.";
3107 EXPECT_CALL(visitor_, OnGoAway(_));
3108 ProcessGoAwayPacket(&goaway);
3109 }
3110
TEST_P(QuicConnectionTest,WindowUpdate)3111 TEST_P(QuicConnectionTest, WindowUpdate) {
3112 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3113
3114 QuicWindowUpdateFrame window_update;
3115 window_update.stream_id = 3;
3116 window_update.byte_offset = 1234;
3117 EXPECT_CALL(visitor_, OnWindowUpdateFrames(_));
3118 ProcessFramePacket(QuicFrame(&window_update));
3119 }
3120
TEST_P(QuicConnectionTest,Blocked)3121 TEST_P(QuicConnectionTest, Blocked) {
3122 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3123
3124 QuicBlockedFrame blocked;
3125 blocked.stream_id = 3;
3126 EXPECT_CALL(visitor_, OnBlockedFrames(_));
3127 ProcessFramePacket(QuicFrame(&blocked));
3128 }
3129
TEST_P(QuicConnectionTest,InvalidPacket)3130 TEST_P(QuicConnectionTest, InvalidPacket) {
3131 EXPECT_CALL(visitor_,
3132 OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, false));
3133 QuicEncryptedPacket encrypted(NULL, 0);
3134 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), encrypted);
3135 // The connection close packet should have error details.
3136 ASSERT_FALSE(writer_->connection_close_frames().empty());
3137 EXPECT_EQ("Unable to read public flags.",
3138 writer_->connection_close_frames()[0].error_details);
3139 }
3140
TEST_P(QuicConnectionTest,MissingPacketsBeforeLeastUnacked)3141 TEST_P(QuicConnectionTest, MissingPacketsBeforeLeastUnacked) {
3142 // Set the sequence number of the ack packet to be least unacked (4).
3143 peer_creator_.set_sequence_number(3);
3144 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3145 QuicStopWaitingFrame frame = InitStopWaitingFrame(4);
3146 ProcessStopWaitingPacket(&frame);
3147 EXPECT_TRUE(outgoing_ack()->missing_packets.empty());
3148 }
3149
TEST_P(QuicConnectionTest,ReceivedEntropyHashCalculation)3150 TEST_P(QuicConnectionTest, ReceivedEntropyHashCalculation) {
3151 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(AtLeast(1));
3152 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3153 ProcessDataPacket(1, 1, kEntropyFlag);
3154 ProcessDataPacket(4, 1, kEntropyFlag);
3155 ProcessDataPacket(3, 1, !kEntropyFlag);
3156 ProcessDataPacket(7, 1, kEntropyFlag);
3157 EXPECT_EQ(146u, outgoing_ack()->entropy_hash);
3158 }
3159
TEST_P(QuicConnectionTest,ReceivedEntropyHashCalculationHalfFEC)3160 TEST_P(QuicConnectionTest, ReceivedEntropyHashCalculationHalfFEC) {
3161 // FEC packets should not change the entropy hash calculation.
3162 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(AtLeast(1));
3163 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3164 ProcessDataPacket(1, 1, kEntropyFlag);
3165 ProcessFecPacket(4, 1, false, kEntropyFlag, NULL);
3166 ProcessDataPacket(3, 3, !kEntropyFlag);
3167 ProcessFecPacket(7, 3, false, kEntropyFlag, NULL);
3168 EXPECT_EQ(146u, outgoing_ack()->entropy_hash);
3169 }
3170
TEST_P(QuicConnectionTest,UpdateEntropyForReceivedPackets)3171 TEST_P(QuicConnectionTest, UpdateEntropyForReceivedPackets) {
3172 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(AtLeast(1));
3173 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3174 ProcessDataPacket(1, 1, kEntropyFlag);
3175 ProcessDataPacket(5, 1, kEntropyFlag);
3176 ProcessDataPacket(4, 1, !kEntropyFlag);
3177 EXPECT_EQ(34u, outgoing_ack()->entropy_hash);
3178 // Make 4th packet my least unacked, and update entropy for 2, 3 packets.
3179 peer_creator_.set_sequence_number(5);
3180 QuicPacketEntropyHash six_packet_entropy_hash = 0;
3181 QuicPacketEntropyHash kRandomEntropyHash = 129u;
3182 QuicStopWaitingFrame frame = InitStopWaitingFrame(4);
3183 frame.entropy_hash = kRandomEntropyHash;
3184 if (ProcessStopWaitingPacket(&frame)) {
3185 six_packet_entropy_hash = 1 << 6;
3186 }
3187
3188 EXPECT_EQ((kRandomEntropyHash + (1 << 5) + six_packet_entropy_hash),
3189 outgoing_ack()->entropy_hash);
3190 }
3191
TEST_P(QuicConnectionTest,UpdateEntropyHashUptoCurrentPacket)3192 TEST_P(QuicConnectionTest, UpdateEntropyHashUptoCurrentPacket) {
3193 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(AtLeast(1));
3194 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3195 ProcessDataPacket(1, 1, kEntropyFlag);
3196 ProcessDataPacket(5, 1, !kEntropyFlag);
3197 ProcessDataPacket(22, 1, kEntropyFlag);
3198 EXPECT_EQ(66u, outgoing_ack()->entropy_hash);
3199 peer_creator_.set_sequence_number(22);
3200 QuicPacketEntropyHash kRandomEntropyHash = 85u;
3201 // Current packet is the least unacked packet.
3202 QuicPacketEntropyHash ack_entropy_hash;
3203 QuicStopWaitingFrame frame = InitStopWaitingFrame(23);
3204 frame.entropy_hash = kRandomEntropyHash;
3205 ack_entropy_hash = ProcessStopWaitingPacket(&frame);
3206 EXPECT_EQ((kRandomEntropyHash + ack_entropy_hash),
3207 outgoing_ack()->entropy_hash);
3208 ProcessDataPacket(25, 1, kEntropyFlag);
3209 EXPECT_EQ((kRandomEntropyHash + ack_entropy_hash + (1 << (25 % 8))),
3210 outgoing_ack()->entropy_hash);
3211 }
3212
TEST_P(QuicConnectionTest,EntropyCalculationForTruncatedAck)3213 TEST_P(QuicConnectionTest, EntropyCalculationForTruncatedAck) {
3214 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(AtLeast(1));
3215 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3216 QuicPacketEntropyHash entropy[51];
3217 entropy[0] = 0;
3218 for (int i = 1; i < 51; ++i) {
3219 bool should_send = i % 10 != 1;
3220 bool entropy_flag = (i & (i - 1)) != 0;
3221 if (!should_send) {
3222 entropy[i] = entropy[i - 1];
3223 continue;
3224 }
3225 if (entropy_flag) {
3226 entropy[i] = entropy[i - 1] ^ (1 << (i % 8));
3227 } else {
3228 entropy[i] = entropy[i - 1];
3229 }
3230 ProcessDataPacket(i, 1, entropy_flag);
3231 }
3232 for (int i = 1; i < 50; ++i) {
3233 EXPECT_EQ(entropy[i], QuicConnectionPeer::ReceivedEntropyHash(
3234 &connection_, i));
3235 }
3236 }
3237
TEST_P(QuicConnectionTest,ServerSendsVersionNegotiationPacket)3238 TEST_P(QuicConnectionTest, ServerSendsVersionNegotiationPacket) {
3239 connection_.SetSupportedVersions(QuicSupportedVersions());
3240 framer_.set_version_for_tests(QUIC_VERSION_UNSUPPORTED);
3241
3242 QuicPacketHeader header;
3243 header.public_header.connection_id = connection_id_;
3244 header.public_header.reset_flag = false;
3245 header.public_header.version_flag = true;
3246 header.entropy_flag = false;
3247 header.fec_flag = false;
3248 header.packet_sequence_number = 12;
3249 header.fec_group = 0;
3250
3251 QuicFrames frames;
3252 QuicFrame frame(&frame1_);
3253 frames.push_back(frame);
3254 scoped_ptr<QuicPacket> packet(
3255 BuildUnsizedDataPacket(&framer_, header, frames).packet);
3256 scoped_ptr<QuicEncryptedPacket> encrypted(
3257 framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet));
3258
3259 framer_.set_version(version());
3260 connection_.set_is_server(true);
3261 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
3262 EXPECT_TRUE(writer_->version_negotiation_packet() != NULL);
3263
3264 size_t num_versions = arraysize(kSupportedQuicVersions);
3265 ASSERT_EQ(num_versions,
3266 writer_->version_negotiation_packet()->versions.size());
3267
3268 // We expect all versions in kSupportedQuicVersions to be
3269 // included in the packet.
3270 for (size_t i = 0; i < num_versions; ++i) {
3271 EXPECT_EQ(kSupportedQuicVersions[i],
3272 writer_->version_negotiation_packet()->versions[i]);
3273 }
3274 }
3275
TEST_P(QuicConnectionTest,ServerSendsVersionNegotiationPacketSocketBlocked)3276 TEST_P(QuicConnectionTest, ServerSendsVersionNegotiationPacketSocketBlocked) {
3277 connection_.SetSupportedVersions(QuicSupportedVersions());
3278 framer_.set_version_for_tests(QUIC_VERSION_UNSUPPORTED);
3279
3280 QuicPacketHeader header;
3281 header.public_header.connection_id = connection_id_;
3282 header.public_header.reset_flag = false;
3283 header.public_header.version_flag = true;
3284 header.entropy_flag = false;
3285 header.fec_flag = false;
3286 header.packet_sequence_number = 12;
3287 header.fec_group = 0;
3288
3289 QuicFrames frames;
3290 QuicFrame frame(&frame1_);
3291 frames.push_back(frame);
3292 scoped_ptr<QuicPacket> packet(
3293 BuildUnsizedDataPacket(&framer_, header, frames).packet);
3294 scoped_ptr<QuicEncryptedPacket> encrypted(
3295 framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet));
3296
3297 framer_.set_version(version());
3298 connection_.set_is_server(true);
3299 BlockOnNextWrite();
3300 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
3301 EXPECT_EQ(0u, writer_->last_packet_size());
3302 EXPECT_TRUE(connection_.HasQueuedData());
3303
3304 writer_->SetWritable();
3305 connection_.OnCanWrite();
3306 EXPECT_TRUE(writer_->version_negotiation_packet() != NULL);
3307
3308 size_t num_versions = arraysize(kSupportedQuicVersions);
3309 ASSERT_EQ(num_versions,
3310 writer_->version_negotiation_packet()->versions.size());
3311
3312 // We expect all versions in kSupportedQuicVersions to be
3313 // included in the packet.
3314 for (size_t i = 0; i < num_versions; ++i) {
3315 EXPECT_EQ(kSupportedQuicVersions[i],
3316 writer_->version_negotiation_packet()->versions[i]);
3317 }
3318 }
3319
TEST_P(QuicConnectionTest,ServerSendsVersionNegotiationPacketSocketBlockedDataBuffered)3320 TEST_P(QuicConnectionTest,
3321 ServerSendsVersionNegotiationPacketSocketBlockedDataBuffered) {
3322 connection_.SetSupportedVersions(QuicSupportedVersions());
3323 framer_.set_version_for_tests(QUIC_VERSION_UNSUPPORTED);
3324
3325 QuicPacketHeader header;
3326 header.public_header.connection_id = connection_id_;
3327 header.public_header.reset_flag = false;
3328 header.public_header.version_flag = true;
3329 header.entropy_flag = false;
3330 header.fec_flag = false;
3331 header.packet_sequence_number = 12;
3332 header.fec_group = 0;
3333
3334 QuicFrames frames;
3335 QuicFrame frame(&frame1_);
3336 frames.push_back(frame);
3337 scoped_ptr<QuicPacket> packet(
3338 BuildUnsizedDataPacket(&framer_, header, frames).packet);
3339 scoped_ptr<QuicEncryptedPacket> encrypted(
3340 framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet));
3341
3342 framer_.set_version(version());
3343 connection_.set_is_server(true);
3344 BlockOnNextWrite();
3345 writer_->set_is_write_blocked_data_buffered(true);
3346 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
3347 EXPECT_EQ(0u, writer_->last_packet_size());
3348 EXPECT_FALSE(connection_.HasQueuedData());
3349 }
3350
TEST_P(QuicConnectionTest,ClientHandlesVersionNegotiation)3351 TEST_P(QuicConnectionTest, ClientHandlesVersionNegotiation) {
3352 // Start out with some unsupported version.
3353 QuicConnectionPeer::GetFramer(&connection_)->set_version_for_tests(
3354 QUIC_VERSION_UNSUPPORTED);
3355
3356 QuicPacketHeader header;
3357 header.public_header.connection_id = connection_id_;
3358 header.public_header.reset_flag = false;
3359 header.public_header.version_flag = true;
3360 header.entropy_flag = false;
3361 header.fec_flag = false;
3362 header.packet_sequence_number = 12;
3363 header.fec_group = 0;
3364
3365 QuicVersionVector supported_versions;
3366 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
3367 supported_versions.push_back(kSupportedQuicVersions[i]);
3368 }
3369
3370 // Send a version negotiation packet.
3371 scoped_ptr<QuicEncryptedPacket> encrypted(
3372 framer_.BuildVersionNegotiationPacket(
3373 header.public_header, supported_versions));
3374 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
3375
3376 // Now force another packet. The connection should transition into
3377 // NEGOTIATED_VERSION state and tell the packet creator to StopSendingVersion.
3378 header.public_header.version_flag = false;
3379 QuicFrames frames;
3380 QuicFrame frame(&frame1_);
3381 frames.push_back(frame);
3382 scoped_ptr<QuicPacket> packet(
3383 BuildUnsizedDataPacket(&framer_, header, frames).packet);
3384 encrypted.reset(framer_.EncryptPacket(ENCRYPTION_NONE, 12, *packet));
3385 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1);
3386 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3387 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
3388
3389 ASSERT_FALSE(QuicPacketCreatorPeer::SendVersionInPacket(
3390 QuicConnectionPeer::GetPacketCreator(&connection_)));
3391 }
3392
TEST_P(QuicConnectionTest,BadVersionNegotiation)3393 TEST_P(QuicConnectionTest, BadVersionNegotiation) {
3394 QuicPacketHeader header;
3395 header.public_header.connection_id = connection_id_;
3396 header.public_header.reset_flag = false;
3397 header.public_header.version_flag = true;
3398 header.entropy_flag = false;
3399 header.fec_flag = false;
3400 header.packet_sequence_number = 12;
3401 header.fec_group = 0;
3402
3403 QuicVersionVector supported_versions;
3404 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
3405 supported_versions.push_back(kSupportedQuicVersions[i]);
3406 }
3407
3408 // Send a version negotiation packet with the version the client started with.
3409 // It should be rejected.
3410 EXPECT_CALL(visitor_,
3411 OnConnectionClosed(QUIC_INVALID_VERSION_NEGOTIATION_PACKET,
3412 false));
3413 scoped_ptr<QuicEncryptedPacket> encrypted(
3414 framer_.BuildVersionNegotiationPacket(
3415 header.public_header, supported_versions));
3416 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
3417 }
3418
TEST_P(QuicConnectionTest,CheckSendStats)3419 TEST_P(QuicConnectionTest, CheckSendStats) {
3420 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
3421 connection_.SendStreamDataWithString(3, "first", 0, !kFin, NULL);
3422 size_t first_packet_size = writer_->last_packet_size();
3423
3424 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
3425 connection_.SendStreamDataWithString(5, "second", 0, !kFin, NULL);
3426 size_t second_packet_size = writer_->last_packet_size();
3427
3428 // 2 retransmissions due to rto, 1 due to explicit nack.
3429 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
3430 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(3);
3431
3432 // Retransmit due to RTO.
3433 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(10));
3434 connection_.GetRetransmissionAlarm()->Fire();
3435
3436 // Retransmit due to explicit nacks.
3437 QuicAckFrame nack_three = InitAckFrame(4);
3438 NackPacket(3, &nack_three);
3439 NackPacket(1, &nack_three);
3440 SequenceNumberSet lost_packets;
3441 lost_packets.insert(1);
3442 lost_packets.insert(3);
3443 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
3444 .WillOnce(Return(lost_packets));
3445 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
3446 EXPECT_CALL(visitor_, OnCanWrite()).Times(2);
3447 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3448 EXPECT_CALL(*send_algorithm_, RevertRetransmissionTimeout());
3449 ProcessAckPacket(&nack_three);
3450
3451 EXPECT_CALL(*send_algorithm_, BandwidthEstimate()).WillOnce(
3452 Return(QuicBandwidth::Zero()));
3453
3454 const uint32 kSlowStartThreshold = 23u;
3455 EXPECT_CALL(*send_algorithm_, GetSlowStartThreshold()).WillOnce(
3456 Return(kSlowStartThreshold));
3457
3458 const QuicConnectionStats& stats = connection_.GetStats();
3459 EXPECT_EQ(3 * first_packet_size + 2 * second_packet_size - kQuicVersionSize,
3460 stats.bytes_sent);
3461 EXPECT_EQ(5u, stats.packets_sent);
3462 EXPECT_EQ(2 * first_packet_size + second_packet_size - kQuicVersionSize,
3463 stats.bytes_retransmitted);
3464 EXPECT_EQ(3u, stats.packets_retransmitted);
3465 EXPECT_EQ(1u, stats.rto_count);
3466 EXPECT_EQ(kMaxPacketSize, stats.congestion_window);
3467 EXPECT_EQ(kSlowStartThreshold, stats.slow_start_threshold);
3468 EXPECT_EQ(kDefaultMaxPacketSize, stats.max_packet_size);
3469 }
3470
TEST_P(QuicConnectionTest,CheckReceiveStats)3471 TEST_P(QuicConnectionTest, CheckReceiveStats) {
3472 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3473
3474 size_t received_bytes = 0;
3475 received_bytes += ProcessFecProtectedPacket(1, false, !kEntropyFlag);
3476 received_bytes += ProcessFecProtectedPacket(3, false, !kEntropyFlag);
3477 // Should be counted against dropped packets.
3478 received_bytes += ProcessDataPacket(3, 1, !kEntropyFlag);
3479 received_bytes += ProcessFecPacket(4, 1, true, !kEntropyFlag, NULL);
3480
3481 EXPECT_CALL(*send_algorithm_, BandwidthEstimate()).WillOnce(
3482 Return(QuicBandwidth::Zero()));
3483 const uint32 kSlowStartThreshold = 23u;
3484 EXPECT_CALL(*send_algorithm_, GetSlowStartThreshold()).WillOnce(
3485 Return(kSlowStartThreshold));
3486
3487 const QuicConnectionStats& stats = connection_.GetStats();
3488 EXPECT_EQ(received_bytes, stats.bytes_received);
3489 EXPECT_EQ(4u, stats.packets_received);
3490
3491 EXPECT_EQ(1u, stats.packets_revived);
3492 EXPECT_EQ(1u, stats.packets_dropped);
3493
3494 EXPECT_EQ(kSlowStartThreshold, stats.slow_start_threshold);
3495 }
3496
TEST_P(QuicConnectionTest,TestFecGroupLimits)3497 TEST_P(QuicConnectionTest, TestFecGroupLimits) {
3498 // Create and return a group for 1.
3499 ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 1) != NULL);
3500
3501 // Create and return a group for 2.
3502 ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 2) != NULL);
3503
3504 // Create and return a group for 4. This should remove 1 but not 2.
3505 ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 4) != NULL);
3506 ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 1) == NULL);
3507 ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 2) != NULL);
3508
3509 // Create and return a group for 3. This will kill off 2.
3510 ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 3) != NULL);
3511 ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 2) == NULL);
3512
3513 // Verify that adding 5 kills off 3, despite 4 being created before 3.
3514 ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 5) != NULL);
3515 ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 4) != NULL);
3516 ASSERT_TRUE(QuicConnectionPeer::GetFecGroup(&connection_, 3) == NULL);
3517 }
3518
TEST_P(QuicConnectionTest,ProcessFramesIfPacketClosedConnection)3519 TEST_P(QuicConnectionTest, ProcessFramesIfPacketClosedConnection) {
3520 // Construct a packet with stream frame and connection close frame.
3521 header_.public_header.connection_id = connection_id_;
3522 header_.packet_sequence_number = 1;
3523 header_.public_header.reset_flag = false;
3524 header_.public_header.version_flag = false;
3525 header_.entropy_flag = false;
3526 header_.fec_flag = false;
3527 header_.fec_group = 0;
3528
3529 QuicConnectionCloseFrame qccf;
3530 qccf.error_code = QUIC_PEER_GOING_AWAY;
3531 QuicFrame close_frame(&qccf);
3532 QuicFrame stream_frame(&frame1_);
3533
3534 QuicFrames frames;
3535 frames.push_back(stream_frame);
3536 frames.push_back(close_frame);
3537 scoped_ptr<QuicPacket> packet(
3538 BuildUnsizedDataPacket(&framer_, header_, frames).packet);
3539 EXPECT_TRUE(NULL != packet.get());
3540 scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket(
3541 ENCRYPTION_NONE, 1, *packet));
3542
3543 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_PEER_GOING_AWAY, true));
3544 EXPECT_CALL(visitor_, OnStreamFrames(_)).Times(1);
3545 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3546
3547 connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
3548 }
3549
TEST_P(QuicConnectionTest,SelectMutualVersion)3550 TEST_P(QuicConnectionTest, SelectMutualVersion) {
3551 connection_.SetSupportedVersions(QuicSupportedVersions());
3552 // Set the connection to speak the lowest quic version.
3553 connection_.set_version(QuicVersionMin());
3554 EXPECT_EQ(QuicVersionMin(), connection_.version());
3555
3556 // Pass in available versions which includes a higher mutually supported
3557 // version. The higher mutually supported version should be selected.
3558 QuicVersionVector supported_versions;
3559 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
3560 supported_versions.push_back(kSupportedQuicVersions[i]);
3561 }
3562 EXPECT_TRUE(connection_.SelectMutualVersion(supported_versions));
3563 EXPECT_EQ(QuicVersionMax(), connection_.version());
3564
3565 // Expect that the lowest version is selected.
3566 // Ensure the lowest supported version is less than the max, unless they're
3567 // the same.
3568 EXPECT_LE(QuicVersionMin(), QuicVersionMax());
3569 QuicVersionVector lowest_version_vector;
3570 lowest_version_vector.push_back(QuicVersionMin());
3571 EXPECT_TRUE(connection_.SelectMutualVersion(lowest_version_vector));
3572 EXPECT_EQ(QuicVersionMin(), connection_.version());
3573
3574 // Shouldn't be able to find a mutually supported version.
3575 QuicVersionVector unsupported_version;
3576 unsupported_version.push_back(QUIC_VERSION_UNSUPPORTED);
3577 EXPECT_FALSE(connection_.SelectMutualVersion(unsupported_version));
3578 }
3579
TEST_P(QuicConnectionTest,ConnectionCloseWhenWritable)3580 TEST_P(QuicConnectionTest, ConnectionCloseWhenWritable) {
3581 EXPECT_FALSE(writer_->IsWriteBlocked());
3582
3583 // Send a packet.
3584 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
3585 EXPECT_EQ(0u, connection_.NumQueuedPackets());
3586 EXPECT_EQ(1u, writer_->packets_write_attempts());
3587
3588 TriggerConnectionClose();
3589 EXPECT_EQ(2u, writer_->packets_write_attempts());
3590 }
3591
TEST_P(QuicConnectionTest,ConnectionCloseGettingWriteBlocked)3592 TEST_P(QuicConnectionTest, ConnectionCloseGettingWriteBlocked) {
3593 BlockOnNextWrite();
3594 TriggerConnectionClose();
3595 EXPECT_EQ(1u, writer_->packets_write_attempts());
3596 EXPECT_TRUE(writer_->IsWriteBlocked());
3597 }
3598
TEST_P(QuicConnectionTest,ConnectionCloseWhenWriteBlocked)3599 TEST_P(QuicConnectionTest, ConnectionCloseWhenWriteBlocked) {
3600 BlockOnNextWrite();
3601 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
3602 EXPECT_EQ(1u, connection_.NumQueuedPackets());
3603 EXPECT_EQ(1u, writer_->packets_write_attempts());
3604 EXPECT_TRUE(writer_->IsWriteBlocked());
3605 TriggerConnectionClose();
3606 EXPECT_EQ(1u, writer_->packets_write_attempts());
3607 }
3608
TEST_P(QuicConnectionTest,AckNotifierTriggerCallback)3609 TEST_P(QuicConnectionTest, AckNotifierTriggerCallback) {
3610 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3611
3612 // Create a delegate which we expect to be called.
3613 scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate);
3614 EXPECT_CALL(*delegate.get(), OnAckNotification(_, _, _, _, _)).Times(1);
3615
3616 // Send some data, which will register the delegate to be notified.
3617 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, delegate.get());
3618
3619 // Process an ACK from the server which should trigger the callback.
3620 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
3621 QuicAckFrame frame = InitAckFrame(1);
3622 ProcessAckPacket(&frame);
3623 }
3624
TEST_P(QuicConnectionTest,AckNotifierFailToTriggerCallback)3625 TEST_P(QuicConnectionTest, AckNotifierFailToTriggerCallback) {
3626 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3627
3628 // Create a delegate which we don't expect to be called.
3629 scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate);
3630 EXPECT_CALL(*delegate.get(), OnAckNotification(_, _, _, _, _)).Times(0);
3631
3632 // Send some data, which will register the delegate to be notified. This will
3633 // not be ACKed and so the delegate should never be called.
3634 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, delegate.get());
3635
3636 // Send some other data which we will ACK.
3637 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
3638 connection_.SendStreamDataWithString(1, "bar", 0, !kFin, NULL);
3639
3640 // Now we receive ACK for packets 2 and 3, but importantly missing packet 1
3641 // which we registered to be notified about.
3642 QuicAckFrame frame = InitAckFrame(3);
3643 NackPacket(1, &frame);
3644 SequenceNumberSet lost_packets;
3645 lost_packets.insert(1);
3646 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
3647 .WillOnce(Return(lost_packets));
3648 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
3649 ProcessAckPacket(&frame);
3650 }
3651
TEST_P(QuicConnectionTest,AckNotifierCallbackAfterRetransmission)3652 TEST_P(QuicConnectionTest, AckNotifierCallbackAfterRetransmission) {
3653 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3654
3655 // Create a delegate which we expect to be called.
3656 scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate);
3657 EXPECT_CALL(*delegate.get(), OnAckNotification(_, _, _, _, _)).Times(1);
3658
3659 // Send four packets, and register to be notified on ACK of packet 2.
3660 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL);
3661 connection_.SendStreamDataWithString(3, "bar", 0, !kFin, delegate.get());
3662 connection_.SendStreamDataWithString(3, "baz", 0, !kFin, NULL);
3663 connection_.SendStreamDataWithString(3, "qux", 0, !kFin, NULL);
3664
3665 // Now we receive ACK for packets 1, 3, and 4 and lose 2.
3666 QuicAckFrame frame = InitAckFrame(4);
3667 NackPacket(2, &frame);
3668 SequenceNumberSet lost_packets;
3669 lost_packets.insert(2);
3670 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
3671 .WillOnce(Return(lost_packets));
3672 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
3673 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
3674 ProcessAckPacket(&frame);
3675
3676 // Now we get an ACK for packet 5 (retransmitted packet 2), which should
3677 // trigger the callback.
3678 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
3679 .WillRepeatedly(Return(SequenceNumberSet()));
3680 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
3681 QuicAckFrame second_ack_frame = InitAckFrame(5);
3682 ProcessAckPacket(&second_ack_frame);
3683 }
3684
3685 // AckNotifierCallback is triggered by the ack of a packet that timed
3686 // out and was retransmitted, even though the retransmission has a
3687 // different sequence number.
TEST_P(QuicConnectionTest,AckNotifierCallbackForAckAfterRTO)3688 TEST_P(QuicConnectionTest, AckNotifierCallbackForAckAfterRTO) {
3689 InSequence s;
3690
3691 // Create a delegate which we expect to be called.
3692 scoped_refptr<MockAckNotifierDelegate> delegate(
3693 new StrictMock<MockAckNotifierDelegate>);
3694
3695 QuicTime default_retransmission_time = clock_.ApproximateNow().Add(
3696 DefaultRetransmissionTime());
3697 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, delegate.get());
3698 EXPECT_EQ(1u, stop_waiting()->least_unacked);
3699
3700 EXPECT_EQ(1u, writer_->header().packet_sequence_number);
3701 EXPECT_EQ(default_retransmission_time,
3702 connection_.GetRetransmissionAlarm()->deadline());
3703 // Simulate the retransmission alarm firing.
3704 clock_.AdvanceTime(DefaultRetransmissionTime());
3705 EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
3706 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 2u, _, _));
3707 connection_.GetRetransmissionAlarm()->Fire();
3708 EXPECT_EQ(2u, writer_->header().packet_sequence_number);
3709 // We do not raise the high water mark yet.
3710 EXPECT_EQ(1u, stop_waiting()->least_unacked);
3711
3712 // Ack the original packet, which will revert the RTO.
3713 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3714 EXPECT_CALL(*delegate.get(), OnAckNotification(1, _, 1, _, _));
3715 EXPECT_CALL(*send_algorithm_, RevertRetransmissionTimeout());
3716 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
3717 QuicAckFrame ack_frame = InitAckFrame(1);
3718 ProcessAckPacket(&ack_frame);
3719
3720 // Delegate is not notified again when the retransmit is acked.
3721 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
3722 QuicAckFrame second_ack_frame = InitAckFrame(2);
3723 ProcessAckPacket(&second_ack_frame);
3724 }
3725
3726 // AckNotifierCallback is triggered by the ack of a packet that was
3727 // previously nacked, even though the retransmission has a different
3728 // sequence number.
TEST_P(QuicConnectionTest,AckNotifierCallbackForAckOfNackedPacket)3729 TEST_P(QuicConnectionTest, AckNotifierCallbackForAckOfNackedPacket) {
3730 InSequence s;
3731
3732 // Create a delegate which we expect to be called.
3733 scoped_refptr<MockAckNotifierDelegate> delegate(
3734 new StrictMock<MockAckNotifierDelegate>);
3735
3736 // Send four packets, and register to be notified on ACK of packet 2.
3737 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL);
3738 connection_.SendStreamDataWithString(3, "bar", 0, !kFin, delegate.get());
3739 connection_.SendStreamDataWithString(3, "baz", 0, !kFin, NULL);
3740 connection_.SendStreamDataWithString(3, "qux", 0, !kFin, NULL);
3741
3742 // Now we receive ACK for packets 1, 3, and 4 and lose 2.
3743 QuicAckFrame frame = InitAckFrame(4);
3744 NackPacket(2, &frame);
3745 SequenceNumberSet lost_packets;
3746 lost_packets.insert(2);
3747 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3748 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
3749 .WillOnce(Return(lost_packets));
3750 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
3751 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _));
3752 ProcessAckPacket(&frame);
3753
3754 // Now we get an ACK for packet 2, which was previously nacked.
3755 SequenceNumberSet no_lost_packets;
3756 EXPECT_CALL(*delegate.get(), OnAckNotification(1, _, 1, _, _));
3757 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
3758 .WillOnce(Return(no_lost_packets));
3759 QuicAckFrame second_ack_frame = InitAckFrame(4);
3760 ProcessAckPacket(&second_ack_frame);
3761
3762 // Verify that the delegate is not notified again when the
3763 // retransmit is acked.
3764 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _))
3765 .WillOnce(Return(no_lost_packets));
3766 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
3767 QuicAckFrame third_ack_frame = InitAckFrame(5);
3768 ProcessAckPacket(&third_ack_frame);
3769 }
3770
TEST_P(QuicConnectionTest,AckNotifierFECTriggerCallback)3771 TEST_P(QuicConnectionTest, AckNotifierFECTriggerCallback) {
3772 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3773
3774 // Create a delegate which we expect to be called.
3775 scoped_refptr<MockAckNotifierDelegate> delegate(
3776 new MockAckNotifierDelegate);
3777 EXPECT_CALL(*delegate.get(), OnAckNotification(_, _, _, _, _)).Times(1);
3778
3779 // Send some data, which will register the delegate to be notified.
3780 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, delegate.get());
3781 connection_.SendStreamDataWithString(2, "bar", 0, !kFin, NULL);
3782
3783 // Process an ACK from the server with a revived packet, which should trigger
3784 // the callback.
3785 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
3786 QuicAckFrame frame = InitAckFrame(2);
3787 NackPacket(1, &frame);
3788 frame.revived_packets.insert(1);
3789 ProcessAckPacket(&frame);
3790 // If the ack is processed again, the notifier should not be called again.
3791 ProcessAckPacket(&frame);
3792 }
3793
TEST_P(QuicConnectionTest,AckNotifierCallbackAfterFECRecovery)3794 TEST_P(QuicConnectionTest, AckNotifierCallbackAfterFECRecovery) {
3795 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3796 EXPECT_CALL(visitor_, OnCanWrite());
3797
3798 // Create a delegate which we expect to be called.
3799 scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate);
3800 EXPECT_CALL(*delegate.get(), OnAckNotification(_, _, _, _, _)).Times(1);
3801
3802 // Expect ACKs for 1 packet.
3803 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _));
3804
3805 // Send one packet, and register to be notified on ACK.
3806 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, delegate.get());
3807
3808 // Ack packet gets dropped, but we receive an FEC packet that covers it.
3809 // Should recover the Ack packet and trigger the notification callback.
3810 QuicFrames frames;
3811
3812 QuicAckFrame ack_frame = InitAckFrame(1);
3813 frames.push_back(QuicFrame(&ack_frame));
3814
3815 // Dummy stream frame to satisfy expectations set elsewhere.
3816 frames.push_back(QuicFrame(&frame1_));
3817
3818 QuicPacketHeader ack_header;
3819 ack_header.public_header.connection_id = connection_id_;
3820 ack_header.public_header.reset_flag = false;
3821 ack_header.public_header.version_flag = false;
3822 ack_header.entropy_flag = !kEntropyFlag;
3823 ack_header.fec_flag = true;
3824 ack_header.packet_sequence_number = 1;
3825 ack_header.is_in_fec_group = IN_FEC_GROUP;
3826 ack_header.fec_group = 1;
3827
3828 QuicPacket* packet =
3829 BuildUnsizedDataPacket(&framer_, ack_header, frames).packet;
3830
3831 // Take the packet which contains the ACK frame, and construct and deliver an
3832 // FEC packet which allows the ACK packet to be recovered.
3833 ProcessFecPacket(2, 1, true, !kEntropyFlag, packet);
3834 }
3835
TEST_P(QuicConnectionTest,NetworkChangeVisitorCallbacksChangeFecState)3836 TEST_P(QuicConnectionTest, NetworkChangeVisitorCallbacksChangeFecState) {
3837 QuicPacketCreator* creator =
3838 QuicConnectionPeer::GetPacketCreator(&connection_);
3839 size_t max_packets_per_fec_group = creator->max_packets_per_fec_group();
3840
3841 QuicSentPacketManager::NetworkChangeVisitor* visitor =
3842 QuicSentPacketManagerPeer::GetNetworkChangeVisitor(
3843 QuicConnectionPeer::GetSentPacketManager(&connection_));
3844 EXPECT_TRUE(visitor);
3845
3846 // Increase FEC group size by increasing congestion window to a large number.
3847 visitor->OnCongestionWindowChange(1000 * kDefaultTCPMSS);
3848 EXPECT_LT(max_packets_per_fec_group, creator->max_packets_per_fec_group());
3849 }
3850
3851 class MockQuicConnectionDebugVisitor
3852 : public QuicConnectionDebugVisitor {
3853 public:
3854 MOCK_METHOD1(OnFrameAddedToPacket,
3855 void(const QuicFrame&));
3856
3857 MOCK_METHOD5(OnPacketSent,
3858 void(QuicPacketSequenceNumber,
3859 EncryptionLevel,
3860 TransmissionType,
3861 const QuicEncryptedPacket&,
3862 WriteResult));
3863
3864 MOCK_METHOD2(OnPacketRetransmitted,
3865 void(QuicPacketSequenceNumber,
3866 QuicPacketSequenceNumber));
3867
3868 MOCK_METHOD3(OnPacketReceived,
3869 void(const IPEndPoint&,
3870 const IPEndPoint&,
3871 const QuicEncryptedPacket&));
3872
3873 MOCK_METHOD1(OnProtocolVersionMismatch,
3874 void(QuicVersion));
3875
3876 MOCK_METHOD1(OnPacketHeader,
3877 void(const QuicPacketHeader& header));
3878
3879 MOCK_METHOD1(OnStreamFrame,
3880 void(const QuicStreamFrame&));
3881
3882 MOCK_METHOD1(OnAckFrame,
3883 void(const QuicAckFrame& frame));
3884
3885 MOCK_METHOD1(OnCongestionFeedbackFrame,
3886 void(const QuicCongestionFeedbackFrame&));
3887
3888 MOCK_METHOD1(OnStopWaitingFrame,
3889 void(const QuicStopWaitingFrame&));
3890
3891 MOCK_METHOD1(OnRstStreamFrame,
3892 void(const QuicRstStreamFrame&));
3893
3894 MOCK_METHOD1(OnConnectionCloseFrame,
3895 void(const QuicConnectionCloseFrame&));
3896
3897 MOCK_METHOD1(OnPublicResetPacket,
3898 void(const QuicPublicResetPacket&));
3899
3900 MOCK_METHOD1(OnVersionNegotiationPacket,
3901 void(const QuicVersionNegotiationPacket&));
3902
3903 MOCK_METHOD2(OnRevivedPacket,
3904 void(const QuicPacketHeader&, StringPiece payload));
3905 };
3906
TEST_P(QuicConnectionTest,OnPacketHeaderDebugVisitor)3907 TEST_P(QuicConnectionTest, OnPacketHeaderDebugVisitor) {
3908 QuicPacketHeader header;
3909
3910 MockQuicConnectionDebugVisitor* debug_visitor =
3911 new MockQuicConnectionDebugVisitor();
3912 connection_.set_debug_visitor(debug_visitor);
3913 EXPECT_CALL(*debug_visitor, OnPacketHeader(Ref(header))).Times(1);
3914 connection_.OnPacketHeader(header);
3915 }
3916
TEST_P(QuicConnectionTest,Pacing)3917 TEST_P(QuicConnectionTest, Pacing) {
3918 TestConnection server(connection_id_, IPEndPoint(), helper_.get(),
3919 factory_, /* is_server= */ true, version());
3920 TestConnection client(connection_id_, IPEndPoint(), helper_.get(),
3921 factory_, /* is_server= */ false, version());
3922 EXPECT_FALSE(client.sent_packet_manager().using_pacing());
3923 EXPECT_FALSE(server.sent_packet_manager().using_pacing());
3924 }
3925
TEST_P(QuicConnectionTest,ControlFramesInstigateAcks)3926 TEST_P(QuicConnectionTest, ControlFramesInstigateAcks) {
3927 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
3928
3929 // Send a WINDOW_UPDATE frame.
3930 QuicWindowUpdateFrame window_update;
3931 window_update.stream_id = 3;
3932 window_update.byte_offset = 1234;
3933 EXPECT_CALL(visitor_, OnWindowUpdateFrames(_));
3934 ProcessFramePacket(QuicFrame(&window_update));
3935
3936 // Ensure that this has caused the ACK alarm to be set.
3937 QuicAlarm* ack_alarm = QuicConnectionPeer::GetAckAlarm(&connection_);
3938 EXPECT_TRUE(ack_alarm->IsSet());
3939
3940 // Cancel alarm, and try again with BLOCKED frame.
3941 ack_alarm->Cancel();
3942 QuicBlockedFrame blocked;
3943 blocked.stream_id = 3;
3944 EXPECT_CALL(visitor_, OnBlockedFrames(_));
3945 ProcessFramePacket(QuicFrame(&blocked));
3946 EXPECT_TRUE(ack_alarm->IsSet());
3947 }
3948
3949 } // namespace
3950 } // namespace test
3951 } // namespace net
3952