• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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